Rails应用GitHub Actions测试报错:stderr捕获步骤无法执行
解决方案
方法一:给打印步骤添加if: always()条件
这是最直接的解决方式,让打印步骤无视前面测试步骤的状态,强制执行:
- name: Run rails tests env: PGPASSWORD: postgres_password RAILS_ENV: test run: | ... initialize db, load fixtures... bin/rails test 2> test.stderr - name: print test results if: always() # 关键配置:确保此步骤必执行 run: | echo "rails test results:" cat test.stderr
if: always()会让该步骤在任何情况下(包括前面步骤失败、取消)都运行,这样既能捕获到测试的错误日志,整个工作流的最终状态依然由测试步骤的结果决定。
方法二:在同一步骤中执行测试+打印
把测试命令和打印逻辑合并到同一个步骤里,确保测试失败后仍能输出日志:
- name: Run rails tests and print results env: PGPASSWORD: postgres_password RAILS_ENV: test run: | ... initialize db, load fixtures... # 执行测试并暂存退出码 bin/rails test 2> test.stderr TEST_EXIT_CODE=$? # 打印捕获的错误日志 echo "rails test results:" cat test.stderr # 用测试的原退出码结束步骤,保证工作流状态准确 exit $TEST_EXIT_CODE
这种方式下,测试命令的退出码会被临时保存,打印完成后再用原退出码结束步骤,既保留了错误日志,又不会影响工作流的最终状态判断。
方法三:暂存退出码,延迟标记失败
先让测试步骤强制返回成功,暂存真实的测试退出码,打印完成后再根据退出码标记工作流失败:
- name: Run rails tests env: PGPASSWORD: postgres_password RAILS_ENV: test run: | ... initialize db, load fixtures... bin/rails test 2> test.stderr # 将测试退出码写入环境变量 echo "TEST_EXIT_CODE=$?" >> $GITHUB_ENV # 强制此步骤返回成功,让后续步骤执行 exit 0 - name: print test results run: | echo "rails test results:" cat test.stderr - name: Check test result run: | # 根据暂存的退出码决定是否让工作流失败 if [ $TEST_EXIT_CODE -ne 0 ]; then exit $TEST_EXIT_CODE fi
这种方式适合需要在打印后执行更多后续处理的场景,但相对前两种更繁琐。
内容的提问来源于stack exchange,提问作者aerijman
相关产品推荐
相关产品推荐

