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

CI/CD作业合并代码至staging分支后无法远程推送的问题求助

CI/CD作业合并代码至staging分支后无法远程推送的问题求助

看起来你的问题核心是GitLab Runner没有权限向staging分支推送代码,从日志里的这段报错就能明确:

remote: You are not allowed to upload code.
fatal: unable to access 'https://gitlab.com/ansm6927/ci-cd-implementation.git/': The requested URL returned error: 403

手动推送能成功是因为你用的是自己拥有项目推送权限的账号,但CI作业里的GitLab Runner使用的身份(可能是CI令牌、Runner本地Git账号)没有向staging分支推送的权限。下面给你几个针对性的解决思路:

1. 检查Runner的权限配置

首先要确认Runner使用的身份是否拥有staging分支的写权限:

  • 如果是使用项目CI/CD令牌:进入项目的Settings > CI/CD > Variables,确认CI_JOB_TOKEN是否被赋予了写权限(GitLab默认CI_JOB_TOKEN具备写权限,但如果staging是保护分支,需要在Settings > Repository > Protected branches里,把Runner所属的角色(比如项目维护者、开发者)加入允许推送的列表)。
  • 如果是Shell类型的Runner:登录到Runner所在的机器(你的ansthinkpad),执行git config --list查看本地Git配置的账号,这个账号必须在GitLab项目中拥有staging分支的推送权限。

2. 修复本地staging分支与远程的分歧

从日志里能看到你的本地staging分支和远程已经出现分歧:

Your branch and 'origin/staging' have diverged, and have 6 and 1 different commits each, respectively.

这种情况下直接合并推送容易引发问题,建议在CI脚本的合并步骤前先拉取远程staging的最新代码,修改后的merge_to_staging任务如下:

merge_to_staging:
  stage: merge
  script:
    - echo "Merging branch into staging..."
    - git checkout staging
    - git pull origin staging  # 拉取远程staging的最新代码,避免分歧
    - git merge origin/$CI_COMMIT_REF_NAME
    - echo "before pushing to staging"
    - git push origin staging
    - echo "after pushing to staging"
  except:
    - master
    - staging

3. 改用GitLab原生合并流程替代手动Git命令

手动在CI里执行checkout、merge、push这类命令很容易踩权限和分支状态的坑,更稳妥的方式是利用GitLab的Merge Request机制:
比如设置当issue_*分支提交时,自动创建指向staging的Merge Request,然后在CI中通过API触发合并(需要用具备权限的个人访问令牌来执行),这样能更好地利用GitLab的分支保护和权限控制功能,减少手动操作的风险。

备注:内容来源于stack exchange,提问作者Muhammad Ans

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 12:30:30