Статьи

Build Light: непрерывная доставка соответствует реинжинирингу драйвера USB

Непрерывная доставка — это язык шаблонов, используемый при разработке программного обеспечения для автоматизации и улучшения процесса доставки программного обеспечения. Такие методы, как автоматическое тестирование , непрерывная интеграция и непрерывное развертывание, позволяют разрабатывать программное обеспечение в соответствии с высокими стандартами, легко упаковывать и развертывать в средах тестирования.

Непрерывная доставка рассматривает обычное понятие конвейера развертывания: набор проверок, через которые часть программного обеспечения должна пройти на пути к выпуску. При необходимости код компилируется, а затем упаковывается серверами сборки, такими как Jenkins или Bamboo, каждый раз, когда изменение фиксируется в репозитории управления исходным кодом, затем проверяется с помощью ряда различных методов, прежде чем его можно пометить как выполнимое.

Как разработчик, вы должны следить за сервером сборки после каждой фиксации, чтобы увидеть, влияет ли ваша работа на готовящуюся к выпуску версию. Статья Использование Raspberry PI для управления устройством экстремальной обратной связи вдохновила нас на покупку светофора в магазине программного обеспечения . Мы находим идею классной, чтобы визуализировать результаты наших коммитов со светофора и рассматривать ее как дополнение к cS Jenkins Bell . Светофор является простой USB устройство , которое имеет зеленый, желтый и красный светодиод.

К сожалению, оригинальный драйвер светофора поддерживает только Microsoft Windows и Linux . Но многие в ComSysto используют Apple PowerBook. Именно поэтому мы решили обновить драйвер и включить его в Java API. Мы контролировали драйвер linux на виртуальной машине Ubuntu с помощью средства usbmon ядра Linux. Usbmon может использоваться для вывода информации о необработанном пакете, который отправляется во время USB-связи компьютера и USB-устройства, которое в нашем случае является светофором Cleware .

sudo modprobe usbmon

Если вы не хотите просматривать весь обмен данными между компьютером и устройством USB, инструмент под названием Usbdump помогает просматривать только обмен данными с определенным устройством USB. Usbdump — это простой интерфейс для средства usbmon ядра Linux. Каждое USB-устройство идентифицируется поставщиком и идентификатором продукта . В случае светофора Cleware идентификатор поставщика равен 0D50, а идентификатор продукта — 0008 .

usbdump -d 0D50:0008 -u 1

После запуска usbdump вы можете включать и выключать светофор с помощью оригинального драйвера, и вы получите аналогичный дамп в результате наблюдения. Дамп немного сжимается. Он показывает только последовательность включения и выключения желтого светодиода светофора .

3.680370 1<-- 6: 8a00 0000 0000
3.686056 -->2 3: 0011 01
11.649153 1<-- 6: 8e00 0000 0000
11.675358 -->2 3: 0011 00
11.681172 1<-- 6: 8e00 0000 0000

Как видите, последовательность включения желтого светодиода — 0011 01, а последовательность выключения — 0011 00 . Теперь вся информация доступна для реализации драйвера. HID-API обеспечивает простой Java API для устройств , таких как USB — устройства на Mac, Linux и Windows. Это очень простой API. Как вы можете видеть на диаграмме классов ниже, она состоит только из четырех классов. ClassPathLibraryLoader инициализирует собственный драйвер, и с HIDManager вы можете получить доступ к конкретному устройству или список всех устройств. HIDDeviceInfo предоставляет информацию об устройстве USB и HIDDeviceотвечает за операции записи. Метод записи HIDDevice   должен использоваться для записи на устройство USB. В нашем случае это означает, что если вы хотите включить желтый свет светофора, вы должны создать байтовый массив для последовательности  0011 01, используя метод записи. После записи данных желтый индикатор начнет мигать.

HID API Diagram

Диаграмма классов HID API

Мы можем создать очень простой Java API для светофора Cleware с помощью HID-API. Как вы можете видеть на диаграмме классов ниже, существует TrafficLightFactory, которая создает экземпляр TrafficLightImpl , который используется для выполнения таких операций, как включение и выключение светодиодов светофора USB-устройства.

Диаграмма классов Java Driver

Диаграмма классов Java Driver

Вы можете легко использовать этот API в своем собственном приложении, вам нужно только добавить следующую зависимость в ваш Maven POM.xml :

<dependency>
  <groupId>com.comsysto.buildlight</groupId>
  <artifactId>cleware-driver</artifactId>
  <version>1.0</version>
</dependency>

Если вы используете современную систему сборки, такую ​​как Gradle, вы можете поместить следующую зависимость в ваш build.gradle :

compile "com.comsysto.buildlight:cleware-driver:1.0"

Вот пример кода использования Java-драйвера Cleware Traffic Light с вышеупомянутой зависимостью:

public class TrafficLightFactoryTest {
    public static void main(String[] args) {
        TrafficLight light = TrafficLightFactory.createNewInstance();
        light.switchOn(Led.RED);
        light.switchOffAllLeds();
        light.close();
    }
}

Теперь вернемся к непрерывной доставке. Мы создали небольшое приложение поверх Java-драйвера Cleware Traffic Light, которое называется Build Light . Это сторожевой таймер для Jenkins и Bamboo, который включает зеленый светодиод на светофоре, когда сборка завершается успешно, мигает желтым светом, когда сборка выполняется, и мигает красным светом, если сборка не удалась. Вы можете увидеть, как это выглядит в следующих видео:

Вы можете получить сборки Light исходный код из GitHub comSysto в хранилище . Единственное, что вам нужно сделать, это перейти по ссылке ниже и распаковать сжатый файл. Он доступен для Windows, Mac OS X, Linux и Raspberry Pi .

Скачать артефакты и источник Build Light

Следующие команды оболочки показывают, как вы можете установить Build Light на Mac OS X:

bzuther@MacBook ~/Downloads$ tar xvf buildlight-0.1-DEV.zip
bzuther@MacBook ~/Downloads$ cd buildlight-0.1-DEV/bin
bzuther@MacBook ~/Downloads$ ./buildlight

Вы должны создать файл buildlight.properties в каталоге bin после того, как разархивировали Build Light . Вы определяете сборку, которую хотите посмотреть в этом файле. Вот пример для Дженкинс и Бамбук:

#Jenkins example:
build.server=Jenkins
jenkins.server.url=http://localhost:8080/build-server
jenkins.build.name=Build-Light-Test-Build
 
#Bamboo example:
build.server=Bamboo
bamboo.server.url=http://localhost:8080/build-server
bamboo.build.key=BUILDLIGHT_JOB
bamboo.username=zutherb
bamboo.password=t0ps3cr3t