Github Actions:如何从workflow_dispatch事件运行在非主分支上创建的工作流程?

102

我想请有经验的人帮忙理解Github Actions选项卡的行为。作为一个新手在第三方代码库上使用Actions,我想创建一个分支上的Action,并在workflow_dispatch事件上执行它。但是我没有成功,但我发现以下内容:

  • Action选项卡将根据与最后执行的工作流相关的分支更改找到工作流和操作代码的分支。例如,如果某个工作流使用“Run Workflow”按钮从Action选项卡执行,并且“Use Workflow From”下拉列表设置为某个分支Branch-A,则左侧操作选项卡中的“Workflows”面板的内容将从Branch-A的版本的.github/获取。
  • “This workflow has a workflow_dispatch event trigger.”文本不会随着分支的更改而更改。它似乎来自master。或者,它可能来自上一组结果。我没有进行测试,因为无论哪种方式,它都不是有用的行为。

解决方法是在push事件上执行,这还可以,但这似乎与Github的高标准设计不符。

以上行为听起来a)大致正确,b)无论如何看待,都不是最佳行为吗?还是,有更好的构建和测试actions的方法吗?

5个回答

79
你可以使用Github CLI从命令行运行一个仍在开发中的工作流程,该工作流程位于分支branch-name中。文档中提到:

要在除了仓库默认分支之外的分支上运行工作流程,请使用--ref标志。

gh workflow run workflow-name --ref branch-name

要列出有效的工作流程名称,请使用gh workflow list
要添加输入参数,请按以下方式运行: gh workflow run workflow-name --ref branch-name -f myparameter=myvalue

55
针对workflow_dispatch,在工作流程运行一次之前,它将无法工作。您可以添加一个推送事件钩子,然后在运行一次后它将被激活。使用 gh workflow list 命令,您可以在工作流程运行一次后的列表中看到该任务。 - Dustin
6
哦,我不知道 gh 存在。谢谢。但是就像 @Dustin 所写的那样,可悲的是它不能用于以前没有运行过的新创建的工作流程。我通过在新分支上创建新的工作流文件并运行 gh workflow run workflow-test.yml --ref=feat/wf-dispatch-cli-test 进行测试,结果只显示 could not find any workflows named workflow-test.yml。然而,它可以轻松查看此新分支上的旧工作流程。 - piotrekkr
9
跟进这个操作:在你的工作流文件中添加 pull_request: 并推送文件。这将注册工作流(可以通过 gh workflow list 查看)。接着运行 gh workflow run 'My Workflow Name' --ref branch-name。注意,这里的名称是实际工作流的名称,而不是yaml文件的名称。 - hayesgm
1
要在工作流中添加一个事件才能使其运行一次,这太荒谬了!而且我注意到并不总是这样。例如,我在一个仓库中找不到我新添加的工作流,但在其他10个仓库中它是存在且可运行的(同样的工作流)。 - Josh M.

62

你可以通过GitHub CLI运行你的工作流,但你需要先确保它已经运行。

gh workflow list
如果你的工作流没有出现在该列表中(按名称),那么请添加pull_request:并创建一个拉取请求,以便一次性注册工作流程。
name: 'My Workflow'
on:
  workflow_dispatch:
    inputs:
      parameter:
        description: My Parameter
  pull_request: -- Add this here
...

创建 Pull Request 后,运行 gh workflow list 命令时,您应该看到 'My Workflow'。完成后,您可以删除添加的行。

最后,现在运行:

gh workflow run 'My Workflow' --ref my-branch -f parameter=value

这应该能够从一个特性分支运行您的工作流程派发。


2
这绝对是最好的答案。 - MEMark
12
与其使用pull_request,直接使用push从分支触发第一次运行会更容易。 - MEMark
我们不应该做这两件事情中的任何一件。如果我们在工作流中添加了一个 workflow_dispatch 事件,它应该立即显示在“Actions”选项卡/通过 gh workflow list。但实际上并没有显示出来。 - Josh M.

