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

Udo*_*o G 36 gitlab gitlab-ci

我们有一个由多个(非公共)存储库组成的项目.

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

有没有办法配置GitLab CI来提供我需要的存储库?

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

小智 100

如果您运行的是gitlab版本8.12或更高版本,则会重新设置权限模型.随着这个新的权限模型出现CI环境变量CI_JOB_TOKEN.GitLab的高级版本将此环境变量用于触发器,但您可以使用它来克隆repos.

dummy_stage:
  script:
    - git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.instance/group/project.git
Run Code Online (Sandbox Code Playgroud)

  • 这应该被接受为正确答案。带有SSH密钥的是hack。 (11认同)
  • 请注意,上面的示例中已正确记录,在 GitLab url 中,实例和组之间的分隔符必须是斜杠 (...gitlab.instance<b>/</b>group/project.git)并且 **不是** 冒号 (...gitlab.instance<b>:</b>group/project.git) 以便克隆成功。存储库的 SSH URL 采用后一种形式,导致错误地使用该格式。 (5认同)
  • 目标存储库(正在克隆)应将源存储库(正在运行的管道)列入允许列表中,以便 CI_JOB_TOKEN 能够访问它。更多详细信息请参见:https://docs.gitlab.com/ee/ci/jobs/ci_job_token.html#add-a-project-to-the-job-token-scope-allowlist (2认同)

Iva*_*van 10

几个解决方法(我讨厌这个词!)为我解决了这个问题:

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

  2. 重新使用$ CI_REPOSITORY_URL通过Gitlab和可用甚至里面的孩子Docker容器定义.此env var已包含用户名和密码,可用于同一服务器上的另一个repo.请参阅.gitlab-ci.yml的片段:

- 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. 甚至将带有username\password的URL存储在〜/ .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领域花了几年时间,我认为这不是一个好的设计,需要链接存储库作为.

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

但是我喜欢GitLab CI作为管道代码的方式,其中.gitlab-ci.yml控制着这个非常仓库的构建,你甚至不必考虑获取源代码的整个预构建步骤.然后这样的构建将发布二进制工件,下游项目\ repos可以使用那些而不是依赖.它也更快.

关注点分离.

我的.gitlab-ci.yml中没有正式的方法来使用另一个项目的工件.但是还有其他方法,比如钩子,Gitlab API,虽然这种定制解决方案需要维护.

有更好的方法 - 从外部广泛采用的软件包管理器中将\ fetch工件发布到\.根据您的语言,它可能是Maven,NuGet,npm,jFrog Artifactory,Nexus等.此方法的另一个优点是开发人员可以在其本地构建中遵循相同的过程,如果在.gitlab中定义依赖项,则不容易完成-ci.yml

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


Dre*_*ing 7

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

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

  • 也许自 2015 年以来情况发生了变化,但在 Gitlab.com 上,跑步者似乎以“root”身份运行内容。在我的例子中没有 `gitlab-runner` 用户。 (2认同)