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

如何用gitlab-ci.yml配置实现服务器自动git pull 解决部署不生效问题

问题根因

从运行日志可以看到,当前所有CI作业绑定的是GitLab托管的共享弹性Docker Runner(标识为docker-auto-scale),整个执行流程全程在GitLab侧的隔离云容器内运行:

  • 你执行git pull的路径是容器内的临时构建目录 /builds/ivanvaleraa/pos_v1/,作业执行完成后容器会直接销毁,拉取的代码不会持久保存
  • 整个流程从始至终没有和你的DigitalOcean Droplet服务器建立连接,哪怕脚本提示执行成功,也不会对服务器上的项目目录产生任何修改,自然没法达到更新线上代码的效果。
正确实现配置步骤

1. 将Droplet配置为自有执行Runner

放弃使用GitLab共享Runner,在你的Ubuntu 20.04 Droplet上安装Shell类型的GitLab Runner,完成项目绑定注册。

  • 注册完成后修改Runner配置,将 builds_dir 参数设置为你PHP项目在服务器上的实际存放绝对路径,比如LAMP环境默认的 /var/www/html/your-project,确保后续CI作业的执行目录直接指向线上项目文件夹,不会跑到默认的临时构建路径操作错位置
  • 给gitlab-runner运行用户分配该项目目录的读写权限,避免git操作时触发权限报错
  • 提前配置好gitlab仓库的SSH拉取凭据,让Runner执行git操作时不需要交互输入账号密码

2. 修正现有gitlab-ci.yml的逻辑错误

你当前编写的CI脚本存在几个明显的逻辑问题:

  • 不需要手动重复执行 git checkout、git pull 拉代码:Runner在作业启动阶段会自动拉取匹配分支的代码到指定构建目录,手动写拉取脚本反而容易出现分支不匹配的问题
  • 原有test作业的分支判断逻辑混乱:不管推develop还是production分支,都固定checkout develop分支,完全起不到分支匹配测试的作用

修正后的参考配置如下:

stages:
  - test
  - deploy

# 开发分支推送自动校验
test_dev:
  stage: test
  only:
    - develop
  script:
    - echo "develop分支代码同步完成"
    # 可按需补充PHP代码语法校验、单元测试逻辑
  tags:
    - your-droplet-runner-tag # 绑定到服务器上注册的自有Runner标签

# 生产分支手动部署
deploy_prod:
  stage: deploy
  only:
    - production
  script:
    - echo "开始同步production分支最新代码到服务器"
    # 因为builds_dir已经指向项目目录,这里的git pull会直接操作服务器上的线上项目
    - git pull origin production
    # LAMP环境适配:重载PHP-FPM让代码更新生效
    - sudo systemctl reload php-fpm
  environment: production
  when: manual
  tags:
    - your-droplet-runner-tag

3. 执行链路验证

配置完成后先手动触发一次deploy作业,通过日志确认以下几点正常:

  • 作业执行的Runner是你Droplet上的自有Runner,不再是之前的docker-auto-scale共享实例
  • git操作的执行路径是项目实际的服务器绝对路径,不是临时容器路径
  • 拉取完成后检查项目目录的代码版本,和GitLab仓库对应分支的提交记录一致

内容的提问来源于stack exchange,提问作者Ivan J.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.26 16:06:04