Wiki
Clone wikiember2drupal / 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. Непрерывная интеграция
Изначально, добавим проект на CircleCI. Я буду использовать свой публичный репозиторий drupal (являющийся форком оф. Drupal репозитория). Как только вы добавите свой проект, CircleCI будет автоматически запускать сборку при каждого коммите.
Тестовое окружение
Добавьте следующий 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 автоматически запустит процесс сборки:
Запустит наши тесты:
Все тесты проходят. Это значит, что мы можем перейти ко второй части, в которой развернем нашу сборку.
2. Доставка
Это не универсальное руководство по доставке вашей сборки в рабочую среду. Все зависит от вашего рабочего процесса и инфраструктуры.
Кроме того, с докером возможны два варианта:
- Доставка кода (архив развертки)
- Доставка контейнера 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 и создайте новый бакет:
Перейдите к 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
Updated