Ответ 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
- Создать пользователя
-
Прикрепите следующие разрешения:
- 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": "*" } ] }
-
Генерация учетных данных безопасности
Примечание. Политики, перечисленные выше, очень широки. Вы можете подстраиваться под ваши требования, создавая собственные политики, ограничивающие доступ только к определенным ресурсам.
Примечание. Храните эти учетные данные в надежном месте. Они понадобятся вам позже.
Экземпляр AWS EC2 и роль
Роль экземпляра для CodeDeploy
https://console.aws.amazon.com/iam/home#roles
Создайте новую роль, которая будет назначена вашему экземпляру EC2 для доступа к S3,
- Установите имя в соответствии с вашими соглашениями об именах (т.е.
MyDeploymentAppRole
) - Выберите
Amazon EC2
, чтобы экземпляры EC2 могли запускать другие сервисы AWS. - Прикрепите следующие правила:
- 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, которая будет содержать ваши файлы развертывания.
Просто следуйте этим шагам:
- Выберите
Create Bucket
- Выберите имя сегмента (т.е.
my-app-codepipeline-deployment
) - Выберите регион
- Выберите имя сегмента (т.е.
- В консоли для вашего ведра выберите
Properties
- Разверните меню
Versioning
- выберите
Enable Versioning
- Разверните меню
AWS CodeDeploy
https://console.aws.amazon.com/codedeploy/home#/applications
Теперь, когда основные элементы заданы, мы готовы создать приложение Deployment в 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#/dashboard
Следующим шагом является создание CodePipeline, который отвечает за выполнение соединения между корзиной S3 и процессом CodeDeploy.
Чтобы создать CodePipeline, выполните следующие действия:
- Нажмите на
Create Pipeline
- Назовите ваш конвейер (т.е.
MyAppDeploymentPipeline
)- следующий
- Установите
Source Provider
наAmazon S3
- установите расположение
Amazon S3 location
по адресу вашего сегмента и целевого файла развертывания (т.е.s3://my-app-codepipeline-deployment/myapp.zip
) - следующий
- установите расположение
- Установите для
Build Provider
значениеNone
- это уже обрабатывается 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
вашего проекта и установите следующие переменные:
-
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-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