Gitlab Runner 的分布式缓存实战
环境和版本信息
本次实战涉及到多个服务,下面给出它们的版本信息供您参考:
GitLab:Community Edition 13.0.6
GilLab Runner:13.1.0
kubernetes:1.15.3
Harbor:1.1.3
Minio:2020-06-18T02:23:35Z
Helm:2.16.1
部署分布式缓存
minio 是兼用 S3 的分布式缓存,也是官方推荐使用的,如下图:
minio 作为一个独立的服务部署,我将用 docker 部署在服务器:192.168.50.43
在服务器上准备两个目录,分别存储 minio 的配置和文件,执行以下命令:
mkdir -p /var/services/homes/zq2599/minio/gitlab_runner \
&& chmod -R 777 /var/services/homes/zq25
99/minio/gitlab_runner \
&& mkdir -p /var/services/homes/zq2599/minio/config \
&& chmod -R 777 /var/services/homes/zq2599/minio/config
执行 docker 命令创建 minio 服务,指定服务端口是 9000,并且指定了 access key(最短三位)和 secret key(最短八位):
sudo docker run -p 9000:9000 --name minio \
-d --restart=always \
-e "MINIO_ACCESS_KEY=access" \
-e "MINIO_SECRET_KEY=secret123456" \
-v /var/services/homes/zq2599/minio/gitlab_runner:/gitlab_runner \
-v /var/services/homes/zq2599/minio/config:/root/.minio \
minio/minio server /gitlab_runner
浏览器访问,输入 access key 和 secret key 后登录成功:
如下图,点击红框中的图标,创建一个 bucket,名为 runner:
至此,minio 已备好,接下来在 GitLab Runner 上配置;
GitLab Runner 上配置缓存
我这里是用 helm 部署的 GitLab Runner,因此修改的是 helm 的 value 配置,如果您没有用 helm,可以参考接下来的操作直接去配置 config.toml 文件;
helm 下载了 GitLab Runner 的包后,解开可见配置信息如下:
打开 values.yaml,找到 cache 的配置,当前 cache 的配置如下图,可见值为空内容的大括号,其余信息全部被注释了:
修改后的 cache 配置如下图,红框 1 中原先的大括号已去掉,红框 2 中的是去掉了注释符号,内容不变,红框 3 中填写的是 minio 的访问地址,红框 4 中的是去掉了注释符号,内容不变:
上图红框 4 中的 s3CacheInsecure 参数等于 false 表示对 minio 的请求为 http(如果是 true 就是 https),但实际证明,当前版本的 chart 中该配置是无效的,等到运行时还是会以 https 协议访问,解决此问题的方法是修改 templates 目录下的_cache.tpl 文件,打开此文件,找到下图红框中的内容:
将上图红框中的内容替换成下面红框中的样子,即删除原先的 if 判断和对应的 end 这两行,直接给 CACHE_S3_INSECURE 赋值:
以上只是 cache 相关的配置,helm 部署 GitLab Runner 的其他设置还请自行处理,所有设置完成后回到 values.yam 所在目录,执行以下命令即可创建 GitLab Runner:
helm install \
--name-template gitlab-runner \
-f values.yaml . \
--namespace gitlab-runner
配置完毕,启动 Riglab Runner 成功后,一起来验证一下;
验证
在 GitLab 仓库中,增加名为.gitlab-ci.yml 的文件,内容如下:
设置执行镜像
image: busybox:latest
整个 pipeline 有两个 stage
stages:
build
test
定义全局缓存,缓存的 key 来自分支信息,缓存位置是 vendor 文件夹
cache:
key: ${CI_COMMIT_REF_SLUG}
paths:
vendor/
before_script:
echo "Before script section"
after_script:
echo "After script section"
build1:
stage: build
tags:
k8s
script:
echo "将内容写入缓存"
echo "build" > vendor/hello.txt
test1:
stage: test
script:
echo "从缓存读取内容"
cat vendor/hello.txt
提交上述脚本到 GitLab,如下图,可见 pipeline 会被触发,状态为 pending 是因为正在等待 runner 创建 executor pod:
评论