我正在尝试让 gitlab 的 CI 与外部子模块一起正常工作。
- 我在另一个存储库中有一个子模块,所以没有相对路径。
- 我不想使用 SSH key 解决方案。
- 我想使用 CI token (CI_JOB_TOKEN)。
文档不明确,因为什么是可能的,什么是不可能的,已经改变了,到处都是文本,有许多不同的方法,但没有一个符合基本标准。
过去,如果子模块有绝对路径,则无法使用 CI 拉取子模块,因此人们想出了各种解决方案。然后它成为可能,并且有一些关于身份验证问题的解决方案。 但它们都涉及做一个不再需要的克隆,因为现在我们可以设置 CI 来做一个递归池。
这意味着大多数在线帖子都变得无关紧要和过时了,答案到处都是,但几个小时后,没有一个对我有用。变量: GIT_SUBMODULE_STRATEGY:递归
有用的是创建一个全局管理 key ,允许访问所有内容,但这根本不是一个好的解决方案。
我现在拥有的是:
variables:
GIT_SUBMODULE_STRATEGY: recursive
before_script:
- git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/".insteadOf "git@gitlab.com:"
- git submodule sync && git submodule update --init
其中,根据Getting GitLab CI to clone private repositories应该可以。
但它失败了:
fatal: could not read Username for 'https://gitlab.com': No such device or address
最佳答案
我设置了 GIT_SUBMODULE_STRATEGY: none
并重写了子模块 URL,以使用 HTTPS 和创建的访问/部署 token ,仅允许读取子模块的存储库。在 .gitlab-ci.yaml
中是这样的:
image: docker:stable
variables:
GIT_STRATEGY: clone
# don't clone submodules by default
GIT_SUBMODULE_STRATEGY: none
someJob:
tags:
- docker-priv
before_script:
- apk update
- apk add git
- git --version
- git config --global url."https://${ACCESS_TOKEN_XYZ_NAME}:${ACCESS_TOKEN_XYZ}@GITLAB-HOST/GROUP/XYZ.git".insteadOf git@GITLAB-HOST/GROUP/XYZ.git
- git config --global url."https://${ACCESS_TOKEN_XYZ_NAME}:${ACCESS_TOKEN_XYZ}@GITLAB-HOST/GROUP/XYZ.git".insteadOf https://GITLAB-HOST/GROUP/XYZ.git
- git submodule sync --recursive
- git submodule update --init --recursive
请注意,gitlab 中部署 token 的默认名称使用 +
符号,因此在存储为 CI 变量以供上述使用时需要进行 url 编码。您可以使用一个变量 (gitlab%2Breadonly-token-name-123:randomtokenvalue
) 而不是两个,以使其更易于阅读。
关于gitlab - 任何人都可以发布具有外部子模块的 GitLab CI 的工作示例吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58040183/