如何使用 GH CLI 对 Github Action 中的远程仓库进行身份验证?

Posted

技术标签:

【中文标题】如何使用 GH CLI 对 Github Action 中的远程仓库进行身份验证?【英文标题】:How do I authenticating to remote repo inside Github Action using GH CLI? 【发布时间】: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,但我不知道它是如何工作的。 【参考方案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 token 和 set 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 可以访问私有存储库。

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

    将 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 时,此身份验证是隐式的。

【讨论】:

以上是关于如何使用 GH CLI 对 Github Action 中的远程仓库进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章

在 CLI 中观看 GH Actions 工作流输出?

使用 github cli 将外部协作者添加到组织存储库

GitHub的官方命令行工具

github怎样创建gh-page

有没有办法使用 Bitbucket 从命令行创建 PR?

gh-ost —— GitHub Online DDL 工具使用详解