Простой трубопровод Дженкинса с марафоном и мезосом

Простой трубопровод Дженкинса с марафоном и мезосом

1. Вступление

В этой статье мы реализуем простой конвейер непрерывной доставки сJenkins,Marathon иMesos.

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

Результатом этого будет полностью автоматизированный конвейер Jenkins, который развертывает наше приложение в нашем кластере Mesos с помощью Marathon.

2. Обзор стека технологий

При работе с контейнерами и микросервисными архитектурами мы сталкиваемся с новыми операционными проблемами, которые мы не смогли бы решить с более традиционными стеками.

Например, при развертывании в кластере нам приходится иметь дело с масштабированием, отработкой отказа, сетью и многим другим. Эти сложные распределенные вычислительные проблемы можно решить с помощью распределенных ядер и планировщиков, таких как Apache Mesos и Marathon.

2.1. Mesos

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

2.2. Марафон

Marathon - это фреймворк, который используется для развертывания наших приложений в Mesos, решения сложных для нас проблем (проверка работоспособности, автоматическое масштабирование, отработка отказа, мониторинг и т. Д.).

3. Установка и установка

В этой статье предполагается, что у вас уже запущены Jenkins, Mesos и Marathon. Если это не так, обратитесь к официальной документации для каждого из них, чтобы узнать, как их настроить. Без этого вы не сможете выполнить ни один из шагов в руководстве.

4. Наш конвейер доставки

Мы будем создавать следующий конвейер Jenkins:

 

image

В этом подходе нет ничего особенно сложного - он синонимичен потоку большинства современных конвейеров CD. В нашем случае сборка будет означать контейнеризацию приложения, а развертывание - использование Marathon для планирования его работы в кластере Mesos.

5. Тестирование и сборка нашего приложения

Первым шагом является создание и тестирование нашего приложения. Проще говоря, приложение, с которым мы будем работать, является приложением Spring Boot. Из-за этого наш полученный артефакт будет исполняемым файлом. У него не будет никаких внешних зависимостей, кроме JRE, что делает его очень простым в исполнении.

5.1. Создание нашей работы

Первое, что мы хотим сделать, это создать работу Дженкинса. Давайте выберем «Новый элемент» на левой панели навигации, затем выберем создать проект вольного стиля, назвав его «marathon-mesos-demo«:.

image

5.2. Интеграция с Git

Затем давайте настроим его наclone the Github repository, содержащий наше приложение:

image

Для простоты наш репозиторий является общедоступным, что означает, что мы можем клонировать через https.. Если бы это было не так и мы клонировали через SSH, был бы дополнительный шаг для настройки SSH. пользовательский и закрытый ключ, выходящие за рамки данной статьи.

5.3. Настройка триггеров сборки

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

image

5.4. Генерация нашего скрипта сборки

Теперь мы можем сказать нашей работе, чтобы он выполнял скрипт оболочки при его запуске. Поскольку мы работаем с простым проектом Spring Boot Maven, все, что нам нужно сделать, это запустить команду «mvn clean install». Это запустит все тесты и создаст исполняемый файл jar:

image

5.5. Создание нашего проекта

Теперь мы настроили начало нашего конвейера, давайте запустим его вручную, нажав кнопку «Создать сейчас» в задании. Как только работа завершена, мы можем подтвердить, что она прошла, помеченная синим цветом.

6. Контейнеризация нашего приложения

Давайте перейдем к следующему этапу нашего конвейера - упаковке и публикации нашего приложения с помощью Docker. Нам нужно использовать Docker, так как контейнеры - это именно то, чем управляет Marathon. В этом нет ничего неразумного, поскольку в контейнере может работать практически все. Такому инструменту, как Marathon, проще работать с предоставляемой ими абстракцией.

6.1. Создание Dockerfile

Во-первых, давайте создадимDockerfile в корне проекта. По сути, Dockerfile - это файл, содержащий инструкции для Docker Deamon о том, как создать образ:

FROM openjdk:8-jre-alpine
ADD target/mesos-marathon-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8082
ENTRYPOINT ["java","-jar","/app.jar"]

Образ, который мы создаем, прост - все, что в нем содержится, - это исполняемый файл jar и команда оболочки, которая выполнит его при запуске контейнера. Мы также должны убедиться, что выставляем порт, который будет прослушивать наше приложение, в данном случае - 8082.

