В последних двух постах мы построили приложение Rails в Docker и развернули его в Amazon ECS. В этом посте мы используем AWS CodePipeline для автоматизации создания изображений Docker и развертывания нашего приложения в нашу сервису ECS.
- Строительными Rails + Sidekiq Web Apps в Docker
- Развернуть рельсы в Amazon ECS
- Концепции
- Нажмите изображение в ECR
- Создать базу данных RDS, определение задачи и балансировщик нагрузки
- Создайте кластер ECS и соедините все вместе
- Настройка Sidekiq
- Автоматизировать развертывания с помощью AWS Codepipeline — мы здесь
- Глубокое погружение на кодовую корзину AWS
- Усовершенствованные концепции ECS:
- Обнаружение обслуживания и масштабирование автоматического
- Фаргейт — скоро
Если вы хотите следовать без необходимости создавать приложение Rails из первого поста, вы можете клонировать последнюю версию репозитория в моя страница GitHub Анкет
Зачем вообще беспокоиться о трубопроводах CI/CD? 🤷🏻
По мере того, как проект становится все больше, в процессе развертывания все больше и больше времени съедается. Представьте себе, что ваши разработчики должны были до 5-10 экземпляров EC2, управляя вашим приложением для запуска Git Pull Origin Развитие
и перезапустить приложение. Этот процесс может занять 5-20 минут вашего разработчика. Если он/она совершает ошибки, разработчику придется повторить процесс снова и снова.
Наличие конвейера CI/CD позволяет вам иметь надежный и последовательный процесс развертывания. Вашим разработчикам больше не нужно беспокоиться о ошибках в развертывании, потому что им больше не нужно делать это вручную. Они просто стремятся освоить и уйти. 🟢
CI — непрерывная интеграция
CI — это философия кодирования, которая поощряет команды часто объединять небольшие изменения. Каждый раз, когда эти изменения объединяются, автоматизированная сборка и набор тестов, выполняемых, чтобы доказать, что это изменение совместимо с существующим кодом.
CD — непрерывная доставка
CD — это расширение к CI, которое позволяет быстро развернуть новые изменения. Каждый раз, когда вы слияете, чтобы освоить, CI работает. Затем приложение развертывается в стационарной среде для тестирования. Процесс ручного утверждения стоит на пути того, что эти изменения будут развернуты прямо к производству.
CD также непрерывное развертывание 🚚
Как только ваша команда достигнет уровня уверенности в вашем тестовом наборе, вы можете внести изменения прямо на производство.
Что мы будем делать в этом посте
Для этого поста мы создадим 3-этажный трубопровод:
- Источник: наш код будет храниться в GitHub. Когда разработчики стремятся к освоению, остальная часть конвейера CI/CD запускается.
- Build: На этом этапе мы просто строим наше изображение Docker и нажимаем это изображение в ECR.
- Развертывание: мы будем развертываться в сервисе «веб -» ECS. Чтобы все было просто, мы не будем пытаться развернуть в сервисе ECS «Sidekiq», который мы сделали в Предыдущий пост Анкет
Чтобы создать конвейер CI/CD, мы должны создать buildspec.yml
Файл в корневом каталоге нашего проекта. Этот файл служит набором инструкций для Codebuild, для которых команды использовать для процесса сборки. Мы можем подвести итог, что делает наш buildspec.yml в простых шагах ниже:
- Аутентификация с AWS ECR
- Создайте общие папки
- Создайте и отметьте изображение Docker
- Нажмите изображение Docker в ECR
- Создайте артефакт с именем «Imagedefinitions.json», который указывает название контейнера для обновления в службе ECS. Если вы следили за этой серией блога, его следует назвать «Интернет». Если вы хотите найти название контейнера в собственном сервисе ECS, изображение ниже должно выглядеть знакомо:
Если вы хотите узнать больше о Codebuild, вы можете посетить мой предыдущий пост о том, как работает Codebuild.
version: 0.2 phases: install: runtime-versions: docker: 18 commands: - nohup /usr/local/bin/dockerd --host=unix:///var/run/docker.sock --host=tcp://127.0.0.1:2375 --storage-driver=overlay2& - timeout 15 sh -c "until docker info; do echo .; sleep 1; done" pre_build: commands: - echo Logging in to Amazon ECR.... - aws --version - $(aws ecr get-login --no-include-email --region $CI_REGION) - COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7) - echo "The commit hash is $COMMIT_HASH" - IMAGE_TAG=${COMMIT_HASH:=latest} - echo "Creating folders for pid files" - mkdir shared - mkdir shared/pids - mkdir shared/sockets build: commands: - echo Build started on `date` - echo Building the Docker image... - docker build -t $REPO_URL:latest . - docker tag $REPO_URL:latest $REPO_URL:$IMAGE_TAG post_build: commands: - echo Build completed on `date` - echo Pushing the Docker images... - docker push $REPO_URL:latest - docker push $REPO_URL:$IMAGE_TAG - echo Writing image definitions file... - printf '[{"name":"web","imageUri":"%s"}]' $REPO_URL:$IMAGE_TAG > imagedefinitions.json artifacts: files: imagedefinitions.json
В серии постов в блоге мы создали два сервиса ECS: один для Интернета, а другой для Sidekiq. В этом посте мы создаем конвейер CI/CD только для веб -службы. В следующем посте я изменю этот конвейер CI/CD, чтобы также обновить службу Sidekiq
(3.1) В меню услуг поиск кодипелины. Мы должны создать трубопровод в том же регионе как кластер ECS.
(3.2) Затем нажмите «Создать трубопровод».
(3.3) Назовите трубопровод «Ruby-Docker-App-Pipeline». Здесь Codepipeline по умолчанию создает новую роль в обслуживании.
(3.4) Для исходного этапа выберите исходного поставщика, где хранится ваш код. Для меня (и для вас, если вы следили за сериалом), я выбрал GitHub. Затем нажмите «Подключитесь к GitHub».
Я думаю, что CodeCommit предлагает лучшую интеграцию с CodePipeline и другими услугами AWS. Но это не совсем догнало GitHub/Bitbucket с точки зрения простоты использования.
(3.5) Затем появляется всплывающий экран с просьбой разрешить доступ к вашей учетной записи GitHub.
(3.6) Затем укажите ветвь. Шаг к этой ветви запускает Codepipeline (через Github Webhooks), чтобы запустить процесс CI/CD. Обычно мы делегируем основную филиал для процесса CI/CD, потому что мы хотим развернуть код в главной филиале в нашу производственную среду. Но бывают и моменты, когда мы создаем конвейеры CI/CD для других ветвей.
Затем нажмите Далее.
(3.7) На стадии сборки мы используем кодовую строительство для создания и разжигания нашего изображения Docker. Для этого мы создаем новый проект сборки, нажав «Создать проект».
(3.8) Назовите проект как «Ruby-Docker-App-Demo» и добавьте любое описание, которое вам нравится.
Для окружающей среды выберите Ubuntu в качестве ОС и последнего AWS/CODEBUILD/Стандарт: 4.0
изображение. Обязательно включите привилегированный флаг, чтобы мы могли создавать изображения Docker.
Мы не очень внимательно относимся к нашей среде, потому что у нас нет кода на основе рубины для запуска. Но в реальных трубопроводах CI/CD они обычно проводят модульные тесты на стадии сборки. При этом вам придется выбрать среду, которая содержит версию языка программирования, на котором вы хотите запустить тесты. Вы можете найти это Здесь Анкет
Мы также создаем новую роль сервисного обслуживания, которую Codebuild использует при запуске нашего процесса сборки.
Затем нажмите: «Далее».
Затем мы перенаправлены обратно на страницу Codepipeline. Здесь вы видите, что был добавлен проект Codebuild. После этого нажмите Далее.
(3.9) Теперь мы находимся на стадии развертывания. Мы указываем название кластера и название службы службы ECS, на которую мы хотим развернуть.
(3.10) Затем просмотрите конфигурации. Как только вы будете удовлетворены, нажмите «Создать».
(3.10) После того, как конвейер был создан, он автоматически пытается запустить ваш процесс CI/CD. Он показывает вам прогресс в визуальном представлении вашего трубопровода.
(3.11) Через несколько минут этап сборки не удается, потому что мы не добавили переменные среды, и мы не обновили нашу роль сервиса кодовой машины.
Чтобы решить это, перейдите в свой проект CodeBuild и нажмите на роль обслуживания в разделе «Сведения».
Затем мы прикрепляем Amazonec2containerRegistryfullaccess
политика в этой роли. Эта политика позволяет Codebuild выдвигать изображения в ECR, чтобы мы могли использовать его на этапе развертывания позже.
(3.12) Еще одна вещь, которую мы должны сделать, это добавить переменные среды. Присмотревшись к нашему buildspec.yml в разделе 2, процесс сборки нуждается в двух переменных: $ Repo_url
и $ Ci_region.
Для этого перейдите в Codebuild и найдите проект сборки, который мы создали на шаге 3.8. Если вы следовали именованию, его следует назвать «Ruby-Docker-App-Demo». Затем под выпаданием «Редактировать» в верхнем правом правом нажмите «Среда».
На следующей странице разверните раскрытие «дополнительная конфигурация». Там найдите раздел переменных среды. Добавьте две переменные среды Repo_url
и Ci_region.
Ci_region
— Для этой переменной просто поместите регион AWS, в котором вы находитесь в настоящее времяRepo_url
— Добавьте простой URL вашего репозитория ECR. Формат URL выглядит как пример ниже. Если бы вы следовали этой серии блога, вы бы создали репозиторий ECR в Раздел 3 этого поста Анкет<< account-number >>. Dkr.ecr.us-west-2.amazonaws.com/sample-docker-rails-app
(3.13) С помощью переменной среды и роли кодовой строительства мы можем правильно запустить трубопровод. Перейдите в Codepipeline и найдите только что только что созданный, который мы создали. На стадии сборки ударить «Retry».
Через несколько минут вы должны увидеть полностью развернутый трубопровод.
Чтобы по -настоящему продемонстрировать, что наш трубопровод CI/CD работает, мы создаем и продвигаем изменения в нашей главной ветви. Затем мы должны увидеть это на нашем сайте через несколько минут.
(4.1) Чтобы продемонстрировать, что что -то изменилось, мы показываем сайт, прежде чем добавить изменения. Получите URL своего ALB и вставьте его в свой браузер. Если вы не уверены, где найти URL, Шаг 12.1 этого поста демонстрирует, как это искать.
Вы должны увидеть этот сайт:
(4.2) Вернемся к коду приложения. В app/views/home/index.html.erb
Файл, давайте добавим новую линию внизу.
Home Page: <%= @message %> <% @posts.each do |post| %><%= post.title %>
<%= post.author.name %>
<%= post.body %>
<%= link_to "Like", increment_async_path(post_id: post.id), method: :post %> Likes: <%= post.likes_count %>
<% end %>Updated via CodeBuild!
Update just now via CodePipeline!!
А потом давайте покончим и нажмите на этот код:
git add -p git commit -m "Added line for CodePipeline deployment." git push origin master
(4.3) После нажатия вашего обновления вы должны увидеть, что наш трубопровод CI/CD снова занят на работе:
(4.4) Через несколько минут вы должны увидеть наше обновление кода в прямом эфире на нашем сайте.
Вы построили свое собственное приложение Rails в Docker и создали для него полный конвейер CI/CD! Теперь вы готовы в полной мере воспользоваться CI/CD для вашей команды.
Добавление до этой сцены — немалый подвиг. Если вам нужна помощь в реализации пошагового руководства, просто дайте мне знать. Не стесняйтесь оставить комментарий ниже или написать мне! Я хотел бы услышать от вас!
Особая благодарность моему редактору Аллену за то, что сделал мои сообщения более последовательными Анкет
Оригинал: «https://dev.to/raphael_jambalos/automate-deployments-with-aws-codepipeline-52f5»