GitHub Actions任务无法推送代码问题求助
解决GitHub Actions(act本地测试)推送卡住的问题
问题场景
我配置了GitHub Actions任务用于自动更新NPM包版本、提交变更并推送到远程仓库,使用act本地测试时,提交环节成功完成,但推送步骤一直卡住,输出停在:
| [test-pipeline--Minor ee02442] Update package.json version | 2 files changed, 6284 insertions(+), 6284 deletions(-) | Pushing to https://github.com/%7Borganization_name%7D/%7Brepo_name%7D
已确认目标分支无保护规则,当前分支为test-pipeline--Minor,git用户邮箱/名称配置与GitHub账号一致,工作流通过workflow_dispatch触发,且操作均在非主分支进行;另外尝试用git add .会意外提交大量未知文件。
原因分析
- act本地测试的凭据缺失:默认checkout步骤可能没有保留推送所需的凭据,或者远程仓库URL的变量未正确替换(输出中的
%7Borganization_name%7D是URL编码的占位符,说明仓库地址未正确解析) - 推送未指定分支:
git push未明确目标分支,可能触发交互等待 - package-lock.json全量变更:本地与Action环境的npm版本不一致,导致lock文件产生大量无意义变更,推送时因文件过大卡住
修复方案
1. 优化Checkout步骤,确保凭据与分支正确
修改checkout动作,指定目标分支并保留凭据:
- name: Checkout repository uses: actions/checkout@v4.1.0 with: ref: ${{ github.ref_name }} # 明确检出当前触发分支 persist-credentials: true # 保留Git凭据用于后续推送
2. 推送时明确指定分支
将git push --verbose替换为:
git push origin ${{ github.ref_name }} --verbose
避免因分支不明确导致的交互等待。
3. 锁定Node/npm版本,减少lock文件变更
添加setup-node动作,使用与本地一致的Node版本,避免lock文件全量更新:
- name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20.x # 替换为你本地使用的Node版本 cache: 'npm' # 缓存npm依赖,加速构建
4. 本地act测试的凭据配置
运行act时,需传入GitHub个人访问令牌(PAT),令牌需拥有repo权限:
ACT_GITHUB_TOKEN=ghp_你的令牌内容 act -j update_package_version
完整修复后的工作流代码
update_package_version: runs-on: ubuntu-latest permissions: contents: write pull-requests: write steps: - name: Checkout repository uses: actions/checkout@v4.1.0 with: ref: ${{ github.ref_name }} persist-credentials: true - name: Setup Node.js uses: actions/setup-node@v4 with: node-version: 20.x cache: 'npm' - name: Update package run: | local_branch_name=$(git rev-parse --abbrev-ref HEAD) github_branch_name=${{ github.ref }} git config --global user.email ${{vars.UserEmail}} git config --global user.name ${{vars.UserName}} if [[ $local_branch_name =~ --Major$ || $github_branch_name =~ --Major$ ]]; then echo "Updating package.json version to a major release" npm version major --no-git-tag-version elif [[ $local_branch_name =~ --Minor$ || $github_branch_name =~ --Minor$ ]]; then echo "Updating package.json version to a minor release" npm version minor --no-git-tag-version elif [[ $local_branch_name =~ --Patch$ || $github_branch_name =~ --Patch$ ]]; then echo "Updating package.json version to a patch release" npm version patch --no-git-tag-version else echo "No version update required for the current branch" fi git add package.json package-lock.json git commit -m "Update package.json version" --allow-empty git push origin ${{ github.ref_name }} --verbose
内容的提问来源于stack exchange,提问作者Karim Fayed
相关产品推荐
相关产品推荐

