gitlab+runner持续集成springboot项目之docker模式【3】
系列导航栏
- 容器中gitlab的安装及备份与恢复【1】
- gitlab+gitlab-runner持续集成springboot项目【2】
- 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有几种类型,这里采用全局注册的方式
左侧有俩个重要的信息,一个是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了:
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 流水线触发
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 浏览器访问测试
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分钟后,刷新浏览器查看:
5.问题总汇
5.1 gitlab-runner 拉取代码错误
上面的问题是因为 注册 runner的用户未添加到该项目中。根据我自己理解,当gitlab多个仓库都需要做CI/CD时,可以创建一个gitlab-runner用户,然后在每个项目中添加该用户作为Reporter,然后通过 gitlab-runner 用户中添加 runner,这样所有的项目CI/CD都可以拉取到,就不会出现如上的报错信息。
6. 参考链接
Docker部署gitlab-runner并使用Docker命令构建Docker镜像