跳过上一个作业时 Github 操作作业会触发

Sca*_*olo 17 github-actions

在设置 GitHub 操作来构建和部署应用程序时,我遇到了以下问题。

我想在以下条件下部署我的网络应用程序。然而,wheneverdeploy-apideploy-syncskipdeploy-web也会被跳过。我认为我的 if 条件会捕获这种情况并仍然运行,deploy-web但事实并非如此。感觉就像我错过了一些明显但无法识别的东西。

deploy-web:
  name: Deploy Web
  runs-on: ubuntu-latest
  needs: [build-and-publish-web, deploy-api, deploy-sync]
  if: |
    needs.build-and-publish-web.result == 'success' &&
    (needs.deploy-api.result == 'success' || needs.deploy-api.result == 'skipped') &&
    (needs.deploy-sync.result == 'success' || needs.deploy-sync.result == 'skipped')
Run Code Online (Sandbox Code Playgroud)

Krz*_*tof 36

您似乎遇到了这个问题 - 如果跳过“needs”属性中的作业,则作业级“if”条件未正确评估

请尝试使用always表达式:

deploy-web:
  name: Deploy Web
  runs-on: ubuntu-latest
  needs: [build-and-publish-web, deploy-api, deploy-sync]
  if: |
    always() &&
    needs.build-and-publish-web.result == 'success' &&
    (needs.deploy-api.result == 'success' || needs.deploy-api.result == 'skipped') &&
    (needs.deploy-sync.result == 'success' || needs.deploy-sync.result == 'skipped')
Run Code Online (Sandbox Code Playgroud)

不特定于原始问题,但如果您关心的只是确保没有失败,needs.*.result则提供通配符行为,使您不必手动检查每个步骤:

  if: |
    always() &&
    !contains(needs.*.result, 'failure') &&
    !contains(needs.*.result, 'cancelled')
Run Code Online (Sandbox Code Playgroud)

  • 不错的解决方案,但问题是依赖于“deploy-web”的作业仍然被跳过,然后你最终会在各处添加“always()”:( (6认同)
  • 在作业中使用 `always()` 的另一个问题是作业无法取消(https://docs.github.com/en/actions/managing-workflow-runs/canceling-a-workflow#steps-github-takes -取消工作流程运行) (5认同)
  • 我喜欢`${{always() && !failed() && !cancelled() }}` (3认同)

rh0*_*h0x 12

我更喜欢更简洁的条件,但如果您的条件很复杂,您可能需要更复杂的解决方案,如接受的答案中所示:

needs: [compute_version_tag, bump_version]
if: ${{ always() && !failure() && !cancelled() }} # when none of the needed jobs fail or are cancelled (skipped or successful jobs are ok).
Run Code Online (Sandbox Code Playgroud)

请注意,!cancelled()需要能够取消具有always()if 条件的作业。

  • `if:` 表达式中不再需要 `${{ }}`,因此只需 `if:always() && !failure() && !cancelled()` (3认同)