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

标签 gitlab gitlab-ci gitlab-ci-runner

我正在尝试让 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/

相关文章:

docker - 如何在 dockerfile 中使用来自 gitlab-ci.yml 的变量

gitlab - “gitlab-runner”意外地以 root 身份运行

node.js - Gitlab CI/CD : Cannot find module: 'src/css/index.css' . 确保已安装此软件包

azure - 是否可以为 Azure Snowflake DB 创建 GitLab CICD 管道?

gitlab - 如何仅运行 Gitlab-CI 管道分支和标签?

linux - RHEL 6 上的 gitlab 7.7.2 ldap 配置

docker - 如何在 Gitlab-CI Runner 上下文中连接到 Apache?

java - Gitlab 批准 merge 请求

mongodb - 如何在docker镜像中访问mongorestore/mongodump

docker - Gitlab-CI DinD 不会启动