如何将手动工作流运行附加到拉取请求的状态检查?

How can I attach a manual workflow run to a pull request's status checks?

提问人:NotX 提问时间:12/21/2022 最后编辑:NotX 更新时间:10/12/2023 访问量:1574

问:

我有一个工作流,可以在给定的情况下自动运行作业,也可以手动运行它:test

name: Test

on:
  workflow_dispatch:
    inputs:
      used-branch:
        description: Branch the test shall be run on
        default: master
        required: true
  push:
    branches: ['main', 'master']
    tags: ['!**']
  pull_request:
    types: [opened, reopened, ready_for_review]

jobs:
  test:
    steps:
      - name: Checkout selected branch
        uses: actions/checkout@v3
        if: inputs.used-branch != ''
        with:
          ref: ${{ github.event.inputs.used-branch }}
      - name: Checkout current branch
        uses: actions/checkout@v3
        with:
          ref: ${{github.ref}}
        if: inputs.used-branch == ''
      - name: Run test
        ...

我希望在合并之前需要测试。因此,我检查,并在存储库的分支设置中指定所需的工作。Require status check to pass before mergingRequire branches to be up to date before mergingtest

问题是:当我手动运行工作流(因此通过变量注入分支)时,它与分支无关,PR 检查不会“发现”它的成功。

是否有另一种方法可以将运行链接到分支,或者另一种方法可以将结果传播到分支的拉取请求?

github-actions 拉取请求

评论

1赞 aknosis 12/21/2022
我 100% 理解你的问题,一旦你开始围绕 GitHub 的 API 设计工作,事情就会变得复杂。我最好的猜测是,在手动运行时,您将需要求助于使用 API......参见:github.com/orgs/community/discussions/24616 & docs.github.com/en/rest/checks?apiVersion=2022-11-28 & docs.github.com/en/pull-requests/...
0赞 NotX 12/21/2022
@aknosis 感谢您的回复!因此,目前没有“可配置”的方法来实现这一目标。好吧,如果这是答案,那么请随时提供它,我会接受的!我认为,我现在不认为自己在修补 API。一种解决方法是关闭并重新打开 PR,也许我暂时找到了一种不那么古怪的方法(可悲的是也不存在)。:)pr_comment
0赞 aknosis 12/22/2022
pr_comment事件是通过方式处理的,因为拉取请求只是代码问题......docs.github.com/en/actions/using-workflows/......issue_comment
0赞 NotX 12/22/2022
@aknosis 哦,我明白了。在简要浏览了这个话题之后,我认为这意味着在参考问题中发表评论(为了我的辩护,我还没有时间进行适当的阅读)。因此,感谢您的澄清,也许这是一个很好的折衷方案!
1赞 aknosis 12/23/2022
在过去的六个月里,我一直被埋葬在GHA中,所以我从学习它:)得到了所有的瘀伤

答:

0赞 aknosis 12/22/2022 #1

我花了一分钟来消化你问的问题,但现在我明白了。(更准确地说,更新了标题)。

简短的回答,这是不可能的。一旦你开始围绕 GitHub 的 API 设计工作,事情就会变得复杂。

我今天能想到的唯一合理的解决方案是通过 GitHub API。

看:

评论

1赞 develobster 6/2/2023
> 我今天能想到的唯一可行的解决方案是通过 GitHub API。你能详细说说吗?
0赞 aknosis 6/3/2023
@develobster 我以前没有探索过检查 api,但本质上您需要将所有非触发器映射到 PR,然后使用 api 在 PR 上设置适当的状态。pull_request
0赞 Piedone 5/27/2023 #2

这不是一个真正的解决方案,因为 GitHub 不支持您观察到的这一点,但解决方法是从拉取请求中发生的事情触发工作流。例如,当标签被添加到 PR 中(如“运行测试”)或 PR 被批准(需要触发器和作业条件的组合)时,它可以被触发。一个特别的评论也可以,尽管这不太直观。

虽然这些并不完全是您询问的调度触发器,但我认为它们涵盖了“手动运行工作流”用例。

评论

0赞 NotX 6/1/2023
嘿,不过,不确定所有这些都会起作用。我尝试了一种方法,即 PR 中的评论触发了测试,但这也没有更新检查。现在,我正在切换 PR 并切换回来,这会触发一个真正被识别的工作流程,类似于您建议的。\testDraft
0赞 develobster 6/2/2023
@NotX这些应该有效。你的工作是什么样的?无论如何,我知道你说它触发了测试,但是只有当工作流文件位于主分支中时,才会触发由事件触发的测试(来源issue_comment)
0赞 Piedone 6/2/2023
是的,我们实际上使用标签方法;首先尝试了 PR 批准,一种也有效,但由于其他原因我们不喜欢它。
0赞 NotX 7/7/2023
@develobster你是对的,我做了一些调整,它正在工作。因此,现在 PR 中的注释会触发一个工作流,其结果被 PR 的状态检查检测到。/test
2赞 Felipe 10/12/2023 #3

有一种方法可以通过 api 做到这一点。您可以根据手动输入有条件地运行步骤,并使用 中的操作。github.checks.creategithub-script

假设你给出了你的步长和 id ,下面是一个示例:name: Run testtests-step

- name: Report tests check
  if: ${{ github.event.inputs.used-branch && steps.tests-step.outcome }}
  uses: actions/github-script@v3
  with:
    github-token: ${{ secrets.GITHUB_TOKEN }}
    script: |
      github.checks.create({
        name: 'run tests',
        head_sha: '${{ github.event.issue.pull_request.head.sha }}',
        status: 'completed',
        conclusion: '${{ steps.tests-step.outcome }}',
        output: {
          title: 'Run tests',
          summary: 'Results: ${{ steps.tests-step.outcome }}'
        },
        owner: context.repo.owner,
        repo: context.repo.repo
      })

请注意,它会自动内置到您的工作流程中GITHUB_TOKEN

该参数很棘手,需要存在才能使提交注释正常工作。在这种情况下,属性是指将要注释的 PR(github 将其视为“问题”)。head_shaissuegithub.event.issue

这里的问题是,如果使用 运行工作流,则无法访问此值,因为在手动运行的上下文中没有 PR。workflow_dispatch

一种解决方案是有一个需要 PR 编号的输入,以及一个脚本来获取 sha。这是你如何做到这一点的:

- name: get sha from PR number and save output
  id: get-sha
  uses: actions/github-script@v3
  with:
    github-token: ${{ secrets.GITHUB_TOKEN }}
    script: |
      console.log('PR number: ' + ${{ github.event.issue.number }})
      const pr = await github.pulls.get({
        owner: context.repo.owner,
        repo: context.repo.repo,
        pull_number: ${{ github.event.issue.number }}
      })
      console.log('PR Head sha: ' + pr.data.head.sha)
      core.setOutput('sha', pr.data.head.sha)