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/1V1ttNag82ihi83CjZKAeOw
+QQ获取提取码:470033365
目录:博客园文章共享目录>持续集成>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 ---

本文作者:hukey

本文链接:https://www.cnblogs.com/hukey/p/17183582.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   hukey  阅读(590)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
  1. 1 彩虹 Jay
彩虹 - Jay
00:00 / 00:00
An audio error has occurred.

彩虹 + 轨迹 (Live) - 周杰伦 (Jay Chou)

彩虹

词:周杰伦

曲:周杰伦

哪里有彩虹告诉我

哪里有彩虹告诉我

能不能把我的愿望还给我

能不能把我的愿望还给我

为什么天这么安静

为什么天这么安静

所有的云都跑到我这里

有没有口罩一个给我

有没有口罩一个给我

释怀说了太多就成真不了

释怀说了太多就成真不了

也许时间是一种解药

也许时间是一种解药

也是我现在正服下的毒药

也是我现在正服下的毒药

看不见你的笑 我怎么睡得着

看不见你的笑 我怎么睡得着

你的声音这么近我却抱不到

你的声音这么近我却抱不到

没有地球太阳还是会绕

没有地球太阳还是会绕

没有理由我也能自己走

没有理由我也能自己走

你要离开 我知道很简单

你要离开 我知道很简单

你说依赖 是我们的阻碍

你说依赖 是我们的阻碍

就算放开 但能不能别没收我的爱

就算放开 但能不能别没收我的爱

当作我最后才明白

当作我最后才明白

看不见你的笑 要我怎么睡得着

看不见你的笑 要我怎么睡得着

你的声音这么近我却抱不到

没有地球太阳还是会绕 会绕

没有理由我也能自己走掉

释怀说了太多就成真不了

也许时间是一种解药 解药

也是我现在正服下的毒药

轨迹

词:黄俊郎

曲:周杰伦

我会发着呆然后忘记你

接着紧紧闭上眼

想着哪一天 会有人代替

想着哪一天 会有人代替

让我不再想念你

我会发着呆 然后微微笑

我会发着呆 然后微微笑

接着紧紧闭上眼

又想了一遍 你温柔的脸

又想了一遍 你温柔的脸

在我忘记之前