Как развернуть GitLab-Ci в EC2 с помощью AWS CodeDeploy/CodePipeline/S3



Я работал над проектом SlackBot, основанным в Scala с использованием Gradle, и изучал способы использования Gitlab-CI для развертывания в AWS EC2.



Я могу полностью построить и протестировать свое приложение с помощью Gitlab-CI.



Как я могу выполнить развертывание из Gitlab-CI в Amazon EC2 с помощью CodeDeploy и CodePipeline?



Ответ следовать в качестве руководства, чтобы сделать это.

765   1  

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 как конвейер для развертывания

Приведенный пример .gitlab-ci.yml основан на проекте Java/Scala + Gradle. Скрипт предоставляется как универсальный пример и должны быть адаптированы к вашим конкретным потребностям при реализации непрерывной доставки с помощью этого метода.

В руководстве предполагается, что пользователь обладает базовыми знаниями о сервисах AWS и о том, как выполнять необходимые задачи.

Примечание : руководство, приведенное в этом примере, использует консоль 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

  1. создать пользователя
  2. Приложите следующее: разрешения:

    • 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: " ], "Ресурс": "" } ] }
  3. Создание учетных данных безопасности

Примечание : перечисленные выше меры политики имеют очень широкий охват. Вы можете приспособиться к вашим требованиям, создав собственные политики, ограничивающие доступ только к определенным ресурсам.

Примечание : пожалуйста, храните эти учетные данные в безопасном месте. Они понадобятся вам на более позднем этапе.

AWS EC2 instance & Role

Роль экземпляра для CodeDeploy

Https://console.aws.amazon.com/iam/home?region=us-east-1#roles

Создайте новую роль, которая будет назначена вашему экземпляру EC2 для доступа к S3,

  1. задайте имя в соответствии с вашими соглашениями об именовании (т. е. MyDeploymentAppRole)
  2. выберите Amazon EC2, чтобы разрешить инстансам EC2 запускать другие сервисы AWS
  3. атташе следующее политика:
    • 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, в которой будут храниться файлы развертывания.

Просто выполните следующие действия:

  1. выберите Create Bucket
    • выберите имя корзины (т. е. my-app-codepipeline-deployment)
    • выберите регион
  2. в консоли для вашего ведра Выберите Properties
    • раскройте меню Versioning
    • выберите Enable Versioning

AWS CodeDeploy

Https://console.aws.amazon.com/codedeploy/home?region=us-east-1#/applications

Теперь, когда основные элементы будут установлены, мы готовы создавать приложения для развертывания в codedeploy не зависит от

Для создания приложения развертывания CodeDeploy выполните следующие действия действия:

  1. выберите Create New Application
  2. выберите имя приложения (т. е. MyApp-Production)
  3. выберите имя группы развертывания (т. е. MyApp-Production-Fleet)
  4. выберите экземпляры EC2, которые будут затронуты этим развертыванием - Search by Tags
    • В Разделе Key Выберите Name
    • В Разделе Value Выберите MyApp-Production-Instance
  5. В Разделе Service Role Выберите MyDeploymentAppRole
  6. нажмите на Create Application

Примечание : вы можете назначить развертывание любому соответствующему тегу, который применяется к нужным экземплярам, предназначенным для развертывания. Для простоты, только тег имени был использован для выбора экземпляра, определенного ранее.

AWS CodePipeline

Https://console.aws.amazon.com/codepipeline/home?region=us-east-1#/dashboard

Следующим шагом является создание CodePipeline, который отвечает за выполнение соединения между корзиной S3 и процессом CodeDeploy.

Чтобы создать CodePipeline, выполните следующие действия:

  1. нажмите на Create Pipeline
  2. Назовите свой конвейер (т. е. MyAppDeploymentPipeline )
    • далее
  3. установите Source Provider в Amazon S3
    • задайте Amazon S3 location адрес вашего файла развертывания корзины и цели (т. е. s3://my-app-codepipeline-deployment/myapp.zip)
    • далее
  4. Set Build Provider to None - это уже обрабатывается Gitlab-CI, как будет описано ниже
    • далее
  5. установить Deployment Provider в AWS CodeDeploy
    • набор Application Name к имени вашего приложения CodeDeploy (т. е. MyApp-Production)
    • задайте Deployment Group имя вашей группы развертывания CodeDeploy (т. е. MyApp-Production-Fleet)
    • далее
  6. создание или выбор роли службы конвейера
    • далее
  7. просмотрите и нажмите Create Pipeline

Настройка среды на Gitlab

Теперь, когда среда AWS подготовлена к развертыванию приложения, мы можем приступить к настройке CI среда и параметры для обеспечения сборки и развертывания кода на экземпляре EC2 с помощью S3, CodeDeploy и CodePipeline.

Переменные Gitlab

Для того, чтобы развертывание работало, нам нужно будет установить несколько переменных окружения в репозитории проекта.

В вашем проекте Gitlab перейдите в область Variables для вашего проекта и задайте следующие переменные:

  • AWS_DEFAULT_REGION => ваш регион AWS
  • AWS_SECRET_ACCESS_KEY => ваш пользователь AWS секретный ключ учетных данных (полученный при создании учетных данных для пользователя)
  • AWS_ACCESS_KEY_ID = > Ваш идентификатор ключа учетных данных пользователя AWS (полученный при создании учетных данных для пользователя)
  • AWS_S3_LOCATION = > расположение zip-файла развертывания (т. е. s3://my-app-codepipeline-deployment/my_app.zip)
Эти переменные будут доступны с помощью скриптов, выполняемых контейнерами Gitlab-CI.

Сценарий запуска

Был предоставлен простой сценарий запуска (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

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

Соответствующая часть, связанная с развертыванием, такова:

# 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
Первый шаг включает установку системы управления пакетами python: pip. 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-файл должен содержать:

  • почтовый корень
    • appspec.yml = > инструкции по развертыванию CodeDeploy
    • сценарии этапа развертывания
    • предоставленные образцы будут помещены в каталог scripts в zip-файл, потребует наличия скрипта my_app.sh, который будет добавлен в корневой каталог вашего приложения (т. е. my_app каталог в zip)
    • код дистрибутива-в нашем примере он будет находиться в каталоге my_app
Такие инструменты, как Gradle и Maven, способны генерировать дистрибутивные zip-файлы с определенными изменениями в процессе генерации zip. Если вы не используете такой инструмент, возможно, Вам придется дать команду Gitlab-CI сгенерировать этот zip-файл в формате другой способ; Этот метод выходит за рамки данного руководства.

Развертывание приложения в 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
    • конец-сигнализирует кодовой линии, что развертывание завершено успешно

Скриншоты успешного развертывания:

Гитлаб Развернуть Работу

Развертывание CodePipeline

Codedeploy не зависит от крючка журнал сценарий

Ссылки

Comments

    Ничего не найдено.