Laravel Gitlab CI/CD中MySQL连接正常但migrate失败问题求助
问题
我正在为Laravel/InertiaJS/Vue/Vite项目配置GitLab CI/CD流水线,流水线包含5个步骤:
- 构建composer:安装composer依赖
- 构建npm:安装并构建npm
- 连接MySQL:测试MySQL连接有效性
- 配置应用:执行
php artisan migrate - 测试:运行Pest测试
第3步可成功执行命令:
echo "SELECT 'OK';" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE"
但第4步执行php artisan migrate时失败,报错:
SQLSTATE[HY000] [2002] Connection refused (Connection: mysql, SQL: select * from information_schema.tables where table_schema = parmt and table_name = migrations and table_type = 'BASE TABLE')
我的.gitlab-ci.yml文件内容如下:
image: lorisleiva/laravel-docker:latest services: - mysql:latest variables: CI_COMMIT_REF_SLUG: main MYSQL_DATABASE: [db] MYSQL_ROOT_PASSWORD: [pw] stages: - build composer - build npm - connect mysql - setup app - test composer: stage: build composer script: - composer install --no-interaction --prefer-dist --optimize-autoloader - cp .env.example .env - php artisan key:generate artifacts: expire_in: 1 month paths: - vendor/ - .env cache: key: ${CI_COMMIT_REF_SLUG}-composer paths: - vendor/ npm: stage: build npm dependencies: - composer cache: key: ${CI_COMMIT_REF_SLUG}-npm paths: - node_modules/ script: - npm install - npm run build artifacts: expire_in: 1 month paths: - node_modules/ - public/css/ - public/js/ connect: stage: connect mysql image: mysql script: - echo "SELECT 'OK';" | mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE" app: stage: setup app dependencies: - composer - npm script: - cat .env # this is just to check I've got a valid setup - php artisan config:clear - php artisan optimize - php artisan migrate pest: stage: test dependencies: - composer - npm - connect - app script: - php artisan optimize - php artisan test --colors=never --coverage-text
此前我曾成功执行过迁移,但后续所有Pest测试均出现相同连接拒绝错误,导致测试无法运行。请告知如何正确配置以解决该问题?
解决方案
1. 补充Laravel数据库连接环境变量
在.gitlab-ci.yml的variables块中添加Laravel所需的数据库连接参数,确保应用能正确识别MySQL服务:
variables: CI_COMMIT_REF_SLUG: main MYSQL_DATABASE: [db] MYSQL_ROOT_PASSWORD: [pw] # 添加Laravel数据库配置变量 DB_CONNECTION: mysql DB_HOST: mysql DB_PORT: 3306 DB_DATABASE: ${MYSQL_DATABASE} DB_USERNAME: root DB_PASSWORD: ${MYSQL_ROOT_PASSWORD}
2. 等待MySQL服务完全就绪
MySQL容器启动需要时间,直接执行迁移会因服务未就绪触发连接拒绝。在app Job中添加等待逻辑:
app: stage: setup app dependencies: - composer - npm services: - mysql:latest script: - cat .env - php artisan config:clear # 循环等待MySQL服务可用 - until mysql --user=root --password="$MYSQL_ROOT_PASSWORD" --host=mysql "$MYSQL_DATABASE" -e "SELECT 1"; do sleep 2; done - php artisan migrate --force # 添加--force跳过交互确认
3. 修正Pest Job的依赖与配置
pest Job无需依赖connect Job,且需确保能访问MySQL服务,同时避免缓存旧配置:
pest: stage: test dependencies: - composer - npm - app services: - mysql:latest script: - php artisan config:clear - php artisan test --colors=never --coverage-text
4. 确保.env文件配置正确
在composer Job中显式修改.env文件,覆盖.env.example中的默认数据库配置,避免环境变量未正确注入:
composer: stage: build composer script: - composer install --no-interaction --prefer-dist --optimize-autoloader - cp .env.example .env # 替换.env中的数据库配置 - sed -i "s/DB_HOST=.*/DB_HOST=mysql/" .env - sed -i "s/DB_DATABASE=.*/DB_DATABASE=${MYSQL_DATABASE}/" .env - sed -i "s/DB_USERNAME=.*/DB_USERNAME=root/" .env - sed -i "s/DB_PASSWORD=.*/DB_PASSWORD=${MYSQL_ROOT_PASSWORD}/" .env - php artisan key:generate
5. 移除不必要的optimize命令
php artisan optimize会缓存配置,可能导致环境变量未被正确读取。在app和pest Job中移除该命令,或在执行核心操作前先清除缓存。
内容的提问来源于stack exchange,提问作者Cornel Verster
相关产品推荐
相关产品推荐

