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

