Пользователь
0,0
рейтинг
11 апреля 2011 в 21:02

LED монитор состояния Continuous Integration сервера из песочницы

Активное внедрение в компании Continuous Integraion серверов на основе Jenkins (fork Hudson-а) породило много разговоров о «красной лампе» — обычной такой лампе, которая бы стояла у руководителя разработки и сигнализировала в случае неуспешного билда. Интерес взял вверх, и в выходные перешел от слов к делу. В результате, получилось такое устройство:


Что оно умеет:
  • по USB подключаться к компьютеру;
  • отслеживать статус шести проектов Jenkins;
  • выводить информацию о текущем состоянии, используя 4 варианта индикации (два цвета по два режима работы).


Построено оно на базе популярной платформы Arduino (точнее, его не менее популярного клона — Seeeduino).

Основная концепция устройства проста:
  1. На рабочей машине запускается программа, которая слушает статус заданных проектов Jenkins;
  2. При изменении статуса, программа отправляет по UART (через Serial Port, он же COM порт) в Arduino определенный сигнал;
  3. Arduino принимает сигнал и включает соответсвующий светодиод в нужном режиме.


Программная часть на Arduino


Arduino на борту имеет встроеную поддержку SerialPort, так что проблем с подключением к ПК нет. Командой
  1. Serial.begin(9600);

инициализируется прослушивание порта на заданной частоте (здесь важно, чтобы программа, запущенная на компьютере, работала с той же частотой в том же режиме), а далее командой
  1. incomingByte = Serial.read();

в бесконечном цикле считывается сигнал с порта. В зависимости от того, что пришло, выбирается один из пяти режимов для одного из шести светодиодов:
  1. Последняя сборка была успешной (зеленый диод);
  2. Сборка в процессе (мигающий зеленый диод);
  3. Последняя сборка была неуспешной (красный диод);
  4. Последняя сборка была вручную прервана (красный диод);
  5. Невозможно получить ответ от сервера, либо статус неопределен (выключенный диод).

Можно сделать еще один режим — мигание по очереди зеленый-красный, если кому-то такой набор статусов кажется недостаточным.

Для экономии выводов Arduino, были выбраны двухвыводные красно-зеленые светодиоды. При протекании тока в одном направлении такой диод горит зеленым цветом, в обратном — красным:


Подключаем его к двум выводам Arduino (не забываем про токоограничительный резистор) и, выставляя на этих ножках низкий и высокий потенциал, задаем необходимый режим работы светодиода:
  • Зеленый: на одном выводе высокий, на другом — низкий уровень;
  • Красный: то же самое, но в обратную сторону;
  • Выключенный светодиод, если на оба вывода подать низкий сигнал.

Мигающий режим получается чередованием включения и выключения светодиода по таймеру.

Выводы 0 и 1 заняты для общения по UART, их использовать нельзя. Я ограничился шестью индикаторами, повесив их, соотвественно, на выводы 2-13.


При желании, можно использовать остальные 6 выводов Arduino, а также расширить количество индикаторов, используя, например, сдвиговые регистры. Правда, над кодом прошивки придется дополнительно поколдовать.

Полный скетч для ардуино можно посмотреть в архиве с исходным кодом.

Железная часть


Железную часть интерфейса реализовал в виде платы расширения для Arduino — см. фото. Штырьки вставляются в разъемы, получается жесткая прочная конструкция без проводов и шлейфов. Удобно и надежно.
Плата сделана методом ЛУТ, про который много раз уже писали на Хабре. Хорошее описание в картинках есть на сайте easyelectronics.ru.
Светодиоды и токоограничительный резисторы использованы в чип-формате, но, конечно, подойдут любые.



В качестве «фишки» вытравил название проектов прямо на плате. На фотографии пришлось “замазать”, т.к. это названия конкретных клиентов нашей компании. Можно было просто написать Server01, Server02 и т.д. Но я хотел сделать Красиво :)

Программированная часть на ПК


Мониторящую статус серверов программа написана на Perl-е. В принципе, подойдет любой язык, который сможет отправлять в SerialPort сигналы. Какой именно язык использовать — дело вкуса каждого.
Замечу, что для Perl пришлось доустановить пакеты DeviceSerial (для Mac OS X), Win32-API (для Windows) и Win32-Serial (для Windows).

