我们有一个由多个(非公共)存储库组成的项目.
要构建整个项目,构建系统需要拥有所有存储库(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)
Iva*_*van 10
几个解决方法(我讨厌这个词!)为我解决了这个问题:
使用git submodule
,请参阅https://docs.gitlab.com/ce/ci/git_submodules.html
重新使用$ 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
- 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等等正在慢慢追赶.
您可以为所有项目添加部署密钥。然后在运行器上配置部署密钥的私钥。在构建过程中使用普通的 git 命令来克隆运行器上的存储库。这可能需要对您的跑步者进行一些配置,但它应该可以工作。
您可以生成一个 SSH 密钥对并在所有运行程序上使用它,也可以为每个运行程序生成一个密钥对。要生成 SSH 密钥对,请遵循SSH 密钥文档。私钥应该放在 'gitlab-runner' 用户的.ssh
目录中,以便git
命令可以在克隆时显示它。公钥应该作为部署密钥添加到 GitLab 项目中。在项目设置 -> 'Deploy Keys' 中添加部署密钥。
归档时间: |
|
查看次数: |
27777 次 |
最近记录: |