如何用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.
相关产品推荐
相关产品推荐

