我在GitHub操作作业中有以下步骤的顺序(第一个步骤或多或少用于调试目的)
env:
FAIL_OUTCOME: 'fail'
- name: debug
shell: bash
run: |
echo "evaluation-1 result is ${{ steps.evaluation_1.outputs.evaluation-1-outcome }}
echo "evaluation-2 result is ${{ steps.evaluation_2.outputs.evaluation-2-outcome }}
echo $FAIL_OUTCOME
- name: send slack failure
if: ${{ steps.evaluation_1.outputs.evaluation-1-outcome }} == $FAIL_OUTCOME || ${{ steps.evaluation_2.outputs.evaluation-2-outcome }} == $FAIL_OUTCOME
uses: rtCamp/action-slack-notify@v2
env:
...
- name: send slack success
if: ${{ steps.evaluation_1.outputs.evaluation-1-outcome }} != $FAIL_OUTCOME && ${{ steps.evaluation_2.outputs.evaluation-2-outcome}} != $FAIL_OUTCOME
uses: rtCamp/action-slack-notify@v2
env:
...
以下是调试操作的结果:
echo "evaluation-1 result is
echo "evaluation-2 result is fail
似乎还没有确定第一个结果。
然而,令我困惑的是,成功的行动也是被执行的。
${{ steps.evaluation_1.outputs.evaluation-1-outcome }} != $FAIL_OUTCOME && ${{ steps.evaluation_2.outputs.evaluation-2-outcome}} != $FAIL_OUTCOME
变成真的。这怎么可能呢?
为了提供更多的背景,以前步骤中的产出分配如下:
echo "::set-output name=evaluation-2-outcome::$FAIL_OUTCOME"
发布于 2022-08-15 10:28:38
您的问题的直接答案是,您在if
语句中误用了if
值。
您需要在这里使用:
if: steps.evaluation_1.outputs.evaluation-1-outcome == env.FAIL_OUTCOME || steps.evaluation_2.outputs.evaluation-2-outcome == env.FAIL_OUTCOME
...
if: steps.evaluation_1.outputs.evaluation-1-outcome != env.FAIL_OUTCOME && steps.evaluation_2.outputs.evaluation-2-outcome != env.FAIL_OUTCOME
或者:
if: ${{ steps.evaluation_1.outputs.evaluation-1-outcome == env.FAIL_OUTCOME || steps.evaluation_2.outputs.evaluation-2-outcome == env.FAIL_OUTCOME }}
...
if: ${{ steps.evaluation_1.outputs.evaluation-1-outcome != env.FAIL_OUTCOME && steps.evaluation_2.outputs.evaluation-2-outcome != env.FAIL_OUTCOME }}
Env变量只能在$FAIL_OUTCOME作用域中作为bash
访问--在其他任何地方,都需要显式使用env.
前缀。
但是,我建议正确地执行它,而不要使用与set-output
疯狂相结合的env变量--这有很多问题,很难调试和维护。
通过检查整个作业的输出,可以轻松地处理松懈的成功和失败:
- name: send slack failure
if: failure()
- name: send slack success
if: success()
如果只想就某些步骤的失败进行沟通:
notify_failure:
if: always() && !cancelled() && needs.check_failure_step.result != 'success'
needs: check_failure_step
而不是使用echo set-output::
,只使用exit 1
来完成某项任务。将其与needs
和作业、输出值和if: always()
相结合,您可以实现任何您想要的结果。
它还为您提供了一个巨大的优势,即无需查看其“输出”或“调试”日志,就可以在工作流运行摘要上直接查看哪个作业失败了。
https://stackoverflow.com/questions/73352936
复制相似问题