Laravel项目可通过Git分支策略与GitHub Actions实现自动测试、验证、上线:main分支触发生产CD,release/*和develop触发CI测试;CI阶段运行单元测试与PHPStan,CD阶段通过软链接原子化部署并安全注入密钥。

想让Laravel项目代码一推就自动测试、验证、上线,不手动登录服务器敲命令,也不担心漏执行缓存命令或迁移失败导致页面报错——关键在Git工作流设计与CI/CD流程的精准咬合。
配置Git分支策略与环境映射
生产环境只响应 【main】 分支推送,预发布环境监听 release/* 分支,开发测试走 develop 分支。GitHub Actions 会按分支名自动分流任务,写错分支名会导致部署被跳过。
在 .github/workflows/ci-cd.yml 中明确声明触发规则:
```yaml
on:
push:
branches:
- main
- release/**
- develop
```
注意:不要把 main 写成 master,新仓库默认主干分支是 main,写错将导致生产部署完全不触发。
定义CI阶段:测试与静态检查
PR 提交或推送到 develop 或 release/* 时,仅运行单元测试 + PHPStan 静态分析,不执行迁移、不修改服务器状态。
第一步:检出代码并安装 PHP 8.1 与扩展
第二步:缓存 Composer 依赖,用 composer install --no-dev --optimize-autoloader 安装生产级依赖
第三步:复制 .env.example 并注入测试专用数据库连接变量(DB_DATABASE=testdb),避免污染真实环境
第四步:执行 php artisan migrate:fresh --seed 构建干净测试库 → 运行 ./vendor/bin/phpunit → 执行 ./vendor/bin/phpstan analyse
这一步失败,PR 就无法合并,强制保障代码质量底线。
定义CD阶段:零停机部署到生产
只有 main 分支推送成功通过 CI 后,才触发部署任务。整个流程基于软链接切换,旧版本代码保留在历史目录中,可秒级回滚。
覆盖宏观策略、固收研究、行业公司深度分析、量化因子、大类资产配置、可转债、市场情绪、政策快评、行业景气度追踪等34项核心研究能力,证券研究员的全能数字助手。
方法一:SSH 直连部署
使用 appleboy/scp-action@v0.1.7 将构建产物打包上传至服务器临时目录 → 再用 appleboy/ssh-action@v0.1.10 执行远程命令:
```bash
cd /var/www/myapp && \
git pull origin main && \
composer install --no-dev --optimize-autoloader && \
php artisan key:generate --force && \
php artisan migrate --force && \
php artisan config:cache && \
php artisan route:cache && \
php artisan view:cache && \
ln -snf /var/www/myapp/releases/$(date +%Y%m%d_%H%M%S) /var/www/myapp/current
```
方法二:符号链接结构部署(推荐)
服务器上需预先建立目录结构:/var/www/myapp/releases/ 存放每次部署快照,/var/www/myapp/current 是指向当前生效版本的软链接。
每轮部署先创建带时间戳的新目录 → 复制代码+执行构建 → 最后用 ln -snf 原子化切换 current 指向,Nginx 配置始终指向 /var/www/myapp/current/public。
【切换软链接必须用 -f 参数,否则会报错“文件已存在”】
密钥与敏感配置安全注入
在 GitHub Settings → Secrets and variables → Actions 中添加以下 secrets:
SSH_HOST、SSH_USER、SSH_KEY(私钥内容,开头为 -----BEGIN OPENSSH PRIVATE KEY-----)
APP_KEY(从本地 .env 复制,确保与线上一致)
DB_PASSWORD、REDIS_PASSWORD、MAIL_PASSWORD 等全部以 secrets 形式注入,绝不在 YAML 中硬编码
工作流内引用方式统一为 ${{ secrets.DB_PASSWORD }},GitHub 会自动屏蔽日志输出中的明文值。

















