先说下背景,一个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运行时生成的。参考如下链接:
在每次CI执行前,先清理一下相关.insteadOf的git config,再build尝试多次后没再出现问题,特此记录。
博主友情提示:
如您在评论中需要提及如QQ号、电子邮件地址或其他隐私敏感信息,欢迎使用>>博主专用加密工具v3<<处理后发布,原文只有博主可以看到。