Как стать автором
Обновить

LED монитор состояния Continuous Integration сервера

Время на прочтение4 мин
Количество просмотров7.5K
Активное внедрение в компании 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
Теги:
Хабы:
Всего голосов 82: ↑75 и ↓7+68
Комментарии37

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань