Вкратце, вся CI – это один скрипт обновления конфигурации на OneScript и несколько вспомогательных утилит, которые и делают всю магию непрерывной интеграции. Процесс разворачивания займет не так много времени и обойдется без использования билд серверов вроде jenkins. Результат выполнения скрипта будет приходить на e-mail в следующем довольном аскетичном, но тем не менее весьма полезном формате.
Нам потребуется:
- OneScript - среда для запуска скриптов на 1с-подобном языке.
- AutoUpdateBase.os - заранее подготовленный скрипт на OneScript.
- xUnitFor1C 4.2.0.0 – библиотека для unit-тестов.
- V8LogScanner 1.2. - утилита для парсинга логов ТЖ (требует Java 8). Это как бонус. Если хотите включить в итоговую почтовую рассылку срез N событий из файла ТЖ. Для себя я решил настроить утилиту так, чтобы включать в рассылку срез из самых медленных запросов за сутки.
- Конфигурация с поддержкой БСП с развернутым хранилищем, с которого будем получать изменения и клиент-серверная база, на которую будем накатывать изменения. Скрипт легко можно адаптировать и под файловые базы, но на момент написания статьи он этого делать не умеет.
Шаг 1
Итак, устанавливаем актуальную версию OneScript на любом компьютере, с которого будем запускать по расписанию скрипт. Я для этой цели использовал сервер приложений 1С. Лучше не устанавливать дистрибутив в папку program files, т.к. нам потребуется установить один дополнительный пакет и соответственно административные права на данный каталог.
Шаг 2
Добавляем в системную переменную path путь к основному исполняемому файлу oscript.exe, который спрятан в директории bin\ каталога OneScript.
Шаг 3
Устанавливаем с помощью пакетного менеджера opm, который входит в комплект с OneScript дополнительный пакет InternetMail.(спасибо автору) для работы с e-mail. Для этого открываем консоль cmd.exe и набираем
opm install InternetMail
Шаг 4
Распаковываем архивы с с xUnitFor1C и V8LogScanner и помещаем их внутри одного каталога на том же сервере, где установили OneScript. Например в каталоге D:\scripts\. Должно получится что-то вроде этого:
Шаг 5
Переходим к скрипту autoUpdateBase.os и кидаем его в ранее созданную папку (D:\scripts) . Открываем скрипт и редактируем глобальные переменные в функции Инициализировать()
// В функции задаются параметры базы, которую требуется обновить
Функция Инициализировать()
// ОБЩИЕ ПАРАМЕТРЫ
ПЛАТФОРМА_ВЕРСИЯ = "8.3.10.2580"; // если пустая строка, то будет взята последняя версия
КОМ_КОННЕКТОР = "V83.COMConnector";
РАБОЧИЙ_КАТАЛОГ = "D:\scripts\";
// ПАРАМЕТРЫ БАЗЫ
СЕРВЕР = "svrtest";
СЕРВЕР_ПОРТ = 1541; // 1541 - по умолчанию
БАЗЫ = Новый Массив;
БАЗЫ.Добавить("testdb");
ПОЛЬЗОВАТЕЛЬ = "user"
ПАРОЛЬ = "pwd";
// ПАРАМЕТРЫ ХРАНИЛИЩА
ХРАНИЛИЩЕ_ПУТЬ = "\\storage";
ХРАНИЛИЩЕ_ПОЛЬЗОВАТЕЛЬ = "UPD"; // заведите отдельного пользователя для скрипта
ХРАНИЛИЩЕ_ПАРОЛЬ = "";
// ПАРАМЕТРЫ КЛАСТЕРА СЕРВЕРА
ПОРТ_КЛАСТЕРА = СЕРВЕР_ПОРТ;
ПОРТ_АГЕНТА_СЕРВЕРА = 1540; // 1540 - по умолчанию
ИМЯ_АДМИНИСТРАТОРА_КЛАСТЕРА = "";
ПАРОЛЬ_АДМИНИСТРАТОРА_КЛАСТЕРА = "";
КонецФункции
Имена переменных говорят сами за себя, так что тут сложностей быть не должно. Для переменной ХРАНИЛИЩЕ_ПОЛЬЗОВАТЕЛЬ нужно завести отдельного пользователя в хранилище, иначе выскочит ошибка «Для этого пользователя уже есть связь с хранилищем». Обратите внимание на РАБОЧИЙ_КАТАЛОГ - это каталог, в который мы кинули скрипт и все остальные объекты.
Далее двигаемся в процедуру ОтправитьПисьмо() и редактируем параметры SMTP / POP3 почтового сервера для объекта ИнтернетПочтовыйПрофиль. Настройки полностью идентичны настройкам почты, которые мы бы задали непосредственно в платформе 1С. Там же можно посмотреть документацию по свойствам, с которыми возникают трудности. Мне было достаточно указать верный АдресСервераPOP3 и АдресСервераSMTP для того, чтобы почта заработала.
Процедура ОтправитьПисьмо(Тема, ТекстHTML, Вложения = Неопределено)
Профиль = Новый ИнтернетПочтовыйПрофиль;
Профиль.АдресСервераSMTP = "127.0.0.1"; // укажите свои данные
Профиль.ПользовательSMTP = ""; // укажите свои данные
Профиль.ПарольSMTP = ""; // укажите свои данные
Профиль.ПортSMTP = 25; // укажите свои данные
Профиль.ИспользоватьSSLSMTP = Ложь; // укажите свои данные
Профиль.АдресСервераPOP3 = "127.0.0.1"; // укажите свои данные
Профиль.ИспользоватьSSLPOP3 = Ложь; // укажите свои данные
Профиль.Пользователь = ""; // укажите свои данные
Профиль.Пароль = ""; // укажите свои данные
Сообщение = Новый ИнтернетПочтовоеСообщение;
Сообщение.Получатели.Добавить("receiver@company.ru"); // укажите свои данные
Сообщение.ОбратныйАдрес.Добавить("sender@company.ru"); // укажите свои данные
Сообщение.Отправитель = "sender@company.ru"; // укажите свои данные
Сообщение.Тема = Тема;
Сообщение.Тексты.Добавить(ТекстHTML, ТипТекстаПочтовогоСообщения.HTML);
Если Вложения <> Неопределено Тогда
Для каждого ФайлВложения Из Вложения Цикл
Сообщение.Вложения.Добавить(ФайлВложения);
КонецЦикла;
КонецЕсли;
Почта = Новый ИнтернетПочта;
Почта.Подключиться(Профиль, ПротоколИнтернетПочты.POP3);
Почта.Послать(Сообщение, , ПротоколИнтернетПочты.SMTP);
КонецПроцедуры
Вимание! Если вы не хотите использовать xUnitFor1C или v8LogScanner, а только само обновление с почтовой рассылкой, то закомментируйте в процедуре ОбновитьИБВПопытке() строчки ЗапуститьТесты() и ЗапуститьV8LogScanner()
Шаг 6 (опционально)
Настраиваем unit-тесты. Каждый тест - это отдельная внешняя обработка. Инструкцию и примеры о том, как пишутся тесты можно посмотреть в wiki xUnitFor1C . Если лень писать свой тест, то берем мой, который подходит для теста печати транспортной накладной конфигурации ЕРП 2.2. Впрочем тест выполнится без проблем на любой другой конфигурации, просто на почту к вам приедет результат теста со статусом ERROR. Подготовленный тест перемещаем в папку tests внутри каталога, в котором находится наш скрипт. Должно получится что-то вроде D:\scripts\tests\мой_тест.epf
Шаг 7 (опционально)
Настраиваем v8LogScanner. Для этого заходим в каталог, в который мы его установили и запускаем run_client.cmd . Запустится главное меню. Выберем, например, автопрофиль поиска блокировок и таймаутов с системе. Это позволит прямо в письме получать информацию о количестве блокировок за период. Критичная масса блокировок - это сигнал переходить в активным действиям.
Из главного меню делаем следующее: 4 Auto profiles => 9 Find 1c Deadlocks and Timeouts => 1 Select TOP FROM Locations => <Далее нужно указать вариант поиска папки из которой будут сканироваться логи ТЖ> (навигация выполняется с помощью ввода цифр - пунктов меню на клавиатуре).
Далее возвращаемся в главное меню Main (с помощью поочередного нажатия клавиши q) и выбираем 6 Other => 3 Save profile on disk => enter. Этим мы сохраним настройки парсинга в каталог утилиты в файл profile.json. При каждом следующем запуске настройки будут читаться из этого файла.
Также у вас должен быть уже настроен logcfg.xml в каталоге \1cv8\conf, чтобы логи из ТЖ записывались в выбранные ранее в утилите каталоги. Настроить logcfg.xml можно из главного меню Main утилиты. Для этого переходим в меню 5 Configure log.cfg и играемся конструктором лога.
Шаг 8
Скрипт настроен. Тестируем его работут вручную. Для этого открываем cmd.exe выполняем следующую команду.
oscript autoUpdateBase.os
Эту команду нужно выполнить из каталога в котором лежит наш скрипт. Если мы все сделали правильно, то после выполнения на электронную почту придет письмо с содержанием, показаном в начале статьи. К слову, обмен между скриптом и xUnitFor1C, а также v8LogScanner организован нехитро - через обычные текстовые файлы. Часть этих файлов приатачиваются к письму как вложения.
Шаг 9
Добавляем скрипт в планировщик заданий windows. Настройки задания должны быть следующие:
На этом все. Можно себя поздравить с успешным запуском элементарной системы непрерывной интеграции.