Thursday, May 20, 2010

Использование скриптинга для выполнения рутинных операций. Первые шаги.

Прочитав книгу Эндрю Ханта и Дэвида Томаса "Программист-прагматик", я на какой-то момент стал одержим идеей использования скриптинга и использованием его в рутинных операциях. Как всегда пока сильно не хватает времени, чтобы взять и разобраться с maven, но было сильное желание быстро сделать что-то работающее. Сборка проекта начала занимать слишком много ценного времени, помимо того, нужно эту сборку закачать в базу данных, а также сделать "снимок" среды окружения проекта (например, дизайн бд, которая используется моей программой) и разослать всем заинтересованным лицам почтовые приглашения. Сначала я написал простой батник, который выполнял нужные процедуры по перемещению файлов и запускал NSIS. Позже получилось написать vbs скрипт, который делает все остальное.
Напишу о том, что было использовано в этом батнике.
На листинге1 пример организации цикла по набору, получаемому при вызове команды
dir, которая использует параметр /AD для того, чтобы получить только список каталогов и параметр /B, который нужен для того, чтобы выводились только имена файлов и ничего лишнего. Далее вызывается код по метке :dosub, в вызов которой передается значение переменной цикла %%а. При выполнении всего цикла скрипт завершает свою работу (команда exit).

Листинг 1. Пример цикла, который получает список папок по шаблону пути "releases\cobra_*"

for /f %%a in ('dir /AD /B releases\cobra_*') do (call :dosub %%a)
exit /B
:dosub
set release=%1
... некоторый скрипт, использующий переменную release


Команды, который использовались в скрипте:

rmdir /S /Q anydir - использовал для удаления иерархии папок без подтверждения, для того, чтобы очистить каталог, в котором происходит сборка от старых и посторонних файлов.

md - создание каталога
xcopy - копирование файлов, причем xcopy в моем случае просто необходимо, так как с помощью команды xcopy можно копировать целые каталоги с подкаталогами, в отличие от
copy. Параметры:
-D:m-d-y копировать файлы новее указанной даты,
если дата не указана, то копироваться будут более новые файлы.
-E - копировать все папки и подпапки, включая пустые.
-С - продолжить, даже, если произошла ошибка
-R - перезаписывать все файлы
-K - копировать атрибуты файла (просто xcopy сбрасывает признак "read only")
-Y - подавлять запросы о перезаписи существующий файлов

Листинг 2. Очередной кусок из жуткого батника, демонстрирующий копирование файлов.

rem
rem =============================
rem copy project files
rem =============================
rem
xcopy %inputDir%\cobra.ini %outputDir%
xcopy %inputDir%\artifacts.ini %outputDir%
xcopy %inputDir%\cobra.exe %outputDir%
md %outputDir%\plugins
xcopy %inputDir%\plugins %outputDir%\plugins /D /E /C /R /I /K /Y
md %outputDir%\p2
xcopy %inputDir%\p2 %outputDir%\p2 /D /E /C /R /I /K /Y
md %outputDir%\configuration
xcopy %inputDir%\configuration %outputDir%\configuration /D /E /C /R /I /K /Y


И вот пример вызова NSIS сборщика с использованием lzma-сжатия:

"c:\program files\nsis\makensis.exe" /X"SetCompressor /FINAL lzma" %installerDir%\intpc.installer.nsi

Далее вызывается vbs-скрипт, отвечающий за "публикацию" проекта (т.е. запись сборки в спец. лотусовую базу и рассылку уведомлений по почте по некоторому списку адресов) .

CScript -S _publish.vbs D:\projects\bpm\releases\%release%.exe
rmdir releases\%release% /S /Q

Какое-то время не знал, как сделать процесс сборки, так чтобы запустив экспорт rcp приложения, не нужно было дожидаться этой мучительно долгой процедуры, чтобы потом запустить батник, который отвечал за окончательную компоновку проекта. Оказалось, что можно подключить батник как внешний инструмент и запускать сразу же после запуска процедуры экспорта. Процедура экспорта rcp блокирует выполнение всех операций, до тех пор пока она не выполнится, а следовательно вызов внешнего инструмента сработает сразу после этой процедуры. Таким образом, при сборке я теперь экономлю около 30 минут, которые можно потратить на что-то действительно нужное и интересное. Хотя, конечно пока далеко до автоматических ночных сборок с запуском серий регрессионных тестов и интеграции с нормальной системой версионирования кода.

В следующем посте постараюсь более подробно рассказать о скрипте, отвечающем за публикацию.

No comments:

Post a Comment