GitLab CI

众所周知在k8s的使用过程中,镜像构建无疑是绕不开的步骤,团队目前采用私有harbor存储 + jenkins构建的方式,然而除了jenkins使用的一些体验问题(交互简陋、需要手动点构建、响应速度慢),同时可能是由于研发团队多人同时在使用jenkins,镜像构建的速度也十分之感人,成为提升开发效率道路上最大的绊脚石。

出于两个目的:

  • 提升镜像构建速度

  • 实现代码提交或拉分支、打tag自动构建镜像

我用 gitlab-ci 自己搭建了一个镜像编译服务,跑在自己本地的工作电脑上,工作电脑是windows,我又装了一个windows sub system,系统是ubuntu 20.04,这样用于构建的服务器就有了。

到主题,gitlab-ci只需要基本的两个步骤来正常运行:

  1. 在工作电脑上需要安装gitlab-runner并且需要将你的gitlab-runner注册到gitlab上

  2. 在gitlab项目的根目录下创建.gitlab-ci.yml文件

第一步:安装gitlab-runner并注册

1、如果是ubuntu系统,直接用apt安装gitlab-runner

1
apt update; apt install gitlab-runner

2、注册你的gitlab-runner到gitlab上

首先需要获取gitlab的token,也有几种方式:

1、如果你有管理员权限,token一般在设置Overview > Runners可以找到
2、如果你是项目的管理员,token在项目设置Settings > CI/CD > Runners也可以找到

3、拿到token以后,执行以下操作注册你的gitlab-runner

ubuntu系统下输入:

1
sudo gitlab-runner register

依次会要求输入:

  1. GitLab地址

  2. 上一步获取的token

  3. runner的描述

  4. 标签(tag,后续项目的.gitlab-ci.yml会依此选定这个runner)

  5. maintenance note,runner的说明

  6. runner executor(比较关键,控制runner的执行方式,其实就是在runner所在的机器上用何种方式来执行你的指令,可选有docker、shell等,具体看这里),这里使用的是shell. 选择想要使用的shell类型,比如sh、bash、powershell等

其他操作选项,可以通过命令获取:

1
gitlab-runner register -h

当然也可以通过config.toml来配置这些内容,比如上面的配置可以用一份yaml来描述:

1
2
3
4
5
6
7
8
concurrent = 4
check_interval = 3

[[runners]]
name = "local"
url = "https://gitlab.com"
token = "balabala"
executor = "shell"

4、配置文件一般放在/etc/gitlab-runner/config.toml,更加详细的配置信息,点这里

注册成功之后,在gitlab页面的CI/CD > Runners 页面上可以看到注册好的runner

第二步:项目根目录下使用.gitlab-ci.yml

其实就是此项目关于如何使用gitlab ci的配置文件,主要指明了:

  • 使用哪个runner

  • runner如何执行

简单的一个配置文件来执行build命令

1
2
3
4
5
6
7
8
9
10
stages:
- build # build阶段,属于同阶段的任务并行执行

build-code: # 任务
stage: build # 属于哪个阶段
tags:
- local # 第一步注册的runner的名字
script:
- echo "start build" # 执行的命令
- make

这个例子中build阶段的build-code任务执行时,打印一段内容并在项目根目录执行make指令,具体更详细的yaml配置内容,参见gitlab-ci.yml keyword reference | GitLab

第三步:让项目执行完成后通知

gitlab ci的构建过程是没有消息通知的,但我们需要一个通知机制,在提交代码或者merge之后,能够有工具提醒我们,这个工具可以是企业微信、钉钉、slack、邮件等等方式

在这个例子中,我们加入after_script,它表示一系列命令在任务运行完成之后执行,这里我们执行一个bash脚本

1
2
3
4
5
6
7
8
9
10
11
12
stages:
- build # build阶段,属于同阶段的任务并行执行

build-code: # 任务
stage: build # 属于哪个阶段
tags:
- local # 第一步注册的runner的名字
script:
- echo "start build" # 执行的命令
- make
after_script:
- notify.sh # 执行的通知bash脚本

通常我们在bash脚本中,可以获取到git项目信息,提交人,提交的分支或者tag等,把这些信息通过特定工具提醒出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

repo=$CI_PROJECT_NAME # 项目信息
tag=$CI_COMMIT_REF_NAME # 分支号或者tag
pipline_url=$CI_JOB_URL # 任务运行的gitlab url
user=$GITLAB_USER_NAME # 提交人
result=""

if [ $CI_JOB_STATUS = "success" ]; then
result="build success"
else
result="build failed"
fi

# 调用企业微信机器人api发消息
uri='https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=xxxxxx'
content="【Gitlab Ci 构建通知】
user: $user
repo: $repo
tag: $tag
结果: $result"

#echo $content
curl $uri \
-H 'Content-Type: application/json' \
-d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$content\"}}"

在执行脚本中可获取到的所有gitlab预置的环境变量,可以在Predefined variables reference | GitLab查询

以企业微信机器人为例,添加bot,就可以在企业微信里收到构建通知消息