【问题标题】:Cloning private github repository within organisation in actions在操作中克隆组织内的私有 github 存储库
【发布时间】:2019-12-27 23:03:11
【问题描述】:

我在组织(例如 ORG)中有 2 个私有 GitHub 存储库(例如 A 和 B)。仓库 A 在 requirements.txt 中有仓库 B:

-e git+git@github.com:ORG/B.git#egg=B

我对 A 有以下工作流程(.github/workflows/test.yml):

name: Python package

on: push

jobs:
  build:

    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v1

    - name: Install requirements
      run: |
        pip install -r requirements.txt

    - name: Test with pytest
      run: |
        pytest ./tests

由于 B 是私有的,因此安装失败。

如果他们在同一个组织中,是否可以在此工作流程中测试 A 时安装 B?怎么样?

【问题讨论】:

标签: python github github-actions


【解决方案1】:

我就是这样做的!

- uses: actions/checkout@v1  
  with:
    repository: organization_name/repo_name
    token: ${{ secrets.ACCESS_TOKEN }}

你需要提供一个有效的token,你可以按照this guide生成它

【讨论】:

  • 你的意思是使用两个结帐,第一个用于 repo A,第二个(这个)用于 repo B?
  • 我不希望我的访问令牌存储在公司机密中,因为它可能会被多个人访问。
  • 你最终能弄明白吗? @北树
  • @Erfan 附上我的答案。 stackoverflow.com/a/66094537/482899
  • 我认为这就是这样做的方法。我注意到您可以将令牌添加到您可以在操作中使用的组织机密(或者更确切地说是您的组织管理员可以)。还没有测试过这个
【解决方案2】:

由于访问令牌绑定到一个帐户,并且对它的私有存储库所有具有写入权限,因此这是一个非常糟糕的解决方案。

改为使用deploy keys

部署密钥只是可用于克隆存储库的 SSH 密钥。

  1. 在您的计算机上创建一个新的 SSH 密钥对
  2. 公钥放入私有依赖库的部署密钥
  3. 私钥 放入应用程序仓库的 Actions 机密
  4. 从您的计算机中删除密钥

设置后,您可以在 GitHub Action 的 SSH 代理中设置私钥。无需导入第三方 GitHub Action,2-liner 就足够了。

eval `ssh-agent -s`
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'
pip install -r requirements.txt

我发现ssh-add命令here

【讨论】:

  • 部署密钥也是我的场景中最方便的选择,但为了更加方便,我通过 webfactory/ssh-agent 操作管理加载到代理中:github.com/webfactory/ssh-agent
【解决方案3】:

要么使用不带密码的 SSH 密钥访问存储库 B,要么使用create an access token for that repo,然后使用访问令牌作为密码通过 HTTPS 访问该存储库:https://USERNAME:TOKEN@github.com/ORG/B.git

【讨论】:

  • 我不希望我的访问令牌存储在公司回购(或回购的“秘密”)中,因为它可供很多人使用。默认情况下,我尝试按照您对 HTTPS (-e git+https://my_username:${{secrets.GITHUB_TOKEN}}@github.com/ORG/B.git#egg=B) 的建议使用操作中的 secrets.GITHUB_TOKEN - 它不起作用(使用 remote: Repository not found.)。
  • 我在想你会将令牌存储在Github secrets vault 中。请注意,文档说“每个存储库都包含一个 GITHUB_TOKEN 密码,但默认情况下它不可用于操作。您必须将 GITHUB_TOKEN 密码添加到需要访问的每个操作中。”所以这可能是问题所在。顺便说一句,如果您最终不得不将机密存储在存储库中,Blackbox(由 Stack Exchange 创建,BTW)很好;它使用 GPG 加密您的秘密,以便您控制访问。
  • 而且我不知道如何“将 GITHUB_TOKEN 密码添加到每个需要访问权限的操作中”,因为我仍在等待 Beta 版,所以我无法测试。到目前为止,我只能根据我从文档中了解到的内容阅读文档和答案,我的知识还不完整。
  • 如果需要作为环境变量 (env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}),我相信您需要将其添加为环境变量。我直接从秘密中使用它,所以这不是问题。请注意:有一个较旧的workflow-actions system,也找不到人们如何解决这个问题。谢谢你的时间! :)
  • 这不再起作用,因为 github 禁用了用户名/密码验证:remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead.
【解决方案4】:

您只需提供pip 的 TOKEN 即可访问 repo B,而不是两次检查。

- name: Install requirements
  run: |
    git config --global url."https://${{ secrets.ACESS_TOKEN }}@github".insteadOf https://github
    pip install -r requirements.txt

【讨论】:

  • 最后的.insteadOf https://github 是否正确?
  • 这对我不起作用,您在requirements.txt 中的私人仓库链接是什么样的?
【解决方案5】:

我添加了这一行

git+https://YOUR_TOKEN_HERE@github.com/ORG/REPO_NAME.git@master#egg=REPO_NAME

到我的requirements.txt,它成功了。但正如其他人提到的,您的令牌将暴露给任何有权访问此存储库的人。最好在您的存储库中使用密钥。

【讨论】:

  • 在 GitHub 上尝试使用与 ENV 相同的秘密,但这对我不起作用。
猜你喜欢
  • 1970-01-01
  • 2021-06-19
  • 2020-10-08
  • 2020-09-23
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 2022-08-08
  • 2021-09-04
相关资源
最近更新 更多