GitLab Runner CI/DI
运行环境
- centos 7.8
- 内存配置4G
- gitlab/gitlab-runner
概念
CI(Continuous integration, 持续集成)
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起
CD(Continuous Delivery, 持续交付)
是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。 如果代码没有问题,可以继续部署到生产环境
gitlab-runner执行过程:
1.git push远程仓库
2.若匹配到由gitlab的CI/CD服务注册的runner
3.运行runner程序
一、 拉取镜像
# 拉取gitlab-runner镜像,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-runner
$ docker images #查看镜像
二、创建容器
# 创建gitlab-runner配置文件夹
mkdir /home/gitlab-runner
# 创建容器
docker run -d --name gitlab-runner \
-v /home/gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner
三、注册gitlab-runner(将gitlab与gitlab-runner关联)
# 执行注册操作
docker exec -it gitlab-runner gitlab-runner register
如下图所示:
成功后可以在gitlab中查看到该runner:
四、编写 .gitlab-ci.yml
在项目工程下编写 .gitlab-ci.yml 配置文件内容如下:
stages:
- test
- build
job1:
stage: test
script:
- echo "it is test"
job2:
stage: build
script:
- echo "it is build"
各参数说明:
script 由Runner执行的Shell脚本。
image 使用docker镜像, image:name
service 使用docker services镜像, services:name
before_script 执行作业前运行的脚本
after_script 作业完成后运行的脚本
stages 定义管道中的步骤,依次运行
stage 定义管道中步骤的作业段
only 指定作业限制only:refs,only:kubernetes,only:variables,和only:changes
tags 指定执行作业的runner
allow_failure 允许job失败
cache
key:"$CI_JOB_STAGE-$CI_COMMIT_REF_SLUG" #为每分支,每步骤启用缓存
artifacts job成功时附加到作业的文件或目录
dependencies 此job依赖其他jobz,主要作用于作业优先级
converage 给定作业代码覆盖率设置
retry 在发生故障时,可以自动重试作业的次数。
parallel 应该并行运行多少个作业实例
trigger 定义下游管道触发器
include 允许此作业包含外部YAML
extends 此作业将继承的配置项
pages 上传作业结果用于gitlab pages
variables 作业级别定义作业变量
五、提交代码测试runner
1.代码目录:
2.提交到gitlab服务器仓库后:
git add .
git commit -m 'test gitlab-runner'
git push
3.自动进行了发布操作,同时若配置了邮件服务还会有邮件通知:
六、使用gitlab-runner发布go程序
1.先删除之前创建的gitlab-runner
docker stop gitlab-runner
docker rm gitlab-runner
2.重开容器
docker run -d --name gitlab-runner \
-v /home/gitlab-runner:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
-v /usr/bin/docker:/usr/bin/docker \
-v /usr/lib64/libltdl.so.7:/usr/lib/x86_64-linux-gnu/libltdl.so.7 \
gitlab/gitlab-runner
备注:因需要在gitlab-runner中执行docker相关命令 所以挂载了宿主机中的/usr/bin/docker程序并添加了docker所需动态库
3.编写go程序的Dockerfile
FROM golang:1.14.4-alpine3.12
RUN mkdir /src /app
ADD . ../src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && ls && go build -o ../app/mygo main.go && cd /app && chmod +x mygo && cd /
RUN rm src -fr
WORKDIR /app
ENTRYPOINT ["/app/mygo"]
备注:上述程序实际是在gitlab-runner中执行的,所以第2步需要挂载宿主机docker程序给gitlab-runner使用
- 修改.gitlab-ci.yml文件
stages:
- test
job1:
stage: test
script:
- docker build -t mygo:v1 .
tags:
- go
5. 提交代码测试runner
git add .
git commit -m 'test gitlab-runner'
git push
runner提示失败:
失败的具体原因为:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
6.修改宿主机执行权限
chmod 666 /var/run/docker.sock
再次执行第5步操作:
查看docker images:
mygo程序成功生成docker镜像!
若代码更新重新push后 该镜像也会改变
七、修改Dockerfile 瘦身go的image镜像
因为之前的Dockerfile 是基于 golang:1.14.4-alpine3.12 构建的。带有golang环境~ 所以很大(372M)
- 修改Dockerfile如下:
FROM golang:1.14.4-alpine3.12
RUN mkdir /src
ADD . ../src
ENV GOPROXY="https://goproxy.io"
RUN cd /src && go build -o mygo main.go && chmod +x mygo
FROM alpine3.12
RUN mkdir /app
COPY --from=0 /src/mygo /app
ENTRYPOINT ["/app/mygo"]
备注:基于golang:1.14.4-alpine3.12来编译mygo程序,编译完成后复制到基于alpine3.12的app目录中
建议在宿主机中先pull下来golang:1.14.4-alpine3.12或alpine3.12镜像
- 推送远程仓库
- 查看镜像情况
只有7.65MB
八、runner加入go单元测试
- 增加测试函数isAllNumber并生成单元测试文件
# 增加函数isAllNumber并生成单元测试文件
func isAllNumber(str string) bool {
reg := regexp.MustCompile(`^\d+$`)
return reg.MatchString(str)
}
备注:生成单元测试文件后 可以在命令台中使用 go test直接测试
- 编写DockerfileTest文件
FROM golang:1.14.4-alpine3.12
ADD . /src
WORKDIR /src
cmd ["go","test"]
- 修改 .gitlab-ci.yml 分test与build两个阶段
test阶段失败后 build阶段不会触发
stages:
- test
- build
GoTest:
stage: test
script:
- docker build -f DockerfileTest -t test-mygo:v1 .
- docker run --rm test-mygo:v1
after_script:
- docker rmi test-mygo:v1
tags:
- go
GoBuild:
stage: build
script:
- docker build -t mygo:v1 .
after_script:
- docker rmi $(docker images -af "dangling=true" -q)
tags:
- go
- 提交代码仓库测试
最终的成功执行后的结果
- test阶段:成功生成test-mygo:v1镜像;docker run --rm test-mygo:v1容器执行测试功能;通过测试后删除test-mygo:v1镜像
- build阶段(同之前逻辑)