gitlab+runner持续集成springboot项目之docker模式【3】

系列导航栏


  1. 容器中gitlab的安装及备份与恢复【1】
  2. gitlab+gitlab-runner持续集成springboot项目【2】
  3. gitlab+runner持续集成springboot项目之docker模式【3】

程序下载地址


本文所使用到的程序及安装软件下载地址:
链接:https://pan.baidu.com/s/1HfT6_S_52fxXXBjXRp2Faw?pwd=hkey
提取码:hkey
目录:博客园文章共享目录>持续集成>gitlab+runner持续集成springboot项目之docker模式【3】


1. 介绍


前面的文章已经介绍了如何以 shell的方式来进行gitlab的持续集成,gitlab的CI/CD功能需要通过gitlab-runner来完成,本文采用docker来部署gitlab-runner。

总的来说想要在CI/CD中使用Docker命令,你可以通过如下三种方式进行:


第一种,通过shell execotor可以不必将你的gitlab-runner以docker的方式运行,同时,需要你将gitlab-runner加入到docker组,这样gitlab-runner就可以执行docker的命令了。

第二种,Docker in Docker的方式需要docker container获取privilege的权限。他的含义是①executor的类型是docker②runner通过docker提供的镜像来执行docker命令。dockers镜像需要拥有所有的docker工具,并且以privilege的模式在镜像的上下文中执行docker命令。

在这种模式下官方推荐需要使用TLS,查看:GitLab.com shared runners.

第三种,可以不用priviledge的方式,就是Docker socket binding的方式。这种方式是通过将宿主机/var/run/docker.sock挂载到容器的/var/run/docker.sock上,这样,gitlab-runner中执行的docker命令最终会在宿主机上的docker daemon中执行。

本文采用 第三种 方式来介绍。


2. docker运行runner


2.1 启动runner

通过docker的方式运行 runner

docker run -itd --restart=always  \
--name gitlab-runner \
-v /etc/gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock  \
gitlab/gitlab-runner:alpine

在上面的命令中, 我们进行了两处挂载:

-v /etc/gitlab-runner:/etc/gitlab-runner:这个挂载是将gitlab-runner的配置文件挂载到宿主机上,这样我们可以通过修改宿主机上的这个配置文件对gitlab-runner进行配置

-v /var/run/docker.sock:/var/run/docker.sock:这个挂载是将宿主机上的docker socket挂载到了容器内,这样容器内执行的docker命令会被宿主机docker daemon最终执行。

2.2 注册runner


当容器启动成功后,需要将这个runner注册到gitlab的CI/CD上,runner有几种类型,这里采用全局注册的方式

image-20230306112736350

左侧有俩个重要的信息,一个是URL,就是gitlab的url,另一个是token,我们获取到这两个信息后,通过以下命令进行注册:

docker exec -it gitlab-runner  gitlab-runner register -n \
  --url http://192.168.199.104 \	### 注册gitlab地址
  --registration-token Hz1igGoTfo9YeERHk3iM \	###注册tokan
  --tag-list=dockersock,docker \
  --description "dockersock" \
  --docker-privileged=true \
  --docker-pull-policy="if-not-present" \
  --docker-image "docker:20.10.7" \	###最好和本地运行的docker版本同步
  --docker-volumes /var/run/docker.sock:/var/run/docker.sock \
  --docker-volumes /root/m2:/root/.m2 \		### 共享maven缓存多次使用
  --executor docker

操作完成后,在你的gitlab项目中就会出现这个runner了:

image-20230306113010974


3. 编写配置文件


通过docker构建,需要编写两个配置文件,如下:

  • Dockerfile
  • .gitlab-ci.yml

3.1 Dockerfile

Dockerfile 根据项目自行进行编写,下面是我本项目使用的一个Dockerfile

