这个问题是关于如何管理对其他私有gitlab包的嵌套依赖的私有gitlab python包的访问。这假设所有的访问都是通过直接的git存储库模式,而不是私有的包存储库。
package-a
位于私有的gitlab存储库中,它依赖于依赖于package-c
的package-b
,它们也位于私有的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
脚本应用于project-a
的pyproject.toml
文件,以便gitlab-CI运行者可以克隆package-b
以发现它依赖于package-c
;sed
脚本通过编辑project-b
中的project-a
依赖规范将pyproject.toml
更改为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 runner现在可以在某处克隆project-b
存储库。如果可以在某个地方将同样的sed技巧应用于这个project-b
存储库,那么它可能会起作用,但它现在掌握在poetry
手中,不能碰它。所以project-b
对project-c
有一个git+ssh依赖,gitlab-CI运行器无法安装project-c
,因为它没有克隆它的git+ssh凭证。
因此,私有包依赖链适用于在具有git+ssh访问权限的笔记本电脑上进行开发和docker构建,但它在gitlab-CI上完全失效。在所有这些构建环境中管理这种私有包访问的更好的实践是什么?
发布于 2019-05-30 11:54:22
这些代码片段基于:
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提示输入口令。
https://stackoverflow.com/questions/56371322
复制相似问题