Как развернуть с 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 проект - может работать на частных экземплярах 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 является то, что они предоставляют встроенные контейнеры Continuous Integration для выполнения различных шагов и проверки правильности сборки. К сожалению, ни 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
    • Встроенная политика:

        {
          "Version": "2012-10-17",
          "Statement": [
            {
              "Effect": "Allow",
              "Action": [
                "autoscaling:*",
                "codedeploy:*",
                "ec2:*",
                "elasticloadbalancing:*",
                "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:PutRolePolicy",
                "iam:RemoveRoleFromInstanceProfile",
                "s3:*"
              ],
              "Resource": "*"
            }
          ]
        }
      
  3. Генерация учетных данных безопасности

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

Примечание. Храните эти учетные данные в надежном месте. Они понадобятся вам позже.

Экземпляр AWS EC2 и роль

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

https://console.aws.amazon.com/iam/home#roles

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

  1. Установите имя в соответствии с вашими соглашениями об именах (т.е. MyDeploymentAppRole)
  2. Выберите Amazon EC2, чтобы экземпляры EC2 могли запускать другие сервисы AWS.
  3. Прикрепите следующие правила:
    • AmazonEC2FullAccess
    • AmazonS3FullAccess
    • AmazonCodeDeployRole

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

Запустить экземпляр

https://console.aws.amazon.com/ec2/v2/home

Нажмите на Launch Instance и выполните следующие действия:

  • Выберите Amazon Linux AMI 2016.03.3 (HVM), SSD Volume Type
  • Выберите необходимый тип экземпляра (по умолчанию t2.micro)
    • следующий
  • Выберите 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

На этом этапе вам нужно будет создать корзину S3, которая будет содержать ваши файлы развертывания.

Просто следуйте этим шагам:

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

AWS CodeDeploy

https://console.aws.amazon.com/codedeploy/home#/applications

Теперь, когда основные элементы заданы, мы готовы создать приложение Deployment в 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#/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. Установите для Build Provider значение 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_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

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

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

# 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 файл должен содержать:

  • Zip root
    • appspec.yml => Инструкции по развертыванию CodeDeploy
    • сценарии этапа развертывания
    • при условии, что образцы будут помещены в каталог scripts в zip файле, для этого потребуется my_app.sh сценарий присутствия my_app.sh в корневой каталог вашего приложения (т.е. каталог my_app в zip- my_app)
    • код распределения - в нашем примере он будет находиться в my_app

Такие инструменты, как Gradle и Maven, способны генерировать дистрибутивные ZIP файлы с некоторыми изменениями в процессе генерации ZIP. Если вы не используете такой инструмент, вам, возможно, придется поручить Gitlab-CI сгенерировать этот zip файл другим способом; этот метод выходит за рамки данного руководства.

Развертывание вашего приложения в EC2

Последний шаг в этом руководстве - это успешное развертывание.

Этапы непрерывной интеграции определяются правилами, установленными в gitlab-ci.yml. Пример, предоставленный в этом руководстве, инициирует развертывание для любой ссылки, соответствующей следующему регулярному выражению: /^v\d+\.\d+\.\d+-.*$/.

В этом случае v1.0.0-My-App-Alpha-Release тега v1.0.0-My-App-Alpha-Release через git на удаленный Gitlab может инициировать процесс развертывания. Вы можете изменить эти правила в соответствии с требованиями вашего проекта.

Приведенный gitlab-ci.yml будет выполнять следующие задания при обнаружении тега v1.0.0-My-App-Alpha-Release:

  • построить работу - скомпилировать источники
  • тестовое задание - запустить модульные тесты
  • deploy-job - скомпилируйте исходные коды, сгенерируйте дистрибутив zip, загрузите zip в Amazon S3

После загрузки zip файла дистрибутива в Amazon S3 выполняются следующие шаги:

  • CodePipeline обнаруживает изменение в ревизии почтового файла S3
  • CodePipeline проверяет файл
  • CodePipeline отправляет сигнал, что пакет для CodeDeploy готов
  • CodeDeploy выполняет шаги развертывания
    • Start - инициализация развертывания
    • Application Stop - выполняет определенный скрипт для ловушки
    • DownloadBundle - получает файл комплекта из хранилища S3 через CodePipeline
    • BeforeInstall - выполняет определенный скрипт для ловушки
    • Установить - копирует содержимое в appspec.yml развертывания, как определено в разделе files appspec.yml
    • AfterInstall - выполняет определенный скрипт для ловушки
    • ApplicationStart - выполняет определенный скрипт для ловушки
    • ValidateService - выполняет определенный скрипт для ловушки
    • End - сигнализирует CodePipeline об успешном завершении развертывания

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

Gitlab Deploy Job

CodePipeline Deploy

CodeDeploy hook script log

Рекомендации