如何获取GitHub Actions中Terraform Plan步骤的stdout和stderr
解决GitHub Actions中Terraform步骤无法获取stdout/stderr的问题
问题分析
你当前的GitHub Actions Workflow里,ID为plan的步骤无法通过steps.plan.outputs.stderr或stdout获取输出,原因是GitHub Actions不会自动将步骤的标准输出/错误输出注入到步骤的outputs中,只有通过echo "key=value" >> $GITHUB_OUTPUT显式声明的内容才会出现在steps.<id>.outputs里。从你打印的steps.plan JSON结构也能看到,只有你手动设置的tfplan_identifier在outputs中。
解决方案
方法1:手动捕获并输出到GITHUB_OUTPUT
修改Terraform Plan步骤的run脚本,将Terraform命令的stdout和stderr捕获后,写入$GITHUB_OUTPUT:
- name: Terraform Plan id: plan continue-on-error: true run: | tfplan_identifier=tfplan-expected echo "tfplan_identifier=$tfplan_identifier" >> $GITHUB_OUTPUT # 捕获stdout和stderr到文件,再写入GITHUB_OUTPUT terraform plan -var-file="prod.tfvars" -input=false -no-color -out=${tfplan_identifier} > stdout.log 2> stderr.log echo "stdout=$(cat stdout.log)" >> $GITHUB_OUTPUT echo "stderr=$(cat stderr.log)" >> $GITHUB_OUTPUT terraform show -no-color tfplan-actual > plan.log
之后在后续步骤中,就能通过${{ steps.plan.outputs.stdout }}和${{ steps.plan.outputs.stderr }}获取对应输出。
如果希望同时在控制台看到输出并捕获,可以用tee命令:
terraform plan ... 2>&1 | tee combined.log echo "combined_output=$(cat combined.log)" >> $GITHUB_OUTPUT
方法2:上传日志文件作为Artifact
如果日志内容较大,或者需要长期保留日志文件,可以使用actions/upload-artifact将日志文件上传,方便后续下载查看:
- name: Terraform Plan id: plan continue-on-error: true run: | tfplan_identifier=tfplan-expected echo "tfplan_identifier=$tfplan_identifier" >> $GITHUB_OUTPUT terraform plan -var-file="prod.tfvars" -input=false -no-color -out=${tfplan_identifier} > stdout.log 2> stderr.log terraform show -no-color tfplan-actual > plan.log - name: Upload Terraform Plan Logs uses: actions/upload-artifact@v3 with: name: terraform-plan-logs path: | stdout.log stderr.log plan.log
Workflow执行完成后,你可以在GitHub的Actions页面找到对应运行记录,下载名为terraform-plan-logs的Artifact查看完整日志。
补充说明
- 你的
plan步骤设置了continue-on-error: true,所以即使Terraform命令执行失败,步骤的conclusion会是success,但outcome会显示failure,这是正常行为,不影响日志捕获。 - 如果你使用了Terraform官方的
hashicorp/setup-terraform且开启了terraform_wrapper: true,工具会自动处理部分输出,但你当前设置了terraform_wrapper: false,所以需要手动处理输出捕获。
内容的提问来源于stack exchange,提问作者Kay
相关产品推荐
相关产品推荐

