GitLab Runner CI/DI

  • 概念
  • 一、 拉取镜像
  • 二、创建容器
  • 三、注册gitlab-runner(将gitlab与gitlab-runner关联)
  • 四、编写 .gitlab-ci.yml
  • 五、提交代码测试runner
  • 六、使用gitlab-runner发布go程序
  • 七、修改Dockerfile 瘦身go的image镜像
  • 八、runner加入go单元测试



运行环境

  • centos 7.8
  • 内存配置4G
  • gitlab/gitlab-runner

概念

CI(Continuous integration, 持续集成)

持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起

CD(Continuous Delivery, 持续交付)

是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。 如果代码没有问题,可以继续部署到生产环境

gitlab的url地址在哪 gitlab ci_gitlab的url地址在哪


gitlab-runner执行过程:
1.git push远程仓库
2.若匹配到由gitlab的CI/CD服务注册的runner
3.运行runner程序

gitlab的url地址在哪 gitlab ci_golang_02

一、 拉取镜像

# 拉取gitlab-runner镜像,后面不填写版本则默认pull最新latest版本
$ docker pull gitlab/gitlab-runner
$ docker images #查看镜像

gitlab的url地址在哪 gitlab ci_go_03

二、创建容器

# 创建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关联)

gitlab的url地址在哪 gitlab ci_go_04

# 执行注册操作
docker exec -it gitlab-runner  gitlab-runner register

如下图所示:

gitlab的url地址在哪 gitlab ci_golang_05


成功后可以在gitlab中查看到该runner:

gitlab的url地址在哪 gitlab ci_golang_06

四、编写 .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.代码目录:

gitlab的url地址在哪 gitlab ci_go_07


2.提交到gitlab服务器仓库后:

git add .
git commit -m 'test gitlab-runner'
git push

3.自动进行了发布操作,同时若配置了邮件服务还会有邮件通知:

gitlab的url地址在哪 gitlab ci_go_08


gitlab的url地址在哪 gitlab ci_golang_09

六、使用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

gitlab的url地址在哪 gitlab ci_go_10

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使用

  1. 修改.gitlab-ci.yml文件
stages:
  - test
job1:
  stage: test
  script:
    - docker build -t mygo:v1  .
  tags:
    - go

gitlab的url地址在哪 gitlab ci_git_11


5. 提交代码测试runner

git add .
git commit -m 'test gitlab-runner'
git push

runner提示失败:

gitlab的url地址在哪 gitlab ci_go_12


失败的具体原因为:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock

gitlab的url地址在哪 gitlab ci_gitlab的url地址在哪_13


6.修改宿主机执行权限

chmod 666 /var/run/docker.sock

再次执行第5步操作:

gitlab的url地址在哪 gitlab ci_git_14


查看docker images:

gitlab的url地址在哪 gitlab ci_gitlab的url地址在哪_15


mygo程序成功生成docker镜像!

gitlab的url地址在哪 gitlab ci_gitlab的url地址在哪_16

若代码更新重新push后 该镜像也会改变

七、修改Dockerfile 瘦身go的image镜像

因为之前的Dockerfile 是基于 golang:1.14.4-alpine3.12 构建的。带有golang环境~ 所以很大(372M)

gitlab的url地址在哪 gitlab ci_golang_17

  1. 修改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镜像

  1. 推送远程仓库
  2. 查看镜像情况

    只有7.65MB

八、runner加入go单元测试

  1. 增加测试函数isAllNumber并生成单元测试文件
# 增加函数isAllNumber并生成单元测试文件
func isAllNumber(str string) bool {
	reg := regexp.MustCompile(`^\d+$`)
	return reg.MatchString(str)
}

gitlab的url地址在哪 gitlab ci_git_18


gitlab的url地址在哪 gitlab ci_docker_19


备注:生成单元测试文件后 可以在命令台中使用 go test直接测试

  1. 编写DockerfileTest文件
FROM golang:1.14.4-alpine3.12
ADD . /src
WORKDIR /src
cmd ["go","test"]
  1. 修改 .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
  1. 提交代码仓库测试
    最终的成功执行后的结果
  2. test阶段:成功生成test-mygo:v1镜像;docker run --rm test-mygo:v1容器执行测试功能;通过测试后删除test-mygo:v1镜像
  3. build阶段(同之前逻辑)