Активное внедрение в компании Continuous Integraion серверов на основе Jenkins (fork Hudson-а) породило много разговоров о «красной лампе» — обычной такой лампе, которая бы стояла у руководителя разработки и сигнализировала в случае неуспешного билда. Интерес взял вверх, и в выходные перешел от слов к делу. В результате, получилось такое устройство:
Что оно умеет:
Построено оно на базе популярной платформы Arduino (точнее, его не менее популярного клона — Seeeduino).
Основная концепция устройства проста:
Arduino на борту имеет встроеную поддержку SerialPort, так что проблем с подключением к ПК нет. Командой
инициализируется прослушивание порта на заданной частоте (здесь важно, чтобы программа, запущенная на компьютере, работала с той же частотой в том же режиме), а далее командой
в бесконечном цикле считывается сигнал с порта. В зависимости от того, что пришло, выбирается один из пяти режимов для одного из шести светодиодов:
Можно сделать еще один режим — мигание по очереди зеленый-красный, если кому-то такой набор статусов кажется недостаточным.
Для экономии выводов 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).
Основные шаги программы:
Самым сложным в Perl части для меня оказалась настройка соединения с Jenkins сервером. У нас используется авторизация, и без введения логина/пароля Perl скрипт не получал требуемого результата. Вопрос был решен следующим образом:
Состояние о текущем статусе сервера берем из API Jenkins. Если проект работает по адресу
то по
в plain text режиме выводится различная информация о проекте. Нас интересует, в частности, фрагмент, который начинается с '
Jenkins в этом месте отображает текущий статус. Примеры
Через
получаем содержимое страницы. Далее — дело техники. Находим нужный фрагмент и сравниваем с известными вариантами “цветых решений”. Если не нашли известный вариант или страница не доступна — гасим соотвествующий светодиод.
Полный Perl код так же доступен в архиве с исходным кодом.
Устройство в работе: www.youtube.com/watch?feature=player_embedded&v=IsgqKsnJ8Uo
Что оно умеет:
- по USB подключаться к компьютеру;
- отслеживать статус шести проектов Jenkins;
- выводить информацию о текущем состоянии, используя 4 варианта индикации (два цвета по два режима работы).
Построено оно на базе популярной платформы Arduino (точнее, его не менее популярного клона — Seeeduino).
Основная концепция устройства проста:
- На рабочей машине запускается программа, которая слушает статус заданных проектов Jenkins;
- При изменении статуса, программа отправляет по UART (через Serial Port, он же COM порт) в Arduino определенный сигнал;
- Arduino принимает сигнал и включает соответсвующий светодиод в нужном режиме.
Программная часть на Arduino
Arduino на борту имеет встроеную поддержку SerialPort, так что проблем с подключением к ПК нет. Командой
- Serial.begin(9600);
инициализируется прослушивание порта на заданной частоте (здесь важно, чтобы программа, запущенная на компьютере, работала с той же частотой в том же режиме), а далее командой
- incomingByte = Serial.read();
в бесконечном цикле считывается сигнал с порта. В зависимости от того, что пришло, выбирается один из пяти режимов для одного из шести светодиодов:
- Последняя сборка была успешной (зеленый диод);
- Сборка в процессе (мигающий зеленый диод);
- Последняя сборка была неуспешной (красный диод);
- Последняя сборка была вручную прервана (красный диод);
- Невозможно получить ответ от сервера, либо статус неопределен (выключенный диод).
Можно сделать еще один режим — мигание по очереди зеленый-красный, если кому-то такой набор статусов кажется недостаточным.
Для экономии выводов 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).
Основные шаги программы:
- Подключиться к SerialPort;
В Perl это выполняется через
- my $port = Win32::SerialPort->new("COM8"); # COM8 – название порта, в котором определилось устройство
- # Для Mac OS X будет так: my $port = Device::SerialPort->new("/dev/tty.usbserial-A100eEO6");
- $port->databits(8);
- $port->baudrate(9600);
- $port->parity("none");
- $port->stopbits(1);
- В бесконечном цикле смотреть статус указанного сервиса и отправлять соотвествующий код по UART.
Отправление осуществляется командой
- $port->write(“Any string”);
Самым сложным в Perl части для меня оказалась настройка соединения с Jenkins сервером. У нас используется авторизация, и без введения логина/пароля Perl скрипт не получал требуемого результата. Вопрос был решен следующим образом:
- my $realm = 'Enter you domain credentials'; # Realm сервера
- my $user = 'pavel'; # Имя пользователя
- my $pass = 'sfD90_df13'; # Пароль пользователя. Разумеется, не настоящий :)
- my $browser;
- $browser = LWP::UserAgent->new;
- $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”
— идет сборка; последняя сборка была вручную прервана.
Через
- $response = $browser->get($url); # где $url – прямая ссылка до API для json
- # Например, https://localhost/job/Project/api/json
получаем содержимое страницы. Далее — дело техники. Находим нужный фрагмент и сравниваем с известными вариантами “цветых решений”. Если не нашли известный вариант или страница не доступна — гасим соотвествующий светодиод.
Полный Perl код так же доступен в архиве с исходным кодом.
Устройство в работе: www.youtube.com/watch?feature=player_embedded&v=IsgqKsnJ8Uo