前言
gitlab-runner是当前炙手可热的一个CICD工具,和Gitlab集成非常好。之前在工作中应用了一下,效果相当理想。
为了进一步了解gitlab-runner的运行原理,打算学习一下gitlab-runner源码。
由于是零基础,所以打算把整个过程记录下来,包括每一步的思路,以便复盘;贻笑大方之处,欢迎评论区打脸。
安装Go开发环境
由于编译必须用到docker,可以参考centos下安装vscode开发java,里面有docker安装的三种方式,以及镜像仓库的设置。
Gitlab相关资料
- 我的gitlab 专栏
- gitlab 安装指南
- gitlab 安装指南 docker版
- gitlab-runner使用docker executor
- gitlab-runner使用kubernetes executor
GO语法快速入门
下载代码
编译
编译helper
Gitlab-Runner在不同的操作系统、CPU架构下运行时,需要不同的helper镜像来辅助他。所以我们第一步先编译Helper镜像。
-
我抬手就是一个
make helper-bin helper-dockerarchive
进行编译,提示要装gox
。- 安装gox:
go get github.com/mitchellh/gox
,指定平台,gox -osarch="linux/amd64"
- 安装gox:
-
继续make,提示
Docker experimental mode needs to be enabled for multi-platform build support. Aborting.
sudo vi /etc/docker/daemon.json
,增加属性"experimental": true
,重启systemctl restart docker
-
继续make,提示
read: connection reset by peer
,如下图:
- 基本判断为镜像拉取失败,手动拉取
docker pull alpine:3.12.0
,解决问题。也可以其他站拉取后,打上tag:docker tag xxxx yyyy
- 基本判断为镜像拉取失败,手动拉取
-
继续make,提示
failed to load LLB: runtime execution on platform linux/arm64/v7 not supported
:
- 查了一些资料,我想了三条路去尝试解决这个问题:1.装qemu,2.修改docker buildx 方式,3.直接修改make配置
- 进行修改前,先调整一下编译速度,
vi dockerfiles/runner-helper/Dockerfile
,把RUN apk add
注释了,等调通了再还原。或者使用mirror:RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
- 装完
sudo yum install qemu-user
,重启,同样的错误。 env DOCKER_CLI_EXPERIMENTAL=enabled docker buildx ls
查看旧的build,然后删除docker buildx rm
、新增一个新的docker buildx create
;然而还是同样的错误。- 现在只能禁止编译
arm/v7
,修改ci/build_helper_docker
,仅当linux/amd64
时,才执行_docker_buildx
,如下修改后,能够跳过。
- 装完
if [[ ${platform} == "linux/amd64" ]];then
trap cleanup_docker_context_trap ERR SIGINT SIGTERM
setup_docker_context
_docker_buildx build \
--platform "${platform}" \
--no-cache \
--output "type=tar,dest=$TARGET_FILE" \
--tag "gitlab/gitlab-runner-helper:$TARGET_ARCH-$REVISION" \
dockerfiles/runner-helper
trap - ERR SIGINT SIGTERM
cleanup_docker_context
fi
- 继续make,
arm
虽然没打镜像,但是会检查镜像是否生成,还是报错。- 直接找到
Makefile.runner_helper.mk
,将TAR_XZ
、BINARIES
的值,仅保留amd64
。 - 最终编译完成。如下图:
- 直接找到
总结下来:
- 安装
gox
- docker开启
experimental
模式 - 提早下好需要的镜像
- Dockerfile中速度慢的指令,使用阿里mirror
- 修改
Makefile.runner_helper.mk
,减少编译量
编译runner
很简单,一个命令source ci/touch_make_dependencies && make runner-bin BUILD_PLATFORMS="-osarch='linux/amd64'"
敲下去,无惊无险,直接成功。
完毕。