Drupal 8 CI/CD c Docker и CircleCI

Чт, 08/12/2016 - 18:15

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

Автор @csandanov


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

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

11

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

12

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

Добавьте следующий 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 автоматически запустит процесс сборки:

13

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

14

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

Непрерывная доставка

21

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

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

  • Доставка кода (архив развертки)
  • Доставка контейнера 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 и создайте новый бакет:

22

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

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

23

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

24

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

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

25

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

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

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

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

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

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

26

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

27
28

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

29

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

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

210

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

211

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

2 Спасибо

Комментарии

Аватар пользователя multpix
6 months 2 недели назад multpix #

Исходник этого перевода здесь:
https://bitbucket.org/multpix/ember2drupal/wiki/Drupal_8_CI_CD_with_Docker_via_CircleCI
Кому надо - берите пока открыто))

Если видите очипятки, если есть вопросы или предложения - в комментарии.

Следующий кандидат на перевод, от того же автора:
https://blog.wodby.com/drupal-8-ci-cd-with-jenkins-part-1-integration-eabd0f5c4f75

Не забывайте, Docker, Wodby, CircleCI и AWS - это коммерческие предприятия))

1 Спасибо
Аватар пользователя multpix
6 months 2 недели назад multpix #

Меня немного напрягает мой вариант перевода некоторых терминов,
посему, если есть замечания - так-же прошу комментировать.

0 Спасибо
Аватар пользователя bumble
6 months 2 недели назад bumble #

На главной.

1 Спасибо
Аватар пользователя gun_dose
6 months 2 недели назад gun_dose #

Вот как раз собираюсь заюзать их сборку на следующем проекте.

0 Спасибо
Аватар пользователя ХулиGUN
6 months 2 недели назад ХулиGUN #

Падпишусь. Повторю ещё раз - это всё полезно только тем кто пишет свои модули и тесты на них делает, тем же кто собирает сайты мышкой - бесполезно)))

1 Спасибо
Аватар пользователя gun_dose
6 months 2 недели назад gun_dose #

Вопрос от телезрителей - вот поднял я эту штуку, всё работает. А как драшем пользоваться?

0 Спасибо
Аватар пользователя multpix
6 months 2 недели назад multpix #
gun_dose написал:

а какие проблемы с драшем?
локально?
удаленно?
драш как часть проекта?
у wodby нету драша?
какие действия нужно делать драшем и где?

Чуток инфы:
http://www.drupal.ru/node/124397
https://blog.wodby.com/wodby-demo-video-7a133f3c8420#.iz8ik3hx6
Попробую попробовать пригласить в тему автора статьи @csandanov

0 Спасибо
Аватар пользователя gun_dose
6 months 2 недели назад gun_dose #

Фак! Долбанная маторезка!

Как установить расширения для пхп? В частности, geo ip

0 Спасибо
Аватар пользователя multpix
6 months 2 недели назад multpix #

а глянь, че у них в контейнерах:
https://hub.docker.com/u/wodby/

может web-php больше подойдет?

0 Спасибо
Аватар пользователя gun_dose
6 months 2 недели назад gun_dose #

я хз, кто такой веб-пхп. Интересная телега, если зайти в контейнер по ссш, никаких опций установки чего ли-бо нет. По идее надо пересобирать контейнер с новой конфой. Чтоб я знал ещё что туда написать.

0 Спасибо
Аватар пользователя csandanov
6 months 2 недели назад csandanov #

Свяжитесь с нами через интерком (виджет в правом нижнем углу дашборда) и мы вам поможем с расширением.

0 Спасибо
Аватар пользователя gun_dose
6 months 2 недели назад gun_dose #

Ээээ.... А где дашборд то?)))

1 Спасибо
Аватар пользователя multpix
6 months 2 недели назад multpix #

давай попробуем дождаться ответа от соучредителя wodby,
я отправил просьбу поучаствовать в обсуждении.

0 Спасибо
Аватар пользователя bumble
6 months 2 недели назад bumble #

Минутка оффтопа:

Здесь можно вызывать души мучеников пользователей форума упомянув их ник с собачкой (как в приличных домах Версаля). Например: @multpix.

При этом, данный функционал слегка бажный - ник должен быть без пробелов и доп символов (PR частично готовым лежит уже с год, но правки будут только в следующих релизах).

0 Спасибо
Аватар пользователя multpix
6 months 2 недели назад multpix #

полминутки оффтопа:
Работает)

0 Спасибо
Аватар пользователя ХулиGUN
6 months 2 недели назад ХулиGUN #
bumble написал:
Здесь можно вызывать души мучеников пользователей форума упомянув их ник с собачкой (как в приличных домах Версаля)

Меня нельзя вызывать))))

0 Спасибо
Аватар пользователя bumble
6 months 2 недели назад bumble #

Вызывать - можно, произносить нельзя )))

0 Спасибо
Аватар пользователя ХулиGUN
6 months 2 недели назад ХулиGUN #
bumble написал:
Вызывать - можно, произносить нельзя )))

О, я стал как Воланд де Морт, чьё имя нельзя произносить)))

0 Спасибо