在GitHub Actions工作流中重用Jobs

6

我正在将一个流水线从Circle CI迁移到Github Actions,并发现我只能运行一次任务,而不能创建一个任务,然后从工作流部分调用它,这样可以多次调用任务而不重复在该任务中复制命令/脚本。

我的流水线将代码推送到三个环境中,并为每个环境运行Lighthouse扫描。在Circle CI中,我有1个任务来将代码推送到我的环境并运行Lighthouse。然后从我的工作流部分,我只需调用任务3次,传递环境参数。我是否遗漏了什么,或者Github Actions中没有办法做到这一点?我是否必须在每个任务中三次编写我的命令?

3个回答

9

在GitHub Actions中,代码重用有三种主要方法:

重用工作流程

显而易见的选项是使用"可重用工作流程"功能,它允许您将某些步骤提取到单独的“可重用”工作流程中,并在其他工作流程中调用此工作流程作为作业。

要点:

  • 可重用的工作流程无法调用其他可重用的工作流程。
  • strategy 属性不支持调用可重用工作流程的任何作业。
  • 环境变量和密钥不会被继承。
  • 如果需要在一个作业内提取和重复使用多个步骤,则不太方便。
  • 由于它作为单独的作业运行,因此您必须使用 构建产物 来在可重用的工作流程和主要工作流程之间共享文件。
  • 您可以以同步或异步方式调用可重用的工作流程(使用 needs 键管理作业排序)。
  • 可重用的工作流程可以定义输出,从执行的步骤中提取输出/结果。它们可以轻松地用于将数据传递到“主”工作流程。

分派的工作流程

Github 给我们提供的另一个可能性是 workflow_dispatch 事件,可以触发工作流程运行。简单来说,您可以手动触发工作流程或通过 GitHub API 提供其输入。

在市场上有一些操作可用,允许您将“已调度”工作流作为“主”工作流的步骤触发。

其中一些还允许以同步方式执行它(等待调度的工作流完成)。值得一提的是,此功能通过轮询存储库工作流的状态实现,这在并发环境下不是非常可靠。此外,它受GitHub API使用限制的限制,因此在查找调度的工作流的状态时会有延迟。

要点

  • 您可以有多个嵌套调用,从另一个触发的工作流中触发工作流。如果不小心做会导致无限循环。
  • 您需要一个具有“工作流”权限的特殊令牌;您通常的secrets.GITHUB_TOKEN不允许您分派工作流。
  • 您可以在一个作业内触发多个已分派的工作流。
  • 没有简单的方法可以从分派的工作流中获取一些数据到主要工作流中。
  • 在“点火并忘记”的情况下效果更好。等待已分派的工作流完成有一些限制。
  • 您可以观察分派的工作流运行并手动取消它们。

组合操作

在这种方法中,我们将步骤提取到一个独立的组合操作中,该操作可以位于同一或单独的存储库中。

从您的“主”工作流程中,它看起来像一个普通的操作(单个步骤),但在内部,它由多个步骤组成,每个步骤都可以调用自己的操作。

总结:

  • 支持嵌套:每个组合操作的步骤都可以使用另一个组合操作。
  • 内部步骤运行的可视化效果不佳:在“主”工作流中,它显示为普通步骤运行。在原始日志中,您可以找到内部步骤执行的详细信息,但它看起来不太友好。
  • 与父作业共享环境变量,但不共享密码,应通过输入显式传递密码。
  • 支持输入和输出。输出从内部步骤的输出/结果准备而来,可以轻松地将数据从组合操作传递到“主”工作流。
  • 组合操作在“主”工作流的作业内运行。由于它们共享一个通用文件系统,因此无需使用构建工件将文件从组合操作传输到“主”工作流程中。
  • 不能在组合操作内使用 continue-on-error 选项。

来源: 我的"DRY: reusing code in GitHub Actions"文章


虽然这个链接可能回答了问题,但最好在此处包含答案的基本部分并提供链接作为参考。如果链接页面发生变化,则仅提供链接答案可能会变得无效。-【来自审查】 - Ethan

0
可重用的工作流程无法调用其他可重用的工作流程。
实际上,自2022年8月以来,它们可以:
GitHub Actions:改进可重用工作流程
现在,可重用的工作流程可以从矩阵和其他可重用的工作流程中调用。您现在可以嵌套多达4个级别的可重用工作流程,从而为您提供更大的灵活性和更好的代码重用。从矩阵中调用可重用的工作流程允许您创建更丰富的参数化构建和部署。了解有关嵌套可重用工作流程的更多信息。了解有关使用矩阵策略与可重用工作流程的更多信息。

0

我目前处于完全相同的情况,并找到了答案。你需要一个组合操作,就像这个答案中建议的那样。


1
你的答案可以通过添加进一步的支持信息来改善。请编辑并添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。您可以在帮助中心找到有关如何编写好答案的更多信息。 - Community

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