首页 > 解决方案 > Gitlab CI黄昏 - MySQL连接被拒绝

问题描述

这被问了好几次了,但我尝试了每一个解决方案,我发现并运行了一个具有类似设置的“正常”PHPUnit 测试,所以并不是我所做的一切都可能是错误的。

那么问题来了:
我知道这个问题的主要(仅报告?)原因与 Gitlab CI 和 docker 结合使用的是错误的主机。几乎在每种情况下,OP 都尝试使用某种 localhost 来访问数据库。
这不可能是这种情况,因为DB_HOST在我的variables,DB_HOST在我的.env文件中和我的 mysql 服务的别名都是一样的。

我什至连接到容器中(通过sleep 1h在黄昏命令之前添加 a 并执行 a docker exec)并成功登录到我的数据库并看到迁移和种子表。廷克也很有效。
唯一的问题是黄昏。
有趣的事实:倾倒我的DB_HOST礼物mysql-test(我config:clear在运行黄昏之前做了一个,甚至将它添加到我的setUp函数中。

我真的没有想法了,我希望从人群中得到一些想法。

这是我的 .yml 文件

stages:
- build
- test  

variables:
  DB_HOST: mysql-test
  MYSQL_DATABASE: laravel
  MYSQL_ROOT_PASSWORD: secret
  DB_CONNECTION: mysql

composer:
  image: lorisleiva/laravel-docker:latest
  stage: build
  script:
  - composer install --no-progress --no-interaction
  - cp .env.gitlab-testing .env
  - php artisan key:generate
  artifacts:
    paths:
    - vendor/
    - bootstrap/
    - .env
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - vendor/
  tags:
  - docker

npm:
  image: lorisleiva/laravel-docker:latest
  stage: build
  script:
  - npm install
  - npm run prod
  artifacts:
    paths:
    - public/mix-manifest.json
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - node_modules/
  tags:
  - docker  

dusk:
  stage: test
  dependencies:
  - composer
  - npm
  tags:
  - docker
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - vendor
    - node_modules
    policy: pull

  services:
  - name: mysql:5.7
    alias: mysql-test

  image: chilio/laravel-dusk-ci:latest
  script:
  - cp .env.dusk.gitlab-testing .env
  - cp phpunit.dusk.xml phpunit.xml 
  - configure-laravel
  - start-nginx-ci-project
  - php artisan dusk --colors --debug

  artifacts:
    paths:
    - ./storage/logs 
    - ./tests/Browser/screenshots
    - ./tests/Browser/console
    expire_in: 7 days
    when: always

.env.dusk.gitlab-testing

APP_ENV=local
APP_KEY=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

LOG_CHANNEL=stack
HEADLESS=true

DB_CONNECTION=mysql
DB_HOST=mysql-test
DB_DATABASE=laravel
DB_USERNAME=root
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=array
SESSION_DRIVER=array
QUEUE_DRIVER=sync

phpunit.dusk.xml

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
         backupStaticAttributes="false"
         bootstrap="vendor/autoload.php"
         colors="true"
         convertErrorsToExceptions="true"
         convertNoticesToExceptions="true"
         convertWarningsToExceptions="true"
         processIsolation="false"
         stopOnFailure="false">
    <testsuites>
        <testsuite name="Browser Tests">
            <directory suffix="Test.php">./tests/Browser</directory>
        </testsuite>
    </testsuites>
    <filter>
        <whitelist processUncoveredFilesFromWhitelist="true">
            <directory suffix=".php">./app</directory>
        </whitelist>
    </filter>
    <php>
        <env name="APP_ENV" value="local"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
    </php>
</phpunit>

标签: mysqldockergitlab-cilaravel-dusk

解决方案


它现在确实有效。
这是我的文件现在的样子:
.env.dusk.gitlab-testing:

APP_ENV=local
APP_KEY=base64:WY4y4XWUAKbCPzf8XqC92z5wWMn7oOHXZMFMbg9al3E=
APP_DEBUG=true
APP_LOG_LEVEL=debug
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=mysql-test
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret

BROADCAST_DRIVER=log
CACHE_DRIVER=array
SESSION_DRIVER=array
QUEUE_DRIVER=sync

.gitlab-ci.yml

stages:
- build
- test
- deploy

# Variables
variables:
  DB_HOST: mysql-test
  MYSQL_DATABASE: laravel
  MYSQL_USER: laravel
  MYSQL_PASSWORD: secret
  MYSQL_ROOT_PASSWORD: secretroot
  DB_CONNECTION: mysql

composer:
  image: lorisleiva/laravel-docker:latest
  stage: build
  script:
  - cp .env.gitlab-testing .env
  - composer install --no-progress --no-interaction
  - php artisan key:generate
  artifacts:
    paths:
    - vendor/
    - bootstrap/
    - .env
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - vendor/
    - bootstrap/
  tags:
  - docker

npm:
  image: lorisleiva/laravel-docker:latest
  stage: build
  script:
  - npm install
  - npm run prod
  artifacts:
    paths:
    - public/mix-manifest.json
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - node_modules/
  tags:
  - docker

phpunit:
  image: lorisleiva/laravel-docker:latest
  stage: test
  services:
  - name: mysql:5.7
    alias: mysql-test
  - redis:latest
  artifacts:
    when: always
    paths:
    - storage/logs/
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - vendor/
    - node_modules/
    policy: pull
  dependencies:
  - composer
  - npm
  script:
  - php artisan migrate
  - php artisan db:seed --class=TestingSeeder
  - php vendor/bin/phpunit --coverage-text --colors
  tags:
  - docker

dusk:
  stage: test
  cache:
    key: ${CI_BUILD_REF_NAME}
    paths:
    - vendor/
    - node_modules/
    policy: pull

  services:
  - name: mysql:5.7
    alias: mysql-test

  image: chilio/laravel-dusk-ci:stable
  tags:
  - docker
  script:
  - cp .env.dusk.gitlab-testing .env
  - configure-laravel
  - composer dump-autoload
  - start-nginx-ci-project
  - php artisan dusk --colors

  artifacts:
    paths:
    - ./storage/logs # for debugging
    - ./tests/Browser/screenshots
    - ./tests/Browser/console
    expire_in: 7 days
    when: always

我想,它缺少文件MYSQL_PASSWORD中的变量,.yml但我不是 100% 确定。很高兴它现在可以工作。


推荐阅读