序言
当格陵兰岛的雪山上还在漫天飞雪时,我已经安静的坐在空调房里,吹起了冰爽的风。为了满足组内的代码仓库实时编译的需求,我不得不部署了N个gitlab runner,来实现代码的编译工作。
当然编译代码是个很简单的事情,只需要我们了解我们的代码类型,然后选择适合他们的编译命令即可。
而难住我的不是这个,而是子模块的下载。
1. 拉取子模块
什么是git子模块?
子模块就是允许你将一个 Git 仓库作为另一个 Git 仓库的子目录。 它能让你将另一个仓库克隆到自己的项目中,同时还保持提交的独立。为了拉取子模块,我们需要在流水线里配置子模块相关的变量即可,主要是.gitmodules文件,具体内容可以参考第三节。
如下所示是ci的配置:
variables:
GIT_SUBMODULE_STRATEGY: normal
GIT_SUBMODULE_DEPTH: 1
这样的配置,就是在告诉Gitlab的runner,在拉取代码时,顺便拉取下子模块。
2. 自签名问题
碰到的第一个问题就是因为我采用了https方式部署的gitlab,而签名证书使用的是自签名证书,那反馈的问题也是自签名不识别。
Synchronizing submodule url for 'apiserver'
Cloning into 'E:/GitLab-Runner/builds/BXnNsKsZ/0/apiserver'...
fatal: unable to access 'https://192.168.1.185/apiserver.git/': SSL certificate problem: self signed certificate
要解决自签名,我们需要登录到runner运行的服务器,配置证书。
这里分两种情况:windows runner 和 docker runner
2.1 windows runner
1.在Git Bash 窗口,键入 git config –list
查看证书地址,找Http.sslcainfo
2.增加git证书到这个证书内
$ cat d:/WorkSpace/git.crt >> "d:/Program Files (x86)/Git/mingw64/ssl/certs/ca-bundle.crt"
注意: d:/WorkSpace/git.crt
是我的证书放的位置,你更换成你的地址即可。
2.2 docker下的runner
docker下运行runner,一般会映射一个配置目录,如下
docker run -d --name gitlab-runner2 --restart always -v /home/gitrunner/config2:/etc/gitlab-runner -v /var/run/docker.sock:/var/run/docker.sock runnerwithcert:latest
如果是这样,就可以修改config.toml文件了。
$ cat config.toml
# 以下是文件内容
concurrent = 1
check_interval = 0
shutdown_timeout = 0
[session_server]
session_timeout = 1800
[[runners]]
name = "runner"
url = "https://192.168.1.185/"
id = 3
token_obtained_at = 2023-03-16T06:48:52Z
token_expires_at = 0001-01-01T00:00:00Z
tls-ca-file = "/etc/gitlab-runner/git.crt"
executor = "docker"
[runners.cache]
MaxUploadedArchiveSize = 0
[runners.docker]
tls_verify = false
image = "maven:latest"
privileged = false
disable_entrypoint_overwrite = false
oom_kill_disable = false
disable_cache = false
volumes = ["/cache"]
shm_size = 0
这里,主要增加配置项 tls-ca-file 和 tls_verify = false。
3. 配置子模块为相对位置
经过这些操作后,依然会有错误,那么这里主要是认证错误,如下:
fatal: could not read Username for 'https://192.168.1.185': No such device or address
这里需要考虑子模块配置修改为相对路径。
修改。gitmodules 文件代码如下:
[submodule "src/views/abc"]
path = src/views/abc
# url = https://192.168.1.185/abc.git
url = ../abc.git
branch = main
依据仓库的位置,修改url为合适的相对路径。
如果出现类似这样的错误,大概率是路径设置错了。
fatal: unable to update url base from redirection:
asked for: https://gitlab-ci-token:[MASKED]@192.168.1.185/abc.git/info/refs?service=git-upload-pack
redirect: https://192.168.1.185/users/sign_in
4. 增加拉取子模块的权限
虽然我们配置了上述步骤,依然在ci运行后得到了错误,这个时候就是考研耐心的时候,我们还有重要的一步需要去做。
对照错误如下:
remote: The project you were looking for could not be found or you don't have permission to view it.
因为ci使用 gitlab-ci-token
进行拉取仓库,因此必须给予权限才能拉取到子模块。
我们在gitlab内导航到配置页面(仓库页面的设置 > CI/CD),
在输入框内填入项目名称,然后点击 增加项目,就可以给予权限了。
什么,添加不上去!!!
这个地址是有格式要求的,哎,就是项目顶端的导航,例如:
某项目是: A> B> C>d
那么我们就输入: A\B\C\d 就可以了。注意不要有空格,有空格也不认识。
再次运行ci,如果能看到如下内容,就配置成功了!
Updating/initializing submodules with git depth set to 1...
Synchronizing submodule url for 'abc'
Entering 'abc'
结语
反正自己走过的弯路,就不希望其他人再走了,技术分享就是这么纯粹!
👓都看到这了,还在乎点个赞吗?
👓都点赞了,还在乎一个收藏吗?
👓都收藏了,还在乎一个评论吗?