DEBUG.WIKI
丽萨主机;为跨境业务选好 IP;原生 / 住宅 IP · 按套餐选择;查看 IP →
阿里云;从建站到云上业务;云服务器 · 数据库 · 对象存储;查看产品 →
Evoxt;最高 6.0GHz CPU;高频云服务器 · 免费每周备份;查看配置 →

Actions 已 push 提交,另一个 on: push 工作流却没启动

远端收到提交不代表下游工作流会启动。检查实际推送身份、分支路径过滤和GITHUB_TOKEN事件规则,再选择同流程job或授权认证方案。

工作流成功生成文件并执行 git push,远端也能看到新提交,另一个配置了 on: push 的工作流却没有任何运行记录。同样的文件由本地推送时又会触发。先检查这次推送用了什么身份:由仓库的 GITHUB_TOKEN 产生的 push 事件,不会再创建另一个工作流运行。

这项规则用于避免自动工作流反复触发自身。给令牌增加 contents: write 可以解决推送权限不足,却不会解除这条事件规则。

确认真的推到了目标分支

在排查事件之前,先区分三个状态:本地有新提交、远端已收到提交、下游工作流已启动。它们不是同一件事。

在同一任务中可用只读查询核对本地与远端引用:

git rev-parse HEAD
git ls-remote origin refs/heads/main

main 要替换为实际目标分支。这些命令不推送代码。若两边不是预期的提交,先查推送分支、退出状态与提交是否真的发生;没有产生新提交时,不能把没有下游运行全部归咎于令牌。

再检查下游的分支和路径过滤,以及工作流文件所在分支。提交已收到且满足过滤条件之后,认证身份才是下一步。有成功 push 不代表所有下游规则都被满足。

checkout 留下的凭据也会用于后面的 Git 命令

actions/checkout 默认使用 github.token,并默认保留凭据供后续 Git 操作使用。脚本里虽然没有显式写出 token,git push 仍可能使用它。核对 checkout 的 token、persist-credentials,以及后续是否另行配置了认证;不要把认证头或 token 内容打印到日志。

git config user.name 和 user.email 设置的是提交作者身份。把它们改成另一个账号,不会改变 HTTP 推送使用的令牌,也不会让 GitHub 改按另一个认证身份处理 push 事件。

本文针对 GitHub Cloud 的 push 触发。不要扩大成“GITHUB_TOKEN 产生的任何事件都没有运行”:workflow_dispatch 和 repository_dispatch 有例外;当前 Cloud 还会为它产生的部分 PR 事件建立等待批准的运行。那些例外不能让普通 on: push 自动恢复。

只需要接着构建时,直接衔接 job

如果真实需求是“生成并推送后,构建刚才的提交”,可以在同一工作流里设置 job 依赖,或调用可复用工作流。这样不必为了制造一个新的 push 事件增加账号令牌。

衔接时要传递已经成功推送的确定 SHA。默认 checkout 可能仍检出这次事件原来的 SHA;仅加 needs,不保证后续 job 自动拿到新提交。生产 job 应在确认 push 成功后输出该 SHA,消费 job 按它检出,并保留原有权限及环境审批。

这也会改变工作流组织方式。若现有分支保护、部署审批或状态检查依赖特定工作流名称,先核对它们,不能把“同一工作流中的 job 成功”当作所有原检查已经满足。

必须产生新的 push 事件时,审查现有认证方案

确实需要另一个 on: push 工作流启动时,可以使用经过授权、权限足够且范围明确的 GitHub App installation token,或适当授权的 fine-grained PAT,并让实际 push 使用它。无需给 token 所有仓库权限;仓库访问、内容写入和组织授权按真实操作需求配置。

更换前检查生成工作流自身的触发条件。如果它也响应自己写入的文件,就可能在新身份下持续生成提交。用明确的分支、路径和任务条件限制循环,同时保留 fork、不可信代码与部署权限之间的隔离。不要为了触发下游,把普通 PR 任务改成带密钥的 pull_request_target 执行源分支代码。

另一条路是显式 dispatch,但消费工作流必须支持所选事件,并接收需要的提交参数。dispatch 的运行身份、事件上下文和关联检查不等同于原来的 push,迁移时要逐项确认。

修改后以远端目标提交、下游的实际事件类型和检出 SHA 三者核对结果。推送返回成功只能证明写入成功;看见一次下游运行,也还要确认它构建的是刚生成的提交。