Основные шаги программы:
  1. Подключиться к SerialPort;
    В Perl это выполняется через
    1. my $port = Win32::SerialPort->new("COM8"); # COM8 – название порта, в котором определилось устройство
    2. # Для Mac OS X будет так: my $port = Device::SerialPort->new("/dev/tty.usbserial-A100eEO6");
    3. $port->databits(8);
    4. $port->baudrate(9600);
    5. $port->parity("none");
    6. $port->stopbits(1);
  2. В бесконечном цикле смотреть статус указанного сервиса и отправлять соотвествующий код по UART.
    Отправление осуществляется командой
    1. $port->write(“Any string”);


Самым сложным в Perl части для меня оказалась настройка соединения с Jenkins сервером. У нас используется авторизация, и без введения логина/пароля Perl скрипт не получал требуемого результата. Вопрос был решен следующим образом:
  1. my $realm = 'Enter you domain credentials'; # Realm сервера
  2. my $user = 'pavel'; # Имя пользователя
  3. my $pass = 'sfD90_df13'; # Пароль пользователя. Разумеется, не настоящий :)
  4. my $browser;
  5. $browser = LWP::UserAgent->new;
  6. $browser->credentials('localhost:443', $realm, $user => $pass);


Состояние о текущем статусе сервера берем из API Jenkins. Если проект работает по адресу
https://localhost/job/Project
то по
https://localhost/job/Project/api/json
в plain text режиме выводится различная информация о проекте. Нас интересует, в частности, фрагмент, который начинается с '“color”:'.
Jenkins в этом месте отображает текущий статус. Примеры
  • “color”:”blue” — последняя сборка успешна (интересный факт: вместо «традиционного» зеленого, выбран синий цвет для удобства людей, страдающих дальтонизмом)
  • “color”:”red” — последняя сборка неуспешна
  • “color”:”aborted_anime” — идет сборка; последняя сборка была вручную прервана.


Через
  1. $response = $browser->get($url); # где $url – прямая ссылка до API для json
  2. # Например, https://localhost/job/Project/api/json

получаем содержимое страницы. Далее — дело техники. Находим нужный фрагмент и сравниваем с известными вариантами “цветых решений”. Если не нашли известный вариант или страница не доступна — гасим соотвествующий светодиод.

Полный Perl код так же доступен в архиве с исходным кодом.

Устройство в работе: www.youtube.com/watch?feature=player_embedded&v=IsgqKsnJ8Uo
@PavelKrishtalskiy
карма
13,0
рейтинг 0,0
Реклама помогает поддерживать и развивать наши сервисы

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

