Статьи

Непрерывная доставка в облаке: CD Pipeline

В  первой части этой серии статей я представил   конвейер Continuous Delivery (CD) для  приложения Manatee Tracking  и то, как мы используем этот конвейер для доставки программного обеспечения от регистрации до производства. В этой статье я подробно расскажу о конвейере CD. Список тем для каждой из статей приведен ниже.

Часть 1: Введение  — Введение в непрерывную доставку в облаке и остальные статьи;
Часть 2: конвейер CD — то, что вы сейчас читаете;
Часть 3: CloudFormation  — подготовка виртуальных ресурсов по сценарию ;
Часть 4. Динамическая настройка  — инфраструктура «Файл свойств меньше»;
Часть 5. Автоматизация развертывания.  Скриптовое управление развертыванием;
Часть 6. Автоматизация инфраструктуры.  Предоставление сценариев для среды (Автоматизация инфраструктуры)

Конвейер CD состоит из пяти   заданий Jenkins . Эти задания настроены для запуска одно за другим. В случае сбоя одного из заданий происходит сбой конвейера, и этот кандидат на выпуск не может быть выпущен в производство. Пять заданий Jenkins перечислены ниже (более подробная информация об этих заданиях приведена ниже в статье).

  1. 1) Задание, которое устанавливает переменные, используемые в конвейере ( SetupVariables )
  2. 2) Построить задание ( Build )
  3. 3) Задание обновления производственной базы данных ( StoreLatestProductionData )
  4. 4) Задание создания целевой среды ( CreateTargetEnvironment )
  5. 5) Задание развертывания ( DeployManateeApplication ), которое позволяет развертывание одним щелчком мыши в рабочей среде .

Мы использовали плагины Jenkins для добавления дополнительных функций к базовой конфигурации Jenkins. Вы можете расширить стандартную установку Jenkins с помощью  плагинов Jenkins . Ниже приведен список плагинов, которые мы используем для конфигурации Непрерывной доставки Sea-Shore Alliance.

Grailshttp://updates.jenkins-ci.org/download/plugins/grails/1.5/grails.hpi
Groovyhttp://updates.jenkins-ci.org/download/plugins/groovy/1.12/groovy.hpi
Subversionhttp://updates.jenkins-ci.org/download/plugins/subversion/1.40/subversion.hpi
Параметризованный триггерhttp://updates.jenkins-ci.org/download/plugins/parameterized-trigger/2.15/ parameterized-trigger.hpi
Скопировать артефактhttp://updates.jenkins-ci.org/download/plugins/copyartifact/1.21/copyartifact.hpi
Построить конвейерhttp://updates.jenkins-ci.org/download/plugins/ build-pipe-plugin / 1.2.3 / build-pipeline-plugin.hpi
Anthttp://updates.jenkins-ci.org/download/plugins/ant/1.1/ant.hpi
S3http://updates.jenkins-ci.org/download/plugins/s3/0.2.0/s3.hpi

Параметризованный триггер, сборочный конвейер и   плагины S3 используются для перемещения приложения по конвейерным заданиям. Плагины Ant, Groovy и Grails используются для запуска сборки кода приложения. Subversion для опроса и проверки из контроля версий.

Ниже я опишу каждую из работ, которые составляют конвейер CD, более подробно.

SetupVariables : задание Jenkins, используемое для ввода необходимых значений свойств, которые распространяются по остальной части конвейера.

ПараметрSTACK_NAME
Тип : String
Где : Используется как  в CreateTargetEnvironment  и  DeployManateeApplication  рабочих мест
Цели : Определяет  CloudFormation  имя стеки и  SimpleDB  домны свойства , связанные со стеком CloudFormation.

ПараметрHOST
Тип : String
Где : Используется как  в CreateTargetEnvironment  и  DeployManateeApplication  рабочих мест
Цели : Определяет CNAME домена , созданный в  CreateTargetEnvironment  работе. DeployManateeApplication  задание использует его , когда он динамически создает файлы конфигурации. Например, в test.oneclickdeployment.com, тест будет ХОСТ

ПараметрPRODUCTION_IP
Тип : String
Где : Используется в  StoreProductionData  задания
Цель : Устанавливает производство IP для работы , так что он может SSH в существующую производственную среду и запустить скрипт базы данных, экспорт данных и добавления его в S3.

ПараметрdeployToProduction
Тип : Boolean
Где : Используется как  в CreateTargetEnvironment  и  DeployManateeApplication  рабочих мест
Цель : Определяет , следует ли использовать для разработки или производства SSH ключей.

Чтобы параметры распространялись по конвейеру, мы передаем текущие параметры сборки, используя плагин параметризованной сборки.

Сборка : компилирует исходный код Grails приложения Manatee и создает WAR-файл.

Для этого мы используем плагин Jenkins Grails и запускаем цели Grails, такие как  compile и  prod war. Затем мы архивируем миграции Grails для использования в  задании DeployManateeApplication,  а затем задание продвигает WAR ламантина до S3, который используется в качестве хранилища артефактов.

Наконец, используя плагин для параметризованной сборки триггера, мы  запускаем  задание StoreProductionData с текущими параметрами сборки.

StoreProductionData : это задание выполняет pg-дамп (дамп PostgreSQL) производственной базы данных, а затем сохраняет его в S3 для задания создания среды, которое будет использоваться при создании среды. Ниже приведен фрагмент этой работы.

