gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 04:10:25 27 4
gpt4 key购买 nike

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

package-a在私有(private) gitlab 存储库中,它取决于 package-b , 这取决于 package-c它们也在一个私有(private)的 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"}

任何拥有 org 权限的用户gitlab 的成员(member)资格和 ssh key 可以使用 poetry安装 package-a它依赖于 package-b然后它依赖于 package-c ,全部进入开发笔记本电脑上的 python venv。 ssh协议(protocol)访问也适用于 docker 构建(具有用于 ssh 挂载的实验性功能)。

但是,具有私有(private)依赖项的相同项目不会安装在 gitlab-CI 运行器中,因为它们缺少 ssh 访问权限。 (有什么安全的方法可以启用它吗?)

假设 gitlab-CI 运行器必须使用访问 token 来克隆私有(private) gitlab 存储库,一个 sed脚本应用于 pyproject.toml project-a 的文件, 所以 gitlab-CI runner 可以克隆 package-b发现它依赖于package-c ; sed脚本将 project-b 的 ssh 更改为 https 访问通过编辑 project-a pyproject.toml 中的依赖规范,即

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 runner 安全管理。所以,gitlab-CI runner 现在可以克隆 project-b存储库某处。如果可以将相同的 sed 技巧应用于此 project-b,它可能会起作用存储库 某处,但现在掌握在 poetry 手中它不能被触摸。所以project-bproject-c 有 git+ssh 依赖gitlab-CI runner 安装失败 project-c因为它没有 git+ssh 凭据来克隆它。

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

最佳答案

这些片段基于:

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

公钥用作私有(private)部署 key ,这是从项目设置页面启用的,例如

私钥粘贴到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 提示输入密码。

关于python - gitlab-CI 如何从也引用 gitlab 存储库的 gitlab 依赖项安装私有(private) python 包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56371322/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com