Самое читаемое

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

  • +24
    использовать Arduino / Seeeduino что бы зажечь 6 светодиодов, как по мне — слишком жирно, имхо.
    • +7
      Arduino придумали для программистов, которым лень разбираться в электронике, отсюда и такие результаты =)
      • +5
        По мне так Arduino придумали для школьников.
        • 0
          Поддержу Вас. Но к моему удивлению, на нем даже автопилот умудрились сделать. Видно умеют готовит :)
          • +3
            Никто не спорит, что это хороший инструмент. Плата сама по себе очень простая, но хорошие библиотеки написаны и много шилдов для него. Это и минус и плюс одновременно: плюс — быстрый запуск разработки, а минус — притупляет знания электроники, оттого можно бесконечно ловить хардварные баги и не понимать в чём дело =)
            • +1
              Вы безусловно правы.

              Arduino (и плата, и IDE, и библиотеки) очень облегчает разработку, скрывает тонкости реализации. Это позволяет очень быстро начать разбираться в микроэлектронике и развеивает начальный страх. Сперва кажется, что аппаратное обеспечение – это магия. Магия, доступная лишь избранным. А после пары поделок из Arduino страх исчезает, магия становится понятнее, и, главное, у некоторых появляется интерес копать дальше.

              Мне кажется, что Arduino может привлечь очень много талантливых инженеров в сферу микроэлектроники.
  • –1
    Ну не у каждого есть LPT порт для этих целей, а про серверные материнки история умалчивает.
    • +2
      А при чем здесь LPT? Автор отправляет все через USB. А в системе создается виртуальный СОМ порт, с ним он в программе и общается. Ну это как я понял.
      • +4
        при реализации на LPT схема будет состоять просто из проводков к лампочкам.
      • –1
        … Вы всё правильно поняли
        Дело в том что в большинстве случаев LPT порт торчит из материнки в виде plc «гребёнки» и про его существование мало кто знает вообще. Соответственно, будет куда более целесообразно использовать его для индикации всяческих хтоническо-серверных плюшек… а usb никогда мало не бывает. На lpt только остается навешать резисторов со светодиодами и никаких контроллеров и виртуальных COM портов.
  • +1
    Вы может и не догадываетесь, но ваше устройство — это реализация инструмента «Andons» из Total Quality Managent.
    Коротко про «Andons»: От японского «фонарь» или «свет». Каждое рабочее место оснащается световым устройством и, часто, звуковым. Рабочий имеет все права для того что бы зажечь это устройство. Причем желтый цвет означает «Мне кажется я попадаю в проблему» и красный – «Я не могу работать – у меня проблема». Тогда лидер отдела легко может сориентироваться в приоритетах и приступить к процедуре решения вопросов. Также ведется учет количества зажжённых фонарей и количество решенных лидером проблем в смену.
    • –1
      именно так работают кассы а гипермаркетах
  • +15
    Сделали у себя примерно то же самое, только не светодиоды повесили, а вот такую штуку:
    image
    Включается в случае, если сборка проекта, запускаемая по крону, завершилась с ошибкой =)
    • +2
      Зачетный светодиод!
      • 0
        Корабельный ревун к нему бы еще.
    • 0
      нагло сперли наш шитограф!)
      • –1
        ваш щитограф? ;)
  • –1
    Видел замечательный светофор (настоящий, уличный), стоящий в коридоре офиса и подсоединенный к CI серверу TeamCity — очень эффектно :)
    • –1
      А цвета светофора менять можно в зависимости от нагрузки…
    • –1
      В офисе яндекса есть настоящий светофор, показывает состояние по пробкам, было где-то на Хабре :)

      По мне, так идея забавная — всякие городские недомашние вещи размещать у себя в комнате, вот только где, допустим, тот же светофор достать?
      • +1
        Только, пожалуйста, не снимайте их с перекрёстков :)

        А продаются они например здесь: www.optimaservis.su/svetofor/svetofor.htm
      • +1
        Отвертку и бегом!
        • НЛО прилетело и опубликовало эту надпись здесь
  • +3
    Все эти светофоры и мигалки почему-то вызывают неприятные ассоциации с собаками Павлова.

    Загорелась лампочка — побежал давать люлей. Сломал билд — получил люлей. Творческому росту не способствует.
    • –2
      Когда над проектом работает много разработчиков, и вы не можете продолжить работу, потому, что какой-то гомопед сломал вам мастер, а вам ещё срочно нужно выкладываться на живое, — о каком творческом росте речь? Своевременная сигнализация неполадок в проекте позволяет избежать кучи нервов и сделать разработку приятной и комфортной ;)
      • +2
        Лампочки действительно как-то страшновато. У нас по офису висят несколько экранов на которых отображаются статусы проектов, плюс всевозможные нотификации (от емейла до расширений браузеров и ide).
        • +1
          Согласен, dashboard'ы — это удобно и гораздо более информативно.
      • –1
        >вы не можете продолжить работу, потому, что какой-то гомопед сломал вам мастер

        А разве не для этого сущестауют dev-бранчи?
        • –1
          Простите, а Вы в идеальном мире живёте, или в реальном? Или вы сталкивались только с проектами, где два разработчика высокой квалификации?
          У нас, в реальном мире, где с репозиторием работают самые разные люди, всякое бывает, и дело не в том, master это ветка, или девелоперская ;)
          • –1
            Знаю, бывает. :)
  • –1
    > прослушивание порта на заданной частоте
    Более правильно написать «на заданной скорости», тем более, что 9600 (бит/сек) это именно скорость передачи/приема последовательного порта.
  • 0
    Я, например, с детства недолюбливаю не только паяльник, но и даже прибор для выжигания :)

    И несколько недоумеваю, зачем сейчас паять схемы в домашних условиях, если можно сделать программное решение? С интеграцией хоть на рабочий стол, хоть в смартфон. Хоть красным будет мигать при неудачной раскладке, хоть «Голубую луну» включать.
  • 0
    У меня традиционный вопрос: в чем сделаны рисунки?
    • 0
      Во fritzing.
      • 0
        О, мак версия, буду пробовать, спасибо! 8)
  • 0
    Спасибо, за статью, сделал точно такую же плату как у вас, только прогу переписал на java, если кому понадобится пользуйтесь сырцы тут ^_^.

    А получилось вот что
    image

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