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

为什么 Laravel 项目在 GitHub Actions 中常卡在 composer install?
因为默认 Ubuntu runner 的 PHP 版本往往不匹配 composer.json 中的 platform.php 声明,或缺少扩展(如 ext-pdo_mysql、ext-redis)。Laravel 测试还依赖 phpunit 和正确配置的 .env。
- 显式指定 PHP 版本:用
actions/setup-php@v4,并传入php-version和extensions - 跳过平台检查(仅限 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=mysql、REDIS_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 'Tests\TestCase' not found 怎么办?
这是自动加载未生效的典型表现,根源通常是 composer autoload 没跑,或 phpunit.xml 的 bootstrap 路径错误。Laravel 10+ 默认用 ./vendor/autoload.php,但 CI 中可能因路径或缓存失效导致失败。
- 确保
composer install成功后,再运行vendor/bin/phpunit - 检查
phpunit.xml中是否存在,它能暴露隐藏的致命错误 - 加一步验证:
php -r "require 'vendor/autoload.php'; echo class_exists('Tests\TestCase') ? 'OK' : 'FAIL';" - 若用 Pest,确认
pest二进制已安装(composer require --dev pestphp/pest --with-all-dependencies)
环境变量、服务依赖顺序、PHP 扩展缺失——这些不是配置项,是每次 push 都会触发的硬性校验点。漏掉任意一个,CI 就会静默失败或测试假通过。










