Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Criar, Testar, Integrar e Publicar

Criar, Testar, Integrar e Publicar

Como montar um ambiente docker multiestágio, registrar imagens, automatizar execução de testes e estruturar pipeline de Integração Contínua.

Renê Lima

July 06, 2019
Tweet

Other Decks in Programming

Transcript

  1. Vamos preparar o ambiente Docker de uma aplicação Symfony, configurar

    o Gitlab Pipeline para registrar imagens no GitLab Registry e publicá-las. Photo by Pixabay
  2. Photo by Pixabay code sniffer Vamos usar os recursos do

    GitLab em substituição ao Appveyor e Travis.
  3. $ yarn install $ yarn encore dev $ composer install

    $ bin/console doctrine:database:create $ bin/console doctrine:migrations:migrate $ bin/console doctrine:fixtures:load $ bin/console server:run [OK] Server listening // Quit the server with CONTROL-C. PHP 7.3.5 Development Server started Listening on http://localhost1:8000 Document root is ~/ewok/public Press Ctrl-C to quit. executar
  4. $ bin/console lint:twig templates/ $ bin/console lint:yaml \ config/ translations/

    *.yml $ vendor/bin/php-cs-fixer fix \ --diff --dry-run --no-interaction –v $ bin/phpunit Testing Project Test Suite ....................................... Time: 1.02 minutes, Memory: 62.50MB OK (54 tests, 101 assertions) verificar
  5. docker-compose.yml Configurar serviços, volumes e variáveis de ambiente. Dockerfile Preparar

    imagens, instalar binários e configurar bibliotecas. vhost.conf Configurar o serviço httpd, apontar paths e definir fallback. Makefile Organizar comandos de gerenciamento do ambiente. Configurar serviços que usam imagens para criar containers.
  6. ./docker-compose.yml version: ‘3.7’ services: httpd: image: php/7.3-apache ports: - 8080:80

    volumes: - .:/workspace - .docker/vhost.conf: /etc/apache2/conf.d/vhost.conf depends_on: - postgres - redis postgres: image: postgres:11.3-alpine environment: - POSTGRES_DB=database - POSTGRES_USER=user - POSTGRES_PASSWORD=password redis: image: redis:5.3-alpine
  7. $ docker-compose up –d $ docker-compose down ./docker-compose.yml version: ‘3.7’

    services: httpd: image: php/7.3-apache ports: - 8080:80 volumes: - .:/workspace - .docker/vhost.conf: /etc/apache2/conf.d/vhost.conf depends_on: - postgres - redis postgres: image: postgres:11.3-alpine environment: - POSTGRES_DB=database - POSTGRES_USER=user - POSTGRES_PASSWORD=password redis: image: redis:5.3-alpine .docker/vhost.conf <VirtualHost *:80> DocumentRoot /workspace/public <Directory /workspace/public> AllowOverride None Require all granted Allow from All FallbackResource /index.php </Directory> </VirtualHost>
  8. D ./docker-compose.yml version: ‘3.7’ services: httpd: build: context: . ports:

    - 8080:80 volumes: - .:/workspace depends_on: - postgres - redis postgres: image: postgres:11.3-alpine environment: - POSTGRES_DB=database - POSTGRES_USER=user - POSTGRES_PASSWORD=password redis: image: redis:5.3-alpine Dockerfile
  9. ./Dockerfile FROM php/7.3-apache RUN apk add --no-cache \ composer \

    yarn && mkdir -p /var/www/.composer \ /var/www/.cache/yarn && \ chown -R apache:apache /var/www COPY .docker/vhost.conf \ /etc/apache2/conf.d/vhost.conf WORKDIR /workspace $ docker-compose up –d $ docker-compose down $ docker-compose exec httpd \ yarn encore dev $ docker-compose exec httpd \ composer install
  10. ./Dockerfile FROM phpearth/php:7.3-apache RUN apk add --no-cache \ php7.3-intl \

    php7.3-pdo_pgsql \ php7.3-redis \ composer \ yarn && \ mkdir -p /var/www/.composer \ /var/www/.cache/yarn && \ chown -R apache:apache /var/www COPY .docker/vhost.conf \ /etc/apache2/conf.d/vhost.conf WORKDIR /workspace php/7.3-apache 367MB phpearth/php:7.3-apache 38MB
  11. ./Dockerfile FROM phpearth/php:7.3-apache RUN apk add --no-cache \ php7.3-intl \

    php7.3-pdo_pgsql \ php7.3-redis \ composer \ yarn && \ mkdir -p /var/www/.composer \ /var/www/.cache/yarn && \ chown -R apache:apache /var/www COPY .docker/vhost.conf \ /etc/apache2/conf.d/vhost.conf WORKDIR /workspace Quantidade de vulnerabilidades por imagem Docker de sistemas operacionais publicado em 17 de abril de 2019 em snyk.io por Brian Vermeer e William Henry. 0 0 1 31 42 55 fedora alpine centos ubuntu debian stretch-slim debian
  12. ./Dockerfile FROM phpearth/php:7.3-apache as base RUN apk add --no-cache \

    php7.3-intl \ php7.3-pdo_pgsql \ php7.3-redis COPY .docker/vhost.conf \ /etc/apache2/conf.d/vhost.conf WORKDIR /workspace FROM base as development RUN apk add --no-cache \ composer \ yarn && \ mkdir -p /var/www/.composer \ /var/www/.cache/yarn && \ chown -R apache:apache /var/www Multiestágio Com o mesmo Dockerfile é possível trabalhar com diferentes estágios e otimizar a preparação de imagens para diferentes ambientes desde o desenvolvimento até a produção.
  13. ./Dockerfile FROM phpearth/php:7.3-apache as base RUN apk add --no-cache \

    php7.3-intl \ php7.3-pdo_pgsql COPY .docker/vhost.conf \ /etc/apache2/conf.d/vhost.conf WORKDIR /workspace FROM base as development RUN apk add --no-cache \ composer \ yarn && \ mkdir -p /var/www/.composer \ /var/www/.cache/yarn && \ chown -R apache:apache /var/www ./docker-compose.yml version: ‘3.7’ services: httpd: build: context: . target: development ports: - 8080:80 ... Multiestágio Com o mesmo Dockerfile é possível trabalhar com diferentes estágios e otimizar a preparação de imagens para diferentes ambientes desde o desenvolvimento até a produção.
  14. ./Dockerfile FROM phpearth/php:7.3-apache as base RUN apk add --no-cache \

    php7.3-intl \ php7.3-pdo_pgsql COPY .docker/vhost.conf \ /etc/apache2/conf.d/vhost.conf WORKDIR /workspace FROM base as development RUN apk add --no-cache \ composer \ yarn && \ mkdir -p /var/www/.composer \ /var/www/.cache/yarn && \ chown -R apache:apache /var/www ./docker-compose.yml version: ‘3.7’ services: httpd: build: context: . target: development ports: - 8080:80 ... BASE DEVELOPMENT volume
  15. ./Dockerfile FROM phpearth/php:7.3-apache as base ... FROM base as development

    ... FROM staging AS build COPY . /workspace RUN composer install --no-scripts \ --optimize-autoloader --no-suggest \ --no-dev && \ composer dump-env prod --empty && \ yarn install && \ yarn encore production && \ rm -rf .docker/ .git/ assets/ node_modules/ tests/ var/ FROM base AS production COPY --from=build /workspace /workspace RUN chown apache:apache -R /workspace BASE DEVELOPMENT BUILD PRODUCTION volume copy copy
  16. ./Makefile EXEC := docker-compose exec \ -u apache httpd install:

    up vendor/ public/build/ up: docker-compose up -d down: docker-compose down sh: $(EXEC) /bin/sh vendor/: $(EXEC) composer install node_modules/: $(EXEC) yarn install public/build/: node_modules/ $(EXEC) yarn encore dev $ make up $ make down $ make sh $ make vendor/ $ make node_modules/ $ make public/build/
  17. ./Makefile EXEC := docker-compose exec \ -u apache httpd ...

    data-migrations: $(EXEC) bin/console \ doctrine:database:create $(EXEC) bin/console \ doctrine:migrations:migrate data-fixtures: $(EXEC) bin/console \ doctrine:fixtures:load $ make up $ make down $ make sh $ make vendor/ $ make node_modules/ $ make public/build/ $ make data-migrations $ make data-fixtures
  18. ./Makefile EXEC := docker-compose exec \ -u apache httpd ...

    lint-twig: $(EXEC) bin/console lint:twig templates/ lint-yaml: $(EXEC) bin/console lint:yaml config/ \ translations/ *.yml phpcs: $(EXEC) vendor/bin/php-cs-fixer fix \ --diff --dry-run --no-interaction -v phpunit: $(EXEC) bin/phpunit $ make up $ make down $ make sh $ make vendor/ $ make node_modules/ $ make public/build/ $ make data-migrations $ make data-fixtures $ make lint-twig $ make lint-yaml $ make phpcs $ make phpunit
  19. $ make up $ make vendor/ $ make public/build/ $

    make data-migrations $ make data-fixtures ou apenas ... $ make install executar
  20. $ make lint-twig $ make lint-yaml $ make phpcs $

    make phpunit Testing Project Test Suite ....................................... Time: 1.02 minutes, Memory: 62.50MB OK (54 tests, 101 assertions) verificar
  21. Organizar tarefas e estágios para testar e validar a aplicação,

    registrar e publicar imagens. Video by Pixabay
  22. Build Produzir e registrar imagens docker. Analysis Usar imagem registrada

    para realizar verificações e testes. Deploy Publicar uma imagem registrada. Dependencies Instalar pacotes e bibliotecas Yarn e Composer.
  23. .gitlab-ci.yml Configuração dos estágios, tarefas, cache e controle do pipeline.

    build-production.yml Configurações utilizadas para criar a imagem a ser publicada em produção. build-staging.yml Configurações utilizadas para criar a imagem onde as validações e os testes serão realizados.
  24. .gitlab-ci.yml image: mykiwi/docker services: - docker:dind variables: DOCKER_HOST: tcp://docker:2375 DOCKER_DRIVER:

    overlay2 stages: - build - dependencies - analysis - deploy before_script: - docker info - docker login -u gitlab-ci-token –p \ $CI_JOB_TOKEN $CI_REGISTRY after_script: - docker logout $CI_REGISTRY
  25. .gitlab-ci.yml ... Build Production: stage: build variables: COMPOSE_FILE: build-production.yml script:

    - make up - docker-compose push Build Staging: stage: build variables: COMPOSE_FILE: build-staging.yml script: - make up - docker-compose push
  26. .gitlab-ci.yml ... Composer: stage: dependencies script: - docker-compose pull -q

    httpd - make up - make vendor/ Yarn: stage: dependencies script: - docker-compose pull -q httpd - make up - make node_modules/
  27. .gitlab-ci.yml ... Lint Yaml: stage: analysis script: - docker-compose pull

    -q httpd - make up - make lint-yaml Lint Twig: stage: analysis script: - docker-compose pull -q httpd - make up - make lint-twig
  28. .gitlab-ci.yml ... Code Sniffer: stage: analysis script: - docker-compose pull

    -q httpd - make up - make phpcs Unit Test: stage: analysis script: - docker-compose pull -q httpd - make up - make public/build/ - make phpunit
  29. .gitlab-ci.yml ... Build Staging: stage: build variables: COMPOSE_FILE: build-staging.yml script:

    - make up - docker-compose push only: changes: - docker-compose.yml - Makefile - .docker/*
  30. .gitlab-ci.yml ... Composer: stage: dependencies script: - docker-compose pull -q

    httpd - make up - make vendor/ only: changes: - composer.json Yarn: stage: dependencies script: - docker-compose pull -q httpd - make up - make node_modules/ only: changes: - package.json
  31. Behat BDD framework for PHP to help you test business

    expectations. PHPspec Toolset to drive emergent design by specification. Panther Library to scrape websites and to run end-to-end tests using real browsers. PHPUnit Programmer- oriented testing framework for PHP. Psalm Static analysis tool for finding errors in PHP applications, built on top of PHP Parser. PHPStan Focuses on finding errors in your code without actually running it. Qual estratégia de teste utilizar?