Как развернуть GitLab-Ci в EC2 с помощью AWS CodeDeploy/CodePipeline/S3
Я работал над проектом SlackBot, основанным в Scala с использованием Gradle, и изучал способы использования Gitlab-CI для развертывания в AWS EC2.
Я могу полностью построить и протестировать свое приложение с помощью Gitlab-CI.
Как я могу выполнить развертывание из Gitlab-CI в Amazon EC2 с помощью CodeDeploy и CodePipeline?
Ответ следовать в качестве руководства, чтобы сделать это.
1 ответ:
Я создал набор примеров файлов, чтобы идти с руководством, представленным ниже. Эти файлы доступны по следующей ссылке: https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/
Область применения
Данное руководство предполагает следующее
- GitLab EE hosted project-может работать на частных экземплярах CE/EE (не протестирован)
- GitLab как хранилище версий GIT
- Gitlab-CI как непрерывная интеграция Двигатель
- существующий аккаунт AWS
- AWS EC2 как целевая производственная или промежуточная система для развертывания
- экземпляр AWS EC2 под управлением Amazon Linux AMI
- AWS S3 как хранилище файлов развертывания
- AWS CodeDeploy как механизм развертывания для проекта
- AWS CodePipeline как конвейер для развертывания
Приведенный пример
В руководстве предполагается, что пользователь обладает базовыми знаниями о сервисах AWS и о том, как выполнять необходимые задачи..gitlab-ci.ymlоснован на проекте Java/Scala + Gradle. Скрипт предоставляется как универсальный пример и должны быть адаптированы к вашим конкретным потребностям при реализации непрерывной доставки с помощью этого метода.Примечание : руководство, приведенное в этом примере, использует консоль AWS для выполнения задач. Хотя существуют, вероятно, эквиваленты CLI для выполняемых здесь задач, они не будут охватываться во всем руководстве.
Мотивация
Мотивация для создания этих сценариев и руководства по развертыванию возникла из - за отсутствия надлежащего руководства, показывающего, как реализовать непрерывную доставку с помощью Gitlab и AWS EC2. Gitlab представила свой свободно доступный CI-движок, сотрудничая с Digital Ocean, что позволяет репозиториям пользователей бесплатно пользоваться CI хорошего качества. Одним из главных преимуществ использования Gitlab является то, что они обеспечивают встроенную непрерывную интеграцию. контейнеры для выполнения различных шагов и проверки сборки. К сожалению, ни GITBLAB, ни AWS не обеспечивают интеграцию, которая позволила бы выполнять непрерывную доставку после прохождения сборок.Это руководство и сценарии (https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/) предоставьте упрощенную версию шагов, которые я предпринял для того, чтобы иметь успешный CI и CD, используя как Gitlab, так и AWS EC2, которые могут помочь любому другому начать работу с этим тип реализации.
Настройка среды на AWS
Первым шагом в обеспечении успешного процесса непрерывной доставки является настройка необходимых объектов на AWS, чтобы процесс развертывания был успешным.
Пользователь AWS IAM
Первоначальным требованием будет настройка пользователя IAM:
Https://console.aws.amazon.com/iam/home?#users
- создать пользователя
Приложите следующее: разрешения:
- CodePipelineFullAccess
- AmazonEC2FullAccess
- AmazonS3FullAccess
- AWSCodeDeployFullAccess
- Встроенная Политика: { "Версия": "2012-10-17", "Заявление": [ { "Эффект": "Разрешить", "Действие": [ "автоматическое масштабирование: ", "codedeploy: ", "ec2: ", "эластичная балансировка: ", "iam: AddRoleToInstanceProfile", "iam: CreateInstanceProfile", "iam: CreateRole", "iam: DeleteInstanceProfile", "iam: DeleteRole", "iam: DeleteRolePolicy", "iam: GetInstanceProfile", "iam: GetRole", "iam: GetRolePolicy", "iam: ListInstanceProfilesForRole", "iam: ListRolePolicies", "iam: ListRoles", "iam: PassRole", "ям: Путролеполитика", "iam: RemoveRoleFromInstanceProfile", "s3: " ], "Ресурс": "" } ] }
Создание учетных данных безопасности
Примечание : перечисленные выше меры политики имеют очень широкий охват. Вы можете приспособиться к вашим требованиям, создав собственные политики, ограничивающие доступ только к определенным ресурсам.
Примечание : пожалуйста, храните эти учетные данные в безопасном месте. Они понадобятся вам на более позднем этапе.
AWS EC2 instance & Role
Роль экземпляра для CodeDeploy
Https://console.aws.amazon.com/iam/home?region=us-east-1#roles
Создайте новую роль, которая будет назначена вашему экземпляру EC2 для доступа к S3,
- задайте имя в соответствии с вашими соглашениями об именовании (т. е.
MyDeploymentAppRole)- выберите
Amazon EC2, чтобы разрешить инстансам EC2 запускать другие сервисы AWS- атташе следующее политика:
- AmazonEC2FullAccess
- AmazonS3FullAccess
- AmazonCodeDeployRole
Примечание : перечисленные выше меры политики имеют очень широкий охват. Вы можете приспособиться к вашим требованиям, создав собственные политики, ограничивающие доступ только к определенным ресурсам.
Экземпляр Запуска
Https://console.aws.amazon.com/ec2/v2/home?region=us-east-1#
Нажмите на
Launch Instanceи следуйте этим инструкциям. действия:
- выберите
Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type- выберите требуемый тип экземпляра (t2.микро по умолчанию)
- далее
- выберите
IAM Role, чтобы бытьMyDeploymentAppRole(на основе имени, созданного в предыдущем разделе)
- далее
- Выберите Подходящее Хранилище
- далее
- помечайте экземпляр соответствующим именем (т. е.
MyApp-Production-Instance)
- добавить дополнительные теги в виде требуется
- далее
- при необходимости настройте группу безопасности
- далее
- просмотрите и Запустите свой экземпляр
Вам будет предоставлена возможность либо генерировать, либо использовать SSH-ключи. Пожалуйста, выберите соответствующий применимый метод.
Настройка среды экземпляра
Установить Агент CodeDeploy
Войдите в только что созданный экземпляр EC2 и следуйте инструкциям на экране. инструкции:
CodeDeploy важные пути:
- каталог базы развертывания CodeDeploy:
/opt/codedeploy-agent/deployment-root/- файл журнала CodeDeploy:
/var/log/aws/codedeploy-agent/codedeploy-agent.logСовет : запустите
tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log, чтобы отслеживать развертывание в режиме реального времени.Установите необходимые компоненты проекта Если ваш проект имеет какие-либо предварительные условия для запуска, сделайте убедитесь, что вы установили их перед запуском развертывания, иначе сценарий запуска может завершиться ошибкой.
Репозиторий AWS S3
Https://console.aws.amazon.com/s3/home?region=us-east-1
На этом шаге вам нужно будет создать корзину S3, в которой будут храниться файлы развертывания.
Просто выполните следующие действия:
- выберите
Create Bucket
- выберите имя корзины (т. е.
my-app-codepipeline-deployment)- выберите регион
- в консоли для вашего ведра Выберите
Properties
- раскройте меню
Versioning- выберите
Enable VersioningAWS CodeDeploy
Https://console.aws.amazon.com/codedeploy/home?region=us-east-1#/applications
Теперь, когда основные элементы будут установлены, мы готовы создавать приложения для развертывания в codedeploy не зависит от
Для создания приложения развертывания CodeDeploy выполните следующие действия действия:
- выберите
Create New Application- выберите имя приложения (т. е.
MyApp-Production)- выберите имя группы развертывания (т. е.
MyApp-Production-Fleet)- выберите экземпляры EC2, которые будут затронуты этим развертыванием -
Search by Tags
- В Разделе
KeyВыберитеName- В Разделе
ValueВыберитеMyApp-Production-Instance- В Разделе
Service RoleВыберитеMyDeploymentAppRole- нажмите на
Create ApplicationПримечание : вы можете назначить развертывание любому соответствующему тегу, который применяется к нужным экземплярам, предназначенным для развертывания. Для простоты, только тег имени был использован для выбора экземпляра, определенного ранее.
AWS CodePipeline
Https://console.aws.amazon.com/codepipeline/home?region=us-east-1#/dashboard
Следующим шагом является создание CodePipeline, который отвечает за выполнение соединения между корзиной S3 и процессом CodeDeploy.Чтобы создать CodePipeline, выполните следующие действия:
- нажмите на
Create Pipeline- Назовите свой конвейер (т. е.
MyAppDeploymentPipeline)
- далее
- установите
Source ProviderвAmazon S3
- задайте
Amazon S3 locationадрес вашего файла развертывания корзины и цели (т. е.s3://my-app-codepipeline-deployment/myapp.zip)- далее
- Set
Build ProvidertoNone- это уже обрабатывается Gitlab-CI, как будет описано ниже
- далее
- установить
Deployment ProviderвAWS CodeDeploy
- набор
Application Nameк имени вашего приложения CodeDeploy (т. е.MyApp-Production)- задайте
Deployment Groupимя вашей группы развертывания CodeDeploy (т. е.MyApp-Production-Fleet)- далее
- создание или выбор роли службы конвейера
- далее
- просмотрите и нажмите
Create PipelineНастройка среды на Gitlab
Теперь, когда среда AWS подготовлена к развертыванию приложения, мы можем приступить к настройке CI среда и параметры для обеспечения сборки и развертывания кода на экземпляре EC2 с помощью S3, CodeDeploy и CodePipeline.
Переменные Gitlab
Для того, чтобы развертывание работало, нам нужно будет установить несколько переменных окружения в репозитории проекта.
В вашем проекте Gitlab перейдите в область
Variablesдля вашего проекта и задайте следующие переменные:Эти переменные будут доступны с помощью скриптов, выполняемых контейнерами Gitlab-CI.
AWS_DEFAULT_REGION=> ваш регион AWSAWS_SECRET_ACCESS_KEY=> ваш пользователь AWS секретный ключ учетных данных (полученный при создании учетных данных для пользователя)AWS_ACCESS_KEY_ID= > Ваш идентификатор ключа учетных данных пользователя AWS (полученный при создании учетных данных для пользователя)AWS_S3_LOCATION= > расположение zip-файла развертывания (т. е.s3://my-app-codepipeline-deployment/my_app.zip)Сценарий запуска
Был предоставлен простой сценарий запуска (https://gitlab.com/autronix/gitlabci-ec2-deployment-samples-guide/blob/master/deploy/extras/my_app.sh) разрешить развертыванию выполнять следующие задачи:
- запустите приложение и создайте PID-файл
- проверьте состояние приложения через PID-файл
- остановить приложение
Вы можете найти этот сценарий под
deploy/extras/my_app.shСоздание gitlab-ci.yml
Файл
gitlab-ci.ymlотвечает за выполнение Задачи непрерывной интеграции, связанные с данным коммитом. Он действует как упрощенная группа сценариев оболочки, которые организованы в этапы, соответствующие различным этапам в ваших шагах непрерывной интеграции.Для получения дополнительной информации о деталях и ссылках, пожалуйста, обратитесь к следующим двум ссылки:
Вы можете проверить синтаксис вашего файла
gitlab-ci.ymlв любое время с помощью следующего инструмента: https://gitlab.com/ci/lintДля целей развертывания мы рассмотрим только последний фрагмент образца, поставляемого с этим руководством:
deploy-job: # Script to run for deploying application to AWS script: - apt-get --quiet install --yes python-pip # AWS CLI requires python-pip, python is installed by default - pip install -U pip # pip update - pip install awscli # AWS CLI installation - $G build -x test -x distTar # # Build the project with Gradle - $G distZip # creates distribution zip for deployment - aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION # Uploads the zipfile to S3 and expects the AWS Code Pipeline/Code Deploy to pick up # requires previous CI stages to succeed in order to execute when: on_success stage: deploy environment: production cache: key: "$CI_BUILD_NAME/$CI_BUILD_REF_NAME" untracked: true paths: - build/ # Applies only to tags matching the regex: ie: v1.0.0-My-App-Release only: - /^v\d+\.\d+\.\d+-.*$/ except: - branches - triggersЭта часть представляет всю работу, связанную с развертывание, следующее за предыдущими этапами, если таковые имеются.
Соответствующая часть, связанная с развертыванием, такова:
Первый шаг включает установку системы управления пакетами python:# Script to run for deploying application to AWS script: - apt-get --quiet install --yes python-pip # AWS CLI requires python-pip, python is installed by default - pip install -U pip # pip update - pip install awscli # AWS CLI installation - $G build -x test -x distTar # # Build the project with Gradle - $G distZip # creates distribution zip for deployment - aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATION # Uploads the zipfile to S3 and expects the AWS Code Pipeline/Code Deploy to pick uppip.pipтребуется установить AWS CLI, который необходим для загрузки файла развертывания в AWS S3В этом примере мы используем Gradle (определяется переменной окружения
$G); Gradle предоставляет модуль для автоматического архивирования файлов развертывания. В зависимости от типа развертываемого проекта этот метод будет отличаться для создания дистрибутивного zip-файлаmy_app.zip.Команда
aws s3 cp $BUNDLE_SRC $AWS_S3_LOCATIONзагружает zip-файл дистрибутива в расположение Amazon S3, которое мы определили ранее. Этот файл затем автоматически обнаруживается CodePipeline, обрабатывается и отправляется в CodeDeploy. Наконец, CodeDeploy выполняет необходимые задачи через агент CodeDeploy, как указано в файлеappspec.yml.Создание appspec.yml
appspec.ymlопределяет поведение, которому будет следовать CodeDeploy после получения файла развертывания.Вместе с этим руководством был предоставлен примерный файл, а также примеры сценариев, которые будут выполняться на различных этапах развертывания.
Пожалуйста, обратитесь к спецификации CodeDeploy AppSpec для получения дополнительной информации о том, как построить файл
appspec.yml: http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.htmlГенерация ZipFile развертывания
Чтобы codedeploy не зависит, чтобы работать должным образом, вы должны создать правильно созданный zip-файл вашего приложения.
Zip-файл должен содержать:
Такие инструменты, как Gradle и Maven, способны генерировать дистрибутивные zip-файлы с определенными изменениями в процессе генерации zip. Если вы не используете такой инструмент, возможно, Вам придется дать команду Gitlab-CI сгенерировать этот zip-файл в формате другой способ; Этот метод выходит за рамки данного руководства.
- почтовый корень
appspec.yml= > инструкции по развертыванию CodeDeploy- сценарии этапа развертывания
- предоставленные образцы будут помещены в каталог
scriptsв zip-файл, потребует наличия скриптаmy_app.sh, который будет добавлен в корневой каталог вашего приложения (т. е.my_appкаталог в zip)- код дистрибутива-в нашем примере он будет находиться в каталоге
my_appРазвертывание приложения в EC2
Заключительным шагом в этом руководстве является фактически успешное развертывание.
Этапы непрерывной интеграции определяются правилами, установленными в
gitlab-ci.yml. Пример, приведенный в этом руководстве, инициирует развертывание для любой ссылки, соответствующей следующему регулярному выражению:/^v\d+\.\d+\.\d+-.*$/.В этом случае, нажав тег
v1.0.0-My-App-Alpha-Releaseчерез git на ваш пульт дистанционного управления Gitlab инициирует процесс развертывания. Вы можете изменить эти правила в соответствии с требованиями вашего проекта.Приведенный пример
gitlab-ci.ymlвыполнит следующие задания при обнаружении тегаv1.0.0-My-App-Alpha-Release:
- build job-компиляция исходных текстов
- тестовое задание-запуск модульных тестов
- развертывания-работа - компиляция источников, генерировать распределения zip, загрузить zip на Амазон С3
Как только почтовый индекс дистрибутива будет загружен в Amazon S3, следующие шаги происходят:
- CodePipeline обнаруживает изменение в ревизии zip-файла S3
- CodePipeline проверяет файл
- CodePipeline посылает сигнал, что пакет для CodeDeploy готов
- CodeDeploy выполняет шаги развертывания
- запуск-инициализация развертывания
- Application Stop-выполняет определенный скрипт для hook
- DownloadBundle-получает файл пакета из репозитория S3 через CodePipeline
- BeforeInstall-выполняет определенный скрипт для hook
- Install-копирует содержимое в расположение развертывания, определенное в разделе
filesразделаappspec.yml- AfterInstall-выполняет определенный скрипт для hook
- ApplicationStart-выполняет определенный скрипт для hook
- ValidateService-выполняет определенный скрипт для hook
- конец-сигнализирует кодовой линии, что развертывание завершено успешно
Скриншоты успешного развертывания:
Ссылки
- GitLab-CI QuickStart: http://docs.gitlab.com/ce/ci/quick_start/README.html
- Gitlab-CI .gitlab-ci.yml: http://docs.gitlab.com/ce/ci/yaml/README.html
- Пошаговое Руководство AWS CodePipeline: http://docs.aws.amazon.com/codepipeline/latest/userguide/getting-started-w.html
- установите или переустановите агент AWS CodeDeploy: http://docs.aws.amazon.com/codedeploy/latest/userguide/how-to-run-agent-install.html
- AWS CLI начало работы-Env: http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html#cli-environment
- Ссылка На AppSpec: http://docs.aws.amazon.com/codedeploy/latest/userguide/app-spec-ref.html



Comments