GitHub Actions Runner无法连接SQLite数据库问题排查
问题分析
迁移命令能成功连接SQLite,但PHPUnit测试抛出MySQL连接错误(SQLSTATE[HY000] [2002]),说明测试执行时Laravel没有使用SQLite配置,而是默认回退到MySQL的连接逻辑。核心原因是测试环境的数据库配置没有正确加载或被覆盖。
解决方案
1. 确保.env.testing文件配置正确
Laravel在testing环境下会优先读取.env.testing文件,若该文件存在,工作流中设置的环境变量会被覆盖。检查项目根目录是否有.env.testing文件,确保内容包含:
APP_ENV=testing DB_CONNECTION=sqlite DB_DATABASE=/home/runner/work/[你的仓库名]/[你的仓库名]/database-ci/database.sqlite
注意:SQLite的路径必须是绝对路径,GitHub Actions的工作目录通常为
/home/runner/work/[仓库名]/[仓库名]/,可通过工作流中的pwd命令确认路径后替换。
2. 修正phpunit.xml的配置
即使修改了DB_DATABASE的值,也可能因配置加载顺序问题未生效。确保phpunit.xml中的数据库配置与工作流一致,且添加DB_HOST避免Laravel触发MySQL连接逻辑:
<php> <env name="APP_ENV" value="testing"/> <env name="BCRYPT_ROUNDS" value="4"/> <env name="CACHE_DRIVER" value="array"/> <env name="MAIL_MAILER" value="array"/> <env name="PULSE_ENABLED" value="false"/> <env name="QUEUE_CONNECTION" value="sync"/> <env name="SESSION_DRIVER" value="array"/> <env name="TELESCOPE_ENABLED" value="false"/> <env name="DB_CONNECTION" value="sqlite"/> <env name="DB_DATABASE" value="/home/runner/work/[你的仓库名]/[你的仓库名]/database-ci/database.sqlite"/> <env name="DB_HOST" value="localhost"/> <!-- 新增:避免触发MySQL连接逻辑 --> </php>
3. 在工作流中添加配置清除步骤
Composer安装后可能生成配置缓存,导致测试时加载旧的数据库配置。在Install Dependencies步骤后添加:
- name: Clear Configuration Cache run: php artisan config:clear
4. 强制测试使用指定环境
执行PHPUnit测试时,明确指定使用testing环境,避免环境混淆:
- name: Execute tests via PHPUnit env: DB_CONNECTION: sqlite DB_DATABASE: /home/runner/work/[你的仓库名]/[你的仓库名]/database-ci/database.sqlite run: php artisan test --env=testing
5. 检查config/database.php的测试环境配置
确保config/database.php中testing环境的SQLite配置正确:
'testing' => [ 'driver' => 'sqlite', 'database' => env('DB_DATABASE', database_path('testing.sqlite')), 'prefix' => '', 'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true), ],
验证步骤
在工作流中添加步骤打印测试环境的配置,确认SQLite参数正确:
- name: Print Test Environment Config run: php artisan config:get database.connections.sqlite --env=testing
执行工作流后,查看该步骤输出,确认database路径正确且driver为sqlite。
内容的提问来源于stack exchange,提问作者domjanzsoo
相关产品推荐
相关产品推荐

