GitHub Actions作业输出异常:仅显示成功,失败时无输出
问题分析及解决方案
核心问题
- 命令失败导致步骤终止:GitHub Actions的
run步骤默认会在任何命令返回非零退出码时立即终止,所以当./my-command失败时,后续的结果判断和输出命令根本不会执行,无法生成Failure的输出,甚至整个job1会直接失败,依赖它的job2也会被跳过(无输出)。 - 输出变量名不匹配:你的
job1输出里引用的是steps.step1.outputs.test,但实际在step1中输出的变量是result,这会导致即使./my-command成功,job2也无法正确获取到值(除非你代码里存在笔误)。
修正后的配置
jobs: job1: runs-on: ubuntu-latest outputs: output1: ${{ steps.step1.outputs.result }} # 修正变量名,对应step输出的result steps: - id: step1 run: | # 关闭命令失败自动终止,确保后续代码能执行 set +e ./my-command # 捕获命令的退出码 exit_code=$? # 根据退出码设置结果 if [ $exit_code -eq 0 ]; then result="Success" else result="Failure" fi # 将结果输出到GITHUB_OUTPUT echo "result=$result" >> $GITHUB_OUTPUT # 可选:如果需要让job1的状态与命令结果一致,恢复 errexit 并返回原退出码 # set -e # exit $exit_code # 可选:如果希望命令失败时步骤仍标记为成功,保证job1正常完成、job2能运行 # continue-on-error: true job2: runs-on: ubuntu-latest needs: job1 # 可选:如果希望job2在job1失败时也能运行,添加此条件 # if: always() steps: - run: echo ${{ needs.job1.outputs.output1 }}
关键说明
set +e:关闭shell的errexit模式,避免./my-command失败时直接终止步骤,确保后续的结果判断和输出命令能正常执行。- 变量名匹配:必须保证
job1的outputs引用的变量名和step1中输出的变量名完全一致(均为result),否则无法正确传递值。 continue-on-error: true:如果希望./my-command失败时,step1仍标记为成功,让job1正常完成,从而确保job2能运行(默认情况下,依赖的job失败时后续job会被跳过)。如果需要job1的状态与./my-command的结果一致,可以去掉这个配置,并在run末尾恢复set -e并返回原退出码,此时若要让job2在job1失败时也运行,需要给job2添加if: always()。
内容的提问来源于stack exchange,提问作者dwvldg
相关产品推荐
相关产品推荐

