如何使用GitHub Actions为Laravel项目配置CI/CD? (自动化测试与部署)

11次阅读

laravel项目在gitHub Actions中常卡在composer install,因ubuntu runner的php版本或扩展不匹配;需用actions/setup-php指定版本和扩展,跳过平台检查,配置mysql/redis服务并正确设置host,部署用ssh+rsync配合Secrets,phpunit失败多因autoload未生效。

如何使用GitHub Actions为Laravel项目配置CI/CD? (自动化测试与部署)

为什么 Laravel 项目在 github Actions 中常卡在 composer install

因为默认 Ubuntu runner 的 PHP 版本往往不匹配 composer.json 中的 platform.php 声明,或缺少扩展(如 ext-pdo_mysqlext-redis)。Laravel 测试还依赖 phpunit 和正确配置的 .env

  • 显式指定 PHP 版本:用 actions/setup-php@v4,并传入 php-versionextensions
  • 跳过平台检查(仅限 CI):composer install --no-interaction --prefer-dist --optimize-autoloader --ignore-platform-req=ext-*
  • echo 写入测试专用 .env,确保 DB_CONNECTION=sqlite 或配好 MySQL 服务

如何在 GitHub Actions 中启动 MySQL 和 Redis 服务?

GitHub Actions 支持 services,但 Laravel 默认用 localhost 连接,而 services 实际运行在 docker 网络中,需用 service 名作 host。MySQL 默认 root 密码为空,Redis 无需密码。

services:   mysql:     image: mysql:8.0     env:       MYSQL_ROOT_PASSWORD: ""       MYSQL_DATABASE: testdb     ports:       - 3306:3306     options: >-       --health-cmd="mysqladmin ping -h localhost -u root --password=''"       --health-interval=10s       --health-timeout=5s       --health-retries=3   redis:     image: redis:7-alpine     ports:       - 6379:6379
  • MySQL host 应设为 mysql(service 名),不是 localhost
  • .env.testing 中写 DB_HOST=mysqlREDIS_HOST=redis
  • wait-for-it.sh 或自定义脚本轮询 mysql:3306 就绪,避免 phpunit 启动时连接失败

如何安全地部署到生产服务器(SSH + rsync)?

GitHub Actions 本身不执行远程部署命令,需靠 ssh + rsync 组合完成。私钥不能硬编码,必须存为 Secrets(如 DEPLOY_SSH_KEY),且目标服务器需提前配置好 SSH 免密登录与目录权限。

  • webfactory/ssh-key-action@v2 注入私钥到 runner 的 ~/.ssh/id_rsa
  • 部署前先 rsync -avz --delete . user@host:/var/www/myapp/ --exclude=".git" --exclude="node_modules"
  • 关键命令必须分步执行:拉代码 → 安装依赖 → 运行 php artisan migrate:fresh --seed(仅限测试环境)→ php artisan config:clear && php artisan cache:clear
  • 生产环境禁止自动执行 migrate,应人工确认或走 DB 变更审批流程

phpunit 在 Actions 中报 class 'TestsTestCase' not found 怎么办?

这是自动加载未生效的典型表现,根源通常是 composer autoload 没跑,或 phpunit.xmlbootstrap 路径错误。Laravel 10+ 默认用 ./vendor/autoload.php,但 CI 中可能因路径或缓存失效导致失败。

  • 确保 composer install 成功后,再运行 vendor/bin/phpunit
  • 检查 phpunit.xml 是否存在,它能暴露隐藏的致命错误
  • 加一步验证:php -r "require 'vendor/autoload.php'; echo class_exists('TestsTestCase') ? 'OK' : 'FAIL';"
  • 若用 Pest,确认 pest 二进制已安装(composer require --dev pestphp/pest --with-all-dependencies

环境变量、服务依赖顺序、PHP 扩展缺失——这些不是配置项,是每次 push 都会触发的硬性校验点。漏掉任意一个,CI 就会静默失败或测试假通过。

text=ZqhQzanResources