任何人都可以 post 具有外部子模块的 GitLab CI 的工作示例吗?

Can anyone post a working example of GitLab CI that has external submodules?

我正在尝试让 gitlab 的 CI 与外部子模块一起正常工作。

文档不明确,因为什么是可能的,什么是不可能的,已经改变了,到处都是文本,有许多不同的方法,但没有一个符合基本标准。

以前是无法拉取子模块的,CI,如果有绝对路径的话,大家想出了各种办法。然后它成为可能,并且有一些关于身份验证问题的解决方案。 但它们都涉及做一个不再需要的克隆,因为现在我们可以设置 CI 来做一个递归池。

这意味着大多数在线帖子都变得无关紧要和过时了,答案到处都是,但几个小时后 none 已经为 me.variables 工作了: GIT_SUBMODULE_STRATEGY:递归

有用的是创建一个全局管理密钥,允许访问所有内容,但这根本不是一个好的解决方案。

我现在拥有的是:

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 和创建的 access/deploy 令牌,仅允许读取子模块的存储库。 .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 中部署令牌的默认名称使用 + 符号,因此在存储为 CI 变量时需要进行 url 编码以供上述使用。您可以使用一个变量 (gitlab%2Breadonly-token-name-123:randomtokenvalue) 而不是两个,以使其更易于阅读。