在actions中克隆组织内的私有github仓库

79

我在组织(称为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在同一组织中,是否可以在测试A时安装B?如何操作?


这个回答针对一个稍微不同的问题,但对我来说看起来非常有前途:*如何使用GitHub Actions克隆多个私有存储库?*。 - Alex Cohn
9个回答

89

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

相反,请使用部署密钥

Deploy keys

部署密钥是可以用来克隆仓库的SSH密钥。

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

secrets

设置好后,您可以在GitHub Action的SSH代理中设置私钥。无需导入第三方GitHub Action,只需要两行代码即可。

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

我发现这里ssh-add命令。

6
在我的情况下,部署密钥也是最方便的选择,但为了更加方便,我通过 webfactory/ssh-agent 操作来管理加载到代理程序中的密钥:https://github.com/webfactory/ssh-agent。 - Dato
1
你好,我尝试了这个解决方案,但是如果一个 fork 发起了一个 PR 到我们的仓库,它就不能让我们在 GH actions 中使用 SSH 密钥。我们该如何添加 SSH 密钥,以便 fork PR 启动 GH actions 时仍然可以使用 SSH 密钥来拉取必要的仓库? - ajl123
2
我尝试了一下,但是在克隆仓库时出现了这个错误:git@github.com: Permission denied (publickey)。 致命错误:无法从远程仓库读取。问题出在哪里? - undefined
1
我尝试了一下,但是在克隆仓库时遇到了这个错误:git@github.com: Permission denied (publickey)。 致命错误:无法从远程仓库读取。问题出在哪里? - amir_a14
对于使用macOS的任何人,请尝试以下操作:/usr/bin/ssh-add --apple-use-keychain - <<< "${{ secrets.SSH_PRIVATE_KEY }}" - undefined
显示剩余4条评论

20

我是这样做的!

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

您需要提供有效的令牌,您可以按照此指南生成它


4
你是说需要使用两个结帐,第一个结帐用于存储库A,第二个(即这个)用于存储库B? - northtree
15
我不希望我的访问令牌被存储在公司的秘密中,因为可能会被多人访问。 - Yevhen Kuzmovych
你最终解决了吗?@northtree - Erfan
我认为这是做到它的方式。我注意到你可以将令牌添加到组织机密中(或者更确切地说,您的组织管理员可以),您可以在操作中使用它们。尚未测试过。 - Yevhen Kuzmovych
3
请勿将此解决方案用于组织账户。这是次优的,因为它需要您存储凭据以访问它。Nato Boram在下面提供的解决方案要好得多,因为它使用部署密钥。 - A Merii
@YevhenKuzmovych,你有没有找到不使用令牌克隆私有存储库的方法。我也有同样的情况,但我不想分享我的令牌。 - Neural

5

不需要两次结账,只需提供pip访问repo B的TOKEN。

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

.insteadOf https://github 在末尾是否正确? - Erfan
1
这对我不起作用,你的私有仓库链接在你的 requirements.txt 文件中是什么样子的? - Erfan
这对我没有起作用。 - turtle_in_mind

5
使用部署密钥,您可以进行:
- uses: actions/checkout@v2
  with:
    ssh-key: ${{ secrets.SSH_PRIVATE_KEY }}
    repository: organization_name/repo_name

要使此功能正常工作,您需要执行以下操作:

  • 在本地生成SSH密钥
  • 将公钥作为部署密钥添加到私有仓库中
  • 将私钥作为名为SSH_PRIVATE_KEY的机密添加

1
这将不允许您正常使用 pip install -r requirements.txtpnpm install - Nato Boram

3
要么使用没有密码的SSH密钥访问repo B,要么创建一个用于该repo的访问令牌,然后将访问令牌作为密码使用来通过HTTPS访问该repo:https://USERNAME:TOKEN@github.com/ORG/B.git

9
我不希望我的访问令牌存储在公司的代码库(或者在代码库的“secrets”中),因为它会对很多人可见。默认情况下,GitHub Actions 中有一个名为 secrets.GITHUB_TOKEN 的密钥,我尝试按照你建议的方式使用它来进行 HTTPS 认证(-e git+https://my_username:${{secrets.GITHUB_TOKEN}}@github.com/ORG/B.git#egg=B),但它无法工作(出现 remote: Repository not found. 错误)。 - Yevhen Kuzmovych
我在想你可以将令牌存储在Github secrets vault中。请注意文档中的说明:“每个存储库都包括一个GITHUB_TOKEN secret,但默认情况下,它不可供操作使用。您必须将GITHUB_TOKEN secret添加到需要访问的每个操作中。” 所以这可能是问题所在。顺便说一句,如果您最终不得不将秘密存储在存储库中,Blackbox(由Stack Exchange创建)是一个不错的选择;它使用GPG加密您的秘密,因此您可以控制访问权限。 - rmunn
我不知道如何“将 GITHUB_TOKEN 密钥添加到需要访问的每个操作”,因为我仍然在 beta 的等待列表中,所以无法测试。我只能阅读文档并根据目前从文档中理解到的内容回答问题,而我的知识还不完整。 - rmunn
我认为如果需要将其作为环境变量使用,您需要将其添加为环境变量(env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }})。我直接从secrets中使用它,所以这不是问题。 请注意:有一个较旧的workflow-actions系统,我也找不到人们如何解决这个问题。 谢谢您的时间! :) - Yevhen Kuzmovych
2
自从Github于2021年8月13日禁用了用户名密码认证功能,因此这段代码不再可用:remote: Support for password authentication was removed on August 13, 2021. Please use a personal access token instead. - nont
不存在“该存储库的访问令牌”这样的东西。访问令牌可以读取您拥有访问权限的所有内容。您是否为两家公司签约?您为其中一家公司设置的令牌允许访问另一家公司的存储库。 - Roman Starkov

