【问题标题】:How can gitlab-CI install private python packages from a gitlab dependency that also refers to gitlab repositoriesgitlab-CI 如何从 gitlab 依赖项安装私有 python 包,该依赖项也引用 gitlab 存储库
【发布时间】: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


    【解决方案1】:

    这些 sn-ps 是基于:

    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 提示输入密码。

    【讨论】:

      猜你喜欢
      • 2019-06-21
      • 2018-08-24
      • 2019-02-20
      • 2016-03-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多