我有一个工作流程,可以在给定情况下自动运行
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。
参见:
这不是真正的解决方案,因为正如您所观察到的那样,GitHub 不支持这一点,但解决方法是从拉取请求发生的情况中触发工作流程。例如。当向 PR 添加标签(例如“运行测试”)或 PR 获得批准(需要触发器和作业条件的组合)时,可以触发它。特殊注释也可以,尽管不太直观。
虽然这些并不完全是您询问的调度触发器,但我认为它们涵盖了“手动运行工作流程”用例。
有一种方法可以通过 api 来做到这一点。您可以根据手动输入有条件地运行步骤,并使用
github.checks.create
中的 github-script
操作。
假设您给出了步骤
name: Run test
和 tests-step
的 id,这是一个示例:
- name: Report tests check
if: ${{ github.event.inputs.used-branch && steps.tests-step.outcome }}
uses: actions/github-script@v3
with:
github-token: ${{ secrets.GH_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 api 令牌并将其存储在一个秘密中,例如上面的秘密,
GH_TOKEN
。
head_sha
参数很棘手,需要存在才能使提交注释发挥作用。本例中 issue
的 github.event.issue
属性指的是将被注释的 PR(github 将其视为“问题”)。
这里的问题是,如果您使用
workflow_dispatch
运行工作流程,您将无法访问此值,因为手动运行的上下文中没有 PR。
一种解决方案是提供一个需要 PR 编号的输入,以及一个获取 sha 的脚本。这是未经测试的尝试:
- name: get sha from PR number
id: get-sha
uses: actions/github-script@v3
with:
github-token: ${{ secrets.GH_TOKEN }}
script: |
const { data: pullRequest } = await github.pulls.get({
owner: context.repo.owner,
repo: context.repo.repo,
pull_number: ${{ github.event.issue.number }}
})
return pullRequest.head.sha
另一种解决方案是从 PR 评论触发您的工作流程,在这种情况下,您已经在上面指定的上下文中拥有 sha:
on:
issue_comment:
types: [created]
jobs:
runtests:
if: ${{ github.event.issue.pull_request && contains(github.event.comment.body, '[runtests]') }}