воскресенье, 13 июля 2008 г.

Добавление версии рабочей копии в свойства файла

Последняя фича, которую я реализовал в системе автоматической сборки - вставка в файл информации о ревизии рабочей копии в которой происходила компиляция. Выглядит теперь это у нас вот так:


Понятно, что теперь тестировщики могут не только сообщать нам об ошибках, но и о том, в какой ревизии ошибка была обнаружена, что может сократить время ее устранение.

Как это делается. Когда-нибудь я опишу как у нас работает автоматическая сборка, сейчас же просто замечу, что она состоит из 3х файлов bat, и одной утилиты для отправки электронных писем из консоли. Кроме того, использует клиент Subversion, плюс компилятор Delphi и борландовский же компилятор ресурсов.

Итак, как это работает.
Для того, чтобы поместить в исполняемый файл информацию о версии, нужно создать дополнительный файл ресурсов и включить его в проект. По этому во всех файлах проекта у нас есть примерно такое:
{$IFDEF INCLUDEREV}
{$R version.res}
{$ENDIF}


Файл version.res генерируется автосборкой. Чтобы его сгенерировать, мы прежде всего должны получить версию рабочей копии. Делается это при помощи утилиты svnversion (входит в реализации Subversion и в некоторые консольные клиенты).

for /f %%i in ('svnversion -c %CODE_ROOT%') do SET SVNVER=%%i

for /F "tokens=1,2 delims=:" %%i in ("%SVNVER%") do (
SET T=%%j
if defined T (SET VER=%%j) else (SET VER=%%i)
)


Обратите внимание, ключ -c использовать обязательно, так как в противном случае выходной экзешник будет содержать не версию рабочей копии, а версию репозитория!
С ключем -c утилита svnversion выведет в консоль строку вроде "13:542", которую мы разбираем во втором цикле for и вытаскиваем из нее второе число. Это и есть версия рабочей копии. Следующий шаг - генерация файла version.rc, это делаем при помощи команды echo:

echo 1 VERSIONINFO >> %ROOT%version.rc
echo FILEVERSION 0, 0, 0, %VER% >> %ROOT%version.rc
echo PRODUCTVERSION 5, 6, 7, 8 >> %ROOT%version.rc
echo FILEOS VOS_UNKNOWN >> %ROOT%version.rc
echo FILETYPE VFT_UNKNOWN >> %ROOT%version.rc
echo BEGIN >> %ROOT%version.rc
echo BLOCK "StringFileInfo" >> %ROOT%version.rc
echo BEGIN >> %ROOT%version.rc
echo BLOCK "040904E4" >> %ROOT%version.rc
echo BEGIN >> %ROOT%version.rc
echo VALUE "CompanyName", " " >> %ROOT%version.rc
echo VALUE "FileVersion", " " >> %ROOT%version.rc
echo VALUE "FileDescription", " " >> %ROOT%version.rc
echo VALUE "InternalName", " " >> %ROOT%version.rc
echo VALUE "LegalCopyright", " " >> %ROOT%version.rc
echo VALUE "LegalTrademarks", " " >> %ROOT%version.rc
echo VALUE "OriginalFilename", " " >> %ROOT%version.rc
echo VALUE "ProductName", " " >> %ROOT%version.rc
echo VALUE "ProductVersion", " " >> %ROOT%version.rc
echo END >> %ROOT%version.rc
echo END >> %ROOT%version.rc
echo BLOCK "VarFileInfo" >> %ROOT%version.rc
echo BEGIN >> %ROOT%version.rc
echo VALUE "Translation", 1033, 1252 >> %ROOT%version.rc
echo END >> %ROOT%version.rc
echo END >> %ROOT%version.rc


И компилируем:
brc32 -r -fo%ROOT%version.res %ROOT%version.rc

Вот собственно и все, далее начинается компиляция проектов.