在 GitHub Actions 中运行 Python 脚本时,既要完整捕获其多行标准输出(用于后续 PR 自动评论),又需准确传递原始退出码(0/1)以触发步骤失败,需绕过 $GITHUB_OUTPUT 无视退出码的限制,推荐使用 tee + 临时文件 + 显式状态检查的组合方案。
在 github actions 中运行 python 脚本时,既要完整捕获其多行标准输出(用于后续 pr 自动评论),又需准确传递原始退出码(0/1)以触发步骤失败,需绕过 `$github_output` 无视退出码的限制,推荐使用 `tee` + 临时文件 + 显式状态检查的组合方案。
在 GitHub Actions 工作流中,直接通过 echo "key<
? 注意:$? 在管道后仍能正确获取前一个命令(python)的退出码,因为 tee 不会覆盖它——只要不执行其他命令干扰 $? 即可。
? 后续步骤读取输出与响应逻辑
一旦输出已落盘,后续步骤即可安全读取:
- name: Run script and preserve exit code
id: check_data
shell: bash
run: |
# 执行脚本,实时输出到控制台,并保存到临时文件
python tools/check_data.py "$BRANCH" | tee "$RUNNER_TEMP/check_data_output.txt"
# 捕获上一管道的真实退出码(即 python 脚本的退出码)
script_exit_code=$?
# 将退出码显式写入环境变量(供后续调试或条件判断)
echo "SCRIPT_EXIT_CODE=$script_exit_code" >> "$GITHUB_ENV"
# 关键:主动退出,确保步骤状态与脚本一致
exit $script_exit_code- name: Auto comment on PR
if: github.event_name == 'pull_request'
uses: marocchino/sticky-pull-request-comment@v2.9.0
with:
recreate: true
header: data-check-results
path: ${{ runner.temp }}/check_data_output.txt
- name: Show output in job summary (for pushes)
if: github.event_name != 'pull_request'
run: |
cat "${{ runner.temp }}/check_data_output.txt" >> "${GITHUB_STEP_SUMMARY}"- name: Handle validation failure
if: env.SCRIPT_EXIT_CODE == '1'
run: echo "⚠️ Data validation failed — please review the auto-comment above."