【问题标题】:How do I authenticating to remote repo inside Github Action using GH CLI?如何使用 GH CLI 对 Github Action 中的远程仓库进行身份验证?
【发布时间】:2022-01-17 03:44:49
【问题描述】:

我在 Github Action/Workflow 的以下部分遇到问题,该部分旨在拉取远程私有 repo(例如,不是包含 Action 本身的 repo)的 PR 列表(带有一些过滤)。

  - run: echo "PR2=$( gh pr list --head "${{ env.BRANCH_NAME }}" --repo github.com/[OWNER]/[REMOTE_REPO] | tr -s [:space:] ' ' | cut -d' ' -f1 )" >> $GITHUB_ENV
     env:
      GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

但是,我收到以下错误:GraphQL: Could not resolve to a Repository with the name '[OWNER]/[REMOTE_REPO]'. (repository)

我认为某处的身份验证存在一些问题,因为在使用 gh auth 进行身份验证后,这些命令可以在终端中完美运行。我是 Github 整体、Actions 和 CLI 的新手,所以任何关于如何在操作中正确进行身份验证的建议都会很棒。

编辑:找到解决方案/解决方法。

使用 git ls-remote 获取 PR 和分支的列表,然后使用 ID 链接两者。供将来参考:

id=$(git ls-remote git@github.com:[OWNER]/[REMOTE_REPO] | grep "${{ env.BRANCH_NAME }}" | head -c 40)
PR=$(git ls-remote git@github.com:[OWNER]/[REMOTE_REPO] | grep "${id}.*refs/pull" | cut -b 52- | rev | cut -b 6- | rev)

【问题讨论】:

  • 我在Github CLI repo 上发现了一些关于此问题的内容。您可以尝试在用于列出 PR 的命令之前运行gh auth login <flags> 命令吗?
  • 我很想,但我不知道要使用哪个令牌。标准的gh auth login 是一个交互式命令,所以我想我需要gh auth login --with-token,但我不知道它是如何工作的。

标签: github github-actions building-github-actions github-cli


【解决方案1】:

有一个非交互身份验证的开放功能请求:Add flags to gh auth login to replace the interactive prompts

您可以使用github-script

steps:
  - name: Find Pull Request
    uses: actions/github-script@v5
    with:
      github-token: ${{ secrets.TOKEN_FOR_PRIVATE_REPO }}
      script: |
        const pulls = github.rest.pulls.list({
          owner: '[OWNER]',
          head: '${{ env.BRANCH_NAME }}',
          repo: '[REMOTE_REPO]',
        });

注意它如何传递一个单独的github-token。默认令牌 (secrets.GITHUB_TOKEN) 无法访问您的其他私有存储库,因此您必须使用 issue another tokenset that up as a secret

如果您不想使用 github 脚本,您也可以使用普通 curl 和新发行的令牌。这是关于 REST API 的文档:https://docs.github.com/en/rest/reference/pulls#list-pull-requests 以及如何使用令牌:https://docs.github.com/en/rest/overview/other-authentication-methods#via-oauth-and-personal-access-tokens

【讨论】:

  • 感谢您的帮助,我会牢记这些工具。我设法使用git ls-remote 破解了一个解决方案,以获取 PR 和分支的列表,然后使用 ID 将两者链接起来。供将来参考:id=$(git ls-remote git@github.com:[OWNER]/[REMOTE_REPO] | grep "${{ env.BRANCH_NAME }}" | head -c 40)PR=$(git ls-remote git@github.com:[OWNER]/[REMOTE_REPO] | grep "${id}.*refs/pull" | cut -b 52- | rev | cut -b 6- | rev)
【解决方案2】:

您不需要使用 gh auth 进行专门的身份验证,但在这种情况下,您应该使用生成的 PAT 可以访问私有存储库。

  1. 例如,生成一个可以访问您的私人仓库的 PAT,步骤:https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token

  2. 将 PAT 作为机密添加到您拥有工作流程的存储库中,例如 PRIVATE_REPO_PAT,步骤:https://docs.github.com/en/actions/security-guides/encrypted-secrets#creating-encrypted-secrets-for-a-repository

然后,您可以在工作流程中使用它,例如:

- run: echo "PR2=$( gh pr list --head "${{ env.BRANCH_NAME }}" --repo github.com/[OWNER]/[REMOTE_REPO] | tr -s [:space:] ' ' | cut -d' ' -f1 )" >> $GITHUB_ENV
     env:
      GITHUB_TOKEN: ${{ secrets.PRIVATE_REPO_PAT }}

请注意,如果您确实想以“非交互方式”使用 gh auth,例如在 shell 脚本中,您可以随时使用:

echo "$GH_CONFIG_TOKEN" | gh auth login --with-token

其中 GH_CONFIG_TOKEN 是默认的 GITHUB_TOKEN 或生成的 PAT。

对于在 Github Actions 中使用,当您在 env 变量中传入正确的 GITHUB_TOKEN 时,此身份验证是隐式的。

【讨论】:

    猜你喜欢
    • 2022-01-19
    • 2019-09-25
    • 2022-12-12
    • 2013-04-10
    • 2013-02-15
    • 2016-11-04
    • 1970-01-01
    • 2011-10-05
    • 2019-01-30
    相关资源
    最近更新 更多