我们有一个由多个(非公共)存储库组成的项目。
要构建整个项目,构建系统需要拥有所有存储库(master
分支)的文件。
我有没有办法配置GitLab CI来提供我需要的存储库?
我想我可以在CI构建期间执行git fetch
或类似操作,但是如何处理身份验证呢?
答案 0 :(得分:44)
如果您运行的是gitlab版本8.12或更高版本,则权限模型为reworked。随着这个新的权限模型,CI环境变量CI_JOB_TOKEN
出现。 GitLab的高级版本将此环境变量用于触发器,但您可以使用它来克隆repos。
dummy_stage:
script:
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.instance/group/project.git
答案 1 :(得分:8)
为我解决了几个变通办法(我讨厌这个词!)
使用git submodule
,请参阅https://docs.gitlab.com/ce/ci/git_submodules.html
重新使用Gitlab定义的 $ CI_REPOSITORY_URL ,甚至可以在子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
- 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方式的Pipeline As Code,其中.gitlab-ci.yml控制着这个非常回购的构建,你甚至不需要考虑获取源代码的整个预构建步骤。 然后这样的构建将发布二进制工件,下游项目\ repos可以使用那些而不是来源的依赖项。它也更快。
关注点分离。
我的.gitlab-ci.yml中没有官方方法可以使用其他项目的工件。但是还有其他方法,比如钩子,Gitlab API,虽然这种定制的解决方案需要维护。
有更好的方法 - 将\ fetch工件发布到外部广泛采用的Package Manager中。 根据您的语言,它可能是Maven,NuGet,npm,jFrog Artifactory,Nexus等。 此方法的另一个优点是开发人员可以在其本地构建中遵循相同的过程,如果在.gitlab-ci.yml
中定义了依赖项,则不容易完成对于本机代码(Cxx)来说,这是一个更大的问题,主要是由于二进制接口的兼容性,但像Conan.io等正在慢慢追赶。
答案 2 :(得分:4)
您可以为所有项目添加部署密钥。然后在运行器上配置部署密钥的私钥。在构建过程中使用普通的git命令来克隆运行器上的存储库。这可能需要在跑步者身上进行一些配置,但它应该有效。
您可以生成一个SSH密钥对,并在所有参与者上使用该密钥对,也可以为每个参与者生成一个密钥对。要生成SSH密钥对,请遵循SSH key文档。私钥应放在'gitlab-runner'用户的.ssh
目录中,以便git
命令可以在克隆时显示它。应将公钥作为部署密钥添加到GitLab项目中。在项目设置中添加部署密钥 - > '部署密钥'。