История одного скрипта

Написано 5 Апрель, 2013 в категории Windows

По долгу службы мне, пользователю ubuntu с 7 летним стажем, приходится вести разработку в windows 7, и естественно некоторые процессы тестирования хочется немного автоматизировать. До недавнего времени в процессе разработки приходилось выполнять целый набор действий требующих точной последовательности и внимательности, что естественно отнимало время и силы. Вот они эти действия:
1. открыть консоль, собрать приложение в maven
2. открыть папку с собранным jar и скопировать его
3. открыть папку deploy (к слову сказать разрабатываю я osgi-бандл для Apache ServiceMix) и вставить, скопированный на предыдущем шаге jar
4. Закрыть консоль с запущенным Servicemix'ом
5. Открыть новую консоль и запустить в ней Servicemix

В общем-то каждое действие типичная рутина, повторять приходится после каждого внесения изменений в приложение, а это от 2 до 20 раз в час. Занимает эта цепочка 1-2 минуты, но дико выматывает. Поэтому я начал искать пути автоматизации.
1. Самое простое - это скрипт запуска ServiceMix. 3 строки и дело сделано:

d:
cd apache-servicemix-4.4.2\bin
servicemix.bat

2. Было бы наверное глупо пользоваться Maven и не сделать deploy куда надо. Сделано все просто, сначала удаляем старый jar и копируем на его место новый. Использовал плагин maven-antrun-plugin

3. Осталось самое интересное - автоматизировать процесс полностью. Т.е. скрипт должен делать следующее: закрыть консоль c запущенным ServiceMix, собрать проект и обновить его в папке deploy, запустить ServiceMix.
И все бы ничего, но писать скрипт придется для cmd.exe, а я его не знаю, да и способностей у него маловато.
Как оказалось проблемы возникли в довольно неожиданных местах. Вот скрипт целиком:

 @echo off 
chcp 1251 > nul
:: останавливаем karaf
taskkill /fi "Windowtitle eq Администратор:  Karaf" > nul
chcp 866 > nul 
@echo on 
 
:: собираем кассету и инсталлим её в SM
@d:
@cd d:\my-bundle\
cmd /K mvn clean install -P deploy
 
:: запускаем karaf
@cd d:\apache-servicemix-4.4.2\bin
servicemix.bat

Первое с чем мне пришлось столкнуться - это проблемы с кодировкой.
Первое что должен делать скрипт - это закрывать cmd в котором запущен ServiceMix. Единственный способ закрыть нужный процесс, найти его по Windowtitle. При запуске ServiceMix на моей машине Windowtitle = Администратор: Karaf. Т.е. вроде все просто, делаем taskkill c фильтром по Windowtitle. Как-то так это выглядело в моей голове после небольшого гугления:

:: останавливаем  servicemix
taskkill /fi "Windowtitle eq Администратор:  Karaf"

и это отлично работало, но только в уже запущенном cmd. При запуске из bat-файла слово "Администратор" превращалось в тыкву набор крякозябр. Естественно, процесса с крякозябрами в заголовке taskkill найти не мог.

На мое счастье, я не единственный кто задумал написать скрипт под windows и, после получасового поиска решений в интернете, была получена вот такая конструкция:

 @echo off 
chcp 1251 > nul
:: останавливаем karaf
taskkill /fi "Windowtitle eq Администратор:  Karaf"
chcp 866 > nul 
@echo on

Я совсем забыл, что в 21 веке Блокнот Windows 7 продолжает сохранят файлы в cp1251, а bat-скрипты выполняются в кодировке cp866... Ммммдааа...

Протестировав эту конструкцию понял, что в принципе результаты работы taskkill можно не выводить на консоль и отправил весь вывод команды taskkill в nul

 @echo off 
chcp 1251 > nul
:: останавливаем karaf
taskkill /fi "Windowtitle eq Администратор:  Karaf" > nul
chcp 866 > nul 
@echo on

Подумав, что самое страшное позади, я столкнулся со странным поведением команды сборки проекта. Изначально, в bat-файле было написано следующее:

:: собираем кассету и инсталлим её в SM
d:
cd d:\my-bundle\
mvn clean install -P deploy

И какого было мое удивление когда после успешной сборки проекта окно cmd.exe просто закрылось!!! Хотя, после сборки скрипт должен был запустить ServiceMix. Решение нашлось достаточно быстро - это запуск сборки в отдельном экземпляре cmd с ключем /K. Этот ключ предотвращает закрытие окна после завершения в нем сборки. В итоге получилось так:

:: собираем кассету и инсталлим её в SM
@d:
@cd d:\my-bundle\
cmd /K mvn clean install -P deploy

Самое простое, как оказалось это запуск нового экземпляра ServiceMix.
Для справки: @ - подавляет вывод самой команды на экран.

Итак, получился скрипт позволяющий запускать и перезапускать ServiceMix со свежей версией моего приложения.
Всем спасибо!