С одной стороны M-программисты настолько суровы, что любой прикладной софт пишут сами. И задача сборки проекта не должна вызвать особых затруднений. Действительно, что сложного в том, чтобы: сделать запрос к серверу контроля версий, разобрать ответ и вытащить номер ревизии, сравнить с номером ревизии загруженного кода, вызвать исполняемый файл и скачать исходники, загрузить их в базу, скомпилировать, сохранить результаты, сформировать отчет, прикрутить к этому всему web-интерфейс, добавить возможность изменения настроек, расписания, и так далее. С другой стороны – сколько времени вы на это собираетесь потратить?
Если больше пяти минут, то однозначно стоит обратить внимание на Jenkins. Делает все вышеперечисленное и будет экономить вам время каждый раз, когда необходимо собрать проект. Статья базируется на материалах лекции со школы инноваций 2013, но всё внимание сконцентрировано только на задаче-минимум — получение исходников, загрузка и компиляция в Caché, просмотр результатов.
Суть происходящего на видео ниже:
Все красиво, просто и удобно. Вся специфика работы с Caché скрыта в командном файле:
Для подключения к другим типам хранилищ можно воспользоваться плагинами
Если больше пяти минут, то однозначно стоит обратить внимание на Jenkins. Делает все вышеперечисленное и будет экономить вам время каждый раз, когда необходимо собрать проект. Статья базируется на материалах лекции со школы инноваций 2013, но всё внимание сконцентрировано только на задаче-минимум — получение исходников, загрузка и компиляция в Caché, просмотр результатов.
Суть происходящего на видео ниже:
- Скачиваем и устанавливаем Jenkins
- Настраиваем рабочую директорию и подключение к репозиторию
- Подключаем *.bat файл и оповещение по email
- Настраиваем работу по расписанию
- Запускаем сборки и смотрим результаты
Все красиво, просто и удобно. Вся специфика работы с Caché скрыта в командном файле:
- Для управления сервером Caché используется слабо документированная утилита cache.exe (находится в «каталоге установки Caché»\Bin\). По сравнению с cterm, она удобнее тем, что позволяет использовать обычный синтаксис Caché Object Script (вместо send-wait cterm-а), а результаты выполнения выводит в консоль текущего процесса. Последняя особенность позволит нам просматривать результаты сборки из интерфейса Jenkins.
- Серверу Caché для загрузки исходников необходимо передать путь к директории с исходниками. Но мы уже указали ее при настройке проекта в Jenkins. Jenkins, в свою очередь, перед запуском скрипта устанавливает соответствующие переменные окружения. Однажды и только однажды, так ведь? Поэтому используется прием, когда скрипт (cmd) создает скрипт (cos), прописывая в нем значения переменных Jenkins.
- Есть особенности в использовании символов % в командном файле windows, но они описаны даже в документации по Caché
Командный файл build.bat
:: '>' - создает и пишет в файл
:: '>>' - дописывает в файл
:: '@' - убирает из вывода саму команду
::Переключаем режим вывода на utf8 - для комфортного чтения логов
@chcp 65001
:: Проверим наличие переменной, инициализируемой Jenkins
@IF NOT DEFINED WORKSPACE EXIT 1
:: Сборка может завершится с разным результатом
:: Пусть наличие определенного файла в директории говорит нам о проблемах со сборкой
:: %CD% - [C]urrent [D]irectory это системная переменная
:: она содержит имя директории в которой запускается скрипт (bat)
@SET ERRFLAG=%CD%\error.flag
:: Удаляем файл-флаг неудачного завершения от предыдущего запуска
@DEL "%ERRFLAG%"
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: СОЗДАЕМ СКРИПТ УПРАВЛЕНИЯ CACHE
:: построчно записываем в build.cos команды для управления Cache
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Если Cache установлена с нормальной или повышенной безопасностью
:: то в первых двух строках имя и пароль пользователя Cache
@ECHO SuperUser>build.cos
@ECHO YourPassword>>build.cos
:: Переход в необходимый NAMESPACE
@ECHO zn "USER" >>build.cos
:: Загружаем и компилируем все исходники в директории сборки;
:: %WORKSPACE% - переменная Jenkins
@ECHO set sc=$SYSTEM.OBJ.ImportDir("%WORKSPACE%","*.xml","ck",.err,1) >>build.cos
:: Если не получилось, покажем ошибку, чтобы увидеть ее в логах Jenkins
@ECHO if sc'=1 do $SYSTEM.OBJ.DisplayError(sc) >>build.cos
:: и из скрипта cos создадим файл-флаг ошибки, чтобы оповестить скрипт bat
@ECHO if sc'=1 set file="%ERRFLAG%" o file:("NWS") u file do $SYSTEM.OBJ.DisplayError(sc) c file >>build.cos
:: Завершим процесс Cache
@ECHO halt >>build.cos
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Вызываем программу управления Cache и передаем ей сформированный скрипт ::
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
C:\InterSystems\Cache\bin\cache.exe -s C:\InterSystems\Cache\mgr -U %%SYS <%CD%\build.cos
:: Если при выполнении скрипта cos был создан файл-флаг ошибки - оповещаем об этом Jenkins
@IF EXIST "%ERRFLAG%" EXIT 1
Для подключения к другим типам хранилищ можно воспользоваться плагинами