GitLab内置CI runner初始化submodule子模块报错问题的一种原因

先说下背景,一个gitlab的代码项目,其中以submodule方式引用了同gitlab实例里其他group内的项目,.gitmodules文件内容类似这样:

[submodule "lib1"]
	path = lib1
	url = http://gitlab.xxx.xxx/group1/lib1.git
[submodule "lib2"]
	path = lib2
	url = http://gitlab.xxx.xxx/group2/lib2.git
[submodule "lib3"]
	path = lib3
	url = http://gitlab.xxx.xxx/group3/lib3.git

这个结构在本地开发时子模块管理操作没有任何问题,当然本地的gitlab账号是有依赖的几个子模块代码仓库访问权限的。而在搭建项目CI构建环境时,linux系统使用的是gitlab的docker runner方式,没有任何问题,而在mac系统却遇到了无法初始化submodule的错误问题(使用的是shell runner方式):

$ git submodule sync –recursive

Synchronizing submodule url for ‘lib1’

Synchronizing submodule url for ‘lib2’

Synchronizing submodule url for ‘lib3’

Synchronizing submodule url for ‘lib4’

$ git submodule update –init –recursive

Cloning into ‘/Users/mac/gitlab-runner/builds/dYrBzARdn/0/…’…

remote: HTTP Basic: Access denied

fatal: Authentication failed for ‘…’

fatal: clone of ‘…’ into submodule path ‘/Users/mac/gitlab-runner/builds/dYrBzARdn/0/…’ failed

Failed to clone ‘dep/lib1’. Retry scheduled

这个问题在网上查到了一种说法是需要通过:

git config –global url.”http://gitlab-ci-token:${CI_JOB_TOKEN}@${CI_SERVER_HOST}/group1/lib1.git”.insteadOf http://gitlab.xxx.xxx/group1/lib1.git

这种方式嵌入gitlab CI的鉴权信息,测试了下,发现一开始确实ok,但是过一段时间又开始报子模块更新鉴权相关错误,花了很多时间研究,最后意识到问题出在shell runner上,由于这种runner实际就是直接在CI机器上不断运行build,所以上面的git config在每次执行时都会在git config中生成一个本次TOKEN等变量实际值的config项,而要替换的源url都是一样的,这样就造成了随机混乱情况,导致token用的可能是已经过期的之前CI运行时生成的。参考如下链接:

https://stackoverflow.com/questions/79359811/how-to-use-git-config-unset-all-with-a-regex-to-remove-many-keys

在每次CI执行前,先清理一下相关.insteadOf的git config,再build尝试多次后没再出现问题,特此记录。

博主友情提示:

如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。