提问人:NotX 提问时间:12/21/2022 最后编辑:NotX 更新时间:10/12/2023 访问量:1574
如何将手动工作流运行附加到拉取请求的状态检查?
How can I attach a manual workflow run to a pull request's status checks?
问:
我有一个工作流,可以在给定的情况下自动运行作业,也可以手动运行它: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 merging
Require branches to be up to date before merging
test
问题是:当我手动运行工作流(因此通过变量注入分支)时,它与分支无关,PR 检查不会“发现”它的成功。
是否有另一种方法可以将运行链接到分支,或者另一种方法可以将结果传播到分支的拉取请求?
答:
我花了一分钟来消化你问的问题,但现在我明白了。(更准确地说,更新了标题)。
简短的回答,这是不可能的。一旦你开始围绕 GitHub 的 API 设计工作,事情就会变得复杂。
我今天能想到的唯一合理的解决方案是通过 GitHub API。
看:
- https://github.com/orgs/community/discussions/24616
- https://docs.github.com/en/rest/checks?apiVersion=2022-11-28
- https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/collaborating-on-repositories-with-code-quality-features/about-status-checks
评论
pull_request
这不是一个真正的解决方案,因为 GitHub 不支持您观察到的这一点,但解决方法是从拉取请求中发生的事情触发工作流。例如,当标签被添加到 PR 中(如“运行测试”)或 PR 被批准(需要触发器和作业条件的组合)时,它可以被触发。一个特别的评论也可以,尽管这不太直观。
虽然这些并不完全是您询问的调度触发器,但我认为它们涵盖了“手动运行工作流”用例。
评论
\test
Draft
issue_comment
)
/test
有一种方法可以通过 api 做到这一点。您可以根据手动输入有条件地运行步骤,并使用 中的操作。github.checks.create
github-script
假设你给出了你的步长和 id ,下面是一个示例:name: Run test
tests-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_sha
issue
github.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)
评论
pr_comment
pr_comment
事件是通过方式处理的,因为拉取请求只是代码问题......docs.github.com/en/actions/using-workflows/......issue_comment