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

  1. 修改.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)
在这里插入图片描述

  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)
}

在这里插入图片描述
在这里插入图片描述
备注:生成单元测试文件后 可以在命令台中使用 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阶段(同之前逻辑)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值