安装 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
该命令的一些细节:
/srv/gitlab-runner/config 为宿主机上的的 runner 配置目录,目录中存在一个 config.toml 文件,后续如果需要修改 runner 的配置可以通过修改该文件并重启容器更新 runner 配置docker restart gitlab-runner
需要填写的配置项有:
gitlab 地址
注册 runner 的 token(项目设置中可以找到)
设置 runner 的名字,用于标识
设置 runner 的 tag 名,后续需要配置在 ci 的 tag 字段中才能正确使用该 runner
设置 runner 的描述,可忽略
设置 runner 的 executor,一般填 docker
配置默认镜像,例如用于运行 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 -alpineRUN 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 -alpineRUN 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 当构建任务比较多时,机器上的缓存占用空间会比较大,可以通过命令清理解放磁盘空间:
该命令会删除当前未使用的 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 的区别