Github Actions:检查步骤状态

Max*_*xim 18 github-actions

我在 CI 的工作中有一些可能会引发错误的步骤。我不希望在出现错误的每一步都重新启动工作流程,并希望转到检查这些步骤的最后一步并以失败的方式完成此工作。但我无法在之前的步骤中获取状态信息。

name: CI
on: [pull_request]
jobs:
  myjob:
    runs-on: ubuntu-latest
    steps:
      - name: Step 1
        id: hello
        run: <any> 
        continue-on-error: true
      - name: Step 2
        id: world
        run: <any> 
        continue-on-error: true
      - name: Check on failures
        if: job.steps.hello.status == failure() || job.steps.world.status == failure()
        run: exit 1
Run Code Online (Sandbox Code Playgroud)

当我在“if”或“run”中使用下一个构造时,将得到:steps -> {}, job.steps -> null。

如何获取状态信息?

pet*_*ans 18

更新steps上下文现在包含有关默认情况下每个步骤执行的详细信息。使用outcome每个步骤的属性,我们可以检查其执行的结果。

name: CI
on: [pull_request]
jobs:
  myjob:
    runs-on: ubuntu-latest
    steps:
      - name: Step 1
        id: hello
        run: <any> 
        continue-on-error: true
      - name: Step 2
        id: world
        run: <any> 
        continue-on-error: true
      - name: Check on failures
        if: steps.hello.outcome != 'success' || steps.world.outcome != 'success'
        run: exit 1
Run Code Online (Sandbox Code Playgroud)

原始答案 查看步骤上下文的文档,它似乎不包含有关步骤以外的任何信息outputs。这些必须由步骤明确定义。这就是步骤上下文为空的原因{}

https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions#steps-context

不幸的是,据我所知,可以访问的步骤没有默认状态。该解决方案涉及从每个步骤手动定义状态输出变量。

name: CI
on: [pull_request]
jobs:
  myjob:
    runs-on: ubuntu-latest
    steps:
      - name: Step 1
        id: hello
        run: echo ::set-output name=status::failure
        continue-on-error: true
      - name: Step 2
        id: world
        run: echo ::set-output name=status::success
        continue-on-error: true
      - name: Dump steps context
        env:
          STEPS_CONTEXT: ${{ toJson(steps) }}
        run: echo "$STEPS_CONTEXT"
      - name: Check on failures
        if: steps.hello.outputs.status == 'failure' || steps.world.outputs.status == 'failure'
        run: exit 1
Run Code Online (Sandbox Code Playgroud)

这将创建以下上下文输出并且作业失败。

{
  "hello": {
    "outputs": {
      "status": "failure"
    }
  },
  "world": {
     "outputs": {
      "status": "success"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

https://help.github.com/en/articles/metadata-syntax-for-github-actions#outputs https://help.github.com/en/articles/development-tools-for-github-actions#set -an-output-parameter-set-output

  • 2020 更新:正如其他答案提到的,不再需要(如果有的话,IDK)显式设置输出。您只需要:1. 在步骤上设置“id”,2. 调用“steps.&lt;step id&gt;.outcome”。参考:https://docs.github.com/en/actions/reference/context-and-expression-syntax-for-github-actions#steps-context 请@peterevans 更新答案以添加此类信息。 (2认同)

Nic*_*amy 8

您可以使用setps.STEPNAME.outcome 属性获取状态,该属性与 success() 或 failure() 检查相关联

name: CI
on: [pull_request]
jobs:
  myjob:
    runs-on: ubuntu-latest
    steps:
      - name: Step 1
        id: hello
        run: <any> 
        continue-on-error: true
      - name: Step 2
        id: world
        run: <any> 
        continue-on-error: true
      - name: Check on failures
        if: (${{ success() }} || ${{ failure() }}) && (${{ steps.hello.outcome }} == 'failure' || ${{ steps.world.outcome }} == 'failure')
        run: exit 1
Run Code Online (Sandbox Code Playgroud)

  • @BF99 `always` 也会在取消时运行。 (4认同)