Gitlab CI触发Project A构建成功后推送到Project B返回403错误如何解决
问题根因分析
你当前遇到的403权限错误核心是两个配置冲突导致:
- 你在CI中配置了SSH密钥,但克隆Project B时使用的是HTTPS协议,SSH密钥全程未生效,推送时使用的是克隆时带入的
${PROJECT_USERNAME}和${PROJECT_PASSWORD}凭证 - Gitlab公共Runner的权限校验比本地Runner更严格,包括私钥权限校验、主机指纹校验、受保护分支权限校验等,本地能通过的配置在公共Runner上会被拦截
可行解决方案
方案1:切换为SSH协议访问(推荐,和你现有配置适配性最高)
- 先确认Project B的部署密钥配置:打开Project B→设置→仓库→部署密钥,你上传的
GITLAB_CI_PUBKEY对应的公钥必须勾选允许写入权限,默认添加的部署密钥只有只读权限,这是最常见的踩坑点 - 修改
gitlab-ci.yml的before_script部分,补充3项配置:# 原有配置保留,新增/修改以下内容 - chmod 600 ~/.ssh/id_rsa ~/.ssh/id_rsa.pub # 必须设置私钥权限,SSH默认拒绝权限过宽的私钥 - ssh-keyscan gitlab.com >> ~/.ssh/known_hosts # 公共Runner默认没有Gitlab主机指纹,会拦截SSH连接 # 把原来的HTTPS克隆地址替换为SSH格式 - git clone git@gitlab.com:<username>/<projectName>.git - 确认Project B的master分支保护规则:打开Project B→设置→仓库→受保护的分支,把部署密钥对应的用户/角色加入允许推送的白名单。
方案2:继续使用HTTPS协议(不需要调整SSH配置)
- 生成个人访问令牌(PAT)时必须勾选
write_repository权限,不要只选只读类权限 - 将
${PROJECT_PASSWORD}变量替换为你生成的PAT,${PROJECT_USERNAME}留空即可 - 同样确认PAT对应用户在Project B的受保护分支推送白名单内。
方案3:使用Gitlab原生CI_JOB_TOKEN(安全性最高,不需要手动维护密钥)
- 打开Project B→设置→CI/CD→令牌访问,将Project A添加到允许访问的项目列表
- 直接用Gitlab CI自带的令牌克隆,不需要配置任何自定义密钥/令牌:
- git clone https://gitlab-ci-token:${CI_JOB_TOKEN}@gitlab.com/<username>/<projectName>.git
替代实现方案
如果不想配置跨项目写权限,可以用Pipeline触发的方式实现:
- Project A构建成功后触发Project B的Pipeline,把需要修改的内容作为参数传递给Project B
- 由Project B自己的CI作业完成代码修改、提交、推送的操作,不需要跨项目授权,权限隔离更安全。
内容的提问来源于stack exchange,提问作者j will
相关产品推荐
相关产品推荐

