在 GitHub Actions 工作流程中重用作业

Jor*_* RV 6 github github-actions

我\xe2\x80\x99m 将管道从 Circle CI 迁移到 Github Actions,我发现有点奇怪,我只能运行作业一次而不是创建作业,然后从工作流程部分调用它,从而可以调用多次作业,而无需重复该作业中的命令/脚本。

\n

我的管道将代码推送到三个环境,然后对每个环境运行灯塔扫描。在 Circle ci 中,我有 1 项工作将代码推送到我的环境,还有 1 项工作来运行 lighthouse。然后,从我的工作流程部分,我只需调用作业 3 次,并将 env 作为参数传递。我是否遗漏了一些东西,或者没有办法在 github actions 中做到这一点?我是否只需在每个作业中写 3 次命令?

\n

Car*_*nal 9

GitHub Actions 中的代码重用主要有 3 种方法:

重用工作流程

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

要点:

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

分派工作流程

GitHub 为我们提供的另一种可能性是workflow_dispatch事件,它可以触发工作流运行。简而言之,您可以手动或通过 GitHub API 触发工作流程并提供其输入。

Marketplace 上提供了一些操作,允许您触发“分派”工作流程作为“主”工作流程的一个步骤。

其中一些还允许以同步方式执行此操作(等到分派的工作流程完成)。值得一提的是,该功能是通过轮询存储库工作流状态来实现的,这不太可靠,尤其是在并发环境中。此外,它还受到 GitHub API 使用限制的限制,因此在查找已调度工作流程的状态方面存在延迟。

要点

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

复合动作

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

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

要点:

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

来源:我的“DRY:在 GitHub Actions 中重用代码”文章


小智 0

我目前处于完全相同的情况,刚刚找到了答案。您正在寻找复合操作,正如此答案中所建议的那样。