如何在Github Actions中让作业失败?

83

我正在开发Github Actions工作流程。该工作流可在Linux、Mac和Windows上运行。

作为工作流的一部分,我必须检查两个环境变量是否相等。如果它们不相等,则作业失败。

此处所述,Github Actions支持if:条件语句:

steps:
- run: # How can I make a cross-platform failure here?
  if: ${{ envA }} != ${{ envB }}

如果上述条件成立,我该如何使工作失败?一开始,我考虑使用脚本,但肯定有更优雅的方法来强制工作失败。

3个回答

101

我会执行run: exit 1。这将简单地在所有三个平台上以退出码1退出。

证明它是跨平台的:https://github.com/rmunn/Testing/runs/220188838,其中运行以下工作流程:

name: Test exiting on failure

on: [push]

jobs:
  build:

    strategy:
      matrix:
        os: [ubuntu-latest, windows-latest, macOS-latest]
    runs-on: ${{ matrix.os }}
    
    steps:
    - uses: actions/checkout@v1
    - name: Try to fail
      run: exit 1
    - name: Print message if we don't fail
      run: echo Should not get here

(此答案的早期版本推荐使用“/bin/false”,但这只适用于Linux和macOS。)

11
有没有方法在不导致任务失败的情况下完成此操作?也就是说,当满足某个条件时以成功的方式退出任务? - simon
6
如果有人想知道,“exit 0”会在不取消作业的情况下提前结束步骤。 - user3714134
3
我尝试使用了exit 0,但它没有生效。接下来的步骤仍会运行。 - Yumin Gui
1
@YuminGui 需要注意的是,"exit 0将结束步骤而不会取消作业",这与你期望的可能不同,即"exit 0将结束作业而不会使工作流失败"。请记住,一个工作流程有许多作业,一个作业有许多步骤,每个步骤都运行一个 shell 命令或使用一个操作。 - airtonix

73

在2021年,也许有一种更为优雅的方法来实现这个:

- name: A/B Check
  if: ${{ envA }} != ${{ envB }}
  uses: actions/github-script@v3
  with:
    script: |
        core.setFailed('envA and envB are not equivalent!')

在这里,我们使用github-script操作来提供一个一行脚本,用于使作业失败。只有当if行中的条件为真时,“A/B Check”步骤才会运行,因此脚本仅在该情况下运行,这正是我们想要的。

这种方法的好处是,您将在存储库中的操作UI中获得格式良好的输出,显示“ A/B Check”步骤导致了失败以及原因(即“ envA和envB不等效”)。

请注意,如果在此之后作业中有其他步骤,并且您不希望它们在A/B检查失败时运行,则需要在它们上面使用if: success()以防止它们在这种情况下运行。


5
我很喜欢这个!但实际上我不得不更改 if 语句的条件为 if: ${{ envA != envB }} - Rafael-WO
更快的方法是使用相邻答案中展示的技术:https://dev59.com/BVMH5IYBdhLWcg3w2kR3#74229789 - airtonix

19

Github workflow commands文档 提供了这方面的提示。

工具箱函数 等效的工作流命令
core.setFailed 可用作 ::errorexit 1 的快捷方式

有了这个,您可以在不使用任何外部工作流程的情况下执行以下操作。

steps:
  - name: A/B Check
    if: ${{ envA }} != ${{ envB }}
    run: |
      echo "::error file={name},line={line},endLine={endLine},title={title}::{message}"
      exit 1

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