История одного скрипта
По долгу службы мне, пользователю 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 со свежей версией моего приложения.
Всем спасибо!