如何在 GitHub Actions 工作流程中获取拉取请求编号

47

我想在Github Actions工作流中访问Pull Request编号。我可以访问可用的GITHUB_REF环境变量。但是,在Pull Request操作上,它的值为:refs/pull/125/merge。我需要提取出125

我找到了一个类似的帖子here,展示了如何使用此变量获取当前分支。然而,在这种情况下,我解析的内容不同,我无法隔离出Pull Request编号。

  • 我尝试使用{GITHUB_REF##\*/},它解析为merge
  • 我还尝试过{GITHUB_REF#\*/},它解析为pull/125/merge

我只需要Pull Request编号(在我的例子中为125)


1
如果事件是 pull_request,您应该能够使用 ${{ github.event.pull_request.number }}。在此处查看所有属性:https://docs.github.com/en/rest/pulls/pulls#get-a-pull-request - Joshua Pinter
8个回答

94
尽管已经有答案了,但我发现最简单的方法是使用GitHub上下文。以下示例展示如何将其设置为环境变量。

尽管已经有答案了,但我发现最简单的方法是使用GitHub上下文。以下示例展示如何将其设置为环境变量。

env:
  PR_NUMBER: ${{ github.event.number }}

1
这个解决方案很好,因为上面的那个会在 GitHub Actions 中产生弃用警告,而且这个只有两行代码。 - george_h
4
但我猜这只适用于仅筛选拉取请求的操作,例如如果该操作由问题触发,则事件编号将是该问题的编号。 - Obay Abd-Algader
2
@ObayAbd-Algader,实际上,它似乎只是针对PR的,问题将在github.event.issue.number中。我还没有找到任何关于这种行为的文档(但)。 - David Perfors

12
如果您想在push事件而不是pull_request事件中确定提交链接到哪个PR,另一种选择是使用标准GitHub Action镜像中包含的gh CLI(请参见链接)

例如:
      - name: Get Pull Request Number
        id: pr
        run: echo "::set-output name=pull_request_number::$(gh pr view --json number -q .number || echo "")"
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

请确保在作业中添加pull_request: read权限

然后,在接下来的步骤中,您可以使用变量访问它,

${{ steps.pr.outputs.pull_request_number }}

我尝试了你的实现,但是 gh cli 在没有将 actions/checkout 添加到作业步骤中时无法识别存储库。一旦我添加了它,它就像预期的那样工作了!感谢您的分享。我在这里引用了您的答案(https://dev59.com/r2wMtIcB2Jgan1zn8mm2)。 - GuiFalourd

9

虽然@Samira的答案是正确的,但我发现有一种新方法可以实现这个目标,并希望与可能遇到此问题的任何人分享。

解决方案是在工作流程开头添加一个阶段,从Github Token(事件)获取PR编号,然后将其设置为环境变量,以便在整个工作流程中轻松使用。以下是代码:

  - name: Test
    uses: actions/github-script@0.3.0
    with:
      github-token: ${{github.token}}
      script: |
        const core = require('@actions/core')
        const prNumber = context.payload.number;
        core.exportVariable('PULL_NUMBER', prNumber);

现在,在任何后续阶段,您只需使用$PULL_NUMBER即可访问先前设置的环境变量。


7
如何使用 awk 提取 GITHUB_REF 的部分,而不是使用 bash 魔法?
awk 的手册中可以看到:

-F fs

--field-separator fs

使用 fs 作为输入字段分隔符(即 FS 预定义变量的值)。

只要记住这一点,就可以轻松地提取你需要的变量部分。 awk 在所有平台上都可用,因此以下步骤适用于任何平台:
- run:   echo ::set-env name=PULL_NUMBER::$(echo "$GITHUB_REF" | awk -F / '{print $3}')
  shell: bash

4

这里有一个工作代码片段,可以利用actions/github-script在GitHub Actions工作流中获取pushpull_request事件中的问题编号:

steps:
  - uses: actions/github-script@v6
    id: get_issue_number
    with:
      script: |
        if (context.issue.number) {
          // Return issue number if present
          return context.issue.number;
        } else {
          // Otherwise return issue number from commit
          return (
            await github.rest.repos.listPullRequestsAssociatedWithCommit({
              commit_sha: context.sha,
              owner: context.repo.owner,
              repo: context.repo.repo,
            })
          ).data[0].number;
        }
      result-encoding: string
  - name: Issue number
    run: echo '${{steps.get_issue_number.outputs.result}}'

脚本通过 octokit/rest.js 客户端查询 问题标签列表 REST API 端点。

3

在我的情况下,我的工作是由触发的

  pull_request_review:
    types: [submitted]

因此,使用github.event.number不能给我提供PR编号。

这里的其他解决方案都使用了已弃用的set-env方法,这需要您“允许不安全命令”。

我能够使用更现代的方法将PR放入我的环境变量中,使用了awk(我从Samarai的答案中取得了那部分):

      - name: Get Pull Request Number
        run: echo "PULL_NUMBER=$(echo "$GITHUB_REF" | awk -F / '{print $3}')" >> $GITHUB_ENV
        shell: bash

然后在其他步骤中使用它就像这样简单:

${{ env.PULL_NUMBER }}

1
我们需要更多像这样的文档。谢谢。 - undefined

2
对于需要在PR上运行的操作以及对PR上的评论进行操作,我最终使用以下方法提取它:
export PR_NUMBER="${{ github.event.pull_request.number || github.event.issue.number }}"

这是因为github.event.pull_request.number仅在PR打开/关闭触发的事件中定义,而github.event.issue.number仅在对PR进行评论时定义(前者需要on: pull_request,后者需要on: issue_comment):这种方法使我能够在不同的工作流中重复使用相同的操作。

0

我来分享一下我的解决方案

      - id: find-pull-request
        uses: jwalton/gh-find-current-pr@v1
        with:
          # Can be "open", "closed", or "all".  Defaults to "open".
          state: open
      - name: create TODO/FIXME comment body
        id: comment-body
        run: |
          yarn leasot '**/*.{js,ts,jsx,tsx}' --ignore 'node_modules/**/*' --exit-nicely --reporter markdown > TODO.md
          body="$(sed 1,2d TODO.md)"
          body="${body//'%'/'%25'}"
          body="${body//$'\n'/'%0A'}"
          body="${body//$'\r'/'%0D'}" 
          echo "::set-output name=body::$body"
      - name: post TODO/FIXME comment to PR
        uses: peter-evans/create-or-update-comment@v2
        with:
          issue-number: ${{ steps.find-pull-request.outputs.number }}
          body: ${{ steps.comment-body.outputs.body }}

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