即使上一步失败,但作业仍然失败,如何运行下一个 github 操作步骤?

sgo*_*owd 17 github github-actions

这个问题类似于如何运行 github-actions 步骤,即使上一步失败,同时仍然使作业失败,但接受的答案对我没有帮助,因为它创建了额外的作业。

我想在下面完成的是

  • 当测试应用程序(步骤2)通过时;test-clean 步骤应该运行,并且 github 操作工作流返回成功。
  • 当测试应用程序(步骤2)失败时;应运行 test-clean、action-slack 和 failure-action 步骤。github 操作工作流程返回失败。

如何修复以下代码以使其发生?

name: CI
on:
  pull_request:
    branches:
    - master
  push:
    branches:
      - master

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v1    

    - name: test-app
      run: ./gradlew test

    - name: test-clean
      run: some cleanup that should run always

    - name: action-slack
      if: ${{ step2.result != 'success' }}
      uses: 8398a7/action-slack@v3
      with:
          status: ${{ step2.result }}
          fields: repo,message,commit,author,action,eventName,ref,workflow,job,took
      env:
          SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK_URL }}

    - name: fail-action        
      run:  |
         if ${{ step2.result != 'success' }}; then
            exit 1
         fi

Run Code Online (Sandbox Code Playgroud)

Mat*_*att 25

您可以使用状态检查功能来了解之前步骤的状态。如果您不包含这样的功能,if: success() && ...则暗示如此。这意味着当先前的作业失败时,作业将不会运行,除非您在子句中使用always()or 。failure()if

要解决前面步骤的结果,您可以使用(应用之前)或(应用之后)等步骤。contextsteps.<id>.outcomecontinue-on-errorsteps.<id>.conclusioncontinue-on-error

这是一个结合了所有内容的工作示例:

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2

    # Mock to test workflow
    - name: Test app
      id: test-app # will be referenced later
      run: |
        echo "Testing app (randomly fails)"
        if [[ $(($RANDOM % 2)) == 0 ]]; then exit 0; else exit 1; fi

    # runs always
    - name: test-clean
      if: always()
      run: echo "Cleanup after tests"

    # runs if previous jobs failed and test-app was not successful (failure/cancelled)
    - name: action-slack
      if: failure() && steps.test-app.outcome != 'success'
      run: |
        echo "Run action-slack"
        echo "Result of test-app was '${{ steps.test-app.outcome }}'"
Run Code Online (Sandbox Code Playgroud)

PS:另一个问题的答案不会添加额外的工作,而是包含一个如何将其应用于不同工作的示例。然而,这个答案并没有解决您的确切用例,但它可以通过提供一些指导来帮助您。