如何在GitHub Actions中捕获步骤的完整输出与退出状态码?
问题:GitHub Actions中捕获命令完整stdout并保留退出码
我已经知道如何在GitHub Actions中获取步骤的简单输出,但想知道在步骤中运行命令时,如何捕获完整的stdout供其他步骤使用,同时不拦截命令的退出状态码?
测试用的bash脚本mimick-output.sh如下:
#!/usr/bin/env bash echo "Output 1..." sleep 1 echo "Output 2..." sleep 1 echo "Output 3..." sleep 1 exit 123
我尝试了两种方式,但都没能成功捕获输出:
方法1
- name: Produce Some Output id: run-produce-output run: echo $(foo_output=./mimick-output.sh) >> $GITHUB_OUTPUT - name: Echo output run: echo ${{ steps.run-produce-output.outputs.foo_output }}
此方法中foo_output为空,因为语法错误——foo_output=./mimick-output.sh仅完成变量赋值,并未执行脚本。
方法2
- name: Produce output. id: run-produce-output run: ./mimick-output.sh - name: Echo output if: always() run: echo ${{join(steps.run-produce-output.outputs.*, '\n')}}
此方法同样无法获取输出,因为GitHub Actions步骤的outputs不会自动捕获命令的stdout,必须显式写入$GITHUB_OUTPUT。
我的期望是:后续步骤能打印出完整的脚本输出:
Output 1... Output 2... Output 3...
同时run-produce-output步骤的退出状态码保持为123。
解决方案
要同时实现捕获完整stdout和保留原始退出码,可通过以下步骤完成:
- name: Produce and capture output id: run-produce-output run: | # 捕获脚本stdout到变量,同时记录退出码 output=$(./mimick-output.sh) exit_code=$? # 用Here Document写入多行输出到GITHUB_OUTPUT,避免换行丢失 echo "foo_output<<EOF" >> $GITHUB_OUTPUT echo "$output" >> $GITHUB_OUTPUT echo "EOF" >> $GITHUB_OUTPUT # 以脚本的原始退出码结束步骤 exit $exit_code - name: Echo captured output if: always() run: | echo "Captured output:" echo "${{ steps.run-produce-output.outputs.foo_output }}"
关键说明
- 捕获输出与退出码:
output=$(./mimick-output.sh)捕获脚本所有标准输出,exit_code=$?保存脚本执行后的退出状态。 - 处理多行输出:使用Here Document(
<<EOF)格式写入$GITHUB_OUTPUT,确保换行符被完整保留,避免单行输出截断多行内容。 - 保留退出状态:最后执行
exit $exit_code,让步骤的退出状态与原始脚本一致,GitHub Actions会正确识别步骤的成败。
设置完成后,后续步骤可通过${{ steps.run-produce-output.outputs.foo_output }}获取完整输出,且run-produce-output步骤的退出码为123。
内容的提问来源于stack exchange,提问作者Lucas Bustamante
相关产品推荐
相关产品推荐

