0,0
рейтинг
3 декабря 2013 в 18:28

Разработка → Continuous Integration вместе с buildbot: введение из песочницы


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

Buildbot? Не, не слышал.


На хабре почти нет упоминаний об этом замечательном тулките. Значит ли это, что им никто не пользуется? Отнюдь.
Сhromium, python, blender и множество других больших проектов собираются и даже релизятся с помощью buildbot.

Большой и страшный waterfall проекта chromium

Что за зверь такой?


Стоит отметить главную особенность: buildbot — это фреймворк. Кто-то может посчитать это минусом, но для серьезных проектов это несомненный плюс. Ведь давно известно, что если хочешь сделать что-то годное, то лучше сделать это самому.
Конфиг, содержащий в себе инструкции что как и где собирать, представляет из себя код на python. Оттого я надеюсь, что Вы с этим языком знакомы.

В бой!


Лучше один раз увидеть, чем сто раз услышать, так что давайте сразу перейдем к действию.

Нам потребуется:
  • Python в купе с его dev пакетами(для сборки twisted)
  • Virtualenv для создания виртуального окружения
  • Git

Создадим виртуальное окружение
mkdir -p buildbot
cd buildbot
virtualenv --no-site-packages sandbox
source sandbox/bin/activate
easy_install sqlalchemy==0.7.10
easy_install buildbot buildbot-slave

Создадим мастер-сервер
buildbot create-master master

Переименуем дефолтный конфиг
mv master/master.cfg.sample master/master.cfg

А теперь запустим мастер
buildbot start master

Можно проверить хорошо ли все работает посмотрев лог
tail -f master/twistd.log


А теперь, не отходя от кассы, создадим слейв
Размещение слейва рядом с мастером нельзя назвать хорошей практикой, но в нашем случае это позволительно
buildslave create-slave slave localhost:9989 example-slave pass

Запускаем
buildslave start slave

Слейв ругнется на развернутый по-соседству твистедовский сервер мастера. Не обращаем внимания.
Если есть особое желание, то можем проверить, как все прошло, заглянув в лог
tail -f slave/twistd.log


Если мы сделали все правильно, то на 8010 порту нашего localhost'а будет красоваться вот такая приветственная страничка:


Проверяем


Логинимся. user: pyflakes, password: pyflakes.
Идем на localhost:8010/builders/runtests и видим примерно следующее:

Смело жмякаем «Force Build»

Наш первый билд готов. Нажимаем F5 и переходим на страницу сборки. Все шаги зеленые? Значит, тесты прошли успешно.

Нажав на stdout конкретного шага сборки, можно увидеть вывод консоли с подробным описанием того что, как и где запускалось.

Конец


Вот и все, на этом я закончу введение в buildbot. Если у хабрасообщества есть желание, то я с удовольствием продолжу повествование, расскажу о тонкостях и граблях на которые я наступил при внедрении билдбота.
Александр Плесовских @HgeN
карма
9,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

Подробнее
Реклама

Самое читаемое Разработка

Комментарии (11)

  • +3
    О чём это и зачем это? Перевели First Run с оффсайта? Ок.

    Можно было бы хотя бы написать о том, чем BuildBot лучше (или хуже), чем Hudson, Jenkins, CruiseControl и т.п., почему именно BuildBot, почему вы хотите потратить время на написание конфига на Python вместо того, чтобы накликать всё это мышкой в том же Jenkins, предупредить, что для сложных проектов кода на Python будет реально много, но показать, почему это нужно и как это помогает решить те или иные задачи.
    • 0
      Да, начинал статью немного с другой целью, но вышло уж сильно похоже на туториал.
      Я обязательно об этом расскажу, если надобность есть.
      • +4
        Конкретно у меня такой надобности нет — мы уже успешно используем BuildBot. Но поставьте себя на место читателя, который ничего не знает про BuildBot и прочитал вашу статью. Какие выводы он может для себя сделать? Да, есть такая штука BuildBot, вот с таким страшным Waterfall и кривой формой Force Build. Думаете этого достаточно, чтобы заинтересовать людей?
      • +1
        Я бы с удовольствием послушал, чем BuildBot принципиально отличается и какие преимущества перед Hudson или Jenkins. Мы вроде бы пока справляемся вполне с помощью hudson, плагинов и парой тулзов, написанных собственноручно. Так вот хотелось бы узнать, стоит тратить время на освоение BuildBot.
  • 0
    Побольше бы примеров, желательно из своей практики. Жду продолжения.
    Мне тоже интересно, в чем принципиальное от Jenkins, Teamcity и т.п.

    Допускаю, что процесс автотестирования может быть каким-то нетиповым и есть вероятность, что к готовой CI-системе нужно прикручивать какие-нибудь костыли. И правильно ли я понял, что можно просто настроить buildbot, а так же развернуть самописную CI систему с минимальными усилиями?

    • 0
      Да, вы вполне правильно поняли. В свободное время расскажу о том, что мы сами наработали.
  • 0
    Для сборки Java, публикации тестов для нее подходит?
    • 0
      Вполне себе. Он умеет кушать xunit. Только вот Jenkins, всё-таки, лучше под яву заточен.
      • 0
        На Jenkins неудобно развесистые зависимости делать между проектами.
        Чтобы элементарно собрать несколько проектов из разных репозиториев, собрать из них образ и запустить в параллели на этом образе несколько разных тестов требуется увлекательное кликанье мышкой по штук пяти заданиям с кучей свернутых менюшек (см. обычную в Jenkins «свертку» «Advanced») — по полчаса-часу на бранч — и это когда все отлажено и рука уже набита. Обещают workflow-plugin к нему, где все это на Groovy писать можно будет, но пока это early beta.

        В остальном то Jenkins устраивает практически полностью.
        • 0
          Дженкинс же можно дергать по REST и делать параметризированный запуск нескольких тасков. Мол делаем один job, который запускает все остальные.

          Билдбот очень своеобразный продукт, но попробовать его стоит.
          • 0
            Да, именно так и делаю, кроме REST (про него почитаю, спасибо).

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