Github-Action-Day6:快速失败式矩阵工作流

这是我的 Github Action Advent Calendar 的第六天的内容,如果您想要了解更多已经发布的 tips 信息,查看此处的 索引

关于 Github Action 的这些文章还没有发布到一个礼拜,我就已经写了大量关于矩阵工作流 (matrix workflows) 的内容了。你没有猜错,我是它的超级粉丝。

但是如果您想要开始配置你的第一个矩阵工作流,这里你需要知道一个警告:在默认情况下,矩阵式的工作流 (matrix workflows)

表示为 fail fast。意思是说:如果通过矩阵扩展的这些任务 (jobs) 中有一个运行出错了,其余的任务 (jobs) 就会被取消

这种效果通常来说都是非常有益的:如果你正在运行对某 pull request 验证的一系列操作,而其中一个操作失败了,你可能很容易忽视其余的操作成功与否。任何失败都足以表明一个严重的问题,你应该避免合并这个 PR (pull request)。

Translate Note:

pull request的一系列操作中,只要有一个阶段操作有问题,其余的操作都应该取消,取消合并这个 PR

但是当你从头创建一个工作流 (workflow) 时,您可能需要迭代一下,以使其在第一次运行时正常运行。而且如果 jobs 运行失败是因为工作流配置的问题 — 而不是代码本身的时候 — 关闭 fail-fast 并让其作为一个调试工具往往很有用处。

Translate Note:

迭代一下,其实就是预先测试工作流是否可以良好运行,这时候肯定是需要所有的步骤都运行,以便测试整体运行的情况。如果提前取消,没有运行的子任务的错误可能就无法发现。

假如你有一个在 Linux 平台上运行良好的工作流 (workflow),而你想使用矩阵 (matrix) 来将其扩展至 macOS 以及 Windows 上运行。对于一个简单的 workflow 来说,运行起来应该没什么问题。但是对于某些复杂的 workflow 来说,在运行前你可能需要配置一些依赖或者说安装一些工具。所以,在没有任何改动的前提下,你的 workflow 在 Linux 平台上能够运行,但很有可能在 macOS 或者 Windows 上无法运行。

所以在你第一次运行这个新的矩阵工作流 (matrix workflow) 到底发生了什么呢?

实际上,你的 Linux、macOS以及 Windows jobs 都会同时开始运行,而且 macOS 或者 Windows 的 jobs只要其中有一个运行失败,其余的 workflow 都会被取消运行。

想象一下,首先是 Windows job 第一个运行失败,那么你应该看到这样的情况:

Windows Fail

OK,看到这个此时你决定去修复 Windows 相关的 workflow。于是你检查到底是哪里出了问题,随后修复更新了你的 workflow 并推送更改到 Action 的运行队列中。但是,由于排序和队列不是非常确定的,可能这一次 macOS 运行完成了 —但是失败了。(这就造成) 您甚至还没来得及查看 Windows 运行 (进程)是否已经能够正常运行之前,它就被就被取消 (运行) 了。

这样刚才修复的 Windows workflow 是否修复好就不知道了。

因此,当你在调试你的 workflow 时,你可以通过设置 fail-fast: false 来关闭这种行为 (快速失败) :

strategy:
matrix:
os: [ubuntu-latest, macos-latest, windows-latest]
fail-fast: false

现在, workflow 不会在第一个失败的job 出现时被取消。它会允许 Windows 以及 macOS 的 jobs 完整的运行直到结束:

Mac Fail

关闭 fail-fast 可以帮助您轻松地迭代 (更新测试) 您的 workflow 。当你准备在生产环境中运行时,一定要确保开启 fail-fast! 这可以帮助您在 CI 工具运行时节省时间 (以及金钱)。