6.2. Публикация изображения

Теперь, когда мы можем создать наш образ, давайте создадим простой сценарий bash, который собирает и публикует его в нашем частном репозиторииDocker Hub, и помещает его в корень нашего проекта:

#!/usr/bin/env bash
set -e
docker login -u example -p $DOCKER_PASSWORD
docker build -t example/mesos-marathon-demo:$BUILD_NUMBER .
docker push example/mesos-marathon-demo:$BUILD_NUMBER

Возможно, вам потребуется отправить изображение в общедоступный реестр Docker или в личный.

Переменная среды$BUILD_NUMBER заполняется Jenkins, увеличиваясь с каждой сборкой. Хотя это и немного хрупко, но это быстрый способ заставить каждую сборку увеличить номер версии. $DOCKER_PASSWORD также заполняется Jenkins, и в этом случае мы будем использоватьEnvInject plugin, чтобы сохранить его в секрете.

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

6.3. Создание и публикация на Jenkins

Теперь давайте изменим наше задание Jenkins так, чтобы оно запускало Dockerise.sh после сборки jar:

 

image

А затем давайте снова запустим нашу работу, чтобы подтвердить, подтвердив, что все работает по синему цвету.

7. Развертывание нашего образа

Наш трубопровод почти завершен. Есть только еще один этап - использование Marathon для развертывания нашего приложения в нашем кластере Mesos.

Дженкинс поставляется с плагином «https://wiki.jenkins-ci.org/display/JENKINS/Marathon+Plugin[Deploy with Marathon]». Это действует как обертка вокруг Marathon API, делая его проще, чем при работе с традиционными сценариями оболочки. Вы можете установить его через менеджер плагинов.

7.1. Создание нашего файла Marathon.Json

Прежде чем мы сможем использовать плагин Marathon, нам нужно создать файл «marathon.json» и сохранить его в корне нашего проекта. Это потому, что плагин зависит от него.

Этот файл: «marathon.json» содержитMesos Application Definition. Это описание долгосрочной службы (приложения), которую мы хотим запустить. В конечном итоге плагин Jenkins Marathon отправит содержимое файла POST в конечную точку Marathon/v2/apps. Марафон, в свою очередь, запланирует запуск определенного приложения на Mesos:

{
  "id": "mesos-marathon-demo",
  "container": {
    "type": "DOCKER",
    "docker": {
      "image": "",
      "network": "BRIDGE",
      "portMappings": [
        { "containerPort": 8082, "hostPort": 0 }
      ]
    }
  }
}

Это самая простая конфигурация, которую мы можем предоставить для контейнерного приложения.

Свойство: «portMappings» должно быть установлено правильно, чтобы сделать наше приложение доступным из нашего подчиненного устройства Mesos. По сути, это означает, что сопоставьте порт контейнера8082 со случайным портом на хосте (подчиненный сервер mesos), чтобы мы могли общаться с нашим приложением из внешнего мира. После развертывания вашего приложения Marathon сообщит нам, какой порт использовался.

7.2. Добавление шага сборки развертывания Marathon

Давайте добавим к нашей работе действие сборки Marathon Deployment post:

image

Обратите внимание, что мы сообщаем плагину, где работает Marathon, в данном случае «localhost: 8081». Мы также сообщаем ему образ, который хотим развернуть. Это то, чем заменяется пустое поле «изображение» в нашем файле.

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

7.3. Проверка нашего развертывания в марафоне

Теперь, когда он развернут, давайте взглянем на пользовательский интерфейс Marathon:

 

image

Как мы видим, ваше приложение не отображается в пользовательском интерфейсе. Чтобы получить к нему доступ, нам просто нужно проверить, какому хосту и порту он был назначен:

image

В этом случае ему случайным образом был назначен порт 31143 на локальном хосте, который будет внутренне сопоставляться с портом 8082 в нашем контейнере, как указано в определении приложения. Затем мы можем посетить этот URL в вашем браузере, чтобы убедиться, что приложение обслуживается правильно.

8. Заключение

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

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

Исходный код нашего приложения доступен наover on GitHub; это проект Maven, который должен работать как есть.