首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >gitlab-CI如何从也引用gitlab存储库的gitlab依赖项安装私有python包

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

Stack Overflow用户
提问于 2019-05-30 11:44:21
回答 1查看 3.2K关注 0票数 6

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

package-a位于私有的gitlab存储库中,它依赖于依赖于package-cpackage-b,它们也位于私有的gitlab存储库中。

package-a有一个这样的pyproject.toml

代码语言:javascript
复制
[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

代码语言:javascript
复制
[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-apyproject.toml文件,以便gitlab-CI运行者可以克隆package-b以发现它依赖于package-csed脚本通过编辑project-b中的project-a依赖规范将pyproject.toml更改为https访问,即

代码语言:javascript
复制
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-bproject-c有一个git+ssh依赖,gitlab-CI运行器无法安装project-c,因为它没有克隆它的git+ssh凭证。

因此,私有包依赖链适用于在具有git+ssh访问权限的笔记本电脑上进行开发和docker构建,但它在gitlab-CI上完全失效。在所有这些构建环境中管理这种私有包访问的更好的实践是什么?

EN

回答 1

Stack Overflow用户

发布于 2019-05-30 11:54:22

这些代码片段基于:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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提示输入口令。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56371322

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档