如何让gitlab-CI从引用gitlab存储库的依赖项中安装私有Python包

6
这个问题是关于如何管理私有 gitlab python 包及其嵌套依赖关系的访问权限。这里假定所有访问都是通过直接的 git 仓库模式进行,而非私有包存储库。 package-a 存在于一个私有 gitlab 代码库中,并且它依赖于 package-b,后者又依赖于 package-c。这些包同样也存在于私有 gitlab 代码库中。 package-apyproject.toml 文件如下:
[tool.poetry]
name = "package-a"
repository = "https://gitlab.com/org/package_a.git"

[tool.poetry.dependencies]
python = "^3.6"
package-b = {git = "ssh://git@gitlab.com/org/package_b.git", tag = "0.1.0"}

package-b有一个类似于这样的pyproject.toml文件:

[tool.poetry]
name = "package-b"
repository = "https://gitlab.com/org/package_b.git"

[tool.poetry.dependencies]
python = "^3.6"
package-c = {git = "ssh://git@gitlab.com/org/package_c.git", tag = "0.1.0"}

任何在gitlab上拥有正确组织成员身份和ssh密钥的用户都可以使用poetry在开发笔记本电脑的python venv中安装package-a及其依赖项package-b,以及它的依赖项package-c。此外,ssh协议访问也适用于docker构建(具有ssh挂载的实验功能)。
然而,具有私有依赖项的同一项目在gitlab-CI运行器中不会被安装,因为它们缺少ssh访问权限。(是否有安全的方式来启用它?)
假设gitlab-CI运行器必须使用访问令牌来克隆私有gitlab存储库,则对project-a的pyproject.toml文件应用sed脚本,以便gitlab-CI运行器可以克隆package-b以发现它依赖于package-c。sed脚本通过编辑pyproject.toml中project-a的依赖规范来将project-b的ssh更改为https访问。
sed -i -e 's#ssh://git@gitlab.com/org#https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/org#g' pyproject.toml

CI_JOB_TOKEN是由GitLab-CI运行程序提供的环境变量,受GitLab-CI运行程序安全管理。因此,GitLab-CI运行程序现在可以在某个位置克隆project-b仓库。如果同样的sed技巧也能应用于这个project-b仓库的某个位置,那么它可能会起作用,但是现在这已经在poetry的掌握之中,无法触及。所以project-bproject-c具有git+ssh依赖关系,但是GitLab-CI运行程序无法安装project-c,因为它没有git+ssh凭据来克隆它。

因此,在开发和使用具有git+ssh访问权限的笔记本电脑进行Docker构建时,私有包依赖链工作正常,但在GitLab-CI上则全部破损。如何更好地管理所有这些构建环境中的私有包访问?

1个回答

3
这些片段基于以下内容:
ssh-keygen -o -t rsa -b 4096 -C "git@gitlab.com"

# output to something like ~/.ssh/gitlab_ci_rsa
# do not add any passphrase

# once created, copy the private key to the clipboard, e.g.
cat ~/.ssh/gitlab_ci_rsa | base64 -w0 > tmp.txt
xclip -sel clip < tmp.txt 

公钥被用作私有部署密钥,可以从项目设置页面启用,例如: 将私钥粘贴到gitlab-CI变量SSH_PRIVATE_KEY中,gitlab应该能够掩盖它(当它是base64编码时)。然后,.gitlab-ci.yml文件可以使用以下方式将此私钥添加到ssh-agent中:
before_script:
  - apt-get update -y -qq && apt-get install -y -qq git make openssh-client
  - eval $(ssh-agent -s)
  ## Add the SSH key stored in SSH_PRIVATE_KEY variable to the agent store
  - ssh-add <(echo "$SSH_PRIVATE_KEY" | base64 --decode)
  ## Create the SSH directory and give it the right permissions
  - mkdir -p ~/.ssh
  - chmod 700 ~/.ssh
  - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts
  - chmod 644 ~/.ssh/known_hosts

Gitlab文档并不使用base64编码,但将所有私钥复制到变量中是必要的,这样可以避免在ssh-add时提示输入密码。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接