如何在GitHub Workflow中基于同分支上一次运行状态触发通知?
基于GitHub Workflow上一次运行状态执行条件步骤的实现
可以实现需求,GitHub原生Context确实没有直接提供上一次同分支同工作流的运行状态,但可以通过调用GitHub API获取该数据,再基于此设置步骤的执行条件。具体实现如下:
实现思路
- 调用GitHub API获取当前分支下,同工作流的上一次已完成运行的状态结论(排除当前运行)。
- 将获取到的状态保存为步骤输出变量,供后续步骤判断使用。
- 在通知步骤中设置条件:仅当当前工作流运行成功,且上一次运行失败时,执行通知操作。
具体工作流示例
jobs: notify-on-fix: runs-on: ubuntu-latest steps: - name: 获取上一次工作流运行状态 id: last_run_status env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} REPO: ${{ github.repository }} WORKFLOW_ID: ${{ github.workflow_id }} BRANCH: ${{ github.ref_name }} CURRENT_RUN_ID: ${{ github.run_id }} run: | # 调用API获取上一次同分支同工作流的完成运行记录 LAST_RUN_CONCLUSION=$(curl -s -H "Authorization: token $GITHUB_TOKEN" \ "https://api.github.com/repos/$REPO/actions/workflows/$WORKFLOW_ID/runs?branch=$BRANCH&status=completed&per_page=1" \ | jq -r ".workflow_runs[] | select(.id != $CURRENT_RUN_ID) | .conclusion") # 处理首次运行的情况(无历史记录),默认设为success避免误触发 if [ -z "$LAST_RUN_CONCLUSION" ] || [ "$LAST_RUN_CONCLUSION" == "null" ]; then LAST_RUN_CONCLUSION="success" fi echo "conclusion=$LAST_RUN_CONCLUSION" >> $GITHUB_OUTPUT - name: 发送修复完成通知 if: job.status == 'success' && steps.last_run_status.outputs.conclusion == 'failure' run: | # 这里替换为你的通知逻辑,比如发送Slack消息、邮件等 echo "✅ 工作流已修复:当前分支的${{ github.workflow }}工作流运行成功,上一次运行失败"
注意事项
- 默认的
GITHUB_TOKEN已经具备actions:read权限,无需额外配置权限。 - 示例中使用
curl和jq来调用API和解析结果,GitHub托管的Runner默认已安装这两个工具;如果是自托管Runner,需要确保已安装。 - 若需要支持手动触发的工作流,可以根据
github.event_name调整条件,比如添加|| github.event_name == 'workflow_dispatch'。 - 首次运行工作流时,由于没有历史记录,会默认将上一次状态设为
success,不会触发修复通知,符合预期逻辑。
内容的提问来源于stack exchange,提问作者vokimon
相关产品推荐
相关产品推荐

