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

Dar*_*ber 5 python git private package gitlab-ci

这个问题是关于如何管理对其他私有 gitlab 包具有嵌套依赖关系的私有 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"}
Run Code Online (Sandbox Code Playgroud)

package-bpyproject.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"}
Run Code Online (Sandbox Code Playgroud)

任何org在 gitlab 上拥有正确成员资格和 ssh-key 的用户都可以poetry用来安装package-a,它依赖于package-b,然后依赖于package-c,所有这些都在开发笔记本电脑上的 python venv 中。的ssh协议访问方法也适用于搬运工构建(与实验为特征的ssh坐骑)。

但是,在 gitlab-CI runners 中没有安装具有私有依赖项的相同项目,因为它们缺乏 ssh 访问权限。(是否有任何安全的方法来启用它?)

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

sed -i -e 's#ssh://git@gitlab.com/org#https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/org#g' pyproject.toml
Run Code Online (Sandbox Code Playgroud)

CI_JOB_TOKEN 是 gitlab-CI runner 提供的环境变量。它由 gitlab-CI runner 安全管理。因此,gitlab-CI runner 现在可以在某处克隆project-b存储库。如果可以将相同的 sed 技巧应用于此存储库的某个地方,它可能会起作用,但是现在掌握在手中并且无法触及。所以有一个 git+ssh 依赖,并且 gitlab-CI runner 无法安装,因为它没有 git+ssh 凭据来克隆它。project-bpoetryproject-bproject-cproject-c

因此,私有包依赖链适用于具有 git+ssh 访问权限的笔记本电脑上的开发和 docker 构建,但它在 gitlab-CI 上都被破坏了。在所有这些构建环境中管理此私有包访问的更好做法是什么?

Dar*_*ber 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 
Run Code Online (Sandbox Code Playgroud)

公钥用作私有部署密钥,可以从项目设置页面启用,例如

私钥被粘贴到 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
Run Code Online (Sandbox Code Playgroud)

gitlab 文档不使用base64编码,但将所有私钥复制到变量中至关重要,这样可以避免 ssh-add 提示输入密码。