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

问题描述 投票:0回答:3

我有一个工作流程,可以在给定情况下自动运行

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-actions pull-request
3个回答
1
投票

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

简短的回答,开箱即用是不可能的。一旦你开始研究 GitHub 的 API 设计,事情就会变得复杂。

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

参见:


0
投票

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

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


0
投票

有一种方法可以通过 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]') }}
© www.soinside.com 2019 - 2024. All rights reserved.