获取GitLab CI以克隆私有存储库

dan*_*oks 38 ssh continuous-integration gitlab gitlab-ci gitlab-ci-runner

我设置了GitLab和GitLab CI来托管和测试我的一些私人回购.对于我在这个系统下的作曲家模块,我设置了Satis来解析我的私人包.

显然这些私有包需要一个ssh密钥来克隆它们,我在终端中工作 - 我可以运行composer install并获取这些包,只要我ssh-add在shell中添加了密钥.

但是,当在GitLab CI中运行我的测试时,如果项目具有任何这些依赖项,则测试将无法完成,因为我的GitLab实例需要身份验证才能获得deps(显然),并且测试失败了Host key verification failed.

我的问题是如何设置它以便当跑步者运行测试时它可以在没有密码的情况下对gitlab进行身份验证?我已经尝试在我的runners ~/.ssh文件夹中放置一个无密码的ssh-key ,但是构建甚至不会添加密钥,"eval ssh-agent -s"后面跟ssh-add似乎没有说代理没有运行...

toc*_*och 42

这里有一个完整的指南:

一般设计

  • 生成一对SSH密钥
  • 将私有一个添加为项目的安全环境变量
  • 使私有版本可用于GitLab-CI上的测试脚本
  • 将public one添加为每个私有依赖项的部署密钥

生成一对公钥和私钥SSH密钥

生成一对没有密码的公钥和私钥SSH密钥:

ssh-keygen -b 4096 -C "<name of your project>" -N "" -f /tmp/name_of_your_project.key
Run Code Online (Sandbox Code Playgroud)

将私有SSH密钥添加到项目中

您需要将密钥作为安全环境变量添加到项目中,如下所示:

  • 浏览 https://<gitlab_host>/<group>/<project_name>/variables
  • 点击"添加变量"
  • 填写文本字段KeySSH_PRIVATE_KEY
  • Value使用私有SSH密钥本身填充文本字段
  • 点击"保存更改"

将私有SSH密钥公开给您的测试脚本

为了使您的私钥可用于您的测试脚本,您需要将以下内容添加到您的.gitlab-ci.yml文件中:

before_script:
  # install ssh-agent
  - 'which ssh-agent || ( apt-get update -y && apt-get install openssh-client -y )'
  # run ssh-agent
  - eval $(ssh-agent -s)
  # add ssh key stored in SSH_PRIVATE_KEY variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY")
  # disable host key checking (NOTE: makes you susceptible to man-in-the-middle attacks)
  # WARNING: use only in docker container, if you use it with shell you will overwrite your user's ssh config
  - mkdir -p ~/.ssh
  - echo -e "Host *\n\tStrictHostKeyChecking no\n\n" > ~/.ssh/config
Run Code Online (Sandbox Code Playgroud)

Code Snippet来自GitLab文档

将公共SSH密钥作为部署密钥添加到所有私有依赖项

您需要将公共SSH密钥作为部署密钥注册到所有私有依赖项,如下所示:

  • 浏览 https://<gitlab_host>/<group>/<dependency_name>/deploy_keys
  • 点击"新部署密钥"
  • Title使用项目名称填充文本字段
  • Key使用公共SSH密钥本身填充文本字段
  • 点击"创建部署密钥"


Mar*_* A. 21

我发布这个作为答案,因为其他人不完全清楚和/或详细的恕我直言

从GitLab 8.12+开始,假设子模块repo与请求它的服务器位于同一服务器中,您现在可以:

  1. 像往常一样用git子模块设置repo(git submodule add git@somewhere:folder/mysubmodule.git)

  2. 修改您的.gitmodules文件如下

    [submodule "mysubmodule"]
      path = mysubmodule
      url = ../../group/mysubmodule.git
    
    Run Code Online (Sandbox Code Playgroud)

    其中`../../group/mysubmodule.git'是从您的存储库到子模块的相对路径.

  3. 添加以下行 gitlab-ci.yml

    variables:
      GIT_SUBMODULE_STRATEGY: recursive
    
    Run Code Online (Sandbox Code Playgroud)

    指示运行器在构建之前获取所有子模块.

警告:如果您的跑步者似乎忽略了该GIT_SUBMODULE_STRATEGY指令,您应该考虑更新它.

(来源:https://docs.gitlab.com/ce/ci/git_submodules.html)

  • 我不赞成这种方法,因为我认为Gitlab不应该强迫我以特定方式配置子模块。我更喜欢[使用Gitlab令牌并将配置保存在`.gitlab-ci.yml`中](/sf/answers/3763098111/)。 (2认同)

a54*_*4jh 15

如果您不想使用ssh键或子模块,可以在git的配置中覆盖repo以使用作业令牌进行身份验证(in gitlab-ci.yml):

before_script:
  - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.example.com/group/repo.git".insteadOf git@gitlab.example.com:group/repo.git
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案是最优雅的。它与dockerized的GitLab Community Edition 11.6.4一起使用 (2认同)

Dun*_*nes 6

目前接受的答案嵌入Gitlab特殊要求到我的.gitmodules文件。这将强制进行本地开发的特定目录布局,并使向另一个版本控制平台的迁移变得复杂。

取而代之的是,我遵循了贾德琳回答中的建议。这是一个更完整的答案。

我的.gitmodules文件包含以下内容:

[submodule "myproject"]
    url = git@git.myhost.com:mygroup/myproject.git
Run Code Online (Sandbox Code Playgroud)

在我的gitlab-ci.yml我有以下几点:

build:
  stage: build
  before_script:
    - git config --global url."https://gitlab-ci-token:${CI_JOB_TOKEN}@git.myhost.com/".insteadOf "git@git.myhost.com:"
    - git submodule sync && git submodule update --init
Run Code Online (Sandbox Code Playgroud)

由于我们正在从SSH身份验证映射到HTTPS,因此尾随/和在行:中至关重要git config。这使我绊了一段时间,出现“ 非法端口号 ”错误。

我喜欢此解决方案,因为它将特定于Gitlab的需求嵌入到特定于Gitlab的文件中,其他所有文件均将其忽略。

  • 为了避免其他人犯同样的愚蠢模式匹配错误,对于gitlab.com上托管的项目,请使用git config --global url。“ https:// gitlab-ci-token:$ {CI_JOB_TOKEN} @ gitlab.com / “ .insteadOf” git@gitlab.com:“` (3认同)

Jud*_*ing 5

我使用了部署令牌来解决此问题,因为为测试运行程序设置SSH密钥似乎有些麻烦。

git clone http://<username>:<deploy_token>@gitlab.example.com/tanuki/awesome_project.git
Run Code Online (Sandbox Code Playgroud)

部署令牌是每个项目的只读信息。