В этой статье я хотел бы поделиться своими впечатлениями от использования Atlassian Bamboo — системы непрерывной интеграции от компании Atlassian. В Java-проекте, над которым мы работаем, изначально в качестве системы управления использовалась JIRA On Demand, т.е. облачная версия JIRA, установленная на серверах компании Atlassian. В определенный момент появилась необходимость внедрения системы непрерывной интеграции. Важным требованием при выборе такой системы была поддержка из коробки системы автоматической сборки Gradle. Подобному требованию удовлетворяло лишь несколько систем непрерывной интеграции: всем известный Jenkins, Jetbrains TeamCity и Atlassian Bamboo. Под катом изложено как это работает и почему же мы выбрали Atlassian Bamboo. Осторожно — много картинок!
Так выглядит главная страница Bamboo, отображающая список т.н. планов сборки (build plan), т.е. независимых наборов заданий, которые нужно выполнять с некоторой периодичностью или при выполнении определенных условий или при запуске вручную. Каждый план может использовать один и тот же исходный код, но выполняться с различной периодичностью или разворачивать приложение на разные сервера. Например, в нашем случае требовалось ежедневно развертывать приложение на тестовый сервер в автоматическом режиме и собирать исходный код, предназначенный для выкладывания на production, но не выкладывать его. На главной странице отображается список планов, их статус и последние изменения в коде. Также можно запустить план вручную или перейти на страницу настройки.
На странице «Текущая активность» можно увидеть список планов, выполняемых в данный момент и список ранее запущенных планов.
На странице «My Bamboo» приведен список планов, в которых присутствуют изменения, внесенные текущим аккаунтом. Поскольку в Bamboo On Demand используются та же учетная запись, что и для JIRA, выводится список JIRA-тикетов, присвоенных текущему пользователю и список планов, в которых присутствуют изменения, касающиеся этих тикетов. Также имеется список избранных планов.
Каждый план имеет собственную страницу, где приведена сводная таблица предыдущих запусков плана (билдов), а также графические данные о соотношении успешных и неудачных билдов.
Страница билда содержит информацию о длительности и успешности билда и позволяет добавить комментарии.
Кроме того имеется список JIRA-тикетов и коммитов, включенных в билд. Нажатие на тикет — открывает соответствующую страницу JIRA, а на коммит — страницу коммита в Bitbucket (как выясняется, принадлежащий Atlassian и хорошо интегрированный с остальными онлайн-сервисами). В нашем случае речь идет о Git-коммитах, но также поддерживаются другие популярные системы контроля версий (Subversion, Mercurial). С этой же страницы можно скачать полный лог-файл, относящийся к билду, или посмотреть статистику по пройденным автоматическим тестам. Если билд выполняется в текущий момент, то зеленая панель представляет собой шкалу, отображающую текущий прогресс сборки, а лог-файл обновляется в реальном времени и отображается внизу страницы.
На отдельной странице доступны для ручного скачивания файлы, сгенерированные в ходы выполнения плана (т.н. артефакты). В версии JIRA On Demand на серверах Atlassian хранится до 1 Гб таких файлов.
Настройка плана представляет собой серию страниц, позволяющих задать имя плана…
… список используемых репозиториев исходного кода и настройки подключения к ним…
… способ работы с ветками исходного кода (branches). Bamboo имеет несколько полезных возможностей при работе с ветками. Во-первых, можно собирать не только основную ветку (master), но и все другие ветки репозитория, имена которых удовлетворяют заданному регулярному выражению. Например, при использовании Git Flow можно собирать все ветки, содержащие feature/. Это позволяет быть более уверенным, что изменения вносимые в feature-ветках, не сломают билд, при вливании в основной код. Во-вторых, поддерживается автоматическая синхронизация изменений между master-веткой и feature-ветками. Здесь возможно выбрать между двумя стратегиями: вливать успешно собранные изменения из feature-ветки обратно в master-ветку (Gatekeeper) или же вливать изменения из master-ветки в feature-ветки (Branch Updater). Если имя ветки содержит название тикета из JIRA, то такая ветка будет автоматически прикреплена к этому тикету для быстрого перехода.
Страница «Triggers» позволяет настроить условия, при которых план запускается на выполнение. Например, билд может запускаться периодически в заданное время и только при условии, что в репозиторий были отправлены изменения. Можно запускать билд, по завершению коммита, используя механизм хуков (post-commit hook), или же просто раз в день, как это делают многие команды.
План в Bamboo состоит из набора стадий (stage), каждая из которых может содержать одну или несколько работ (job), которые в свою очередь состоят из заданий (task). В случае, если одна из работ завершается с ошибкой, можно перезапустить только эту работу, а не весь план. Кроме того работы в рамках одной стадии могут выполняться параллельно. Например, можно создать три стадии — сборка (build), тестирование (testing) и развертывание (deployment). В каждой из этих стадий может собираться, тестироваться и развертываться на разные сервера несколько деревьев исходного кода.
Набор встроенных заданий не очень большой, но содержит все необходимое для наших нужд. Например, поддерживается сборка проекта при помощи Ant или Maven, запуск тестов JUnit (или PHPUnit, если вы пишете на PHP), выполнение произвольных shell-сценариев, развертывание war-файла под Tomcat или Heroku, добавление тегов в систему контроля версий, копирование файлов по SSH и многое другое.
Панель администратора Bamboo имеет множество опций. Я не буду описывать такие стандартные опции, как управление правами доступа пользователей или просмотр лог-файлов. Наиболее важной настройкой в Bamboo On Demand, с моей точки зрения, является настройка Amazon инстансов, используемых для выполнения планов. Все дело в том, что Atlassian не предоставляет вычислительные мощности своего дата-центра для сборки ваших проектов. Вместо этого Bamboo использует ваш ключ от API Amazon Web Services для создания инстансов виртуальных машин и запуска планов на этих инстансах. В панели администратора мы можете указать свои данные для работы с AWS API, тип и количество создаваемых инстансов, используемые образы виртуальных машин (AMI) и тома EBS. При запуске плана Bamboo проверяет нет ли уже запущенного инстанса, и при его отсутствии создает требуемый инстанс. По-умолчанию через 300 секунд после завершения выполнения плана и при отсутствии других заданий в очереди инстанс выключается. При задании конфигурации инстанса нужно учитывать, что в Amazon On Demand оплата производится минимум за час работы, поэтому в целях экономии имеет смысл подумать о выборе менее производительного инстанса, если для выполнения всех планов достаточно часа. Также можно использовать снимки EBS-томов, чтобы хранить относительно свежую версию исходного кода, т.к. это позволит избежать значительного расхода трафика при загрузке полного дерева исходного кода при каждом выполнении плана (в больших проектах Git репозиторий может иметь размер в сотни мегабайт и даже гигабайты).
Atlassian Bamboo хорошо интегрирован с JIRA и другими сервисами Atlassian. Если вы указываете названия тикетов JIRA в описаниях коммитов, то сможете легко перемещаться между Bamboo и страницами этих тикетов. Кроме того статус выполнения каждого плана отображается в панели состояния JIRA (Activity Stream).
Главная страница
Так выглядит главная страница Bamboo, отображающая список т.н. планов сборки (build plan), т.е. независимых наборов заданий, которые нужно выполнять с некоторой периодичностью или при выполнении определенных условий или при запуске вручную. Каждый план может использовать один и тот же исходный код, но выполняться с различной периодичностью или разворачивать приложение на разные сервера. Например, в нашем случае требовалось ежедневно развертывать приложение на тестовый сервер в автоматическом режиме и собирать исходный код, предназначенный для выкладывания на production, но не выкладывать его. На главной странице отображается список планов, их статус и последние изменения в коде. Также можно запустить план вручную или перейти на страницу настройки.
На странице «Текущая активность» можно увидеть список планов, выполняемых в данный момент и список ранее запущенных планов.
На странице «My Bamboo» приведен список планов, в которых присутствуют изменения, внесенные текущим аккаунтом. Поскольку в Bamboo On Demand используются та же учетная запись, что и для JIRA, выводится список JIRA-тикетов, присвоенных текущему пользователю и список планов, в которых присутствуют изменения, касающиеся этих тикетов. Также имеется список избранных планов.
Страница плана
Каждый план имеет собственную страницу, где приведена сводная таблица предыдущих запусков плана (билдов), а также графические данные о соотношении успешных и неудачных билдов.
Страница билда содержит информацию о длительности и успешности билда и позволяет добавить комментарии.
Кроме того имеется список JIRA-тикетов и коммитов, включенных в билд. Нажатие на тикет — открывает соответствующую страницу JIRA, а на коммит — страницу коммита в Bitbucket (как выясняется, принадлежащий Atlassian и хорошо интегрированный с остальными онлайн-сервисами). В нашем случае речь идет о Git-коммитах, но также поддерживаются другие популярные системы контроля версий (Subversion, Mercurial). С этой же страницы можно скачать полный лог-файл, относящийся к билду, или посмотреть статистику по пройденным автоматическим тестам. Если билд выполняется в текущий момент, то зеленая панель представляет собой шкалу, отображающую текущий прогресс сборки, а лог-файл обновляется в реальном времени и отображается внизу страницы.
На отдельной странице доступны для ручного скачивания файлы, сгенерированные в ходы выполнения плана (т.н. артефакты). В версии JIRA On Demand на серверах Atlassian хранится до 1 Гб таких файлов.
Настройка плана
Настройка плана представляет собой серию страниц, позволяющих задать имя плана…
… список используемых репозиториев исходного кода и настройки подключения к ним…
… способ работы с ветками исходного кода (branches). Bamboo имеет несколько полезных возможностей при работе с ветками. Во-первых, можно собирать не только основную ветку (master), но и все другие ветки репозитория, имена которых удовлетворяют заданному регулярному выражению. Например, при использовании Git Flow можно собирать все ветки, содержащие feature/. Это позволяет быть более уверенным, что изменения вносимые в feature-ветках, не сломают билд, при вливании в основной код. Во-вторых, поддерживается автоматическая синхронизация изменений между master-веткой и feature-ветками. Здесь возможно выбрать между двумя стратегиями: вливать успешно собранные изменения из feature-ветки обратно в master-ветку (Gatekeeper) или же вливать изменения из master-ветки в feature-ветки (Branch Updater). Если имя ветки содержит название тикета из JIRA, то такая ветка будет автоматически прикреплена к этому тикету для быстрого перехода.
Страница «Triggers» позволяет настроить условия, при которых план запускается на выполнение. Например, билд может запускаться периодически в заданное время и только при условии, что в репозиторий были отправлены изменения. Можно запускать билд, по завершению коммита, используя механизм хуков (post-commit hook), или же просто раз в день, как это делают многие команды.
План в Bamboo состоит из набора стадий (stage), каждая из которых может содержать одну или несколько работ (job), которые в свою очередь состоят из заданий (task). В случае, если одна из работ завершается с ошибкой, можно перезапустить только эту работу, а не весь план. Кроме того работы в рамках одной стадии могут выполняться параллельно. Например, можно создать три стадии — сборка (build), тестирование (testing) и развертывание (deployment). В каждой из этих стадий может собираться, тестироваться и развертываться на разные сервера несколько деревьев исходного кода.
Набор встроенных заданий не очень большой, но содержит все необходимое для наших нужд. Например, поддерживается сборка проекта при помощи Ant или Maven, запуск тестов JUnit (или PHPUnit, если вы пишете на PHP), выполнение произвольных shell-сценариев, развертывание war-файла под Tomcat или Heroku, добавление тегов в систему контроля версий, копирование файлов по SSH и многое другое.
Панель администратора
Панель администратора Bamboo имеет множество опций. Я не буду описывать такие стандартные опции, как управление правами доступа пользователей или просмотр лог-файлов. Наиболее важной настройкой в Bamboo On Demand, с моей точки зрения, является настройка Amazon инстансов, используемых для выполнения планов. Все дело в том, что Atlassian не предоставляет вычислительные мощности своего дата-центра для сборки ваших проектов. Вместо этого Bamboo использует ваш ключ от API Amazon Web Services для создания инстансов виртуальных машин и запуска планов на этих инстансах. В панели администратора мы можете указать свои данные для работы с AWS API, тип и количество создаваемых инстансов, используемые образы виртуальных машин (AMI) и тома EBS. При запуске плана Bamboo проверяет нет ли уже запущенного инстанса, и при его отсутствии создает требуемый инстанс. По-умолчанию через 300 секунд после завершения выполнения плана и при отсутствии других заданий в очереди инстанс выключается. При задании конфигурации инстанса нужно учитывать, что в Amazon On Demand оплата производится минимум за час работы, поэтому в целях экономии имеет смысл подумать о выборе менее производительного инстанса, если для выполнения всех планов достаточно часа. Также можно использовать снимки EBS-томов, чтобы хранить относительно свежую версию исходного кода, т.к. это позволит избежать значительного расхода трафика при загрузке полного дерева исходного кода при каждом выполнении плана (в больших проектах Git репозиторий может иметь размер в сотни мегабайт и даже гигабайты).
Интеграция с JIRA
Atlassian Bamboo хорошо интегрирован с JIRA и другими сервисами Atlassian. Если вы указываете названия тикетов JIRA в описаниях коммитов, то сможете легко перемещаться между Bamboo и страницами этих тикетов. Кроме того статус выполнения каждого плана отображается в панели состояния JIRA (Activity Stream).