Wiki

Clone wiki

ember2drupal / Drupal_8_CI_CD_with_Docker_via_CircleCI

Drupal 8 CI/CD c Docker и CircleCI

перевод (рус.) статьи Drupal 8 CI/CD with Docker via CircleCI

В этой статье я продемонстрирую организацию работы CI для вашего Drupal8 сайта, используя Docker. Мы будем использовать CircleCI в качестве CI/CD (непрерывная интеграция/доставка) >инструментария и docker4drupal для тестового окружения.

Это статья из двух частей. В первой части мы создадим наш CircleCI, развернем тестовое окружение используя docker4drupal контейнер, и >запустим несколько наборов тестов из ядра.

Во второй части, мы подготовим архив для выгрузки на AWS S3. Затем мы развернем новое окружение для Drupal на базе Docker, и выгрузим туда свой архив.

1. Непрерывная интеграция

pic1_1.jpeg

Изначально, добавим проект на CircleCI. Я буду использовать свой публичный репозиторий drupal (являющийся форком оф. Drupal репозитория). Как только вы добавите свой проект, CircleCI будет автоматически запускать сборку при каждого коммите.

pic1_2.jpeg

Тестовое окружение

Добавьте следующий docker-compose.yml файл в свой репозиторий, это упрощенная версия docker4drupal:

version: "2"

services:
  mariadb:
    image: wodby/drupal-mariadb
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: 1
      MYSQL_DATABASE: drupal
      MYSQL_USER: drupal
      MYSQL_PASSWORD: drupal

  php:
    image: wodby/drupal-php:7.0
    environment:
      PHP_SITE_NAME: dev
      PHP_HOST_NAME: localhost:8000
      SIMPLETEST_BASE_URL: http://nginx
      SIMPLETEST_DB: mysql://drupal:drupal@mariadb/drupal
    volumes:
      - ./:/var/www/html

  nginx:
    image: wodby/drupal-nginx
    environment:
      NGINX_SERVER_NAME: localhost
      NGINX_UPSTREAM_NAME: php
      DRUPAL_VERSION: 8
    volumes_from:
      - php

docker-compose.yml определяет набор служб/контейнеров для тестового окружения. Кроме PHP, нам нужны MariaDB и Nginx контейнеры, так как мы будем запускать функциональные тесты, которым необходимы веб-сервер и сервер базы данных. По той-же причине, мы добавили две переменные для Simpletest в PHP контейнер.

Сборка CircleCI

