如何在GitHub Action的post步骤中判断前置步骤是否失败?
可行解决方案
针对你开发自定义GitHub Action时遇到的post步骤需判断前置步骤状态的问题,以下是几个可靠的解决思路:
方法一:将作业结论通过输入参数传递给post步骤
利用GitHub工作流的job.conclusion上下文,在调用自定义Action的post步骤时,将该值作为输入参数传入,这样Action的post逻辑就能直接获取作业最终状态:
- 在工作流YAML中调用Action时,添加输入参数:
- name: 自定义清理Action uses: 你的组织/你的仓库@版本号 with: job-conclusion: ${{ job.conclusion }} if: always()
- 在自定义Action的
action.yml中定义该输入:
inputs: job-conclusion: description: 作业的最终执行结论(success/failure/cancelled) required: true runs: using: 'node16' main: 'dist/main.js' post: 'dist/post.js'
- 在post步骤的代码中,通过
@actions/core包获取该参数:
const core = require('@actions/core'); const jobConclusion = core.getInput('job-conclusion'); if (jobConclusion === 'failure') { // 执行失败时的清理逻辑 } else { // 执行成功时的清理逻辑 }
这个方法直接利用工作流上下文,避免了API调用的延迟和匹配问题,是最可靠的方案。
方法二:在前置步骤中记录状态到共享环境/文件
因为同一作业的主步骤和post步骤运行在同一个Runner环境下,可以通过环境变量或临时文件传递状态:
- 环境变量方式:在每个前置步骤结尾,不管成功失败,都将状态写入
GITHUB_ENV:
- name: 核心步骤1 run: | # 执行核心逻辑 echo "STEP1_STATUS=$?" >> $GITHUB_ENV continue-on-error: true # 确保即使步骤失败也能执行状态写入
在post步骤中读取这些环境变量,判断是否有步骤失败:
const step1Status = process.env.STEP1_STATUS; const hasFailedSteps = step1Status !== '0' || ...; // 检查所有步骤状态
- 临时文件方式:在前置步骤中将状态写入
$GITHUB_WORKSPACE下的文件:
- name: 核心步骤1 run: | # 执行核心逻辑 echo $? > $GITHUB_WORKSPACE/step1_status.txt continue-on-error: true
post步骤读取文件内容判断状态:
const fs = require('fs'); const step1Status = fs.readFileSync(`${process.env.GITHUB_WORKSPACE}/step1_status.txt`, 'utf8').trim();
这种方法适合需要追踪单个步骤状态的场景,但需要处理多个步骤的状态汇总。
方法三:利用工作流输出传递步骤状态
在每个前置步骤中设置输出,post步骤通过步骤ID读取输出:
- 前置步骤中设置输出:
- name: 核心步骤1 id: step1 run: | # 执行核心逻辑 if [ $? -eq 0 ]; then echo "status=success" >> $GITHUB_OUTPUT else echo "status=failure" >> $GITHUB_OUTPUT fi continue-on-error: true
- 在post步骤的Action调用中,传入该输出作为参数:
- name: 自定义清理Action uses: 你的组织/你的仓库@版本号 with: step1-status: ${{ steps.step1.outputs.status }} if: always()
这种方式可以精准获取每个步骤的状态,但需要给每个前置步骤设置ID和输出,适合步骤较少的场景。
内容的提问来源于stack exchange,提问作者Philipp Lengauer
相关产品推荐
相关产品推荐

