Одной из самых больших проблем в программировании является плавная интеграция любых изменений, когда над одним проектом одновременно работают несколько человек. Для этих случаев Виктор Рентеа говорит:
Если это больно, делайте это чаще и переносите боль вперед.
Вот где вступают в действие непрерывная интеграция и непрерывное развертывание. Мы знаем, что интегрировать и развертывать небольшие изменения намного легче, чем более крупные и значительные изменения, и сложность возрастает экспоненциально по мере роста этих изменений. Итак, каково решение этой проблемы? Решение состоит в том, чтобы делать это чаще, интегрируя и развертывая небольшие фрагменты кода постоянно и как можно скорее.
Но мы знаем, что для достижения этой цели недостаточно просто постоянно объединять и развертывать наш код. В наш проект необходимо внести следующие понятия:
- Тест. Это действительно важно, чтобы убедиться, что интегрируемые изменения работают правильно и ничего не ломают.
- Автоматизация. Как было сказано ранее, наша цель — чаще вносить эти изменения, поэтому лучше всего использовать автоматический процесс, чтобы сэкономить время и уменьшить количество ошибок, связанных с человеческим фактором.
В этой статье мы сосредоточимся на втором пункте и более конкретно объясним, как автоматизировать интеграцию и развертывание нашего кода в 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, который отслеживает и ждет, пока новая версия приложения не запустится успешно или покажет ошибку.