Gitlab-runner的容器化安装与使用

gitlab-runner有多种安装方式,具体详见 gitlab-runner安装 ,本文采用的docker的方式进行runner的部署

为什么用docker安装gitlab-runner?

  • 1.runner机器经常改变
  • 2.每个作业都处于干净的环境中,没有过去的历史记录。并发任务执行正常,因为每个构建都有自己的 Docker 引擎实例,因此它们不会相互冲突

开始安装:

前提安装好docker环境

1.创建并启动gitlab-runner容器

1
2
3
4
5
sudo docker run -d --name gitlab-runner --restart always   
-v /var/run/docker.sock:/var/run/docker.sock
-v /srv/gitlab-runner/config:/etc/gitlab-runner
-v /home/gitlab-runner/shell:/home/gitlab-runner/shell
-v /root/build_cache:/cache gitlab/gitlab-runner:latest

注:

  1. 第一个 -v 实现docker.sock的挂载(因为后续要实现docker in docker的使用,即 docker executor);
  2. 第二个 -v 实现gitlab-runner的配置挂载(可选)
  3. 第三个 -v 实现gitlab-runner cache目录的挂载(可选),cache相关请参考 docker executor 下的cache部分。
  4. 第四个 -v 实现本地shell目录挂载(可选)

修改gitlab-runner时区为宿主机时区,因为有可能在gitlab-容器中使用到时间,可以执行该命令:

1
sudo docker cp /etc/localtime gitlab-runner:/etc/localtime

2.注册runner

1
2
3
4
5
6
7
8
9
10
11
docker exec gitlab-runner gitlab-runner register -n \
--url https://git-pd.megvii-inc.com/ \
--registration-token qZXDG-z3uPGvsVn-5SNx \
--tag-list runInDk \
--executor docker \
--docker-image mrxccc/maven-jdk8-docker:latest \
--docker-volumes /root/.m2:/root/.m2 \
--docker-volumes /root/.npm:/root/.npm \
--docker-volumes /var/run/docker.sock:/var/run/docker.sock \
--docker-volumes /home/gitlab-runner/shell:/home/gitlab-runner/shell \
--description "runInDk"

注:

  • url 为 gitlab的地址;
  • registration-token 为项目下的token,可通过 gitlab -> project -> settings -> ci/cd 下获得
  • executor,使用 docker 作为 executor;
  • description 为 runner 的描述信息,请自定义;
  • docker-image 为 executor 所采用的自己构建的 docker 镜像,该镜像有maven、java、docker、bash环境(会被gitlab-ci.yml中的配置覆盖)。
  • docker-volumes ,因采用 “docker executor” ,必须挂载宿主机的docker.sock,
  • 挂载.m2文件夹,是为了避免maven每次编译项目时都重新下载jar包。(后面.gitlab-ci.yml文件中使用了maven镜像)

挂载.m2文件夹这一步很重要,不然每次下载依赖包会特别浪费时间

如果想要在docker in docker,也就是在docker容器中使用宿主机的docker,要挂载docker.sock文件,关于为什么要挂载docker.sock,可以参考这篇文章:docker系列-docker.sock探究

mrxccc/maven-jdk8-docker镜像的dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FROM maven:3.6.0-jdk-8-alpine
MAINTAINER mrxccc@qq.com
ENV TZ=Asia/Shanghai
#安装docker
RUN echo http://dl-cdn.alpinelinux.org/alpine/latest-stable/community >> /etc/apk/repositories &&\
apk update &&\
apk add docker --no-cache &&\
apk add openrc --no-cache
#设置时区
RUN apk add --no-cache tzdata &&\
ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone &&\
rm -rf /var/cache/apk/*
#安装sudo
RUN apk add sudo --no-cache
CMD service docker start

3.编写gitlab-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
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
variables:
MAVEN_CLI_OPTS: "-s ./mvn-settings.xml --batch-mode"
SOFT_VERSION: '1.0'
SOFT_VERSION_EXT: 'alpha'
NEW_SOFT_VERSION_EXT: 'beta'

stages:
- verify
- build
- dockerpush

before_script:
- pwd


#单元测试
unit-test:
stage: verify
script:
- mvn $MAVEN_CLI_OPTS test
tags:
- runInDk

#java编译打包docker镜像
java-package:
stage: build
tags:
- runInDk
cache:
key: ${CI_PIPELINE_ID} #根据pipeline id缓存
paths:
- ${CI_PROJECT_DIR}
script:
#registry 是仓库名,imagename是镜像名,CI_PIPELINE_ID是pipeline id
- docker build registry/imagename-${CI_PIPELINE_ID}:$SOFT_VERSION

#push镜像
docker-push:
stage: dockerpush
tags:
- runInDk
cache:
key: ${CI_PIPELINE_ID}
paths:
- ${CI_PROJECT_DIR}
script:
#registry 是仓库名,imagename是镜像名,CI_PIPELINE_ID是pipeline id
- docker push registry/imagename-${CI_PIPELINE_ID}:$SOFT_VERSION

更多参数操作,可以用:sudo docker exec gitlab-runner gitlab-runner register –help 进行查看

更多精彩内容:mrxccc