通过workflow_call调用的第二个GitHub Action工作流为何总是失败?
通过workflow_call调用的第二个GitHub Action工作流为何总是失败?
我来帮你捋捋这个问题的根源哈!
你遇到的这个情况,核心原因是GitHub Actions的workflow_call调用机制的特性:当主工作流依次调用两个子工作流时,第二个子工作流启动时,它使用的代码快照是主工作流刚触发那一刻的仓库状态,而不是第一个子工作流推送新改动后的最新仓库状态。
举个直观的例子:
- 主工作流触发时,仓库处于版本A;
- workflow1基于版本A执行,生成改动后推送到仓库,此时仓库已经更新为版本B;
- 但workflow2启动时,还是拿着版本A的代码在跑,这时候它执行
git push,就会因为本地代码(版本A)和远程仓库(版本B)的状态不一致,导致推送失败——要么提示本地HEAD落后于远程,要么直接出现冲突。
而单独用workflow_dispatch触发时,每个子工作流都会拉取触发时刻的最新仓库代码,自然不会有这个问题。
那怎么解决呢?很简单,在每个子工作流的「提交推送」步骤里,先拉取远程仓库的最新代码,确保本地代码和远程同步之后再执行后续操作。
你可以把现有的推送脚本修改成这样:
echo "Initial status:" git status git config --local user.email "action@github.com" git config --local user.name "GitHub Action" # 关键新增步骤:拉取远程最新代码,自动合并(--no-edit 避免弹出编辑提交信息的窗口) git pull origin $GITHUB_REF_NAME --no-edit git add -A echo "Status after git add:" git status git diff --cached --exit-code && exit 0 # Exit if no changes in the staging area echo "Committing changes:" git commit -m "chore: fetch content from various external sources" echo "Pushing changes:" git push echo "Final status:"
这里的$GITHUB_REF_NAME是GitHub Actions的内置环境变量,会自动识别当前运行的分支名称,不用手动硬编码分支名。
另外还有个小建议:如果你的两个子工作流操作的是同一份仓库内容,也可以考虑把它们合并到同一个工作流的不同Job里,每个Job都执行拉取-修改-推送的流程,不过用上面的拉取方法,分开的子工作流也能正常跑通。
备注:内容来源于stack exchange,提问作者Kor
相关产品推荐
相关产品推荐

