gitlab-ci、cd初步使用及踩坑

基本概念

CI/CD

CI全称为Continuous Integration代表持续集成的意思,通俗来说就是持续的自动构建(单元测试、打包等)。

CD全称为Continuous Deployment代表持续交付的意思,在代码构建完成后自动部署上线。

gitlab-ci/cd

基于gitlab的一套ci/cd工具

配置方法

1.ci文件配置

gitlab-cigitlab自带的功能,只需在项目的根目录添加一个.gitlab-ci.yml的文件名即可。例如我所使用的这个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
stages:
- build
- qbjsonar

build-job:
stage: build
only:
- dev
script:
- cd zhsfsjfw/ && pwd
- mvn clean package


sonar-job:
stage: qbjsonar
only:
- dev
script:
- echo '准备对`qbj`项目代码做sonar的质量检查!
- cd zhsfsjfw/
- mvn compile
- mvn sonar:sonar -Dsonar.host.url=http://172.16.34.102:9000 -Dsonar.login=497a0e0e2fc07f64c4b54edc17bb47dfa251ba34

在上述这个`yml`文件中
  • stages为具体步骤,名称均为自定义。
  • only代表只对dev分支进行ci/cd操作,其余分支不触发
  • script代表具体执行的脚本

在有了这个文件之后,gitlab便会去寻找与之绑定的gitlab-runner(即具体执行script的所在服务器)。

安装runner

这里我是用的是docker来运行gitlab-runner,命令为各处都能搜索到的:

1
2
3
4
sudo docker run -d --name gitlab-runner --restart always \
-v /srv/gitlab-runner/config:/etc/gitlab-runner \
-v /var/run/docker.sock:/var/run/docker.sock \
gitlab/gitlab-runner:latest

运行成功后runner就安装成功了,接下来需要配置与gitlab-ci的连接信息,进入容器进行注册:

1
2
3
4
5
6
7
8
9
10
11
12
docker exec -it gitlab-runner gitlab-ci-multi-runner register
...
输入你搭建的gitlab地址:
http://gitlab.hoppou.com
输入gitlab-ci的token:
(此处需要访问gitlab,找到项目的Settings,拿到相应的token值)
输入runner的描述:
测试runner
输入runner的tag:
mytag
输入runner的执行器,包含docker,shell等多种执行器:
shell

完成之后,重启runner使注册生效。

1
docker restart gitlab-runner

踩坑

可以看到,我的gitlab-ci文件中,使用了mvn命令进行打包操作,而runner镜像本身是没有java环境及maven环境的。所以会出现以下情况。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Running with gitlab-runner 12.5.0 (577f813d)
on 测试runner Z6hhKYEA
Using Shell executor...
Running on cf7b491f673d...
Fetching changes with git depth set to 50...
Initialized empty Git repository in /home/gitlab-runner/builds/Z6hhKYEA/0/CDSFXZ/SF_SFXZ_OUTSOURCING/fy_scqbj_zhsfsjfw/.git/
Created fresh repository.
From http://gitlab.thunisoft.com/CDSFXZ/SF_SFXZ_OUTSOURCING/fy_scqbj_zhsfsjfw
* [new branch] dev -> origin/dev
Checking out c6ae4335 as dev...
Skipping object checkout, Git LFS is not installed.

Skipping Git submodules setup
$ cd zhsfsjfw/ && pwd
/home/gitlab-runner/builds/Z6hhKYEA/0/CDSFXZ/SF_SFXZ_OUTSOURCING/fy_scqbj_zhsfsjfw/zhsfsjfw
$ mvn clean package
bash: line 79: mvn: command not found
ERROR: Job failed: exit status 1

这里最好的方式,还是基于runner镜像,编写一个dockerfile,将javamaven环境安装到runner

(不过我发现的太晚了,又不想动手写dockerfile…..)

于是我想了个骚方法- -。启动容器时,将javamaven的文件夹挂载到容器中去,于是我的启动命令变成了这样:

1
2
3
4
5
6
7
docker run -d --name gitlab-runner --restart always  \
-v /home/volume/jdk1.8.0_211:/usr/local/jdk1.8.0_211 \
-v /home/volume/apache-maven-3.6.3:/usr/local/apache-maven-3.6.3 \
--env JAVA_HOME=/usr/local/jdk1.8.0_211 \
--env MAVEN_HOME=/usr/local/apache-maven-3.6.3 \
--env PATH=$PATH:$JAVA_HOME/bin:$MAVEN_HOME/bin \
--privileged=true gitlab/gitlab-runner:latest

好像起初一看没什么问题?一番操作后,还是报错找不到mvn命令。于是进入到容器中:

1
2
3
4
5
6
7
8
9
10
docker exec -it gitlab-runner /bin/sh
# env
HOSTNAME=8014398ff403
HOME=/root
MAVEN_HOME=/usr/local/apache-maven-3.6.3
TERM=xterm
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
DEBIAN_FRONTEND=noninteractive
JAVA_HOME=/usr/local/jdk1.8.0_211
PWD=/

原来容器内部的PATH环境变并未发生更改,具体原因我猜测是docker run命令中使用的$JAVA_HOME/bin等并没有作为字符串传到容器中去,命令解析时是以宿主机的环境变量为准,而我宿主机并未配置该环境变量。

在我直接按照如下方式写的时候,是可以起效的:(不过谁会愿意这么些呢。。。又臭又长)

1
-- env PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/jdk1.8.0_211/bin:/usr/local/apache-maven-3.6.3/bin

于是我去掉了对PATH变量的赋值,修改gitlabc-ci文件为如下:

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
stages:
- build
- qbjsonar

build-job:
stage: build
only:
- dev
script:
- cd zhsfsjfw/ && pwd
- $MAVEN_HOME/bin/mvn clean package
tags:
- mytag


sonar-job:
stage: qbjsonar
only:
- dev
script:
- echo '准备对`qbj`项目代码做sonar的质量检查!
- cd zhsfsjfw/
- $MAVEN_HOME/bin/mvn compile
- $MAVEN_HOME/bin/mvn sonar:sonar -Dsonar.host.url=http://172.16.34.102:9000 -Dsonar.login=497a0e0e2fc07f64c4b54edc17bb47dfa251ba34
tags:
- mytag

script的命令修改之外,可以看到我还添加了tags标签,这里匹配的是注册runner时,自己填写的tag。可以在gitlabsettings页面进行修改。

如果不想配置tags,可以进入settings --> CI/CD --> Runners Settings,找到启用的runner –> 编辑:

image

yml没有指定tagssettings中也没有勾选该配置,那么任务会一直处于pending状态,提示找不到runner

最后再提一下关于docker命令中 --privileged=true,起初我没有添加该配置- -,虽然可以找到mvn命令了,但ci报错提示没有权限。虽然容器中默认是用的root用户,但这个root只具有容器内部的root权限,针对挂载的目录,他并不能操作宿主机的文件,加上--privileged=true后就可以了。

另:ci发送指令给runner时是自己创建了一个名为gitlab-runner的用户(并非root),所以如果有别的权限问题,可以考虑将文件移动到 /home/gitlab-runner下操作,即可解决。

0%