内网部署自动化

Jenkins、GitLab 和 Laradock 的自动化部署要先打通信任链,再用 rsync 增量同步代码,并在目标服务器容器内执行可重复的依赖安装。

架构说明

角色说明
GitLab代码仓库,提供 SSH 地址给 Jenkins 拉取代码。
JenkinsCI/CD 调度服务器,执行拉取、同步和远程命令。
目标测试机Nginx / PHP / Laradock 运行环境,承载 Laravel/Lumen 项目。

核心流程:Jenkins 拉取指定分支代码 → rsync 增量同步到目标服务器 → SSH 到目标服务器 → 进入 Laradock → 在 workspace 容器内执行依赖安装。

免密与权限通道

  • Jenkins 到 GitLab:使用 GitLab Deploy Key 拉取代码。
  • Jenkins 到目标测试机:使用 SSH 免密同步代码和执行命令。
  • 部署密钥不要设置密码,否则 Jenkins 自动拉取会被阻塞。
  • GitLab Deploy Key 如只用于拉取代码,不应授予写权限。

项目目录权限边界

  • 不要给整个 Web 根目录设置 777
  • 不要把整个 Web 根目录过户给 jenkins
  • 每个项目使用独立目录,只授权该项目目录。
  • .env 不从 Jenkins 工作区覆盖到目标服务器,应该由目标环境独立维护。
  • vendor 不通过 rsync 同步,统一在目标服务器 Laradock 容器内安装。

Jenkins 任务配置

  • 源码管理选择 Git,使用 SSH 仓库地址。
  • 凭据选择 Jenkins 中配置的 GitLab SSH 私钥。
  • 构建分支可配置为测试分支,例如 */beta
  • 内网环境可用 Poll SCM 轮询,不依赖公网回调或内网穿透。
  • rsync 同步时应排除 .git/.envnode_modules/vendor/storage/logs/
部署脚本应该使用 composer install,而不是 composer update。

Laravel DevOps 准则

  • composer update 会重新解析依赖版本,可能拉取未验证的新版本。
  • composer install 会严格按照 composer.lock 安装,保证开发、测试、生产依赖一致。
  • composer.lock 必须提交到 Git 仓库。
  • 不要依赖 git diff HEAD~1 判断是否执行 Composer;Jenkins 可能使用 shallow clone,多分支合并也会让判断复杂化。
  • 推荐每次部署都执行 composer install,利用 Composer 自身缓存和锁文件比对。

验收清单

  • GitLab 项目已配置 Jenkins Deploy Key。
  • Jenkins 已配置 SSH 私钥凭据,并可拉取 GitLab 仓库。
  • Jenkins 可免密 SSH 到目标测试机。
  • 目标测试机项目目录已创建并归属 Jenkins 用户。
  • 目标测试机 Laradock 目录存在,workspace 容器可执行 Composer。
  • Jenkins Console Output 中 rsync 同步成功。
  • .envvendorstorage/logs 未被覆盖。
  • 站点访问、接口健康检查或 Laravel/Lumen 启动检查正常。

常见问题

  • Jenkins 拉取 GitLab 失败:检查 SSH 仓库地址、凭据、Deploy Key 和 Jenkins 用户 SSH 连通性。
  • rsync 权限不足:检查目标项目目录归属。
  • docker compose exec 失败:检查 Laradock 目录、workspace 容器和 Jenkins 用户 Docker 权限。
  • Composer 安装失败:检查 composer.lock、PHP 版本、扩展和 Composer 源。