首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不应该执行的情况下执行GitHub操作,基于条件

在不应该执行的情况下执行GitHub操作,基于条件
EN

Stack Overflow用户
提问于 2022-08-14 15:37:42
回答 1查看 151关注 0票数 0

我在GitHub操作作业中有以下步骤的顺序(第一个步骤或多或少用于调试目的)

代码语言:javascript
运行
复制
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:
          ...

以下是调试操作的结果:

代码语言:javascript
运行
复制
  echo "evaluation-1 result is 
  echo "evaluation-2 result is fail

似乎还没有确定第一个结果。

然而,令我困惑的是,成功的行动也是被执行的。

代码语言:javascript
运行
复制
${{ steps.evaluation_1.outputs.evaluation-1-outcome }} != $FAIL_OUTCOME && ${{ steps.evaluation_2.outputs.evaluation-2-outcome}} != $FAIL_OUTCOME

变成真的。这怎么可能呢?

为了提供更多的背景,以前步骤中的产出分配如下:

代码语言:javascript
运行
复制
echo "::set-output name=evaluation-2-outcome::$FAIL_OUTCOME"
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-08-15 10:28:38

您的问题的直接答案是,您在if语句中误用了if值。

您需要在这里使用:

代码语言:javascript
运行
复制
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

或者:

代码语言:javascript
运行
复制
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变量--这有很多问题,很难调试和维护。

通过检查整个作业的输出,可以轻松地处理松懈的成功和失败:

代码语言:javascript
运行
复制
 - name: send slack failure
   if: failure()

 - name: send slack success
   if: success()

如果只想就某些步骤的失败进行沟通:

代码语言:javascript
运行
复制
notify_failure:
    if: always() && !cancelled() && needs.check_failure_step.result != 'success'
    needs: check_failure_step

而不是使用echo set-output::,只使用exit 1来完成某项任务。将其与needs和作业、输出值和if: always()相结合,您可以实现任何您想要的结果。

它还为您提供了一个巨大的优势,即无需查看其“输出”或“调试”日志,就可以在工作流运行摘要上直接查看哪个作业失败了。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73352936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档