gitlab-CI如何从也引用gitlab存储库的gitlab依赖项安装私有python软件包

时间:2019-05-30 03:44:21

标签: python git package private gitlab-ci

这个问题是关于如何管理对其他私有gitlab软件包具有嵌套依赖关系的私有gitlab python软件包的访问。假设所有访问都是通过直接git存储库模式而不是私有软件包存储库进行的。

package-a位于私有gitlab存储库中,它取决于package-b,后者取决于package-c,它们也位于私有gitlab存储库中。

package-a具有这样的pyproject.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上拥有正确org成员身份并且使用ssh键的用户都可以使用poetry安装package-a,它依赖于package-b,然后依赖于{ {1}},全部放入开发笔记本电脑上的python venv中。 package-c协议访问权也适用于Docker构建(具有用于ssh挂载的实验功能)。

但是,具有私有依赖项的相同项目未安装在gitlab-CI运行程序中,因为它们缺乏ssh访问权限。 (是否有启用此功能的安全方法?)

假设gitlab-CI运行程序必须必须使用访问令牌来克隆私有gitlab存储库,ssh脚本将应用于{{1} },因此gitlab-CI运行程序可以克隆sed来发现它依赖于pyproject.toml; project-a脚本通过编辑package-b中的package-c依赖关系规范(即

),将ssh更改为sed的https访问权限。
project-b

CI_JOB_TOKEN是gitlab-CI运行程序提供的环境变量。它由gitlab-CI运行程序安全地管理。因此,gitlab-CI运行程序现在可以在{em> somewhere 中克隆project-a存储库。如果可以将相同的sed技巧应用于此pyproject.toml存储库某处,那么它就可以了,但是现在已由sed -i -e 's#ssh://git@gitlab.com/org#https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/org#g' pyproject.toml 掌握,无法被使用。因此,project-bproject-b具有git + ssh依赖性,并且gitlab-CI运行程序无法安装poetry,因为它没有git + ssh凭据来克隆它。

因此,私有软件包依赖项链可用于开发,并且docker可在具有git + ssh访问权限的笔记本电脑上构建,但在gitlab-CI上均已损坏。在所有这些构建环境中管理私有软件包访问的更好的做法是什么?

1 个答案:

答案 0 :(得分:0)

这些摘录基于:

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提示输入密码短语。