Добавим следующий circle.yml` файл в свой репозиторий для ручной сборки:

machine:
  pre:
    - curl -sSL https://s3.amazonaws.com/circle-downloads/install-circleci-docker.sh | bash -s -- 1.10.0
  services:
    - docker
dependencies:
  pre:
    - rm /opt/circleci/php/$(phpenv global)/etc/conf.d/xdebug.ini
  override:
    - sudo pip install docker-compose
    - docker-compose up -d mariadb
    - docker-compose up -d nginx
test:
  pre:
    - composer global require "hirak/prestissimo:^0.3"
    - composer require "wikimedia/composer-merge-plugin:~1.3" --no-interaction
    - composer update -n
    - composer update -n -d ./scripts
    - sudo chown -R 82:82 .
  override:
    - docker-compose run --user 82 php vendor/bin/phpunit -c core core/tests/Drupal/Tests/Core/Password/PasswordHashingTest.php
    - docker-compose run --user 82 php vendor/bin/phpunit -c core core/tests/Drupal/KernelTests/Component/Utility/SafeMarkupKernelTest.php
    - docker-compose run --user 82 php vendor/bin/phpunit -c core core/tests/Drupal/FunctionalTests/Breadcrumb/Breadcrumb404Test.php

Давайте быстро пробежим по его секциям:

  • machine: установит docker 1.10 версии (дефолный 1.8 здесь не сработает)
  • dependencies: в зависимостях мы убрали xdebug (из соображений производительности), установили docker-compose, прикрутили mariadb и nginx службы, определенные в нашем docker-compose.yml файле.
  • test: сначала, посредством composer, мы получим зависимости Drupal и зависимости для Wodby PHP SDK в каталог ./scripts. Сменим владельца на 82, это id пользователя www-data в php/nginx контейнерах. Так-же, в секции override, мы запускаем 4-ре набора тестов (unit и функциональные) из ядра Drupal.

Запуск сборки

Теперь у нас есть все необходимое. Включим в коммит все добавленные файлы. CircleCI автоматически запустит процесс сборки:

pic1_3.jpeg

Запустит наши тесты:

pic1_4.jpeg

Все тесты проходят. Это значит, что мы можем перейти ко второй части, в которой развернем нашу сборку.

2. Доставка

pic2_1.jpeg

Это не универсальное руководство по доставке вашей сборки в рабочую среду. Все зависит от вашего рабочего процесса и инфраструктуры.

Кроме того, с докером возможны два варианта:

  • Доставка кода (архив развертки)
  • Доставка контейнера docker с кодом

В этой статье мы рассмотрим первый вариант, доставим код в инфраструктуру, подготовленную Wodby. Мы подготовим архив развертки и выгрузим его на AWS S3. Затем, развернем наше новое окружение для Drupal на базе docker с помощью Wodby, и отправим в него наш архив с кодом.

Добавим следующие строки в circle.yml файл:

deployment:
  production:
    branch: /.*/
    commands:
      - tar -c --exclude='.git' --exclude='.gitignore' --exclude="./docker-runtime" . | gzip -9 | aws s3 cp - "s3://$AWS_S3_BUCKET/$AWS_S3_FILE_NAME-$CIRCLE_BUILD_NUM.tar.gz"
      - php -f ./scripts/wodby.php

В секции deployment мы создаем архив с кодом и загружаем его на AWS S3 хранилище. Мы запустим wodby.php скрипт, который будет выгружать новый экземпляр Drupal приложения на сервер, подключенный к Wodby.

Простое безопасное хранилище AWS

Мы используем AWS S3 для хранения архива развертки, так как он интегрирован с CircleCI, но вы можете использовать любое другое хранилище. Откройте консоль AWS S3 и создайте новый бакет:

pic2_2.jpeg

Перейдите к AWS IAM сервису, и создайте нового пользователя для CircleCI. Скопируйте сгенерированные ключи (Access Key Id и Secret Access Key), они нам понадобятся позднее.

Добавьте к правам этого пользователя AmazonS3FullAccess политику:

pic2_3.jpeg

Теперь, открыв настройки проекта CircleCI, и перейдя к AWS разрешениям, добавьте ваши ключи:

pic2_4.jpeg

Доставка сборки посредством Wodby

Развертка вашего Drupal сайта с Wodby. По умолчанию, создается dev экземпляр. Мы будем создавать его копию, и импортировать ее в наш архив кода посредством Wodby PHP SDK. Сборка (набор контейнеров) от Wodby на 95% состоит из docker4drupal контейнеров.

pic2_5.jpeg

Скрипты доставки

Скопируйте следующие скрипты из этого репозитория (кат. circle-ci) в свой Drupal project:

  • wodby.php этот скрипт развернет новый экземпляр приложения, развернутого с Wodby и импортирует сборку
  • composer.json здесь указанна Wodby PHP SDK, как зависимость для нашего php скрипта

Этот скрипт использует Wodby PHP SDK для развертки новых экземпляров приложения на сервере, подключенном к Wodby, а после, импортирует архив развертки из AWS S3.

Настройка переменных окружения

Нам необходимо определить следующие переменные окружения и токены для наших скриптов доставки. Мы можем сделать это на странице настроек нашего CircleCI проекта:

pic2_6.jpeg

  • AWS_S3_BUCKET имя вашего AWS S3 бакета, из которого выгружается архив развертки
  • AWS_S3_FILE_NAME базовое имя архива (вы можете использовать название проекта), к которому номер сборки будет добавлен как суффикс
  • WODBY_API_TOKEN вы можете скопировать этот токен со страницы вашего профиля Wodby
  • WODBY_SERVER_ID на панели управления Wodby, перейдите на стр. серверов и скопируйте ID из адресной строки

pic2_7.jpeg pic2_8.jpeg

  • WODBY_APP_ID перейдя на стр. приложений в панели управления Wodby, копируйте Application UUID на вкладках Настройки -> Информация
  • WODBY_SOURCE_INSTANCE_ID Там-же копируйте Instance UUID. Этот экземпляр будет использован как источник базы данных и файлов для нового экземпляра.

pic2_9.jpeg

Запуск сборки

Сейчас, вы можете наблюдать новую секцию развертывания на панели управления CircleCI.

pic2_10.jpeg

Теперь, мы имеем только-что созданный экземпляр с информацией о нашей сборке:

pic2_11.jpeg

Это наш результат. Все необходимое, вы можете найти в этом репозитории, в каталоге circle-ci

Updated