You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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 .会意外提交大量未知文件。

原因分析

  1. act本地测试的凭据缺失:默认checkout步骤可能没有保留推送所需的凭据,或者远程仓库URL的变量未正确替换(输出中的%7Borganization_name%7D是URL编码的占位符,说明仓库地址未正确解析)
  2. 推送未指定分支:git push未明确目标分支,可能触发交互等待
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 00:43:09