FROM openjdk:8-jdk-alpine
COPY target/system-monitoring-1.0-release/system-monitoring-1.0 /app
CMD ["java","-jar","/app/lib/system-monitoring-1.0.jar","--spring.config.location=/app/config/application.yml"]
EXPOSE 8105

3.2 .gitlab-ci.yml

image: docker:20.10.7
stages:
  - compile
  - build
variables:
  MAVEN_OPTS: "-Dmaven.repo.local=/root/.m2"
compile:
  image: maven:3.6.2-jdk-8
  stage: compile
  tags:
    - docker
  script:
    - mvn clean package -Dmaven.test.skip=true
  artifacts:
    expire_in: 1 days
    paths:
      - target
  only:
    - main
build:
  stage: build
  tags:
    - docker
  script:
    - docker build -t test ./
    - docker rm -f monitor
    - docker run --name monitor -d -p 8105:8105 test
  only:
    - main

配置文件详解:

image: docker:20.10.7
说明:Runner执行器设置为docker, 所以这里需要指定docker的版本

stages:
  - compile
  - build
说明:定义了两个阶段:compile和build

variables:
  MAVEN_OPTS: "-Dmaven.repo.local=/root/.m2"
说明:定义个变量, 指定maven下载的jar包存放的位置,方便重复利用,不用多次重复下载


compile:
  image: maven:3.6.2-jdk-8
  stage: compile
说明:第一阶段,打包用到了maven, 所有需要拉取maven镜像。stage:指定阶段

  tags:
    - docker
说明:拥有标签为 docker 的runner执行,没有则不执行

  script:
    - mvn clean package --Dmaven.test.skip=true
说明:执行的打包命令

  artifacts:
    expire_in: 1 days
    paths:
      - target
说明:编译后有产物,所以要指定下过期时间和路径, 以供于其他阶段使用

  only:
    - main
说明:指定仅在 main 分支上运行

build:
  stage: build
  tags:
    - docker
说明:第二阶段及标签

  script:
    - docker build -t test ./
    - docker rm -f monitor
    - docker run --name monitor -d -p 8105:8105 test
说明:执行容器的更替

  only:
    - main
说明:指定仅在 main 分支上运行

4. 触发CI/CD


4.1 提交git

git add .
git commit -m 'test ci/cd'
git push origin main

4.2 流水线触发

image-20230306114906946


4.3 查看服务部署

root@localhost(192.168.199.105)~/system-monitoring>ds
CONTAINER ID   IMAGE                         COMMAND                  CREATED       STATUS       PORTS                                       NAMES
9d773cd4213c   test                          "java -jar /app/lib/…"   2 hours ago   Up 2 hours   0.0.0.0:8105->8105/tcp, :::8105->8105/tcp   monitor
3358767da9e1   gitlab/gitlab-runner:alpine   "/usr/bin/dumb-init …"   2 hours ago   Up 2 hours                                               gitlab-runner

4.4 浏览器访问测试

image-20230306115014711


4.5 版本迭代

这里模拟修改代码内容进行测试是否能够做到自动部署启动

sed -i 's/hello china!/hello beijing!/g' ./src/main/java/com/jiusuo/kj/data/system/service/impl/SystemMonitoringServiceImpl.java
git add .
git commit -m 'test'
git push origin main

等待1-2分钟后,刷新浏览器查看:

image-20230306134524062


5.问题总汇


5.1 gitlab-runner 拉取代码错误

image

上面的问题是因为 注册 runner的用户未添加到该项目中。根据我自己理解,当gitlab多个仓库都需要做CI/CD时,可以创建一个gitlab-runner用户,然后在每个项目中添加该用户作为Reporter,然后通过 gitlab-runner 用户中添加 runner,这样所有的项目CI/CD都可以拉取到,就不会出现如上的报错信息。


6. 参考链接

Docker部署gitlab-runner并使用Docker命令构建Docker镜像


--- EOF ---
posted @ 2023-03-06 13:52  hukey  阅读(370)  评论(0编辑  收藏  举报