laravelbrasil / forum

Ama Laravel? Torne se um Jedi e Ajude outros Padawans
GNU General Public License v3.0
252 stars 13 forks source link

Gitlab CI/CD + Docker image #82

Open zabaala opened 7 years ago

zabaala commented 7 years ago

Estou tentando dar uma otimizada no tempo dos testes de um APP Laravel que estou trabalhando. O processo em si já funciona perfeitamente, mas gostaria de melhorar algumas coisas e não estou tendo tanto sucesso.

Problema Encontrado

Toda vez que o repositório recebe um novo commit, a pipeline roda um novo teste. Vou usar como exemplo esse template de um .gitlab-ci.yml pra facilitar o entendimento:

# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/php
image: php/latest

# Pick zero or more services to be used on all builds.
# Only needed when using a docker container to run your tests in.
# Check out: http://docs.gitlab.com/ce/ci/docker/using_docker_images.html#what-is-service
services:
  - mysql:5.7

variables:
  MYSQL_DATABASE: database_name
  MYSQL_ROOT_PASSWORD: secret

# This folder is cached between builds
# http://docs.gitlab.com/ce/ci/yaml/README.html#cache
cache:
  paths:
  - vendor/
  - node_modules/

# This is a basic example for a gem or script which doesn't use
# services such as redis or postgres
before_script:
  # Update packages 
  - apt-get update -yqq

  # Upgrade to Node 7
  - curl -sL https://deb.nodesource.com/setup_7.x | bash -

  # Install dependencies
  - apt-get install git nodejs libcurl4-gnutls-dev libicu-dev libmcrypt-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libpq-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev -yqq

  # Install php extensions
  - docker-php-ext-install mbstring mcrypt pdo_mysql curl json intl gd xml zip bz2 opcache

  # Install Composer and project dependencies.
  - curl -sS https://getcomposer.org/installer | php
  - php composer.phar install 

  # Install Node dependencies.
  # comment this out if you don't have a node dependency
  - npm install

  # Copy over testing configuration.
  # Don't forget to set the database config in .env.testing correctly
  # DB_HOST=mysql
  # DB_DATABASE=project_name
  # DB_USERNAME=root
  # DB_PASSWORD=secret
  - cp .env.testing .env

  # Run npm build
  # comment this out if you don't have a frontend build
  # you can change this to to your frontend building script like
  # npm run build
  - npm install gulp-cli -g
  - npm install gulp -D
  - gulp

  # Generate an application key. Re-cache.
  - php artisan key:generate
  - php artisan config:cache

  # Run database migrations.
  - php artisan migrate

  # Run database seed
  - php artisan db:seed

test:
  script:
  # run laravel tests
  - php vendor/bin/phpunit --coverage-text --colors=never 

  # run frontend tests
  # if you have any task for testing frontend
  # set it in your package.json script
  # comment this out if you don't have a frontend test
  # - npm test

Isso funciona, mas o before_script é algo que demora bastante.

Daí, qual foi a minha idéia?! Criar minha própria imagem com todas as configurações necessárias (boa parte do before_script pra servir como a imagem que seria utilizada no teste.

Ou seja, esses comandos deixariam de ser executado em cada novo commit, pois já estariam na minha imagem Docker (que está no docker hub):

- apt-get update -yqq

  # Upgrade to Node 7
  - curl -sL https://deb.nodesource.com/setup_7.x | bash -

  # Install dependencies
  - apt-get install git nodejs libcurl4-gnutls-dev libicu-dev libmcrypt-dev libvpx-dev libjpeg-dev libpng-dev libxpm-dev zlib1g-dev libfreetype6-dev libxml2-dev libexpat1-dev libbz2-dev libgmp3-dev libldap2-dev unixodbc-dev libpq-dev libsqlite3-dev libaspell-dev libsnmp-dev libpcre3-dev libtidy-dev -yqq

  # Install php extensions
  - docker-php-ext-install mbstring mcrypt pdo_mysql curl json intl gd xml zip bz2 opcache

  # Install Composer and project dependencies.
  - curl -sS https://getcomposer.org/installer | php

Com isso, alterei minha imagem .gitlab-ci.yml, deixando-o assim:

# This file is a template, and might need editing before it works on your project.
# Official framework image. Look for the different tagged releases at:
# https://hub.docker.com/r/library/php
image: zabaala/docker-php-tester

Ai é que vem a merda (hahahaha), essa parada não funcionou. Ele não executa o comando:

php composer.phar install

e retorna o seguinte erro:

...
Checking out 3aac7b04 as master...
Skipping Git submodules setup
Checking cache for default...
Failed to extract cache
$ php composer.phar install
Could not open input file: composer.phar
ERROR: Job failed: exit code 1

Alguém tem alguma idéia do que eu posso estar fazendo de errado?

Valeu, abraços!!

marabesi commented 7 years ago

Você está executando o composer errado, tente mudar o mando de:

php composer.phar install

para

 composer install

Se não funcionar, instale o composer globalmente e tente novamente o comando 2

paulofreitas commented 7 years ago

@marabesi Na verdade o comando está certo, pois na linha anterior o composer é instalado como Phar. O problema é que o comando anterior certamente não foi executado no mesmo diretório de trabalho do GitLab CI Runner.

Creio que a solução seria instalar o composer globalmente através do seguinte comando:

curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer

Deste modo seria possível executar diretamente composer install no before_script do .gitlab-ci.yml. 👍

zabaala commented 7 years ago

@paulofreitas Vou testar, mas não sei se isso funcionaria.

A sensação que eu tenho é que o comando não é executado dentro do container. Mas mesmo assim irei fazer o teste e retorno aqui.

Valeu.

ravanscafi commented 7 years ago

Usa alguns comandos de debug, pwd por exemplo, pra ver se você tá na pasta certa e etc. confere o WORKDIR no seu Dockerfile.

Acredito que não fazer esse setup toda vez vai melhorar a velocidade drasticamente. Se ainda não for o suficiente, você pode considerar rodar o coverage nos testes somente pra alguma branch específica ou algo do tipo.