0%

GitLab & GitLab Runner 实现代码上传与CI/CD自动部署(基于Docker实现)

  1. GitLab与GitLab-Runner安装
  2. 为代码仓库指定Runner
  3. 配置Runner并挂载宿主机目录
  4. 设置CI/CD执行脚本

操作系统:Ubuntu 18.04

GitLab是代码仓库,GitLab-Runner用于运行代码提交后的自动部署脚本,以实现CI/CD。

GitLab与GitLab-Runner安装

极狐GitLab Docker 镜像 | GitLab

使用docker-compose,挂载三个目录:config, logs和data

然后将阿里云邮箱服务的配置添加进去

GitLab-Runner需要将宿主机的/var/run/docker.sock传入,以使用docker。Runner需要一个运行环境,用来执行构建或者其他操作,该环境可以是命令行,也可以是docker容器,传入宿主机的docker配置使其可以直接调用宿主机的docker命令。

docker-compose.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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
version: '3.6'
services:
web:
image: 'registry.gitlab.cn/omnibus/gitlab-jh:latest'
restart: always
hostname: ''
environment:
GITLAB_ROOT_PASSWORD: ''
GITLAB_OMNIBUS_CONFIG: |
# Add any other gitlab.rb configuration here, each on its own line
gitlab_rails['smtp_enable'] = true
gitlab_rails['smtp_address'] = "smtpdm.aliyun.com"
gitlab_rails['smtp_port'] = 465
gitlab_rails['smtp_user_name'] = "邮箱用户@域名.com"
gitlab_rails['smtp_password'] = "smtp服务密码"
gitlab_rails['smtp_domain'] = "域名.com"
gitlab_rails['smtp_authentication'] = "login"
gitlab_rails['smtp_enable_starttls_auto'] = false
gitlab_rails['smtp_tls'] = true
gitlab_rails['smtp_ssl'] = false
gitlab_rails['gitlab_email_from'] = '同smtp_user_name'
gitlab_rails['gitlab_email_display_name'] = '邮件标识符'
ports:
- '880:80'
- '8443:443'
- '822:22'
volumes:
- './config:/etc/gitlab'
- './logs:/var/log/gitlab'
- './data:/var/opt/gitlab'
shm_size: '256m'
runner:
image: gitlab/gitlab-runner:latest
restart: always
volumes:
- './runner/config.toml:/etc/gitlab-runner/config.toml'
- '/var/run/docker.sock:/var/run/docker.sock'
depends_on:
- web

运行docker-compose up -d,启动多个容器并分离(detach)到后台。

为代码仓库指定Runner

打开一个代码仓库,设置,CI/CD,Runner,指定Runner。这里提供的网址和注册令牌将用来注册Runner

在宿主机执行以下命令,进入Runner

1
2
docker container ls -a  # 查看容器名称,假设为gitlab-runner-1
docker exec -it gitlab-runner-1 gitlab-runner register
  1. 输入网址和注册令牌

  2. 选择执行器(executor),可以是docker,也可以是shell、ssh等(建议docker,运行脚本需要用到一些额外的构建依赖,可以通过指定容器来提供,如果是shell,就需要自己再安装,不太方便)

  3. 如果执行器(executor)选择了docker,接着需要选择默认的镜像,根据构建的环境来选,不知道选什么也可以写docker:latest,之后可以在配置文件中再指定。

注册完成后回到仓库,刷新后可以看到指定的Runner。

配置Runner并挂载宿主机目录

挂载为/etc/gitlab-runner/config.toml的配置文件中,可以看到多了刚刚注册的Runner信息:

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
concurrent = 1
check_interval = 0

[session_server]
session_timeout = 1800

[[runners]]
name = "a2a920771c6a"
url = "http://域名/"
token = "口令"
executor = "docker"
[runners.custom_build_dir]
[runners.cache]
[runners.cache.s3]
[runners.cache.gcs]
[runners.cache.azure]
[runners.docker]
tls_verify = false
image = "docker:latest"
pull_policy = "if-not-present"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache", "/home/deploy:/home/build/dist"]
shm_size = 0

需要注意这里加了一句pull_policy = "if-not-present",避免每次执行脚本都拉取一次镜像。

这个配置就是一个配置而已,作为一个配置记录,但很有用:

  1. 当运行gitlab-runner verify时,检查该配置文件中的runner,是否与GitLab仓库建立关系。若将该配置文件的配置项删除,则不检查。若在仓库中解除与runner的联系,则会提示is removed

  2. 在GitLab仓库执行CI/CD脚本时,系统通过指定的runner,找到这个配置文件,再通过这个配置文件中的内容,创建docker容器(如果executor=”docker”)。因此可以在这个地方设置宿主机runner创建的容器之间的挂载目录,用于构建完成后将文件夹拷贝到宿主机的指定目录

设置CI/CD执行脚本

GitLab仓库,CI/CD,编辑器,默认会打开根目录下的.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
25
26
27
28
29
30
31
32
# 缓存路径,避免重复安装依赖
cache:
key: ${CI_PROJECT_NAME}
paths:
- node_modules/

# 构建阶段,按顺序进行
stages:
- build
- deploy

# 构建
build-job:
image: node:14-alpine # 指定镜像
stage: build # 阶段名称,作为标识符
only: # 仅在某个分支提交时才执行脚本
- master
script: # 执行脚本,首先安装,接着构建
- yarn
- yarn build
artifacts: # 传递到下一阶段可用的文件(文件夹)
expire_in: 1 week
paths:
- dist

# 部署阶段(不指定镜像则使用默认的)
deploy-job:
stage: deploy
only:
- master
script:
cp -r dist/* /home/build/dist/ # 复制所有文件和文件夹到指定目录下

经过以上设置,每次提交到主分支master,都会执行构建脚本,通过“流水线(pipeline)”可以看到执行进度和执行过程中的输出。