如何在 CI 构建中访问多个存储库?

how to access multiple repositories in CI build?

我们有一个由多个(非public)存储库组成的项目。

要构建整个项目,构建系统需要拥有所有存储库(master 个分支)的文件。

有什么方法可以配置 GitLab CI 以提供我需要的存储库?

我想我可以在 CI 构建期间做一个 git fetch 或类似的操作,但是如何处理身份验证呢?

您可以为所有项目添加部署密钥。然后在运行器上配置部署密钥的私钥。在构建过程中使用正常的 git 命令来克隆运行器上的存储库。这可能需要对您的跑步者进行一些配置,但它应该有效。

您可以生成一对 SSH 密钥并在所有运行器上使用它,也可以为每个运行器生成一对密钥。要生成 SSH 密钥对,请遵循 SSH key 文档。私钥应放在 'gitlab-runner' 用户的 .ssh 目录中,以便 git 命令可以在克隆时显示它。 public 密钥应作为部署密钥添加到 GitLab 项目中。在项目设置中添加部署密钥 -> 'Deploy Keys'.

一些解决方法(我讨厌这个词!)对我来说是解决方法:

  1. 使用git submodule,参见https://docs.gitlab.com/ce/ci/git_submodules.html

  2. 重用 $CI_REPOSITORY_URL 由 Gitlab 定义,甚至可以在子 Docker 容器中使用。此环境变量已包含用户名和密码,可用于同一服务器上的另一个存储库。请参阅 .gitlab-ci.yml:

  3. 中的片段
- BASE_URL=`echo $CI_REPOSITORY_URL | sed "s;\/*$CI_PROJECT_PATH.*;;"`
- REPO_URL="$BASE_URL/thirdparty/gtest.git"
- REPO_DIR=thirdparty/gtest
- rm -fr $REPO_DIR
- git clone $REPO_URL $REPO_DIR
  1. 甚至将 URL 和 username\password 存储在 ~/.git-credentials 文件中并配置 git 以使用它通过 credential.helper。所有进一步的 "git clone" 命令都将使用它。
- echo Storing git credentials to be used by "git clone" commands without username and password ...
- GIT_CREDENTIALS_FILE=~/.git-credentials
- BASE_URL=`echo $CI_REPOSITORY_URL | sed "s;\/*$CI_PROJECT_PATH.*;;"`
- echo $BASE_URL > $GIT_CREDENTIALS_FILE
- git config --global credential.helper store --file=$GIT_CREDENTIALS_FILE

但是!

在 CI\CD 领域工作了很多年,我不认为需要将存储库链接为 sources.[=14 是一个好的设计=]

是的,在 Jenkins 或 TeamCity 等经典 CI 工具中,您可以创建一个作业,在不同的子目录中获取多个 Git 存储库。

但我喜欢 GitLab CI 流水线即代码的方式,其中 .gitlab-ci.yml 控制这个 repo 的构建而你不甚至不必考虑获取源代码的整个预构建步骤。 然后这样的构建将发布 binary 工件,下游 projects\repos 可以使用这些工件而不是 sources 的依赖项。它也更快。

关注点分离。

我的 .gitlab-ci.yml 中没有官方方法可以使用另一个项目的工件。但是还有其他方法,例如挂钩 Gitlab API,尽管此类定制解决方案需要维护。

有更好的方法 - publish\fetch 工件 to\from 外部广泛采用的包管理器。 根据您的语言,它可能是 Maven、NuGet、npm、jFrog Artifactory、Nexus 等。 这种方法的另一个优点是开发人员可以在他们的本地构建中遵循相同的过程,如果在 .gitlab-ci.yml

中定义依赖项,这就不容易做到

对于本机代码 (Cxx) 来说这是一个更大的问题,主要是由于二进制接口的兼容性,但是像 Conan.io 等正在慢慢赶上来。

如果你是 运行 gitlab 8.12 或更高版本,权限模型是 reworked。 CI 环境变量 CI_JOB_TOKEN 与这个新的权限模型一起出现。 GitLab 的高级版本将此环境变量用于触发器,但您可以使用它来克隆存储库。

dummy_stage:
  script:
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.instance/group/project.git