laravel 的 github actions ci/cd 核心是保障每次代码变更可测、可验、可发,关键在环境隔离、密钥安全与流程收敛;生产仅响应 main 推送,pr 仅运行测试与静态检查,部署脚本外置幂等,通过软链接实现零停机发布。

用 GitHub Actions 给 Laravel 做 CI/CD,核心不是堆功能,而是让每次代码变更都可测、可验、可发。重点在环境隔离、密钥安全、流程收敛——不是“能跑起来”,而是“跑得稳、改得快、回退快”。
触发与分支策略要明确
别让所有推送都触发部署。生产环境只响应 main 分支的推送;预发布或测试环境可监听 develop 或带 release/ 前缀的分支。Pull Request 仅运行测试和静态检查,不执行迁移或部署。
- push 到 main → 触发完整部署(测试 + 迁移 + 构建 + 上线)
- pull_request 到 main → 只运行单元测试、PHPStan 和 .env 格式校验
- 避免在 workflow 中写
branches: [ '*' ],防止误触发
敏感配置必须走 Secrets
.env 文件里的内容不能进 Git,但 CI 流程又需要它。GitHub Secrets 是唯一合规路径。除 SSH 凭据外,至少还要存:
-
APP_KEY:本地生成后直接粘贴,不要用
php artisan key:generate在 CI 里动态生成 - DB_DATABASE、DB_USERNAME、DB_PASSWORD:测试环境可用 SQLite,但部署阶段必须用真实数据库凭证
- REDIS_HOST、REDIS_PASSWORD:若用队列或缓存,这些也得加密传入
工作流中通过 ${{ secrets.APP_KEY }} 引用,别硬编码、别 echo、别 log 输出。
Conventional Commits v1.0.0 分支、工作树命名及提交信息规范,适用于 GitHub 与 GitLab 项目,用于创建分支和命名工作树等场景。
部署脚本建议外置+幂等
把部署逻辑从 workflow YAML 里抽出来,单独写成 .scripts/deploy.sh 放进仓库。这样便于本地调试、版本追踪,也避免 YAML 冗长难读。
- 脚本开头加
set -e,任一命令失败即中断 - 用
php artisan down --render="503"进维护页,结尾再php artisan up - 迁移前先备份:
mysqldump -u $DB_USER -p$DB_PASSWORD $DB_NAME > backup_$(date +%s).sql - 最后检查
storage/logs/laravel.log是否可写、bootstrap/cache是否可写
零停机靠软链接切换
别直接在 webroot 下 git pull。推荐目录结构:
/var/www/myapp/
├── current → releases/20240615120000
├── releases/
│ ├── 20240615120000/
│ └── 20240614093000/
└── shared/
├── storage/
└── .env
每次部署生成新 release 目录,安装依赖、运行迁移、构建资源后,用 ln -nfs 切换 current 指向新目录。Nginx root 指向 /var/www/myapp/current/public 即可。
这样上线是原子操作,旧版本仍可随时回滚,且无请求丢失风险。










