gitlab-runner部署(shell,docker)

安装 docker

安装并启动 docker:

1
2
yum -y install docker
service docker start

也可以使用 get-docker 安装社区版

1
2
curl -fsSL get.docker.com -o get-docker.sh
sudo sh get-docker.sh --mirror Aliyun AzureChinaCloud

使用 docker 安装 gitlab-runner

启动 gitlab-runner

参考文档: https://docs.gitlab.com/runner/install/docker.html

1
2
3
4
5
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 \
--env TZ=Asia/Shanghai \
gitlab/gitlab-runner:latest

使用命令检查容器是否启动: docker container ls

若需要修改容器启动的配置,例如修改时区,可以通过docker stop/rm删除容器后使用新的命令重启。

注册 runner

1
docker run --rm -it -v /srv/gitlab-runner/config:/etc/gitlab-runner gitlab/gitlab-runner register

该命令的一些细节:

  1. /srv/gitlab-runner/config 为宿主机上的的 runner 配置目录,目录中存在一个 config.toml 文件,后续如果需要修改 runner 的配置可以通过修改该文件并重启容器更新 runner 配置docker restart gitlab-runner

需要填写的配置项有:

  1. gitlab 地址
  2. 注册 runner 的 token(项目设置中可以找到)
  3. 设置 runner 的名字,用于标识
  4. 设置 runner 的 tag 名,后续需要配置在 ci 的 tag 字段中才能正确使用该 runner
  5. 设置 runner 的描述,可忽略
  6. 设置 runner 的 executor,一般填 docker
  7. 配置默认镜像,例如用于运行 node 的话,可以填 node:16.14-alpine(也可以使用自己构建的仓库)

成功注册后能够在项目设置中看到该 runner:

如果要在 runner 创建的容器中使用 docker 构建镜像,则需要使用 DinD 方案,官方说明文档:https://docs.gitlab.com/ee/ci/docker/using_docker_build.html#use-docker-in-docker

官方提供了三种方式,建议使用绑定 docker socket 的方式:

1
2
3
4
5
6
7
8
9
10
11
12
[[runners]]
url = "https://gitlab.com/"
token = RUNNER_TOKEN
executor = "docker"
[runners.docker]
tls_verify = false
image = "docker:20.10.16"
privileged = false
disable_cache = false
volumes = ["/var/run/docker.sock:/var/run/docker.sock", "/cache"]
[runners.cache]
Insecure = false

在 docker 配置中添加 volumes 配置,添加/var/run/docker.sock:/var/run/docker.sock,并指定镜像为docker:20.10.16(建议固定版本)

国内 docker 镜像仓库加速

在拉取官方镜像时可能会出现超时无法拉取到镜像,可以使用国内的镜像仓库进行加速。

错误样例:

1
2
3
4
5
6
7
Running with gitlab-runner 15.4.0 (43b2dc3d)
on xxx xxx
Preparing the "docker" executor
Using Docker executor with image node:16.14-alpine ...
Pulling docker image node:16.14-alpine ...
WARNING: Failed to pull image with policy "always": Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (manager.go:235:15s)
ERROR: Job failed: failed to pull image "node:16.14-alpine" with specified policies [always]: Get https://registry-1.docker.io/v2/: net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers) (manager.go:235:15s)

修改镜像仓库命令:

1
2
3
4
5
6
7
8
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://xxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

PS:亲测即使修改了镜像仓库,绝大多数镜像都是没有的,还是会到官方仓库去拉取,如果遇到拉取超时的话,只能多试几次。

在 runner 中使用 docker 命令

按照如上命令已经在 docker 中启动了

shell 安装 gitlab-runner

源码安装

1
2
3
4
5
6
7
8
9
10
11
12
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64

# Give it permissions to execute
sudo chmod +x /usr/local/bin/gitlab-runner

# Create a GitLab CI user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash

# Install and run as service
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start

注册 runner

注册 runner:

1
2
3
4
5
sudo gitlab-runner register -n \
--url https://gitlab.com/ \
--registration-token REGISTRATION_TOKEN \
--executor shell \
--description "My Runner"

为了能够让 runner 使用 docker 命令,需要添加用户组:

1
sudo usermod -aG docker gitlab-runner

注意若按照上面的方式安装的 docker,系统内并没有 docker 用户组,需要手动创建:

1
2
3
sudo groupadd docker
sudo usermod -aG docker ${USER}
sudo systemctl restart docker

检查 gitlab-runner 是否有权限执行 docker 命令:

1
sudo -u gitlab-runner -H docker info

若打印出 docker 信息,则配置成功。

设置 Runner 可同时执行多个 job

默认同一时间同一个 runner 只能执行一个任务,若多个任务分配给同一个 runner,只有第一个会执行,其他的任务会进入 pending 状态,直到前一个任务完成。

若需要同时支持多个任务同时进行,可以修改配置 /etc/gitlab-runner/config.toml,将concurrent设置为允许的最大并发数即可。

重启 runner:

1
systemctl restart gitlab-runner.service

CI/CD

创建基础 node 镜像

官方的 node 镜像没有设置时区,也没有设置 npm 镜像,且拉取很有可能超时,所以我们自己做一个:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:16.17.0-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk add -U --no-cache tzdata

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" >/etc/timezone

RUN npm config set registry https://registry.npmmirror.com/
RUN npm install pnpm -g --unsafe-perm

CMD ["node"]

创建一个 runner 镜像

官方的 docker 镜像缺少 node 环境,如果需要构建 nodejs 应用的话,需要通过不同的 runner 构建,比较麻烦,可以自己做一个完整环境的镜像:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:16.17.0-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

RUN apk add -U --no-cache tzdata curl docker rsync openssh-client alpine-sdk build-base libffi-dev openssl-dev execline zip coreutils

RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
RUN echo "Asia/Shanghai" >/etc/timezone

RUN npm config set registry https://registry.npmmirror.com/
RUN npm install pnpm -g --unsafe-perm

CMD ["node"]

Cache

cache 指的是缓存,由于每个 job 启动时, 都会自动删除.gitignore 中指定的文件。当多次构建应用时,依赖无需重复安装,就可以设置缓存加快构建速度,例如通过 package.json 文件设置 node_moduels 缓存:

1
2
3
4
5
6
7
job:
cache:
key:
files:
- package.json
paths:
- node_modules

当 package 文件修改时,缓存会失效,依赖会重新安装。

清理 volume

当构建任务比较多时,机器上的缓存占用空间会比较大,可以通过命令清理解放磁盘空间:

1
docker volume prune -f

该命令会删除当前未使用的 volume 数据。

artifacts

官方说明:https://docs.gitlab.com/ee/ci/pipelines/job_artifacts.html

当需要使用一些非源码的文件(例如脚本生成的文件,构建后的产物等),或者是需要下载下来使用,可以使用 artifacts 配置。

例如,小程序打包上传后,生成了一个预览二维码,可以将这个二维码当做 artifacts 进行下载:

1
2
3
4
5
job:
artifacts:
paths:
- preview.jpg
expire_in: 1 week

GitLab-CI 中的 artifacts 和 cache 的区别


gitlab-runner部署(shell,docker)
https://www.wobushi.top/2022/gitlab-runner部署(shell,docker)/
作者
Pride Su
发布于
2022年10月14日
许可协议