如何使用 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 中的远程仓库进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章