You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 01:58:16