【发布时间】:2019-05-30 03:44:20
【问题描述】:
这个问题是关于如何管理对其他私有 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-key 的用户都可以使用 poetry 来安装 package-a,它依赖于 package-b,然后它依赖于 package-c,全部进入 python venv在开发笔记本电脑上。 ssh 协议访问也适用于 docker 构建(具有 ssh 挂载的实验性功能)。
但是,具有私有依赖项的相同项目未安装在 gitlab-CI 运行器中,因为它们缺乏 ssh 访问权限。 (有什么安全的方法可以实现吗?)
假设 gitlab-CI 运行器必须使用访问令牌来克隆私有 gitlab 存储库,sed 脚本应用于pyproject.toml 文件project-a,所以 gitlab- CI runner 可以克隆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 runner 提供的环境变量。它由 gitlab-CI 运行器安全地管理。因此,gitlab-CI 运行器现在可以克隆project-b 存储库somewhere。如果可以将相同的 sed 技巧应用于此 project-b 存储库somewhere,它可能会起作用,但现在它在 poetry 手中,无法触及。所以 project-b 对 project-c 有一个 git+ssh 依赖,而 gitlab-CI 运行器无法安装 project-c,因为它没有 git+ssh 凭据来克隆它。
因此,私有包依赖链适用于具有 git+ssh 访问权限的笔记本电脑上的开发和 docker 构建,但在 gitlab-CI 上这一切都被破坏了。在所有这些构建环境中管理这种私有包访问的更好做法是什么?
【问题讨论】:
标签: python git package private gitlab-ci