28

更新:@hayesgm 答案 可能是更好的选择,因为使用 push/pull_request 工作流触发器将在 GitHub 中注册新的工作流,然后您只需删除不需要的 push/pull_request 事件触发器,并使用 gh 命令运行工作流。它可以在不合并任何内容到默认分支的情况下工作。

更新2:如果您希望在 GitHub UI 中看到“运行工作流”下拉菜单,则似乎使用 @hayesgm 的方法可能无法满足您的要求。它将在“Actions”选项卡中的工作流列表中可见,并且可以使用 gh 运行,但不能使用 GitHub UI 运行。


似乎它按照你描述的那样工作。 在非主分支上运行工作流程时,文本似乎会发生变化,在此分支上,工作流名称更改为某些新内容...... 这个工作流程名称的更改真的很奇怪。我找不到任何描述此行为的文档。
测试工作流程 在进行测试之前,需要做的一件事是实际上将具有相同文件名的虚拟工作流添加到main / master中。否则,此工作流将不会出现在操作选项卡中。
如何测试:
  1. 创建虚拟的 Readme.md 和一些虚拟的 .github/workflows/workflow.yml 进行测试:
    name: 测试运行 v1
    
    on:
      workflow_dispatch:
    
    jobs:
      test:
        runs-on: ubuntu-18.04
        steps:
          - name: 显示环境变量 v1
            run: env | grep ^GITHUB
          - name: 显示版本号 v1
            run: echo "===============> 版本号来自 $GITHUB_REF"
    
  2. 推送到您的默认分支(可能是 mainmaster
  3. 新的操作应该会出现在那里
  4. 现在您可以运行虚拟工作流程了

测试分支运行:

  1. 从默认仓库分支创建新的分支test-branch
  2. 修改工作流文件.github/workflows/workflow.yml
    name: Test run v2
    
    on:
      workflow_dispatch:
    
    jobs:
      test:
        runs-on: ubuntu-18.04
        steps:
          - name: Show environment v2
            run: env | grep ^GITHUB
          - name: Show ref v2
            run: echo "===============> Version from $GITHUB_REF"
    
  3. 提交并推送到test-branch
  4. 进入Actions
  5. 点击Test run v1并将Use workflow from设置为test-branch
  6. 点击运行工作流按钮

您应该看到与默认存储库分支工作流版本不同的步骤名称和不同的GITHUB_REF

奇怪的是,在没有合并任何内容的情况下在test-branch上运行工作流程后,我的先前工作流程(来自默认存储库分支)更改了名称以及新版本。

enter image description here


2
这似乎有点 bug,所以我认为这个答案是可接受的。感谢分析。 - mikemay
2
似乎这个奇怪的名称更改错误已经被修复了,因为我现在已经有一段时间没有看到这种行为了。 - piotrekkr

15

我看到很多答案都添加了pull_request:,但在我们的组织中,我们要等到想让其他人审查时才会发起拉取请求。

我认为@MEMark提出的更好的建议。

改为添加push:,只需将代码推送到远程功能分支一次,然后删除该行。操作将被记录,您无需处理主分支或任何拉取请求。

name: 'My Workflow'
on:
  workflow_dispatch:
    inputs:
      parameter:
        description: My Parameter
  push: -- Add this here

3
也许你应该开始使用草稿PR?这将为您提供CI运行,但不会推动任何审阅者。https://github.blog/2019-02-14-introducing-draft-pull-requests/ - Johan Walles
2
这可能是最好的答案,因为它不需要干扰主分支/主线程来使工作流处于可运行状态。 - gcode
1
超级简单而有效的答案。谢谢 @code11! - undefined

0
作为一种选择,您可以将第三方存储库分叉到您的存储库中,并进行PR合并到您的主分支。之后,您将能够在自己的存储库上调试工作流程。
另一个选择是添加pull_request:并通过创建pull request来测试它。

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