数据库迁移应在CD阶段部署时执行,CI阶段仅用内存数据库测试;生产环境通过--force参数安全运行migrate,并配合备份与零停机策略。

在 Laravel 的 CI/CD 流程中运行数据库迁移,需要根据环境谨慎处理。数据库迁移通常不应在自动化测试或构建阶段直接作用于生产数据库,但可以在部署流程中安全执行。
理解何时运行迁移
CI(持续集成)和 CD(持续部署)职责不同:
- CI 阶段:主要用于代码检查、单元测试、功能测试等,一般使用 SQLite 或临时数据库,不需要真实迁移。
-
CD 阶段:代码部署到预发布或生产环境时,才需要执行
migrate命令更新数据库结构。
在 CI 中准备数据库(用于测试)
如果测试需要数据库支持,推荐使用内存数据库或重建测试数据库:
- 在phpunit.xml 中设置数据库连接为 SQLite 内存模式。- 使用
RefreshDatabase trait,在测试前后自动迁移和回滚。- 在 CI 脚本中运行:
php artisan migrate:fresh --seed (仅限测试数据库)
在 CD 阶段安全执行迁移
部署到正式环境时,通过部署脚本触发迁移:
- 使用 Envoy 或部署工具(如 Envoyer、Forge、Capistrano)在代码拉取后执行:
- --force 是必须的,避免在生产环境交互确认。
- 确保
.env文件正确指向目标数据库。 - 建议配合备份策略,迁移前自动备份数据库。
php artisan migrate --force结合 GitLab CI / GitHub Actions 示例
以 GitHub Actions 为例,CD 阶段片段:
name: Deploy to Productionon:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4
- name: Run migrations
run: php artisan migrate --force
env:
DB_CONNECTION: mysql
DB_HOST: ${{ secrets.DB_HOST }}
DB_DATABASE: ${{ secrets.DB_NAME }}
DB_USERNAME: ${{ secrets.DB_USER }}
DB_PASSWORD: ${{ secrets.DB_PASS }}
注意:实际部署中建议将迁移与应用代码解耦,或使用零停机部署策略。
基本上就这些。关键点是区分测试和生产行为,确保迁移只在受控环境下执行,避免数据风险。










