本文主要演示使用A发布项目到 B上,和注册GitLab Runner,添加docker类型的Executor来执行构建,并以此为基础完成一个go源码示例项目从编译代码构建、docker镜像打包到应用部署的CI/CD过程。
A:192.168.10.12 gitlabrunner B:192.168.10.19 端口2375 需要发布的目标 Gitlab ip:192.168.10.9
一、在192.168.10.12上使用docker安装gitlab-runner
[root@adscom gitlab]# mkdir -p /config #创建配置目录
[root@adscom data]# docker pull gitlab/gitlab-runner:v14.6.1 #拉取gitlab-runner镜像
[root@adscom ~]# docker run -d --name my-runner -v /config/:/etc/gitlab-runner gitlab/gitlab-runner:v14.6.1 #启动容器
[root@adscom ~]# docker exec -it my-runner bash #进入容器
二、登录GitLab注册信息
1 获取注册token信息
2 在192.168.10.12上进行非交互式注册gitlab-runner 需要进入到gitlab-runner容器中
bash-5.0# gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image golang:1.17.6-alpine3.15 \
--url "http://192.168.10.9/" \
--registration-token "mNaxzsqyxpwQQCxJkSTa" \
--description "docker-my111" \
--tag-list "testrunner1" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected"
可在GitLab上看到注册成功的GitLab Runner,如下图所示。
三、缓存配置 GitLab Runner对缓存方案的支持有限,所以 可以通过修改config.toml,需要使用挂载Volume的方式做缓存。
root@ubuntu:/config# pwd
/config
vim config.toml
Docker in Docker Docker技术目前在DevOps中被广泛使用,我们需要将测试或者构建的代码和自动化脚本打包成Docker镜像,然后部署在各运行环境中。而在CI/CD中,我们常用一些CI/CD服务器,比如Jenkins和GoCD来构建与部署我们的应用,从而实现CI/CD的自动化。现在一些CI/CD服务器也被Docker化运行在真实的物理机上。于是我们需要在CI/CD服务器的Docker container里面来构建(build)与运行(run)我们的Docker镜像,这就涉及到"Docker run Docker"的问题。 一个很自然的想法是,我们是不是需要在CI/CD服务器镜像中安装一个Docker Daemon和Docker命令呢?但是Docker里面跑Docker总感觉有些蹩脚,额外安装与运行Docker无疑增加了CI/CD服务器镜像的大小,同时还增加Docker的深度。 实际上,我们并不需要在CI/CD服务器上安装Docker。通过如下的命令在CI/CD服务器上运行我们的镜像:
volumes = ["/var/run/docker.sock:/var/run/docker.sock","/cache"]
也可以在注册时加入(官方的方法):
gitlab-runner register \
--non-interactive \
--executor "docker" \
--docker-image golang:1.17.6-alpine3.15 \
--url "http://192.168.10.9/" \
--registration-token "mNaxzsqyxpwQQCxJkSTa" \
--description "test-sock" \
--tag-list "test-sock" \
--run-untagged="true" \
--locked="false" \
--access-level="not_protected" \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock
四、设置全局变量
- 在GitLab的顶部导航栏中,选择Menu > Admin。
- 在Admin页签下,选择settings。
- 在左侧导航栏中,CI / CD。
- 单击Variables右侧的Expand。添加GitLab Runner可用的环境变量。本示例中,添加以下五个变量
DOCKER_NAMES=abc13877****** >>镜像仓库登录用户名 DOCKER_PWSS:********* >>镜像登录密码 ALIYUN:registry.cn-shenzhen.aliyuncs.com >>镜像仓库登录地址 IMAGE: registry.cn-shenzhen.aliyuncs.com/xiaoshimei/xiaoshimei-tset >>镜像地址 IP_NAME :-H tcp://192.168.10.19:2375 >>10.19 的ip地址
五、编写.gitlab-ci.yml
cache:
paths:
- app
stages:
- package
- docker_build
- deploy
package build_job1:
stage: package
tags:
- testrunner1
script:
- export GO111MODULE=on
- export GOPROXY=https://goproxy.cn
- go get -d -v github.com/gin-gonic/gin
- go get -d -v github.com/shirou/gopsutil/host
- go mod init app
- go mod tidy
- go build .
- ls -lh
only:
- main
docker_build_job2:
image: docker:stable
stage: docker_build
tags:
- testrunner1
script:
- docker build -t $IMAGE:$CI_COMMIT_SHORT_SHA .
- docker login --username=$DOCKER_NAME1 --password=$DOCKER_PWSS $ALIYUN
- docker push $IMAGE:$CI_COMMIT_SHORT_SHA
#- #docker rmi $ALIYUN:$CI_COMMIT_SHORT_SHA
deploy_job3:
image: docker:stable
stage: deploy
tags:
- testrunner1
script:
- docker $IP_NAME pull $IMAGE:$CI_COMMIT_SHORT_SHA
- docker $IP_NAME rm -f abc
- docker $IP_NAME run -d --name abc -p8080:80 $IMAGE:$CI_COMMIT_SHORT_SHA
- docker $IP_NAME ps | grep abc
only:
- main
environment:
name: dev
url: http://192.168.10.19:8080/sys >> 构建成功后可在浏览器输入http://192.168.10.19:8080/sys做测试
.gitlab-ci.yml定义了一个Pipeline, 分三个阶段步骤执行:
cache:
paths:
- app
stages:
- package
- docker_build
- deploy
go源码打包阶段:
package build_job1:
stage: package
tags:
- testrunner1
script:
- export GO111MODULE=on
- export GOPROXY=https://goproxy.cn
- go get -d -v github.com/gin-gonic/gin
- go get -d -v github.com/shirou/gopsutil/host
- go mod init app
- go mod tidy
- go build .
- ls -lh
only:
- main
镜像构建和打包推送阶段:
docker_build_job2:
image: docker:stable
stages:
stage: docker_build
tags:
- testrunner1
script:
- docker build -t $IMAGE:$CI_COMMIT_SHORT_SHA .
- docker login --username=$DOCKER_NAME1 --password=$DOCKER_PWSS $ALIYUN
- docker push $IMAGE:$CI_COMMIT_SHORT_SHA
应用部署阶段:
deploy_job3: #job名称
image: docker:stable # 本阶段构建使用的构建镜像
stage: deploy # 关联的阶段名称
tags: #Gitlab Runner的tag
- testrunner1
script:
- docker $IP_NAME pull $IMAGE:$CI_COMMIT_SHORT_SHA
- docker $IP_NAME rm -f abc
- docker $IP_NAME run -d --name abc -p8080:80 $IMAGE:$CI_COMMIT_SHORT_SHA
- docker $IP_NAME ps | grep abc
only:
- main
environment:
name: dev
url: http://192.168.10.19:8080/sys >> 构建成功后可在浏览器输入http://192.168.10.19:8080/sys做测试
执行之前需要保证对方防火墙开启并开放了端口
root@ubuntu:/config# curl 192.168.10.19:2375 >> 检测远程端口是否开放
{"message":"page not found"}
3 编写Dockerfile
FROM alpine:latest
WORKDIR /data
ADD app .
CMD ./app
4 执行Pipeline 提交.gitlab-ci.yml文件后,Project gitlab-java-demo会自动检测到这个文件并执行Pipeline, 如下图所示。
5 测试验证
pipeline 语法: job:作业的意思,每个作业是独立执行的,每个作业至少要包含一个script script:运行脚本 before_script:用于定义一个命令,该命令在每个作业之前运行,必须是一个数组,指定的script与主脚本中指定的任何脚本串联在一起,并在单个shell中一起执行。 after_script: stages:用于定义作业可以使用的阶段,并且是全局定义的,同一阶段的作业并行运行,不同阶段按顺序执行。 stage:阶段 .pre:.pre始终是整个管道的第一个运行阶段 .post:.post始终是整个管道的最后一个运行阶段,用户定于的阶段都在两者之间运行。 variables:变量 unittest:单元测试 deploy:发布 codescan:代码扫描
官网参考: https://docs.gitlab.com/runner/install/docker.html https://docs.gitlab.com/ee/administration/repository_storage_paths.html https://docs.gitlab.com/runner/executors/docker.html#clearing-docker-cache
|