2

在 Github Actions 中有一种安全的方法可以做到这一点(无需存储 ssh-key)。您可以在 Github Actions 中使用专用库来实现。

- uses: webfactory/ssh-agent@v0.7.0
    with:
      ssh-private-key: ${{ secrets.SSH_PRIVATE_KEY_VOW_SHARED }}

当你使用docker时,你必须创建ssh隧道:

docker build --ssh default=${SSH_AUTH_SOCK} .

docker-compose.yaml 文件:

build:
  ssh:
    default: ${SSH_AUTH_SOCK}

然后在 Dockerfile 中:

RUN mkdir -p -m 0600 ~/.ssh && ssh-keyscan github.com >> ~/.ssh/known_hosts
RUN --mount=type=ssh pip install -r requirements.txt

记得在 ci.yaml 文件中设置 DOCKER_BUILDKIT 标志:

env:
  DOCKER_BUILDKIT: 1

1
免责声明:使用此解决方案,您的秘密将以明文形式存在。
我添加了这一行
git+https://YOUR_TOKEN_HERE@github.com/ORG/REPO_NAME.git@master#egg=REPO_NAME

根据我的requirements.txt进行了修改,它起作用了。但是你的令牌将会暴露给任何能够访问该存储库的人。最好在你的存储库中使用一个密钥。

尝试在GitHub上使用环境变量作为密钥,但对我来说没有起作用。 - Vishesh Kumar Singh
@VisheshKumarSingh 我从未使用过secrets,所以我不确定如何操作,但其他答案似乎已经解释得很好了。 - Philippe Remy

0
如果我们想要从另一个存储库访问一个存储库,我们可以拥有一个Github级别的秘密(比如ORG_GITHUB_TOKEN和ORG_GITHUB_USERNAME)。如果我们需要有细粒度的访问控制,我们可以创建多个具有受限访问权限的令牌。
在Github操作中,我们可以将它们保存在.git-credentials中,并使用凭据存储git配置。这种组合可以在这种情况下帮助我们。
以下是一个示例github操作,我们从另一个私有存储库安装python依赖项。
示例是python单元测试。但这种方法是通用的。
name: UnitTest

on:
  workflow_dispatch:
  push:

jobs:
  unittest:
    name: Unit Test
    env:
      ORG_GITHUB_USERNAME: ${{ secrets.ORG_GITHUB_USERNAME }}
      ORG_GITHUB_TOKEN: ${{ secrets.ORG_GITHUB_TOKEN }}
    runs-on: ubuntu-latest
    steps:
    - name: Check out code
      uses: actions/checkout@v3

    - name: Setup Python
      uses: actions/setup-python@v4
      with:
        python-version: '3.10'
    - name: Install dependencies
      run: |
        echo "https://$ORG_GITHUB_USERNAME:$ORG_GITHUB_TOKEN@github.com" >> $HOME/.git-credentials
        git config --global credential.helper store
        pip install poetry
        poetry config virtualenvs.create false
        poetry install --all-extras --no-root --with dev --no-interaction
        rm -rf ${HOME}/.git-credentials
    - name: Run pytest
      run: |
        python -m pytest

permissions:
  id-token: write
  contents: write
  pages: write
  repository-projects: write


0
我在推荐的答案上遇到了一些问题,所以决定把我做的事情发出来。
问题1:“无法打开到您的身份验证代理的连接”
这些行对我来说不起作用。尽管第一行应该“激活”ssh代理,但第二行却出现了“无法打开到您的身份验证代理的连接”的错误。
eval `ssh-agent -s`
ssh-add - <<< '${{ secrets.PRIVATE_SSH_KEY }}'

解决方案1:使用“使用”上下文
- uses: webfactory/ssh-agent@v0.7.0
   with:
     ssh-private-key: ${{ secrets.PRIVATE_SSH_KEY }}

问题2: "...不是一个有效的可编辑要求"
对于我正在pip安装的(私有)仓库,将其放在requirements.txt中并不起作用。
-e git+git@github.com:ORG/B.git#egg=B

然后运行
-run: pip install -r requirements.txt

在github actions的yml文件中,出现了错误:“git+git@github.com:ORG/B.git#egg=B”不是一个有效的可编辑要求。
解决方案2:将工作流程分成两个步骤。
- run: git clone git@github.com:ORG/B.git
- run: pip install -e B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接