ssh -i /usr/share/tomcat6/development.pem -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no ec2-user@${PRODUCTION_IP} ruby /home/ec2-user/database_update.rb

В целевых средах, созданных с использованием конвейера CD, хранится сценарий базы данных. Сценарий попадает в базу данных PostgreSQL и запускает pg_dump. Затем он отправляет файл SQL pg_dump на S3, который будет использоваться при создании целевой среды.

После успешного сохранения файла SQL  запускается  задание CreateTargetEnvironment .

CreateTargetEnvironment : Создает новую целевую среду, используя шаблон CloudFormation для создания всех  ресурсов AWS и вызывает puppet для предоставления самой среды из базовой операционной системы в полностью рабочую целевую среду, готовую к развертыванию. Ниже приведен фрагмент этой работы.

if [ $deployToProduction ]
then
SSH_KEY=development
else
SSH_KEY=production
fi
# Create Cloudformaton Stack
ruby ${WORKSPACE}/config/aws/create_stack.rb ${STACK_NAME} ${WORKSPACE}/infrastructure/manatees/production.template ${HOST} ${JENKINSIP} ${SSH_KEY} ${SGID} ${SNS_TOPIC}
# Load SimpleDB Domain with Key/Value Pairs
ruby ${WORKSPACE}/config/aws/load_domain.rb ${STACK_NAME}
# Pull and store variables from SimpleDB
host=`ruby ${WORKSPACE}/config/aws/showback_domain.rb ${STACK_NAME} InstanceIPAddress`
# Run Acceptance Tests
cucumber ${WORKSPACE}/infrastructure/manatees/features/production.feature host=${host} user=ec2-user key=/usr/share/tomcat6/.ssh/id_rsa
# Publish notifications to SNS
sns-publish --topic-arn $SNS_TOPIC --subject "New Environment Ready" --message "Your new environment is ready. IP Address: $host. An example command to ssh into the box would be: ssh -i development.pem ec2-user@$host This instance was created by $JENKINS_DOMAIN" --aws-credential-file /usr/share/tomcat6/aws_access

После создания среды  запускается набор  тестов Cucumber, чтобы убедиться, что он находится в правильном рабочем состоянии. Если какой-либо тест не пройден, весь конвейер не пройден, и разработчик получит уведомление, что что-то пошло не так В противном случае, если оно проходит,  задание DeployManateeApplication запускается, и  уведомление по электронной почте AWS  SNS с информацией для доступа к новому экземпляру отправляется разработчику.

DeployManateeApplication : запускает   скрипт Capistrano, который использует шаги для координации развертывания. Фрагмент этой работы показан ниже.

if [ !$deployToProduction ]
then
SSH_KEY=/usr/share/tomcat6/development.pem
else
SSH_KEY=/usr/share/tomcat6/production.pem
fi
#/usr/share/tomcat6/.ssh/id_rsa
cap deploy:setup stack=${STACK_NAME} key=${SSH_KEY}
sed -i "s@manatee0@${HOST}@" ${WORKSPACE}/deployment/features/deployment.feature
host=`ruby ${WORKSPACE}/config/aws/showback_domain.rb ${STACK_NAME} InstanceIPAddress`
cucumber deployment/features/deployment.feature host=${host} user=ec2-user key=${SSH_KEY} artifact=
sns-publish --topic-arn $SNS_TOPIC --subject "Manatee Application Deployed" --message "Your Manatee Application has been deployed successfully. You can view it by going to http://$host/wildtracks This instance was deployed to by $JENKINS_DOMAIN" --aws-credential-file /usr/share/tomcat6/aws_access

Это задание развертывания является последним этапом конвейера доставки, оно объединяет все части, созданные в предыдущих заданиях, для успешной доставки работающего программного обеспечения.

Во время развертывания SSH-сценарий Capistrano на целевом сервере развертывает новую войну и обновленные изменения конфигурации и перезапускает все службы. Затем запускаются тесты Cucumber, чтобы убедиться, что приложение доступно и успешно запущено. Если тесты пройдены, разработчик отправит электронное письмо AWS SNS с информацией о том, как получить доступ к их новому приложению для разработки.

Мы используем Дженкинс в качестве оркестратора конвейера. Jenkins выполняет набор сценариев и передает параметры при выполнении каждого задания. В связи с той ролью, которую играет Дженкинс, мы хотим убедиться, что с ним обращаются так же, как с приложением, то есть с контролем версий и тестированием всех наших изменений в системе. Например, если разработчик изменяет конфигурацию задания создания среды, мы хотим иметь возможность вернуться назад, если это необходимо. Из-за этого требования мы делаем версию конфигурации Jenkins. Задания, плагины и основные настройки. Для этого каждый час выполняется скрипт,  cron.hourly который проверяет наличие новых заданий или обновленной конфигурации и передает их на контроль версий.

Конвейер CD, который мы создали для приложения Manatee, позволяет любым изменениям в приложении, инфраструктуре, базе данных или конфигурации беспрепятственно переходить к производству с использованием автоматизации. Это позволяет полностью протестировать любые новые функции, исправления безопасности и т. Д. При их доставке в производство одним нажатием кнопки.

В следующей части нашей серии, посвященной использованию  CloudFormation,  мы рассмотрим шаблон CloudFormation, используемый для автоматизации создания среды Jenkins. В следующей статье вы увидите, как CloudFormation приобретает ресурсы AWS и обеспечивает нашу среду Jenkins CD Pipeline.