Одной из самых больших проблем в программировании является плавная интеграция любых изменений, когда над одним проектом одновременно работают несколько человек. Для этих случаев Виктор Рентеа говорит:

Если это больно, делайте это чаще и переносите боль вперед.

Вот где вступают в действие непрерывная интеграция и непрерывное развертывание. Мы знаем, что интегрировать и развертывать небольшие изменения намного легче, чем более крупные и значительные изменения, и сложность возрастает экспоненциально по мере роста этих изменений. Итак, каково решение этой проблемы? Решение состоит в том, чтобы делать это чаще, интегрируя и развертывая небольшие фрагменты кода постоянно и как можно скорее.

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

  • Тест. Это действительно важно, чтобы убедиться, что интегрируемые изменения работают правильно и ничего не ломают.
  • Автоматизация. Как было сказано ранее, наша цель — чаще вносить эти изменения, поэтому лучше всего использовать автоматический процесс, чтобы сэкономить время и уменьшить количество ошибок, связанных с человеческим фактором.

В этой статье мы сосредоточимся на втором пункте и более конкретно объясним, как автоматизировать интеграцию и развертывание нашего кода в ECS(Elastic Container Service) с помощьюJenkins. Прежде чем мы начнем, я бы порекомендовал взглянуть на мою предыдущую статью как развернуть микросервис с помощью Elastic Container Service в AWS, так как мы собираемся развернуть оттуда код в этот кластер.

Обзор

В этом примере мы собираемся создать простой конвейер для развертывания нашего кода. Вы можете увидеть код этого примера на Github (user-api code). Это действительно простой микросервис с двумя конечными точками:

  • Получить /users: вернуть список с именем пользователя
  • Сообщение /users: создайте пользователя, получающего json с именем в теле

Трубопровод:

  • Сборка/тестирование. Первым шагом является сборка и тестирование нашего кода с помощью maven.
  • Создать образ. Второй шаг — создать образ Docker.
  • Отправить в ERC. Образ Docker, созданный на предыдущем шаге, пора отправить его в наш ERC (эластичный контейнер репозитория).
  • Развертывание в ECS. Наконец, мы должны обновить определение нашей задачи новой версией образа и развернуть его.

Настройка Дженкинса

Первым шагом здесь является установка Jenkins и его настройка. Чтобы установить Jenkins, я рекомендую следовать официальному руководству. Помимо этого нам понадобятся следующие инструменты:

  • Ява 11
  • Мавен 3.6.3
  • Докер 20.10.2
  • Интерфейс командной строки AWS 1.18.178

И следующие плагины:

  • Докер конвейер 1.25
  • Издатель HTML 1.25
  • Конвейер 2.6
  • Шаги конвейера AWS 1.43
  • Интеграция конвейера Maven 3.9.3
  • Шаги утилиты конвейера 2.6.1
  • Конвейер: GitHub Groovy Libraries 1.0
  • Плагин очистки рабочей области 0.38

Многоветвевой трубопровод

Теперь, когда мы установили Jenkins и настроили его, мы можем начать. Первым шагом является создание Многофилиального конвейера. Эту опцию можно найти, нажав «Новый элемент» (меню слева). Ниже вы можете увидеть конфигурацию:

ДженкинсФайл

На мой взгляд, лучший способ настроить наш конвейер — использовать jenkinsfile, это текстовый файл, содержащий определение Jenkins Pipeline. Я изложил свои причины ниже:

Почему мы должны использовать jenkinsfile?

  • Пайплайн будет версионным в нашем репозитории (мы можем увидеть изменения и откатить их при необходимости). За кадром нет никакой магии.
  • Мы перекладываем ответственность с DevOS на разработчиков. Никто не знает, как развернуть проект лучше, чем его создатели.
  • Проще и быстрее, у нас может быть начальный шаблон (с использованием стандартов компании), который мы можем скопировать в наш проект, модифицировать с учетом конкретной конфигурации и добавить дополнительные этапы, если это необходимо.

Основная структура нашего jenkinsfile выглядит следующим образом:

Опции

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

  • buildDiscarder: в этом параметре мы указываем, сколько артефактов и журналов мы хотим сохранить. В этом случае мы собираемся сохранить последние 10 сборок.
  • disableConcurrentBuilds: запрещает одновременное выполнение конвейера.
  • время ожидания: задает период ожидания для запуска конвейера, после которого Jenkins должен прервать конвейер. Наш тайм-аут 1 час. Это хорошая практика для предотвращения бесконечных блоков в нашем Jenkins.
  • Временные метки: ко всем выводам консоли, сгенерированным запуском Pipeline, добавляется время, когда была создана строка.

Инструменты

В этом разделе определяются инструменты для автоматической установки и размещения по пути:

Окружающая обстановка

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

Этапы

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

Создать и протестировать

На этом этапе мы создадим наш проект и протестируем его с помощью maven. Мы используем подключаемый модуль maven для публикации последнего успешного артефакта:

Создать образ Docker

На этом этапе мы собираемся создать образ docker с помощью Dockerfile. Вы можете найти этот файлв корневом каталоге проекта:

Dockerfile очень прост, мы используем openjdk:13-alpine для выполнения нашего Java-приложения и устанавливаем curl в строке 5. Мы используют curl в ECS, чтобы проверить, поднят контейнер или нет.

На этом этапе мы используем подключаемый модуль docker для создания образа и помечаем его URL-адресом ERC, который мы ранее сохраняли в файле Jenkins. полномочия. Далее в этой статье мы рассмотрим, как настроить учетные данные в Jenkins.

Отправить изображение в ECR

После создания образа docker пришло время отправить его в наш ERC. В этом разделе мы используем подключаемый модуль AWS для использования учетных данных AWS, необходимых для отправки изображения. В строке 7 у нас есть другая команда sh, причина этого в том, что мы скрываем команду входа в систему, чтобы предотвратить ее печать в нашем файле журнала.

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

На последнем этапе мы обновляем определение нашей задачи в AWS новой версией образа и развертываем этот сервис:

Почта

В этом разделе определяется один или несколько дополнительных шагов, которые выполняются после завершения запуска конвейера.

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

Учетные данные Дженкинса

Учетные данные позволяют нам безопасно сохранять конфиденциальные данные, такие как имена пользователей, пароли и т. д., в Jenkins. В этой статье мы используем учетные данные для сохранения нашего пользователя AWS. Важно! Вам нужно создать пользователя AWS только для Jenkins с минимальными необходимыми разрешениями. В нашем случае пользователь Jenkins имеет права только на передачу изображения в ERC и выполнение развертывания.

Чтобы создать учетные данные, нам сначала нужно перейти в наш конвейер, в левом меню мы увидим параметр учетные данные. В этом меню мы можем выбрать нашу область конвейера и, наконец, у нас будет возможность добавить учетные данные.

После добавления учетных данных они будут доступны из конвейера с использованием ID для идентификации.

Резюме

После завершения этого руководства мы можем запустить наш конвейер и развернуть наш код (код user-api Github):

Теперь мы можем взять этот базовый конвейер и добавить столько шагов, сколько нам нужно, чтобы получить идеальный конвейер для нашего проекта. Например, мы можем добавить еще один этап после этапа развертывания в ECS, который отслеживает и ждет, пока новая версия приложения не запустится успешно или покажет ошибку.