GitLab 与 GitLab Runner CI/DI 结合

GitLab Runner CI/DI


运行环境

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

概念

CI(Continuous integration, 持续集成)
持续集成强调开发人员提交了新代码之后,立刻进行构建、(单元)测试。根据测试结果,我们可以确定新代码和原有代码能否正确地集成在一起
CD(Continuous Delivery, 持续交付)
是在持续集成的基础上,将集成后的代码部署到更贴近真实运行环境(类生产环境)中。 如果代码没有问题,可以继续部署到生产环境
GitLab 与 GitLab Runner CI/DI 结合
gitlab-runner执行过程:
1.git push远程仓库
2.若匹配到由gitlab的CI/CD服务注册的runner
3.运行runner程序

GitLab 与 GitLab Runner CI/DI 结合

一、 拉取镜像

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

GitLab 与 GitLab Runner CI/DI 结合

二、创建容器

# 创建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 与 GitLab Runner CI/DI 结合

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

如下图所示:
GitLab 与 GitLab Runner CI/DI 结合
成功后可以在gitlab中查看到该runner:
GitLab 与 GitLab Runner CI/DI 结合

四、编写 .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 与 GitLab Runner CI/DI 结合
2.提交到gitlab服务器仓库后:

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

3.自动进行了发布操作,同时若配置了邮件服务还会有邮件通知:
GitLab 与 GitLab Runner CI/DI 结合
GitLab 与 GitLab Runner CI/DI 结合

五、使用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 与 GitLab Runner CI/DI 结合

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 与 GitLab Runner CI/DI 结合
5. 提交代码测试runner

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

runner提示失败:
GitLab 与 GitLab Runner CI/DI 结合
失败的具体原因为:Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock
GitLab 与 GitLab Runner CI/DI 结合
6.修改宿主机执行权限

chmod 666 /var/run/docker.sock

再次执行第5步操作:
GitLab 与 GitLab Runner CI/DI 结合
查看docker images:
GitLab 与 GitLab Runner CI/DI 结合
mygo程序成功生成docker镜像!
GitLab 与 GitLab Runner CI/DI 结合

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

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

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

  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. 推送远程仓库
    GitLab 与 GitLab Runner CI/DI 结合
  2. 查看镜像情况
    GitLab 与 GitLab Runner CI/DI 结合
    只有7.65MB
    GitLab 与 GitLab Runner CI/DI 结合
上一篇:中国的省,市,县,乡,区完整数据


下一篇:使用 GitLab CI/CD 和阿里云 CLI 自动部署前端项目