перевод (рус.) статьи Drupal 8 CI/CD with Docker via CircleCI
Автор csandanov
В этой статье я продемонстрирую организацию работы CI для вашего Drupal8 сайта, используя Docker. Мы будем использовать CircleCI в качестве CI/CD (непрерывная интеграция/доставка) инструментария и docker4drupal для тестового окружения.
Это статья из двух частей. В первой части мы создадим наш CircleCI, развернем тестовое окружение используя docker4drupal контейнер, и запустим несколько наборов тестов из ядра.
Во второй части, мы подготовим архив для выгрузки на AWS S3. Затем мы развернем новое окружение для Drupal на базе Docker, и выгрузим туда свой архив.
Непрерывная интеграция
Изначально, добавим проект на CircleCI. Я буду использовать свой публичный репозиторий drupal (являющийся форком оф. Drupal репозитория). Как только вы добавите свой проект, CircleCI будет автоматически запускать сборку при каждом коммите.
Тестовое окружение
Добавьте следующий docker-compose.yml файл в свой репозиторий, это упрощенная версия docker4drupal:
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 файл в свой репозиторий для ручной сборки:
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 автоматически запустит процесс сборки:
Запустит наши тесты:
Все тесты проходят. Это значит, что мы можем перейти ко второй части, в которой развернем нашу сборку.
Непрерывная доставка
Это не универсальное руководство по доставке вашей сборки в рабочую среду. Все зависит от вашего рабочего процесса и инфраструктуры.
Кроме того, с докером возможны два варианта:
- Доставка кода (архив развертки)
- Доставка контейнера docker с кодом
В этой статье мы рассмотрим первый вариант, доставим код в инфраструктуру, подготовленную Wodby. Мы подготовим архив развертки и выгрузим его на AWS S3. Затем, развернем наше новое окружение для Drupal на базе docker с помощью Wodby, и отправим в него наш архив с кодом.
Добавим следующие строки в circle.yml файл:
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 и создайте новый бакет:
Перейдите к AWS IAM сервису, и создайте нового пользователя для CircleCI. Скопируйте сгенерированные ключи (Access Key Id и Secret Access Key), они нам понадобятся позднее.
Добавьте к правам этого пользователя AmazonS3FullAccess политику:
Теперь, открыв настройки проекта CircleCI, и перейдя к AWS разрешениям, добавьте ваши ключи:
Доставка сборки посредством Wodby
Развертка вашего Drupal сайта с Wodby. По умолчанию, создается dev экземпляр. Мы будем создавать его копию, и импортировать ее в наш архив кода посредством Wodby PHP SDK. Сборка (набор контейнеров) от Wodby на 95% состоит из docker4drupal контейнеров.
Скопируйте следующие скрипты из этого репозитория (кат. circle-ci) в свой Drupal project:
- wodby.php этот скрипт развернет новый экземпляр приложения, развернутого с Wodby и импортирует сборку
- composer.json здесь указанна Wodby PHP SDK, как зависимость для нашего php скрипта
Этот скрипт использует Wodby PHP SDK для развертки новых экземпляров приложения на сервере, подключенном к Wodby, а после, импортирует архив развертки из AWS S3.
Настройка переменных окружения
Нам необходимо определить следующие переменные окружения и токены для наших скриптов доставки. Мы можем сделать это на странице настроек нашего CircleCI проекта:
- AWS_S3_BUCKET имя вашего AWS S3 бакета, из которого выгружается архив развертки
- AWS_S3_FILE_NAME базовое имя архива (вы можете использовать название проекта), к которому номер сборки будет добавлен как суффикс
- WODBY_API_TOKEN вы можете скопировать этот токен со страницы вашего профиля Wodby
- WODBY_SERVER_ID на панели управления Wodby, перейдите на стр. серверов и скопируйте ID из адресной строки
- WODBY_APP_ID перейдя на стр. приложений в панели управления Wodby, копируйте Application UUID на вкладках Настройки -> Информация
- WODBY_SOURCE_INSTANCE_ID Там-же копируйте Instance UUID. Этот экземпляр будет использован как источник базы данных и файлов для нового экземпляра.
Запуск сборки
Сейчас, вы можете наблюдать новую секцию развертывания на панели управления CircleCI.
Теперь, мы имеем только-что созданный экземпляр с информацией о нашей сборке:
Это наш результат. Все необходимое, вы можете найти в этом репозитории, в каталоге circle-ci
Комментарии
Исходник этого перевода здесь:
https://bitbucket.org/multpix/ember2drupal/wiki/Drupal_8_CI_CD_with_Dock...
Кому надо - берите пока открыто))
Если видите очипятки, если есть вопросы или предложения - в комментарии.
Следующий кандидат на перевод, от того же автора:
https://blog.wodby.com/drupal-8-ci-cd-with-jenkins-part-1-integration-ea...
Не забывайте, Docker, Wodby, CircleCI и AWS - это коммерческие предприятия))
Меня немного напрягает мой вариант перевода некоторых терминов,
посему, если есть замечания - так-же прошу комментировать.
Вот как раз собираюсь заюзать их сборку на следующем проекте.
Вопрос от телезрителей - вот поднял я эту штуку, всё работает. А как драшем пользоваться?
а какие проблемы с драшем?
локально?
удаленно?
драш как часть проекта?
у wodby нету драша?
какие действия нужно делать драшем и где?
Чуток инфы:
http://www.drupal.ru/node/124397
https://blog.wodby.com/wodby-demo-video-7a133f3c8420#.iz8ik3hx6
Попробую попробовать пригласить в тему автора статьи @csandanov
Фак! Долбанная маторезка!
Как установить расширения для пхп? В частности, geo ip
а глянь, че у них в контейнерах:
https://hub.docker.com/u/wodby/
может web-php больше подойдет?
я хз, кто такой веб-пхп. Интересная телега, если зайти в контейнер по ссш, никаких опций установки чего ли-бо нет. По идее надо пересобирать контейнер с новой конфой. Чтоб я знал ещё что туда написать.
Свяжитесь с нами через интерком (виджет в правом нижнем углу дашборда) и мы вам поможем с расширением.
Ээээ.... А где дашборд то?)))
давай попробуем дождаться ответа от соучредителя wodby,
я отправил просьбу поучаствовать в обсуждении.