В первой части этой серии статей я представил конвейер Continuous Delivery (CD) для приложения Manatee Tracking и то, как мы используем этот конвейер для доставки программного обеспечения от регистрации до производства. В этой статье я подробно расскажу о конвейере CD. Список тем для каждой из статей приведен ниже.
Часть 1: Введение — Введение в непрерывную доставку в облаке и остальные статьи;
Часть 2: конвейер CD — то, что вы сейчас читаете;
Часть 3: CloudFormation — подготовка виртуальных ресурсов по сценарию ;
Часть 4. Динамическая настройка — инфраструктура «Файл свойств меньше»;
Часть 5. Автоматизация развертывания. Скриптовое управление развертыванием;
Часть 6. Автоматизация инфраструктуры. Предоставление сценариев для среды (Автоматизация инфраструктуры)
Конвейер CD состоит из пяти заданий Jenkins . Эти задания настроены для запуска одно за другим. В случае сбоя одного из заданий происходит сбой конвейера, и этот кандидат на выпуск не может быть выпущен в производство. Пять заданий Jenkins перечислены ниже (более подробная информация об этих заданиях приведена ниже в статье).
- 1) Задание, которое устанавливает переменные, используемые в конвейере ( SetupVariables )
- 2) Построить задание ( Build )
- 3) Задание обновления производственной базы данных ( StoreLatestProductionData )
- 4) Задание создания целевой среды ( CreateTargetEnvironment )
- 5) Задание развертывания ( DeployManateeApplication ), которое позволяет развертывание одним щелчком мыши в рабочей среде .
Мы использовали плагины Jenkins для добавления дополнительных функций к базовой конфигурации Jenkins. Вы можете расширить стандартную установку Jenkins с помощью плагинов Jenkins . Ниже приведен список плагинов, которые мы используем для конфигурации Непрерывной доставки Sea-Shore Alliance.
Grails : http://updates.jenkins-ci.org/download/plugins/grails/1.5/grails.hpi
Groovy : http://updates.jenkins-ci.org/download/plugins/groovy/1.12/groovy.hpi
Subversion : http://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
Ant : http://updates.jenkins-ci.org/download/plugins/ant/1.1/ant.hpi
S3 : http://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.