Una vez más nos vemos aquí, para contaros mi experiencia con Gitlab Ci, al ir a trabajar con un proyecto que usa MariaDb 10.3 en lugar de Mysql. Dire que hacer pruebas de testing, requiere como mínimo que estas pruebas se hagan emulando el software de la plataforma que usará nuestro software. Mejor aun si hacemos múltiples pruebas con distintas variaciones.
Pero nos encontramos con varios errores, y poca información:
php artisan migrate:fresh --seed 28 Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Connection refused (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')
Contenidos
Para mi trabajo uso Gitlab en mi propio servidor VPS, y una instancia de Gitlab en otra máquina VPS, para el Docker de Gitlab donde ejecuto el testing usando, Gitlab-Ci_pipeline-PHP de Edbizarro . (Puedes ver mi artículo Laravel CI con Gitlab, Docker Runner, MySQL 8 y PHP 7.3)
La verdad es que se me antojaba raro el mensaje, que me salió al cambiar mi fichero .gitlab-ci.yml para usar la imagen oficial de MariaDB 10.3 en lugar de Mysql.
php artisan migrate:fresh --seed 28 Illuminate\Database\QueryException : SQLSTATE[HY000] [2002] Connection refused (SQL: SHOW FULL TABLES WHERE table_type = 'BASE TABLE')
Cuando uno busca información sobre algo, lo primero que se topa es con una ejército de escritores, que no aportan nada que no sea ruido. Que si a mi me funciona, que si yo lo hice asi, etc
El error de Mysql es claro y sólo tiene tres posibilidades:
Teniendo en cuenta que teníamos claros nuestros valores en el fichero .gitlab-ci.yml están correctos de acuerdo a la configuración oficial, algo estaba pasando.
El problema estriba, en que la imagen oficial de MariaDB, tarda un poco más de lo habitual en tener operativo el acceso a MariaDB de forma remota, por un retardo en la apertura del puerto por TCP.
Así pues la solución pasa por añadir un sleep o parada, en nuestra configuración, cuando vayamos a usar el servicio de mariadb.
stages:
- preparation
- building
- testing
- security
variables:
MYSQL_ROOT_PASSWORD: root
MYSQL_USER: albarid_ci
MYSQL_PASSWORD: albarid_secret
MYSQL_DATABASE: albarid_ci
DB_HOST: mysql
cache:
key: $CI_BUILD_REF_NAME
composer:
stage: preparation
services:
- name: mariadb:10.3-bionic
alias: mysql
image: edbizarro/gitlab-ci-pipeline-php:7.3-alpine
script:
- php -v
- echo "{\"http-basic\":{\"nova.laravel.com\":{\"username\":\"${NOVA_USERNAME}\",\"password\":\"${NOVA_PASSWORD}\"}}}" > ~/.composer/auth.json
- composer install --prefer-dist --no-ansi --no-interaction --no-progress --no-scripts
- cp .env.example .env
- php artisan key:generate
artifacts:
paths:
- vendor/
- .env
expire_in: 5 days
when: always
cache:
paths:
- vendor/
db-seeding:
stage: building
services:
- name: mariadb:10.3-bionic
alias: mysql
image: edbizarro/gitlab-ci-pipeline-php:7.3-alpine
dependencies:
- composer
script:
- echo
- sleep 10 # Sleep necesario
- php artisan migrate:fresh --seed
artifacts:
paths:
- ./storage/logs # for debugging
expire_in: 1 days
when: on_failure
phpunit:
stage: testing
services:
- name: mariadb:10.3-bionic
alias: mysql
image: edbizarro/gitlab-ci-pipeline-php:7.3-alpine
dependencies:
- composer
- db-seeding
script:
- php -v
- sleep 10
- sudo cp /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini /usr/local/etc/php/conf.d/docker-php-ext-xdebug.bak
- echo "" | sudo tee /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
- ./vendor/phpunit/phpunit/phpunit --version
- php -d short_open_tag=off ./vendor/phpunit/phpunit/phpunit -v --colors=never --stderr
- sudo cp /usr/local/etc/php/conf.d/docker-php-ext-xdebug.bak /usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
artifacts:
paths:
- ./storage/logs # for debugging
expire_in: 1 days
when: on_failure
codestyle:
stage: testing
image: lorisleiva/laravel-docker:latest
script:
- phpcs --standard=PSR2 --extensions=php app
dependencies: []
phpcpd:
stage: testing
image: edbizarro/gitlab-ci-pipeline-php:7.3
script:
- test -f phpcpd.phar || curl -L https://phar.phpunit.de/phpcpd.phar -o phpcpd.phar
- php phpcpd.phar app/ --min-lines=50
dependencies: []
cache:
paths:
- phpcpd.phar
sensiolabs:
stage: security
image: edbizarro/gitlab-ci-pipeline-php:7.3
script:
- test -d security-checker || git clone https://github.com/sensiolabs/security-checker.git
- cd security-checker
- composer install
- php security-checker security:check ../composer.lock
dependencies: []
cache:
paths:
- security-checker/
Editado: Desde hace un tiempo dejo de funcionar de esta forma. Hay un artículo que nos lo explica, Sensiolabs, The web service failed for an unknown reason (HTTP 403)
Realizado este cambio, nuestra cola de trabajos podrá procesar el acceso a MariaDB de forma correcta y realizar el seeding.
Un error muy común de los desarrolladores o de los usuarios, es pensar que MySQL y MariaDb son iguales. Ya hace tiempo que no, y sus diferencias, pequeñas, pueden ser un quebradero a la hora de implementar soluciones basadas en uno u otro motor, cuando no hemos comprobado su funcionamiento en ese motor.
Como siempre gracias a Unsplash y a Simone Hutsch por la imagen que sirve de portada, que edite gracias a Canva
Comparte este articulo en
Contexto y motivación del proyecto Tras 25 años gestionando infraestructuras de hosting, he identificado un…
Una reflexión para responsables de sistemas, CTOs, directores de producto y administradores con responsabilidad sobre…
Estimada empresa: Les escribo para expresar mi profundo descontento con el servicio recibido tras contratar…
En el ecosistema de la lucha contra el spam, Spamhaus es una de las organizaciones…
¡Hola a todos! Vamos a sumergirnos en el fascinante mundo de Mod Security y aprender…
Ya son muchos años en el sector, muchos años pasando por varios paneles de control,…