НИКИТА ГРЫЗЛОВ ПЕРВАЯ МЕТОДИЧКА ОТ «СЕРЕБРЯНОЙ ПУЛИ» ИНЖЕНЕРА 1C И НЕ ТОЛЬКО МАТЕРИАЛЫ КУРСА "РАЗРАБОТКА ПО ПРОМЫШЛЕННЫМ СТАНДАРТАМ НА платформе 1 ^предприятие" ЧАСТЬ 2. ПРОФ. «ООО Серебряная Пуля» Грызлов Н. А. Пособие релиз-инженера 1C и не только Москва 2018 УДК ББК 004(063) 32.97 Г91 Груш «ООО Серебряная Пуля» Грызлов Н. А. Пособие релиз-инженера 1C и не только Г91 Груш «ОООСеребряная Пуля». Грызлов Н. А. Пособие релиз-инженера 1C Пособие релиз-инженера 1C и не только. — М., 2018 г. — 346 с., ил. ISBN 978-5-9908518-7-0 Книга посвящена вопросу создания автоматизированного процесса управления релизным циклом решений на базе платформы 1С:Предприятие 8. Она основана на учебном курсе «Разработка по промышленным стандартам на платформе 1C: Предприятие», компании «Серебряная Пуля». В книгу включены материалы, описывающие современные практики управления релизным циклом, инструментарий автоматизации выпуска релизов, проверки качества кода, подробно рассматриваются вопросы виртуализации и контейнеризации инструментов релиз-инженера. Книга рассчитана на разработчиков 1C, занимающихся выпуском и развертыванием решений в рабочих контурах, а также технических руководителей команд, ответственных за улучшение качества кода решений, создаваемых на платформе «1С:Предприятие 8». Рассматриваемые в книге инструменты преимущественно следуют философии открытого программного обеспечения (Open Source). УДК 004(063) ББК 32.97 ISBN 978-5-9908518-7-0 Silver Bulleters, LLC Оглавление Раздел 1. Введение....................................................................................................................................................................... 8 Раздел 2. CI-CD................................................................................................................................................................................9 2.1. Непрерывная интеграция................................................................................................................................................ 9 2.2. Непрерывная поставка и непрерывное развертывание.......................................................................................... 12 Раздел 3. OneScript.................................................................................................................................................................... 14 3.1. Пакеты oscript.................................................................................................................................................................. 14 3.2. Хаб пакетов...................................................................................................................................................................... 20 3.3. GitSync - синхронизация хранилища 1C с репозиторием git....................................................................................27 3.4. Deployka - развертывание конфигурации 1C на имеющейся базе........................................................................ 31 3.5. Vanessa-runner - автоматизация рутины.....................................................................................................................32 3.6. Packman - сборка тиражируемых дистрибутивов 1С-конфигураций.................................................................... 33 Раздел 4. Docker...........................................................................................................................................................................35 4.1. Принципы работы Docker.............................................................................................................................................. 35 4.2. Установка Docker на Windows.......................................................................................................................................37 4.3. Kitematic - графический интерфейс по управлению контейнерами...................................................................... 44 4.4. Установка Docker на Linux.............................................................................................................................................. 45 4.5. Установка docker-compose............................................................................................................................................. 51 4.6. Hello, Docker!.................................................................................................................................................................... 53 4.7. Управление контейнерами с помощью Kitematic.....................................................................................................58 4.8. Dockerfile. Собственный образ Docker......................................................................................................................... 62 4.9. Монтирование разделов............................................................................................................................................... 68 4.10. Композитное docker-приложение.............................................................................................................................. 73 Раздел 5. GIT-сервер................................................................................................................................................................... 79 5.1. Обзор имеющихся GIT-серверов.................................................................................................................................. 79 5.2. Git La Ь СЕ - способы установки.................................................................................................................................... 82 5.3. Установка GitLab через Docker Compose...................................................................................................................... 85 5.4. Первоначальная настройка GitLab............................................................................................................................. 104 5.5. Обновление сервера GitLab......................................................................................................................................... 110 Раздел 6. Серверы непрерывной интеграции...................................................................................................................... 117 6.1. Обзор имеющихся серверов сборок.......................................................................................................................... 117 6.2. Jenkins Cl - способы установки....................................................................................................................................119 6.3. Jenkins master - установка............................................................................................................................................ 121 6.4. Базовые настройки........................................................................................................................................................130 6.5. Задача Hello, world!.......................................................................................................................................................138 6.6. Jenkins Slave - установка и подключение................................................................................................................... 143 6.7. Переменные среды - уровень задачи, ноды, сервера........................................................................................... 150 Раздел 7. Синхронизация хранилища 1C с GIT................................................................................................................... 155 3 Никита Грызлов. Пособие релиз-инженера 1C 7.1. Подготовка репозитория..............................................................................................................................................155 7.2. Запуск GitSync из консоли............................................................................................................................................159 7.3. Задача GitSync................................................................................................................................................................ 161 7.4. Триггеры задачи GitSync............................................................................................................................................... 168 Раздел 8. Сборочная линия..................................................................................................................................................... 172 8.1. Понятие сборочной линии в Jenkins...........................................................................................................................172 8.2. Hello from Pipeline!........................................................................................................................................................ 176 8.3. Параллельное выполнение задач..............................................................................................................................182 Раздел 9. Тестовый контур...................................................................................................................................................... 186 9.1. Создание тестовой базы............................................................................................................................................... 186 9.2. Использование Deployka для обновления тестовой базы.................................................................................... 187 9.3. Сборочная линия - Обновление тестовой базы..................................................................................................... 197 Раздел 10. Тесты поведения - BDD......................................................................................................................................... 218 10.1. BDD-тестирование с помощью продукта Vanessa-ADD......................................................................................... 218 10.2. Подготовка базового VBParams.json........................................................................................................................222 10.3. Конфигурирование Jenkins - подключение Allure................................................................................................. 232 10.4. Сборочная линия - запуск проверки BDD............................................................................................................... 235 10.5. Сборочная линия - Allure.......................................................................................................................................... 237 Раздел 11. Отчеты по тестам - BDD........................................................................................................................................ 246 11.1. Конфигурирование Jenkins - подключение Cucumber Reports........................................................................... 246 11.2. Сборочная линия - публикация результатов Cucumber Reports......................................................................... 247 11.3. Конфигурирование Jenkins - подключение Pickles............................................................................................... 250 11.4. Сборочная линия - публикация результатов работы Pickles.............................................................................. 253 Раздел 12. Тестирование кодом - xUnitForlC, TDD.............................................................................................................261 12.1. Прогон тестов, в т.ч. и дымовых тестов, с помощью продукта Vanessa-ADD.................................................... 261 12.2. Конфигурирование дымовых тестов....................................................................................................................... 265 12.3. Конфигурирование Jenkins - Подключение junit reports......................................................................................267 12.4. Сборочная линия - Запуск xUnitForlC..................................................................................................................... 268 12.5. Публикация junit reports.............................................................................................................................................269 Раздел 13. Подготовка поставки.............................................................................................................................................273 13.1. Подготовка манифеста для Packman....................................................................................................................... 273 13.2. Packman - Запуск из командной строки.................................................................................................................. 277 13.3. Сборочная линия - Сборка дистрибутива............................................................................................................... 282 Раздел 14. Расширение сборочной линии............................................................................................................................287 14.1. Цикломатическая сложность кода - расчет из командной строки....................................................................287 14.2. Создание задачи расчета цикломатической сложности......................................................................................289 14.3. Сборочная линия - включение расчета цикломатической сложности............................................................. 293 14.4. Дублирование кода - расчет из командной строки.............................................................................................. 300 14.5. Создание задачи расчета дублирования кода...................................................................................................... 306 4 Silver Bulleters, LLC 14.6. Сборочная линия - включение расчета дублирования кода............................................................................. 316 Раздел 15. Непрерывная проверка качества кода.............................................................................................................318 15.1. О концепции Continuous Inspection....................................................................................................................... 318 15.2. Инструментарий для проверки качества кода..................................................................................................... 320 15.3. Установка sonar-scanner локально..........................................................................................................................325 15.4. Настройка свойств проекта для SonarQube...........................................................................................................327 15.5. Пробный запуск sonar-scanner................................................................................................................................ 328 15.6. Конфигурирование Jenkins - установка sonar-scanner........................................................................................332 15.7. Сборочная линия - Непрерывная проверка качества кода................................................................................ 335 Раздел 16. Заключение............................................................................................................................................................341 Раздел 17. Приложения для самообразования.................................................................................................................. 342 17.1. Блок теории - вопросы для самопроверки............................................................................................................342 17.2. Домашние задания для реализации в процессе чтения.....................................................................................345 5 Никита Грызлов. Пособие релиз-инженера 1C Предисловие Данное методическое пособие представляет собой описание действий, необходимых для выполнения сотрудником, ответственным за запуск процесса автоматизированного управления релизами решений на базе платформы 1С:Предприятие. Пособие предназначено для специалистов, которые желают имплементировать процесс релизинженерии в своей или в своих командах. Вместе с этим для чтения данного пособия недостаточно одних только знаний по платформе 1С:Предприятие, поэтому обращаем ваше внимание на базовые навыки и знания, которые вам понадобятся, а это: • Понимание базовых команд децентрализованной системы контроля версий GIT (таких как git pull, git push, git commit и git add) • Умение работать с командной строкой для запуска консольных приложений, многие примеры в данном пособии будут даваться, как пример запуска командной строки из консоли. Основой данного пособия является видеокурс: "Разработка по промышленным стандартам на платформе 1С:Предприятие часть 2.", однако пособие является отдельным артефактом и может использоваться как самостоятельный продукт. Авторами данного пособия являются сотрудники компании «Серебряная Пуля» • Автор основного контента о Никита Грызлов • Соавторы о Евгений Бессонов о Артур Аюханов о Андрей Овсянкин о Алексей Лустин Отдельно стоит упомянуть участников сообщества OpenSource, без работы которых возникновение инструментария, описанного в данном пособии, было бы невозможно. Поэтому мы благодарны: • Евгению Сосне - за исследование в области применения Jenkins и 1C. • Виктории Дорохиной - за исследования в области поддержки языка 1C в интегрированных средах разработки, отличных от 1С:Конфигуратора. Так что же такое релиз-инженерия на платформе 1С:Предприятие ? Формально- это автоматизация процесса сборки, тестирования и развертывания решений. Но как именно нужно автоматизировать этот процесс? Об этом рассказывает данное пособие. 6 Silver Bulleters, LLC Как читать и как использовать Книга разбита на несколько разделов, начиная от самого простого к самому сложному. Поэтому для поиска следует использовать оглавление разделов. Разделов в нашей книге - 16, тематически они разбиты на 3 части: Часть 1 - Теоретическая: разделы с 1 по 3. Часть 2 - Теоретически-практическая: разделы 5, 6,14 и 15. Часть 3 - Практическая: разделы 4, 7, 8, 9, 10,11, 12 и 13 Раздел 16 является отдельным заключительным и представляет собой по смыслу отдельную часть, в которой даны рекомендации по дальнейшему развитию собственных компетенций. В конце части разделов предусмотрено выполнение домашних заданий, которые мы, как авторы считаем важным элементом обучения, поэтому настоятельно рекомендуем их выполнить. Для каждого домашнего задания описаны критерии успешности его выполнения для осуществления самоконтроля. Актуальность версий В рамках пособия используются актуальные версии программного обеспечения на момент выпуска исходного курса, поэтому на части картинок вы можете наблюдать программное обеспечение старых версий. В таком случае мы используем примечания с указанием изменений в актуальных версиях на момент выпуска данного пособия в печать. Вместе с этим хотим обратить внимание, что: • Инструментарий, который выбирался для автоматизации описываемого процесса, выбирался, в том числе, по такому критерию, как "Поддержка обратной совместимости функциональности". В подавляющем большинстве случаев, описываемая функциональность тех или иных инструментов не утратила актуальности. В случаях, когда описанное программное обеспечение претерпело существенные изменения - обращайте внимание на примечание со списком изменений по сравнению с версией, описанной в данном пособии. Этих мер будет достаточно для исключения проблем с новыми версиями ПО. • В случаях нахождения проблем при использовании старых версий при работе с пособием, вы можете воспользоваться помощью команды "Серебряная Пуля", описав проблему на онлайн форуме, находящемся по адресу https://xdd.silverbulleters.org - сообщество релиз-инженеров 1C поможет вам решить указанную проблему. Ссылки на демонстрационные материалы, которые сделают чтение данного пособия более эффективным даны в разделе 17.2 «Домашние задания» данного пособия, вопросы для самопроверки даны в разделе 17.1 «Блок теории». 7 Никита Грызлов. Пособие релиз-инженера 1C Раздел 1. Введение Мир требует скорости разработки и появления всё новой и новой функциональности для автоматизации процессов. Платформа 1C позволяет этого достичь, однако для обеспечения должного уровня качества выпускаемых решений требуется обеспечить дополнительные процедуры, не относящиеся непосредственно к разработке, а относящиеся к управлению качеством продуктива. Большинство этих процедур многие выполняют вручную, что снижает скорость поставки новой функциональности пользователям. В этой книге мы с вами познакомимся с концепциями непрерывной интеграции и непрерывной поставки, а также их применением в мире 1C. Пару слов об имеющейся инфраструктуре. Для записи материалов этой книги мною была поднята виртуальная машина с Windows 10 Professional (для пользователей linux программное обеспечение будет таким же). На эту виртуальную машину был установлен следующий инструментарий: Список инструментов-txt X * visual Studio Code * Language.К (BSL) Plugin * Oracle Java Developeent Kit 8 р * Git * Vanessa Behavior ❖ * OneScript ” Google Огиве * 7Iip * 1C 8-3-10 • База • Хранилище • Visual Studio Code - редактор исходных кодов о Для поддержки языка 1C на него был установлен плагин Language 1C (BSL) Plugin. • Также была установлена Java Development Kit версии 8 от Oracle. • Git • С помощью Git был склонирован репозиторий Vanessa Behavior (см. примечание ниже). Рис. 1 - основной инструментарий • ~ Был установлен интерпретатор языка 1С. OneScript. • В общении с внешним миром нам будет помогать Google Chrome. • Открывать архивы мы будем с помощью 7Zip. • Также была установлена платформа 1C версии 8.3.10: о Создана база с простейшей конфигурацией - прототипом учетной системы для склада. Эта конфигурация содержит несколько справочников, таких как Товары и Склады, один документ Приходная накладная и регистр накопления Остатки на складах. о А также создано хранилище 1C, подключенное к этой базе. Построение нашего контура непрерывной интеграции мы будем рассматривать на примере разработки в этом хранилище. Примечание: По состоянию на 2018 год уже нет необходимости клонировать репозиторий vanessa-behavior. На базе продуктов xUnitFolC и vanessa-behavior выпущен продукт Vanessa-ADD, расположенный по адресу https://github.com/silverbulleters/add. Для его установки достаточно выполнить команду орт install add. Пакетный менеджер орт описан в разделе 3 данной книги. 8 Silver Bulleters, LLC Раздел 2. CI-CD 2.1. Непрерывная интеграция Итак, давайте познакомимся с концепциями, которые нам с вами предстоит реализовать. Начнем с непрерывной интеграции. Прежде чем уходить в детальное описание этой концепции, обратимся к семантике этого словосочетания. Большинство разработчиков 1C, когда слышат слово «Интеграция», представляют себе обмен между несколькими системами. Например, данные о товарах из Управления торговлей могут синхронизироваться с сайтом. Однако, интеграция - это не только взаимодействие нескольких систем. (« иедом гередезржипм») Рис. 2 - взаимодействие в процессах учета Например, в конфигурации Управление производственным предприятием есть и бухгалтерский учет, и зарплата, и работа с закупками, и работа со складом. Это разные подсистемы или модули, которые в составе одной конфигурации взаимодействуют друг с другом, и проверка интеграции в такой системе это проверка взаимодействия ее модулей. Если копнуть чуть глубже и разделить каждую крупную подсистему на более мелкие блоки, то окажется, что одни и те же данные, проходя через бизнеспроцесс, могут модифицироваться в нескольких местах. 9 Никита Гоызлов. Пособие релиз-инженера 1C ll <Sl_ Управление торговлей УпрййЯймие цея^жзм поджйком Утщааленж финансами Рис. 3 - циклическое изменение данных Таким образом, интеграция в контексте тестирования - это проверка совместной работоспособности различных модулей конфигурации. В традиционных или, условно, негибких моделях разработки интеграция - это заключительный процесс, когда несколько разработчиков, реализующих различные блоки одного продукта, ближе к завершению проекта пытаются слить воедино свои наработки (Рис. 4). Обычно на этих стадиях всплывают различные недоработки в точках соприкосновения систем. Например, несоответствие ожидаемых передаваемых параметров действительным. Рис. 4 - традиционная модель разработки Как правило, процесс решения таких проблем оперативный - команда разработчиков устраняет по одному все несоответствия и проверяет работоспособность системы. Такой оперативный подход может непредсказуемо задержать окончание проекта. Ошибки интеграции намного быстрее выявляются и исправляются, если проводить регулярное тестирование совместной работоспособности модулей. Если такое тестирование проводится постоянно и на каждое изменение исходного кода, то оно и называется непрерывной интеграцией. 10 Silver Bulleters, LLC У такого подхода есть начальные требования: • Весь исходный код и библиотеки, необходимые для сборки и тестирования продукта, должны находиться в системе контроля версий. • И второе - количество действий человека в сборочном процессе должно быть минимизировано. В идеале, сборка должна происходить полностью автоматически. * Получение исходного кода * Сборка проекта * Выполнение тестов * Развертызание на демо-контуре * Отправка отчетов и архивирование результатов сборки) Рис. 5 - шаги непрерывной интеграции Обычно для целей непрерывной интеграции организуется выделенный сервер, который для каждого изменения исходного кода выполняет цепочку из пяти шагов (Рис. 5): • Первый шаг - это актуализация локальной копии исходного кода и необходимого инструментария. • Второй - сборка проекта и подготовка необходимого окружения. • Третий - это выполнение тестов - как модульных, так и интеграционных. • В случае успешного прохождения тестов, собранный проект разворачивается на демо-контуре. • И заключительный шаг - это отправка отчетов о результатах сборки и архивирование. В концепции непрерывной интеграции отдельно выделяют так называемые «ночные сборки». Эти сборки запускаются по расписанию, обычно ночью, для того, чтобы к началу следующего рабочего дня были готовы свежие результаты тестирования, и сразу можно было приступать к исправлению выявленных ошибок. Какие же преимущества и недостатки у подхода непрерывной интеграции? Начнем с преимуществ: • Различные проблемы интеграции (и просто нерабочий код) выявляются и исправляются достаточно быстро. А чем раньше была обнаружена и исправлена ошибка, тем меньше вреда она нанесла, и тем меньше денег потерял бизнес. • Следующий полезный эффект - это постоянное наличие стабильной и работоспособной сборки для целей демонстрации заказчику или выполнения ручного тестирования. • Также быстрое получение результатов сборки отучает разработчиков помещать в хранилище неработоспособный код. Недостатки же кажутся незначительными: • Вам потребуется тратить время и силы на поддержку такого контура проверки, начиная от инфраструктуры и заканчивая написанием специальных скриптов для работы этого контура. Важный момент-единоразовым внедрением сервера непрерывной интеграции и написанием первоначальных скриптов для этого сервера дело не ограничивается. После того, как у вас 11 Никита Грызлов. Пособив релиз-инженера 1C появится работоспособная система проверки вашего продукта, вы погрузитесь в постоянное улучшение этого процесса. Вам захочется добавить в сборку вычисление каких-нибудь дополнительных метрик по вашему коду, интегрировать процесс сборки с вашими корпоративными мессенджерами (будь то Slack или Skype) или просто добавить какие-нибудь дополнительные инструменты. 2.2. Непрерывная поставка и непрерывное развертывание С понятием непрерывной интеграции неразрывно связано понятие поставки. непрерывной Непрерывная поставка расширяет процесс непрерывной интеграции. После того, как мы убедились, что наш продукт функционирует, и он успешно развернут на тестовом контуре, мы можем переходить к развертыванию нашего продукта на production-системе. Концепция непрерывной поставки также подразумевает полную автоматизацию. В идеале, развертывание на production-контуре - это нажатие одной кнопки. Непрерывная интеграция предоставляет нам готовый к разворачиванию дистрибутив. Задача непрерывной поставки - развернуть этот дистрибутив для конечного пользователя. Непрерывная поставка: • с одной стороны, ускоряет появление новой функциональности у конечного пользователя, что позволяет быстрее получить от него обратную связь, и при необходимости, скорректировать имеющуюся функциональность, • ас другой стороны, налаженный и частый процесс развертывания в production-контуре снижает количество аварий, связанных с этим процессом. • Также автоматизация процесса развертывания сокращает время разработчиков и инженеров, которое раньше тратилось на ручное обновление production-контура. У концепции непрерывной поставки есть несколько ограничений. • Не все пользователи любят частые обновления своих программ. Особенно это проявляется в критичные периоды (вспомните закрытие месяца в бухгалтерском учете). • Не все обновления можно применить незаметно для пользователя. Например, в случае изменения структуры базы данных 1C потребуется монопольный доступ к системе, да и к динамическому обновлению стоит прибегать только в крайнем случае. • Критичным также является и требование о совпадении окружения у разработчика и в production-контуре. Это требование обычно нивелируется средствами виртуализации. • И, несмотря на то, что цель непрерывной поставки - это как можно быстрее обновлять продуктивный контур, запуск такого обновления все равно инициируется инженером. 12 Silver Bulleters, LLC Continuous Delivery c£> c=£> c=£> t=£> Continuous Deployment Puc. 6 - непрерывная поставка Схематично процесс непрерывной поставки можно представить так (Рис. 6). • После автоматического выполнения модульных тестов; • Разворачивания на демо-контуре; • И выполнения приемочных тестов • Ответственный инженер должен нажать «большую красную кнопку», которая выполнит разворачивание на production-среде; • И осуществит проверку успешности этого действия. Следующей ступенью развития в процессе поставки функциональности конечному пользователю является концепция непрерывного развертывания. Она полностью совпадает с непрерывной поставкой за исключением единственного, но самого важного отличия - разворачивание на production- окружении происходит полностью автоматически. В мире 1C такой подход несколько модифицируется. Обычно, если разработчики хотят обновлять production-окружение, они настраивают специальную задачу, которая ночью или в другой момент отсутствия в базе пользователей автоматически обновляет базу и выполняет финальные проверки. Так как процесс непрерывной интеграции (в английском варианте Continuous Integration) и непрерывной поставки (Continuous Delivery) неразрывно связаны, то эти термины часто употребляют вместе. В сокращенно варианте это звучит как CI-CD. В рамках этой книги мы будем с вами настраивать сборочный процесс нашей конфигурации вплоть до шага «Разворачивание на production». Однако, инструменты, которыми мы будем разворачивать нашу конфигурацию на демо-контуре, практически без изменений можно применять и для разворачивания на production-системе. 13 Никита Гоызлов. Пособие релиз-инженера 1C Раздел 3. OneScript 3.1. Пакеты oscript Довольно большая часть инструментов, которыми мы будем пользоваться в этом пособии, написана на языке 1C и запускается с помощью OneScript. OneScript - это свободный интерпретатор языка 1C, написанный на C# с поддержкой запуска в windows/linux посредством платформы Mono. Файлы сценариев или скрипты, написанные для OneScript, можно запускать без использования платформы 1С:Предприятие. Рис. 7 - страница релизов oscript.io Если у вас еще не установлен OneScript (или Oscript, как он называется в своем более коротком варианте), вы можете скачать инсталлятор на официальном сайте проекта oscript.io (Рис.7). Перейдем на главную страницу сайта проекта и нажмем на большую зеленую кнопку «Скачать». У вас появится возможность выбрать одну из двух версий сборок: либо актуальную (стабильную), либо версию в разработке (так называемую ночную сборку). Примечание: также можно использовать отдельный продукт ovm (OScript Version Manager) расположенный по адресу https://github.com/silverbulleters/ovm 0VM позволяет упростить установку версий lscript. Например, команды ovm install stable dev && ovm use stable автоматически скачают и подключат интерпретатор к вашему окружению. 14 Silver Bulleters, LLC □ I v I fib _5 ' Q Гздииля - ф Поде.тмтыя X © Вид Этот компьютер » Локальный диск (С:} > Program Files (xSo) > OneScript > lib -• Дата изменения Тип 1 commands 16.032017 1703 Папка е файлами Itestrunne* 16.03.2017 17(8 Папка с файлами asserts 1603201? 1703 Папка с файлами cmdline 16,03201? 17X8 Папка с файлами ft 16X8201? Ш8 Папкаг файлами 9» gitsync 15.032017 1703 Папка с файлами workspace json 16.0320171703 Папка < файлами logos 15.03.201? 1703 Папка с файлами opm 16.G3-2H7 1783 Папка с файлами ParserFiteVSi 16.0320171783 Папка с файлами strings 16.02203717:03 Папка с файлами tempfifes 16X820171703 Папка с файлами tooll cd 16.(82017 57:83 Папка с файлами vSrunner 16.03205? 1703 Папка с файлами 37.0320372812 Файл "OS" fte» v С? Поиск: bfe Я & Быстрый доступ В Рабочий стол Загрузки Ь' Документы •7 Изображения В Видео * * * JS Музыка One-Drive ©3 Этот компьютер Сеть fj package-loader-cs '7- Элементе?» 15 Рис. 8 - пакеты, входящие в поставку oscript В интерпретаторе OneScript по аналогии с внешними компонентами на платформе 1С:Предприятие, есть возможности расширения функциональности с использованием так называемых пакетов. Пакеты бывают двух типов. • Это либо библиотека, которую вы можете подключить в своем скрипте и использовать методы и классы, которые она предоставляет • Либо приложение, когда пакет предоставляет некий командный интерфейс для своего запуска из командной строки. Если вы уже версионируете внешние отчеты и обработки, вам знаком один из таких пакетов - это PrecommitlC - утилита, которая раскладывает внешние отчеты и обработки в исходники при выполнении коммита в Git. При установке OneScript помимо движка, который запускает файлы скриптов, также ставится стандартный набор библиотек. При использовании операционной системы Windows, вы можете найти этот набор в папке установки OneScript. По умолчанию, это диск С, каталог Program Files (х86) (если у вас 64-битная система), папка OneScript и внутри каталог lib (Рис. 8). 15 Никита Грызлов. Пособие релиз-инженера 1C Структура пакета в общем случае может быть произвольной. Например, если мы откроем каталог библиотеки strings, то увидим отдельно лежащий файл с расширением **.os в корне этого каталога (Рис. 9). Однако для более сложных пакетов существует стандарт структуры каталогов. Например, если мы откроем каталог орт (каталог пакетного менеджера OneScript (Рис. 10), то мы увидим, что в нем: • Отдельно выделен каталог с исходным кодом (src); • Отдельно - каталог с тестами (tests); • И ряд дополнительных служебных файлов. т ~ □ орт Поделиться Главнее © О > Этет компвюгер » Локальный диск (С:) > Program Files (xS6) » OoeScr.pt > Bb > opm > ф Итак Дата изменения Тип 14.032017 Шй Папка с файлами Размер > Быстрый доступ -vseoefe М Рабочий стол * * 1Ш20171&3& Папка с файлами 4- Загрузки tests 1бД32017П'.00 Папка с файлами Т Документы * В дКдм» 07ЖЖЙ72&12 Т ежетееый докум.... ■№ Изображения * «в fife,config 11.0320171&38 Исходной файл ... m П LICENSE 07.03201720:12 Файл 12№ £_ opm-metadaU.xm! 16.03201717&3 Документ 1 КБ D packagedef G7.032G572&12 Файл 1КБ * REAOME-md 07.032017 2й 12 Исхедный файл... 2 КБ grt workspace §| Видео J> Мушм « к НФ OneDfive Q|S Этот компьютер Сеть Элемснтое- 5 Выбрит 1 элемент Рис. 10 - структура пакета с тестами, лицензией и пр. В каталоге с исходным кодом отдельно выделены (Рис. 11): 16 X Вид • каталоги для классов и модулей, которые предоставляет этот пакет, • и точка входа в приложение - файл opm.os. Поиск ©pm /Э Silver Bulleters, LLC гм»«а» В . »• ф ; > Эготкоып&йзгер %■ Ляеаждшй диск {С:} » Ргеешп Fife (хЙ§ * OneScript » ib > ©pm & arc Йш Дт ш«»жж т» РжШф #- Быстрый доступ KiMCCbt ПЖ26Ш&38 nans « фввзшш И Р«,&Ч'йЙ с ге я & . Медули?. ’"‘ 1ШЖЛ&38 Пм» < фЛи/и • Загрузки # □ ©£НП-О$ * ад,аз17 ша Файд "ОУ f§ Документы «R йд *” Изображения & ’■ 5й workspace S Видео Му»!» fMeJSjw© S Этет компьютер Сеть Рис. 11 - типовая структура каталогов пакета Основной сценарий использования библиотек - это подключение их в собственных скриптах. Для демонстрации откроем редактор Visual Studio Code, создадим новый файл и сохраним его с расширением *.os (расширение OneScript). Обратите внимание, что языковой режим переключился на 1C (BSL). Подключение библиотек производится с помощью специальной директивы #Использовать. После этой директивы идет название библиотеки, которую мы хотим подключить. Например, #Использовать tempfiles. е>4 • testes - Visual Studio Code J а Ял Г зэекэ Выбор B.'z Переход С-разка Дузбро пожаловать testos ■| • #Использовать berapfiles - ' ' Л Путь = ВременныеФайлы.СоздатьФайл(); Ф Рис. 12 - подключение библиотеки в коде Как только мы написали эту директиву, в контексте нашего скрипта стали доступны классы и модули, которые предоставляет данная библиотека. Например, В случае tempfiles это модуль «ВременныеФайлы», у которого есть функция «СоздатьФайл()». Эта функция вернет нам путь к созданному временному файлу с указанным расширением, если мы его передали. В данном случае, мы расширение не передаем, поэтому во временном каталоге будет создан файл с расширением *.tmp. (Рис. 12) Запуск второго типа пакетов (приложений) производится из командной строки. На данный момент у нас уже установлено одно такое приложение. Это пакетный менеджер OneScript - приложение орт. Откроем командную строку и попробуем вызвать пакетный менеджер орт (Рис. 13). При выполнении этой команды будет выведен стандартная справка данного приложения, в которой определен состав возможных команд. 17 Никита Грызлов. Пособив релиз-инженера 1C SS Командна» строка X □ Microsoft Windc-iu-s (Version 10.6.14-393} (с) корпорация Иэйхрософт (Microsoft Corporation), 2016. Все орава зжвшены. C:\Upers\test>ор-г» Rescript Package Manager vS.9.4 Возможные команды: build - Собрать пакет из исходников гоп - выполнить произвольную задачу test - Выполнить тестирование проекта prepare - Подготовить новый каталог разрабатываемого пакета install - Вьтоямитъ установку. Если указано имя пакета, гфоксх-одит установка из хаба или из файла, в обратном случае стаиавлива-»тся зависимости текущего пакета по файлу packaged©*, update - Обновить пакет зрр - Создать bat-файл для запуска скрипта в указанном каталоге config - Задать пользовательские настройки list - Вывести список пакетов version - Вывести вереи» продукта help - Справка по команда* Иабергге орга help <команда>* чтобы выжти справку по К’ЕЖйнж С: \User sYlest > к с Рис. 13 - результат запуска приложения орт Приложение, написанное для OneScript, можно вызывать из командной строки, потому что при его установке сформировался специальный файл запуска. Этот файл имеет расширение .bat в случае Windows-систем или .sh для Linux-систем. И расположен там же, где и основной исполняемый файл OneScript - в каталоге установки OneScript, подкаталог bin (Рис. 14). □ X - 0 * -ф О > Этот компьютер > Локальный диск (С:) » Program Files (x86j » OneScript * bin Имя Дата шкнемм Тип ISetruniptiMt В. д«$упс.ЬЙ 16ЖЖ717&3 Парный ф®йл... 16,03281717:03 Пакетной ф»йл... 1КБ @ 1са»н:«ыл«ыЕ 07.012017 >12 Раш»ире«^«ри,., §12 КБ Размер Быстрый доступ в Рабочий СТОЯ 8 ♦ s»rp>3« '-f it g Документы :Й Изображения * S 9« workspace S Ьда ЙЬОпеОгые lonic.Zip.dli 1КБ 07.0320172012 Расширение при.-. 452 КБ t; NeAtonsehJson.dli 07Д5Ж7Ж12 Расширен*® ??{$«.... 47§ КБ Z~ opm.hat 16.03201717ДЗ Пакетный файл.. 1КБ M eseript.cfg 07.03201? >12 Файл 'СНГ 1КБ j? oscriptece 1Ш2ВГ71ЭЙ7 Приложение SS5KE Й ScripIEngiM-.!® 14.032017 Расширен^ врж.. 183 КБ _ 14Д320171-1Л Расширение при... 203 КБ 14.0320*-? 1327 Прйломен^е 24£КБ 5cripttngine.Ho«tedScf!pt.dll О TestApp.exe 3i лиопяи Сеть Элементов; 11 Рис. 14 - каталог bin с файлами запуска приложений oscript 18 Понос bin p Silver Bulleters, LLC Если мы посмотрим на состав файлов, то увидим файл opm.bat. Откроем его в редакторе (Рис. 15). «3 opm-bat - Visual Studio Code Файл Правка ’: р Зыоср Вид . Переход ! ■■ Справка • opm.hat X jfosrript.exe "С:\Program Files fxSeVYeneScript \1ibtops''. srcAopir. c-.' X* @'dt Zb XERRORLEVEL* Рис. 15 - командный файл запуска приложения oscript Мы видим, что, по сути, этот bat-файл всего лишь запускает интерпретатор OneScript, передавая ему: • Путь к основной точке входа для библиотеки орт (файлу орт.os); • И аргументы командной строки, с которыми был вызван данный командный файл. С помощью пакетного менеджера орт можно получить весь список установленных в системе пакетов. Для этого существует команда opm list. Откроем командную строку и вызовем эту команду (Рис. 16). Рис. 16 - результат работы команды орт list В выводе команды мы видим список установленных пакетов. 19 Никита Грызлов. Пособие релиз-инженера 1C 3.2. Хаб пакетов Пакеты OneScript распространяются тремя способами. • Первый - обновление стандартной библиотеки происходит вместе с установкой новой версии интерпретатора OneScript, • Второй - пакеты можно обновить, скачав новую версию с GitHub в виде zip-архива или полной копии репозитория. • Третий - через пакетный менеджер OneScript. Первый способ обновления вполне понятен, поэтому рассмотрим подробнее оставшиеся варианты. Все пакеты, входящие в стандартную библиотеку, опубликованы на Git-сервере GitHub, в специальной организации oscript-library по адресу https://github.com/oscript-library . Открываем в браузере сайт github.com и перейдем в организацию под названием oscript-library. В ней мы можем увидеть список опубликованных пакетов (Рис. 17). Рис. 17 -пространство oscript-library на github Здесь помимо библиотек, входящих в стандартную поставку, также опубликованы пакеты, разрабатываемые сторонними разработчиками. Покажу на примере репозитория для орт (пакетного менеджера OneScript). 20 Silver Bulleters, LLC Если мы откроем репозиторий орт в организации oscript-library, то мы увидим (Рис. 18): • исходный код этой библиотеки; • историю разработки (список коммитов); • список задач по доработке. Эта информация позволяет в целом проследить за процессом разработки пакета орт. Здесь же у нас есть возможность (Рис. 19): • Либо склонировать репозиторий непосредственно на свою машину, в каталог установки орт; • Либо скачать его zip-архив, чтобы обновить этот пакет в ручном режиме. Puc. 18 - страница пакета орт 0 oscript-library/орт о Code Issues 22 * > ©Watch- П Pull requests t ; Reports И| Boards §5 Projects о -I Wiki * Star 10 13 : V Fork 7 v Пакетный менеджер OneScript ©204 commits Branch: master ■- j>"2 branches 11 releases 118 co ntri b uto rs ф Ap a ch e- 2.0 New puil request nixeI2007 Merged reteaэаАЮЭ.4 into master Й .vscode Добавлен набор задач проекта #58 ■ features Фича проверки настроек и ее реализация #58 Й src version bump Я tests Фича проверки настроек и ее реализация #58 a month ago Исправление ошибки при обновлении пакета (НЕудаление устаревших файлов) 2 months ago .gitignore § LICENSE Initial commit Й README.md Скопипастил описание команды *opm help* (#31) 3 months ago =• packagedef ОписаниеПакета добавлен как публичный класс для подключения орт через... 2 months ago a year ago Puc. 19 - скачивание архива с исходными кодами 21 Никита Грызлов. Пособив релиз-инженера 1C V oscript-library / precommitlc fsrfcwi &WR »£>Ч-«пЭ««е«|»»гвЭДрг««т|»П1{ <> Code П Pull requests « P Р<фсШ 0 SgWfti -,j Graphs 4*. Wise precommitlc ф 221 commits Branch; ifevefop ■» |? 3 blanches 14 releases New рыЙ request MW Create new Ъ This brandns 1 commit ahead. 18 commits behind xOrivenQevelopmenfcdevetop. Puc. 20 - страница пакета precommitlc в пространстве oscript-library Вернемся в организацию oscript-library. Здесь мы можем увидеть репозитории пакетов, не включенных в стандартную библиотеку. Например, precommitlc. Если мы перейдем в репозиторий этого проекта, то увидим, что репозиторий в организации oscript-library является форком от репозитория в организации xDrivenDevelopment (Рис. 20). В большинстве случае это означает, что основная работа над этой библиотекой ведется в репозитории авторов. Обратите внимание, что в данном репозитории в организации oscript-library нет возможности просматривать и создавать замечания. =' xDrivenPgveiooment / precommitlc. ftc~ py^54tC,T4Weir"-iCi: ' Puli requests 3 <> Code JH'. Projects 0 B3Wiki -ч-Pulse precommitlc ® 246 commits 8м«й; master» [ This branch is Jr 4 branches \> 15 releases New pul! request ; Creal commits ahead, 1 commit behind purabaSOimBster. Puc. 21 - страница разработчиков пакета precommitlc Но если мы перейдем в репозиторий организации xDrivenDevelopment, то мы сможем увидеть и более свежие коммиты, и список веток разработки, и все замечания, зарегистрированные по данному пакету (Рис. 21). Таким образом, организация oscript-library содержит в себе репозитории всех известных пакетов, доступных для интерпретатора OneScript (как разрабатываемых в рамках этой организации, так и от сторонних авторов). 22 Silver Bulleters, LLC Однако же, на практике, обновление версий библиотек из репозиториев не всегда удобно. Специально для распространения организации целей упрощения пакетов, oscript-library, была помимо создана специальная инфраструктура. Первая ее часть - это хаб, хранилище собранных пакетов. Он доступен по адресу hub.oscript.io.(Pnc. 22) В своей текущей версии этот хаб представляет собой довольно минималистичный сайт, на котором есть папка download, где расположены готовые к установке пакеты. Если мы перейдем в каталог precommitlC, репозиторий которого мы изучали до этого, то мы увидим в этом каталоге несколько файлов со расширением *.ospx (Рис. 23). Рис. 22 - ресурс hub.oscript.io Рис. 23 - каталог хранимых версий пакета precommitlc Расширение *.ospx-3TO специальный формат, в который упаковываются пакеты для упрощения своей установки. По сути, это специальным образом собранный zip-архив, который содержит в себе метаинформацию о пакете, а также все файлы, необходимые для работы этого пакета. Вторая часть инфраструктуры - это сам пакетный менеджер орт. Он выполняет роль «клиента» для общения с сервером хаба пакетов, установки пакетов, их сборки и публикации. 23 Никита Гоызлов. Пособие релиз-инженера 1C С:\Users\test>opm list -гemote OneScript Package Manager vO.9.3 Пакеты в хабе: lbdd lcommands ltestrunner InternetMai1 ParserFileV'Si asserts cmdline confluence deployka fs gitrunner gitsync gui i son logos messenger noti fy о pm oscript ©script-config packman.-,.. n precommitlc; Вернемся в командную строку. Пакетный менеджер орт умеет общаться с данным хабом в нескольких режимах. Самое простое - это возможность просмотра полного списка пакетов, доступных в хабе. Выполним команду opm list -remote. Мы увидим полный список пакетов хаба, в котором среди прочих есть precommitlC (Рис. 24). Установка пакета производится с помощью команды opm install, сопровождающаяся именем пакета. Попробуем выполнить команду: opm install precommitlc strings tempfiles toolied t/Srunner vanes sa-г tinner yadi sk Рис. 24 - результат работы команды орт list -remote С: MM«F-s\iest>osM install pre coord tic ©rescript Package Manager информация - Скачивай ф&д: precomitic.ospx. и~ео?ЯАЖЯ - Внешнее исктвченме (System,UssuthorlzedAccessExcepiion ): Отказано в доступе по пути “с: -rogram Files \oneScripi\Iib\ precoaait lc ". хаб) Рис. 25 - ошибка доступа при установке пакета Обратите внимание, мы получили ошибку прав доступа (Рис. 25). Разберемся, почему это произошло. В случае установки интерпретатора OneScript по умолчанию, его библиотеки хранятся в каталоге Program Files, и без предоставления административных прав вы не можете модифицировать в этом каталоге какие-либо файлы. Эту ситуацию можно обойти тремя путями: • Первый путь - устанавливать OneScript не в каталог Program Files • Второй путь - открывать командную строку в режиме администратора • Третий путь - настроить права для текущего пользователя на изменение файлов в каталоге. Я пойду по третьему пути. На машине разработчика этот способ намного удобнее. Пакеты устанавливаются довольно часто и разработчик, как правило, полностью владеет машиной и отвечает за ее состояние. На боевом сервере ситуация обратная, и там контроль за устанавливаемым ПО должен быть иным. Для этого установки прав доступа я выберу каталог C:\Program Files (x86)\OneScript. Открою свойства этого каталога и перейду на вкладку «Безопасность». Для изменения разрешений нажму кнопку «Изменить», найду группу пользователей под названием «Пользователи» и дам им права «Полный доступ». После этого нажму «Применить». (Рис. 26) 24 Silver Bulleters, LLC Раерешемив для групп» ’OneScript" X Безопасиость Им» объекта. С:'Лодгдап Fites icSSJ'OneScnpl Группы или погьзоватвги: §, 8СЕ ОГРАНИЧЕННЫЕ ПАКЕТЫ ПРИЛОЖЕНИЙ а Й^СОЗПАТЕПЬ-ВПАДЕЛЕи 44 СИСТЕМА Администратора fDE5KTDP-3CL8Q8O Aw*»««npan>p Пгльзоаатели (DESKTOP-3CLBO 80' Логызобзте пи? < > Добавить . Удалить Разрешения доя грунты "Полвзэаагели"__________________ Разрешить Запретить И | |по!>ый доступ □ В □ Чтение я выполнение 0 □ Сгисок содержимого ласки 0 □ Чтение В □ QK А V | Lr Отмекз Рис. 26 - установка прав доступа на каталог После этого команда opm install precommitlC не выдаст каких-либо исключений (Рис. 27). Рис. 27 - результат работы орт при установке пакета Обратите внимание, в логах установки пакета появились строки об установке зависимостей. Большинство сложных пакетов используют более простые пакеты-библиотеки внутри себя. Например, данный пакет использует: • Библиотеку логирования logos; • Библиотеку по упрощению работы с аргументами командной строки cmdline; 25 Никита Грызлов. Пособие релиз-инженера 1C • И другие библиотеки, которые используются в приложении precommitlC. Пакетный менеджер орт для установки пакета в случае необходимости доустанавливает или обновляет требуемые зависимости. Рис. 28 - результат запуска команды precommitlC Теперь из командной строки доступна команда precommitlC, которая позволяет быстро устанавливать данную утилиту в нужный репозиторий (в этом нам поможет запуск команды precommitlC с параметром -install). (Рис. 28) Отдельно добавлю - пакетный менеджер орт сейчас активно развивается, поэтому перед выполнением каких-либо действий с пакетами имеет смысл обновить сам пакетный менеджер. Это можно выполнить той же командой opm install. В качестве имени пакета будет выступать сам орт: орт install орт Также у пакетного менеджера орт есть возможность обновить все имеющиеся в системе пакеты одной командой: opm update -all Данная команда скачает из хаба последние версии установленных пакетов и обновит их. Давайте попробуем использовать орт для решения еще одной задачи. Вы могли обратить внимание, что, когда мы в редакторе Visual Studio Code писали тестовый скрипт, по сути, нам приходилось угадывать имеющиеся в библиотеке tempfiles методы. И хотя чтение исходного кода библиотек само по себе полезно, постоянное обращение к ним при написании скриптов будет доставлять неудобство. Давайте поможем редактору. Для понимания того, какие же пакеты установлены на компьютере пользователя, Visual Studio Code использует приложение oscript-config, написанное на OneScript. Это приложение упрощает работу с 26 Silver Bulleters, LLC конфигурационными файлами OneScript, позволяя читать и изменять их прямо из командной строки. Установим пакет oscript-config (Рис. 29). C:\0ser5YtestXGpei install oscript-config OneScript Package Manager V0.9.4 ИНФОРМАЦИЯ - Смачиваю файл: oscript-c.onfigvospx ИНФОРМАЦИЯ - Устанавливаю пакет oscript-eorifig ИНФОРМАЦИЯ - Устанавливаю зависимость: fs ИНФОРМАЦИЯ - ть уже установлен. пропускаем. ЯМ0ИШ|ИЯ - Усс i-wci • ь: logos ИНФОРМАЦИЯ - Iagos уже установлен. Пропускаем. ЙНФОРМАЦИЯ - Устанавливав зависимость: cndlice информация - cadline уже установлен. Пропускаем. ИНФОРМАЦИЯ - Регистрация приложения: ©script-config ИНФОРМАЦИЯ - Установка завершена Рис. 29 - установка пакета oscript-config Для этого в командной строке выполним команду opm install oscript-config Дождемся окончания установки и перезапустим Visual Studio Code. Рис. 30 - всплывающая подсказка при работе с пакетами Откроем наш тестовый файл и снова попробуем написать ВременныеФайлы и поставить точку. Теперь после нажатия точки редактор сам предлагает нам для выбора все имеющиеся в данном модуле функции. (Рис. 30) 3.3. GitSync - синхронизация хранилища 1C с репозиторием git Давайте познакомимся с пакетами OneScript, которые нам понадобятся в настройке нашей сборочной линии. Информацию об этих пакетах можно посмотреть в репозитории пакета на github в организации oscript-library. 27 Никита Гоызлов. Пособие релиз-инженера 1C Начнем с рассмотрения пакета gitsync. Для этого откроем его репозиторий по адресу https://github.com/oscript-librarv/gitsync и прочитаем файл readme.md, где отражается информация о данной утилите (Рис. 31). Синхронизация хранилища 1C с репозиторием git Обсудить release v2X Введение Проект является глубоким рефакторингом утилиты v83unpack (https://github.com/xDrivenDevetopment/v83unpack). Изначально данный механизм представляет собой внешнюю обработку ^Предприятия, которая впоследствии была портирована на OneScript, Иаодные коды порта доступны в том же репозитории vSSunpack. Приложение gitsync представляет собой отдельное (standalone) приложение на 1 Script и предназначено для синхронизации хранилища конфигураций 1C с репозитарием git Рис. 31 - страница утилиты gitsync Как следует из названия, gitsync - это утилита, позволяющая синхронизировать хранилище 1C с вашим git-репозиторием. Выгрузка исходников в git позволяет вам: • Быстро получать историю изменений по вашей конфигурации; • А также выполнять некоторые уникальные по отношению к хранилищу 1C действия: о Например, получение информации о том, кто последний, когда и зачем менял ту или о А также просто осуществлять более быстрый просмотр истории изменений и исходного иную строчку кода в модуле или в объекте метаданных. кода как такового без открытия конфигуратора. Для работы этой утилиты нам потребуется провести некоторые настройки в вашем репозитории, однако, сам ее запуск - максимально простой. Экспорт исходников конфигурации в сторонний репозитарий Git Основной режим работы для сценария в одном репозитарии. Git хранятся как исходники конфигурации 1C, так и прочие исхадаики/файяи продукта (.«апример, аакуявнтация, тесте и прочее). • Клонировать средствами Git исходный репозитарий ( git clone ) иди создать новый ( git init) • Перейти в каталог репозитария Git • Запустить, gitsync с параметрами gitsync export «каталог или файл хранили»? <гатаяоги«вди«аевнутрвикаяьиойкопи»б1т> |-еваО домен почты пальзавателей} Будет инициализирован новый репо и созданы необходимые файлы для синхронизации. Примеры использования: • gitsync export "к: \хренклм<|в1С* src\config - помещение исходников конфигурации в каталог srctconfig репозитория St в текущем каталоге • gitsync export •ыЛХранмличекМсхвДдЬЛсД" sre - помещение исходников конфигурации в каталог sre Рис. 32 - справка по параметрам запуска gitsync 28 Silver Bulleters, LLC Если пролистать описание утилиты чуть пониже, можно увидеть раздел «Экспорт исходников конфигурации в сторонний репозиторий Git». (Рис. 32) Здесь приведены примеры использования приложения gitsync с выполнением команды export и передачей ей различных параметров. Файл authors имеет формат ini-файла Адми н и стратор=Пользовател ы <adnriп- us ег@mal 1. с от> Вася иеанов=другой пользователь [email protected]> слева указано имя пользователя хранилища 1C справа - представление имени пользователя репозитария Git и его e-mail С помощью e-mail выполняется связка пользователя с публичными репозитариями (например, Github или Bitbucket) Рис. 33 - справка по формату файла авторов Помимо выгрузки исходников в git, gitsync также позволяет осуществлять одно важное действие - он делает связку пользователей из хранилища 1C с вашим git-репозиторием. Вы можете настроить специальный файл соответствия авторов - пользователей хранилища и пользователей вашего gitсервера (Рис. 33). Таким образом, информация об авторе, поместившем изменение в хранилище, может автоматически преобразовываться в учетные записи на git-сервере. L': Wsers\test>g:lfsync HtSync v2,l.l ЖКА - Некорректные аргументы- командной строки команды: help - Вывод справки по параметрам clone - Клонирует сущесгеузаций репозиторий и создает служебные файлы In.lt - Создает новый репозиторий и создает служебные файлы set-version - Устанавливает необходимую версии в файл VERESKW all ~ Запускает с инлр©ммз®ци« по нескалькам репозиториям ежрЖ - Выоопмить Жжаяшуш синхромизамиш^, без риП/ржЬ sync - выполняет синхронизацию хранилища 1C с git-репозиторием (указание имени команды необязательно) version - Выводить версию приложения Рис. 34 - вывод справки по возможным командам gitsync Откроем командную строку и выполним команду gitsync. (Рис. 34) Мы можем увидеть все имеющиеся у этого приложения команды, а также получить справку, например, о команде export. Для вывода справки нужно набрать (Рис. 35) gitsync help export E:\Uwts\testXgitsync help export GitSync V2.1.1 export - Выполнить локальную синхронизацию, без poll/push Пвраметрш «ПутьКранвямжу» - Файловый путь к каталогу хравиявии конфигурации 1C., «ЛокельныйКвтвлогГит» - Каталог исходников внутри локальной копии git-репозитария, -eaiail - «домен почты для пользователей git> -vSversion - «Каска версии платформы (8,3, 8,3.5, 8.3,€.2299 и т.п.)> -debug - <on(t3ff> -verbose - «on(off> -format - «hierarchicalfplain> -isinverslon - «номер минимальной версии для выгрузки» -ffiaxversiofi - «номер максимальней версии для выгрузки» -limit - «выгрузить неболее li»it версий от текущей выгруженной» -tempdir - «Путь к каталогу временных файлов» Рис. 35 - справка по команде export 29 Никита Грызлов. Пособив релиз-инженера 1C Здесь описаны все параметры, имеющиеся у этой команды. Каждый из этих параметров мы рассмотрим чуть позже, когда будем настраивать эту утилиту на нашей сборочной линии. Несколько слов об устройстве этого приложения. • Для доступа к хранилищу, gitsync использует утилиту Валерия Агеева «Tool_lCD», которая подключается напрямую к файлу хранилища, вычитывает оттуда список имеющихся версий, список авторов, и позволяет быстро получить файл готовой конфигурации. После этого файл загружается во временную базу, из которой с помощью конфигуратора выполняется выгрузка конфигурации в файлы. • Для использования на платформе с версиями младше, чем 8.3.6, где предусмотрен только линейный формат выгрузки, gitsync может самостоятельно осуществлять раскладку файлов по папкам на основании точек в имени выгружаемого файла. Таким образом, независимо от версии платформы, на которой вы разрабатываете, вы можете получить красивую и понятную иерархическую выгрузку конфигурации в git-репозиторий. Приложение gitsync входит в стандартную библиотеку пакетов, так что он у нас уже установлен. Однако настоятельно рекомендуется его обновить до последней версии, если это еще не было сделано. 30 Silver Bulleters, LLC 3.4. Deployka - развертывание конфигурации 1C на имеющейся базе Познакомимся с еще одним инструментом — deployka. Для этого на сайте github.com откроем организацию oscript-library, перейдем в репозиторий deployka (https://github.com/oscript- library/deployka ) и посмотрим файл описания readme.md (Рис. 36). Vanessa Deployment Engine Развертывание конфигураций ТС на целевой базе 1C Возможные команды • help * Вывод справки по параметрам • loadcfg - Загрузка/обновление конфигурации • loadrepo - Обновить из хранилища подключенную базу • session • Управление сеансами .информационной баз-ы • ctbupdete - Обновление конфигурации базы дадаых • run - Управление запуском в режиме предприятия Для подсказки по конкретной команде наберите help < команда > session - Управление сеансами информационной базы Параметры: • <Действие> - tock(unlock)kill • -ras - Сетевой адрес RAS, по умолчанию localhostl 545 • -гас - Команда запуска КАС, по умолчанию находим в каталоге установки 1с • -db - Имя информационной базы Рис. 36 - страница приложения deployka Приложение Deployka предназначено для развертывания конфигураций 1C на имеющейся базе. Помимо обычных команд по загрузке конфигурации из файла или обновления конфигурации из хранилища у deployka есть возможность работать с сеансами информационной базы. С помощью встроенных в поставку 1С:Предприятие утилит гас и ras (сервера и клиента администрирования серверов 1С:Предприятия), deployka может: • Блокировать или разблокировать начало сеансов в информационной базе; • А также разрывать имеющиеся сеансы. Для этих целей служит команда session. Обратите внимание - несмотря на то, что репозиторий в организации oscript-library является форком, в нем включена возможность просмотра списка имеющихся и создания новых задач, потому что на 31 Никита Грызлов. Пособие релиз-инженера 1C данный момент разработка инструмента deployka сосредоточена непосредственно в организации oscript-library. Приложение deployka не входит в стандартную библиотеку, его установка производится с помощью пакетного менеджера орт. 3.5. Vanessa-runner - автоматизация рутины Утилита vanessa-runner предназначена для автоматизации запуска 1C в различных режимах. Более подробную информацию о vanessa-runner можно получить в репозитории по адресу https://github.com/silverbulleters/vanessa-runner. (Рис. 37) Для того чтобы найти этот репозиторий самостоятельно, перейдем в организацию silverbulleters и в поиске по организации напишем vanessarunner. Описание Библиотека oscript.io для автоматизации различных операции для работы с cf/cfe/epf файлами и простой запуск vanessa-behavior и xunitfpric тестов. Предназначена для организации разработки 1C в режиме когда работа s git идет напрямую с исходниками. Пободает обеспечить единообразный запуск команд "локально" и на серверах сборки CI-CO Установка используйте пакетный менеджер ори из стандартной поставки дистрибутива ocript.io ope install vanessa-runner Рис. 37 - страница приложения vanessa-runner Изначально vanessa-runner разрабатывалась как утилита по автоматизации различных действий, связанных с файлами конфигураций, расширений, внешних отчетов, обработок, их исходниками, а также для запуска 1C в режиме предприятия. Позже в vanessa-runner появились также встроенные команды по запуску из командной строки инструментов ADD, Vanessa-behavior и xllnitForlC, что позволило скрыть часть сложностей по передаче параметров командной строки для этих инструментов, и запуск синтаксической проверки исходников конфигурации средствами 1С:Предприятия. Сейчас это - полноценный консольный task-менеджер для реализации различных операций: от инициализации служебных файловых баз до подтверждения легальности получения обновлений и даже выполнения миграции информационной базы в облако (для конфигураций на базе БСП). Приложение vanessa-runner не входит в стандартную библиотеку, его установка производится с помощью пакетного менеджера орт. 32 Silver Bulleters, LLC 3.6. Packman - сборка тиражируемых дистрибутивов 1С-конфигураций Утилита packman предназначена для сборки тиражируемых дистрибутивов lC-конфигураций. Откроем репозиторий продукта https://github.com/oscript-library/packman и посмотрим readme.md (Рис. 38). Vanessa Packman Сей волшебный инструмент позволяет автоматизировать сборку тиражных релизов 1СЛредприяте 8. Возможности • Собирать конфигурацию из исходников • Или добывать ее из хранилища • Формировать из добытой версии файлы поставки (закрытый от изменений CFJ • Формировать простейший манифест сборки релиза • Формировать штатный платформенный setup»», такой же, каким распространяются типовые конфигурации 1C Вкусняшки Полный цикл сборки релиза. От исходников в git до тиражируемого дистрибутива, который устанавливается в каталог шаблонов системы, ^Инструкция по применению k раскязп help Рис. 38 - страница приложения packman Инструмент packman - это обертка над штатными возможностями 1C по работе с поставками конфигураций. Специальным образом подготовленный манифест, аналогичный манифесту конфигураций в 1С:Предприятии, позволит вам на основании хранилища 1C или исходников конфигурации сформировать так называемый setup.exe - файл установки шаблона конфигурации, аналогичный тиражируемым конфигурациям от 1C. Отдельно отмечу, что данная утилита умеет формировать файлы cfu для обновления конфигураций, находящихся на поддержке. Конечная цель применения этого инструмента - запрет редактирования конфигурации на productionконтуре. В идеальном случае обновление production-систем производится только через механизмы автоматической поставки при помощи данного инструмента. Утилита packman не входит в стандартную библиотеку, ее установка производится с помощью пакетного менеджера орт. 33 Никита Грызлов. Пособие релиз-инженера 1C Еще раз хочу отметить, что все перечисленные утилиты: • Написаны на языке 1C; • Запускаются при помощи интерпретатора OneScript; • И имеют открытый исходный код; Сообщество разработчиков oscript-library будет признательно вам за отзывы, замечания, комментарии и, разумеется, доработки. 34 Silver Bulleters, LLC Раздел 4. Docker 4.1. Принципы работы Docker Одна из причин появления неожиданных проблем при разворачивании продукта на боевых серверах - это различие в окружении у разработчика, в тестовой среде и на production-контуре. Для снижения разницы в окружении применяют различные способы виртуализации. недавнего До времени наиболее известным способом виртуализации являлась аппаратная виртуализация: • В операционной системе, работающей на реальном оборудовании, запускается специальное программное обеспечение, эмулирующее работу оборудования (начиная от процессора и заканчивая системами хранения данных). • На это эмулированное (или виртуализированное) оборудование устанавливается операционная система, называемая «гостевой операционной системой». • И уже в этой гостевой системе запускаются необходимые приложения. Такой способ виртуализации позволяет полностью эмулировать работу реального оборудования и ПО, однако имеет большие накладные расходы, потому что помимо эмуляции оборудования ресурсы также тратятся и на полноценную работу гостевой операционной системы. К тому же, ресурсы на виртуальные машины выделяются чаще всего с запасом, и, несмотря на то, что современные среды управления виртуальными машинами умеют перераспределять неиспользуемые ресурсы, утилизация виртуальных машин обычно довольно низкая. Для решения этих проблем была разработана виртуализация на уровне операционной системы. В само ядро операционной системы заложена возможность запускать несколько изолированных экземпляров пространств пользователя - специальных адресных пространств виртуальной памяти, выделяемых операционной системой для работы программ. Дополнительно, ядро обеспечивает изоляцию аппаратных ресурсов (процессора, памяти, дисков, сетевых интерфейсов и прочего), позволяя контролировать ресурсы, предоставляемые экземпляру пространства пользователя. Такая схема позволяет выделить приложение и его окружение в отдельный изолированный контейнер и обеспечить работу нескольких контейнеров с полной независимостью друг от друга с одной стороны и с единственным экземпляром ядра операционной системы - с другой стороны. На принципах виртуализации на уровне операционной системы и работает Docker. В состав Docker входит (Рис. 39): • Так называемый Docker-демон - своеобразный сервер, управляющий работой контейнеров и взаимодействующий с операционной системой на уровне ядра. • Docker-клиент, позволяющий из командной строки передавать команды Docker-демону для запуска и управления контейнерами. • Машина, на которой работают службы Docker, называется Docker-хост. Однако Docker-это не только виртуализация как таковая. Docker-это целая экосистема, позволяющая автоматизировать задачи развертывания и управления контейнеризированными приложениями. 35 Никита Гоызлов. Пособие релиз-инженера 1C Docker-хост Контейнеры Dockerклиент Docker-демон Ядро Linux Аппаратура Рис. 39 - компоненты docker на хост-машине Docker-контейнеры запускаются на основе Docker-образов. Образ (или в английском варианте image) - это слепок файловой системы и параметров, необходимых для работы контейнера. Он не имеет какого-либо состояния и никогда не меняется. Особенность Docker-образов - их слоистая структура. Вы можете представить Docker-образ как слоеный пирог. • В основании пирога лежит начальный слепок файловой системы - то состояние, в котором находится система после установки новой операционной системы (практически без начальных настроек). • Поверх этого начального слоя пользователи могут накладывать свои собственные слои. Например, для работы со многими приложениями нужна среда выполнения Java. Выполнив ряд команд по установке Java на такой начальный образ, мы можем сформировать новый слой - операционная система плюс Java. • Поверх этого слоя мы можем наложить еще один. Например, слой с сервером сборок Jenkins, которому необходима Java. Слои такого пирога можно переиспользовать. Например, если мы захотим запускать в контейнере другое Java-приложение, у нас нет необходимости готовить слои для этого пирога с самого начала. Мы можем взять уже готовые слои с операционной системой и установленной поверх нее Java и добавить только нужные нам команды по запуску приложений. Если же мы обновим один из слоев (например, установим новую версию Java), нам не понадобится долго обновлять все наши приложения. При очередной сборке образа Docker переиспользует обновленный слой, максимально быстро обновит базу для наших приложений. В экосистеме Docker существует Docker Hub - публичный репозиторий предварительно собранных образов-контейнеров. Различные компании и просто энтузиасты публикуют туда готовые образы для того, чтобы вам не приходилось каждый раз запускать команды по сборке таких пирогов, позволяя значительно ускорить запуск новых или обновления старых контейнеров. Общая схема работы с Docker выглядит следующим образом: 36 Silver Bulleters, LLC На компьютере пользователя подготавливается образ контейнера-он может быть скачан с хаба • или собран самостоятельно. • При необходимости, у контейнера настраиваются дополнительные параметры. Наиболее часто, это - монтирование файловых разделов и проброс определенных сетевых портов из контейнера в основную операционную систему. • С помощью Docker-клиента выполняется команда по запуску контейнера на основании готового образа. И это все. После этого на вашей машине запускается изолированный контейнер с нужным вам приложением. При этом, вы можете запустить любое количество контейнеров на базе одного и того же образа - они никак не будут мешать работе друг друга, так как они распределены по различным сетевым интерфейсам и даже файловая система у них независимая. Например, вы можете запустить два сервера 1C или несколько веб-серверов Apache - эти задачи можно решить буквально одной командой в командной строке. 4.2. Установка Docker на Windows Docker в своей работе опирается на возможности ядра операционной системы. На данный момент запуск Docker-контейнеров возможен в системах на базе двух ядер: • Это ядро Windows, используемое в операционных системах от Microsoft, начиная с Windows 10 и Windows Server 2016. • И ядро GNU Linux, используемое в большом количестве различных Linux-дистрибутивов. Соответственно, и все Docker-контейнеры делятся на два типа - основанные на Windows и основанные на Linux. Linux-контейнеры невозможно запустить на ядре Windows и наоборот. Технология контейнеризации пришла к нам из Linux-мира. Поддержка же ядра Windows появилась относительно недавно, в 2016 году. Поэтому и большинство Docker-образов, которые вы сможете найти на Docker- хабе, основано на ядре Linux. Для обеспечения возможности работы Linux-контейнеров на Windows-системах компанией, разрабатывающей Docker, было придумано следующее решение: • В системе, работающей под управлением Windows, разворачивается виртуальная машина с минималистичным Linux-дистрибутивом, на обеспечение работы которого тратится минимум ресурсов. • Внутри этой виртуальной машины поднимается Docker-демон; • А также обеспечивается простой проброс ресурсов из Windows в Linux и обратно. Такая схема позволяет быстро запустить на Windows контейнеры, собранные под ядро Linux. Обращаю ваше внимание, что такая схема работы не рекомендуется на высоконагруженных серверах, так как на виртуализации Linux-системы возможно ощутимое падение производительности. Поэтому для серьезных production-контуров, использующих Linux-контейнеры, рекомендуется поднимать отдельный Linux-сервер (для целей кластеризации их может быть даже несколько). А для использования Windows-контейнеров - отдельный Windows-сервер. И связывать эти серверы между собой средствами Docker. 37 Никита Грызлов. Пособие релиз-инженера 1C Для Windows существует два официальных клиента Docker. • Первый - это Docker for Windows. Рекомендуемый способ. В нем для Linux-контейнеров используется виртуализация средствами Hyper-V, а Windows-контейнеры запускаются нативными возможностями ядра Windows. • И второй способ - Docker ToolBox. Это устаревший способ, поддерживающий только Linuxконтейнеры. В нем для виртуализации используется VirtualBox. К сожалению, Hyper-V и VirtualBox несовместимы между собой. Если у вас используются виртуальные машины на базе VirtualBox, то после включения Hyper-V они перестанут работать. Поэтому либо будьте готовы переключать используемое средство виртуализации при необходимости, либо переносите виртуальные машины с VirtualBox на Hyper-V. Ремарка для тех, кто выполняет задания этой книги на виртуальной машине, запущенной через Hyper-V в реальной Windows 10: Для виртуализации Linux-системы Docker for Windows также использует Hyper-V, а такая вложенная виртуализация (Hyper-V внутри Hyper-V) в Windows 10 по умолчанию выключена. Для успешной работы ее необходимо включить. Для включения вложенной виртуализации откройте на вашей реальной машине PowerShell с административными правами и выполните команду: Set-VMProcessor -VMName <VMName> -ExposeVirtualizationExtensions $true Здесь вместо <VMName> нужно подставить имя вашей виртуальной машины, и если имя машины содержит пробелы - его необходимо заключить в кавычки: После выполнения этой команды и перезагрузки виртуальной машины, в ней можно будет запустить вложенный Hyper-V. 38 Silver Bulleters, LLC Docker for Windows Рассмотрим установку продукта Docker for Windows docker for windows 8» B«g« Hoeeew. Картине» Покупки Ещё Настрайки Инструменты Результатов пример» 793 000 (0 46 се* ) Get started with Docker for Windows - Docker Documentation https ‘ftfocs tjcfcier comfodcker-for-wireJo*.»/' * Перевести эту страницу Got Docker for Windows'? If you have not yet installed Doctor for Windows, please see InslaB Docker for Windows for an explanation of stable and beta channels . Install Docker for Windows Build and run your first Docker... The Docker for Wtatos® install Bald and и» your Яяй Docker Wwsfows Server conMser. pectoys includes everything Други» результаты с сайта docker сто » Puc. 40 - результат поиска docker for windows в google Откроем браузер и в поисковике наберем «docker for windows»(Pnc. 40). Первый же результат поиска приведет нас на страницу документации с официального сайта Docker. Рис. 41 - страница документации продукта Docker for Windows На этой странице представлена общая информация по работе с Docker for Windows, и в небольшой сноске указана ссылка на страницу, где можно скачать его установочный файл. (Рис. 41) 39 Никита Грызлов. Пособие релиз-инженера 1C Рис. 42 - выбор варианта дистрибутива Docker Здесь у нас есть возможность выбрать один из двух каналов - стабильный и бета-канал (Рис. 42). Выберем стабильный. После нажатия на кнопку Get Docker for Windows Stable началось скачивание дистрибутива. $ Docket Setup X Completed the Docker Setup Wizard be Finish button so еж? be Setao Wizard, gjttaneh Docket } finish | Рис. 43 - инсталлятор Docker for Windows Запустим скачанный установщик. Нас приветствует окно установки Docker с предложением принять условия лицензионного соглашения. Согласимся. После этого сразу начинается установка Docker. После завершения установки, у нас есть возможность сразу же запустить Docker. (Рис. 43) Воспользуемся этой возможностью, оставим галочку Launch Docker и нажмем Finish. 40 Silver Bulleters, LLC Puc. 44 - активация Hyper-V Обратите внимание, что, скорее всего, у вас появится сообщение о том, что функциональность Hyper-V не активирована (Рис. 44). Для корректной работы Docker нам необходимо ее включить. Нажатием на кнопку ОК мы позволим Docker это сделать автоматически, одновременно перезагрузив компьютер. Согласимся. Через некоторое время наша система уйдет в перезагрузку. | После Docker is running Open PaweiShefc .tn j sUft hacking with docket or tsrrtp•ose Dadas fef перезагрузки Docker должен стартовать автоматически. Если этого не произошло, откройте приложение Docker for Windows. В трее появится иконка белого кита. Если вы видите анимацию к л выполнения увеличивающихся и уменьшающихся контейнеров на 1^ 4®) EMG спине кита, Docker все еще запускается. После успешного запуска анимация прекратится и у вас Puc. 45 - иконка статуса Docker появится сообщение о том, что Docker запущен. (Рис. 45) C:\Users\testxtockep version □ lent: Version; l?.GJ.e-ce API version: 1.26 Go version: gol.7.5 бвееЬ22 Git remit: Thu Feb 2» 36:40:59 2617 Built: 05/Arch; wlneovs/*»JW Server: Version: API version: Go version: Git coanit: Built: OS/Areh: Experimental; ________ iz.es.e.ce 1.26 tmlnimus version 1.12) gol.7.5 3a232cS Tue Feb 28 07:52:&s 2617 linux/ABdGA true Рис. 46 - вывод команды docker version Откроем командную строку и убедимся в этом. Выполним команду docker version. (Рис. 46) В выводе команды есть два компонента: • Клиентская часть Docker, которая работает в операционной системе Windows, • И серверная часть - Docker-демон. Этот Docker-демон работает внутри виртуальной машины на базе Linux, которая была автоматически создана в момент установки Docker for Windows. Параметры этой машины мы можем увидеть в диспетчере Hyper-V. 41 Никита Гоызлов. Пособив релиз-инженера 1C Откроем диспетчер Hyper-V, и убедимся, что была создана виртуальная машина MobyLinuxVM, которой назначено 2Гб оперативной памяти. (Рис. 47) | Л Диспетчер Hypef-V Файл Действие Вид Справка В -.. I Диспетчер H.per-V gn DESKTOP-3CLSO&0 Имя Состояние Загрузка ЦП Назначенная пам— 8р< Работ»- 9*4 Ж® МБ ЙЕМ Рис. 47 - docker-host в диспетчере Hyper-V Обратите внимание, что по умолчанию эта виртуальная машина сразу резервирует необходимые ей ресурсы оперативной памяти (Рис. 47). Например, если сейчас, при работающем Docker, мы в диспетчере задач перейдем на вкладку «Производительность», то увидим, что занято 3.5 Гб оперативной памяти. ft Диспетчер маем Ф*йя Параметры Процессы Вид Производительность Ж» Рис. 48 - ресурсы виртуальных машин Но как только мы закроем Docker for Windows, оперативная память сразу высвободится, а виртуальная машина MobyLinuxVM перейдет в состояние «Выключена». (Рис. 48) Docker Toolbox Пользователям тех версий Windows, где нет встроенной поддержки Hyper-V (все версии ниже Windows 10 и Windows Server 2016), для работы с Docker необходимо устанавливать Docker Toolbox. 42 Silver Bulleters, LLC o. docker toolbox ве® Вадв» Карпмвда Ноев» Kbwm £ц@ Нветройим Инструмент») Резу пи arc ев примерно 263 300 (0,50 c«l) Docker 'Whcsc | Docker ht^sT/wmtdMerMm^odwcts^Socker-toot&ox ♦ Перевести эту страницу The Becker Toelbast is ал installer to quickly and easily install and setup a Docket environment art your computer Puc. 49 - результат поиска docker toolbox Его установка в целом аналогична установке Docker for Windows. Мы точно так же набираем в поиске браузера «docker toolbox» и переходим на сайт Docker. (Рис.49) На сайте есть возможность скачать Docker Toolbox для систем на основе MacOS и Windows. (Рис. 50) Рис. 50 - обзор продукта Docker Toolbox Как следует из описания, набор Docker Toolbox содержит в себе: • Движок Docker; • Утилиту по связыванию Docker-контейнеров Docker Compose; • Docker Machine - виртуальную машину для запуска Docker-контейнеров; • И графическое средство управления контейнерами - Kitematic. 43 Никита Гоызлов. Пособие релиз-инженера 1C 4.3. Kitematic - графический интерфейс по управлению контейнерами Для пользователей Windows будет интересен графический интерфейс по управлению контейнерами. Он имеет название Kitematic. Давайте его установим. Discover Docket Enterprise Edition Для этого откроем Docker for Windows, дождемся начала работы Docker, щелкнем правой кнопкой мыши по иконке Settings,,. Docker в трее и выберем пункт Kitematic. Abate Docker Check for Updates», Ehegnose and Feedback,., У нас появится окно с предложением скачать Kitematic и Switch to Windows containers,. указанием пути, куда нам нужно его установить. (Рис. 51) Нажмем кнопку Download. Puc. 51 - команда запуска Kinematic Автоматически запустится скачивание zip-архива, который необходимо распаковать по указанному на предыдущем шаге пути: C:\Program Files\Docker\Kitematic. (Рис. 52) Для этого создадим в каталоге Docker папку Kitematic и выберем извлечение туда. # «еяШк X Download Kitematic Kitematic is compatible with Docker for Windows and can be used as a graphical interface to manage your Docker containers. You can download it. Then make sure you install it irjc.AProgram FilesVPodterVKitematic | u Download Puc. 52 - окно скачивания Kinematic После выполнения извлечения еще раз откроем Kitematic из трея. 44 Cancel Silver Bulleters, LLC Puc. 53 - окно запуска Kinematic В приветственном окне Kitematic предлагает зайти в Docker Hub. (Рис. 53) Если у вас еще нет логина, вы можете зарегистрировать его, нажав кнопку «Sign Up» - тогда вы будете перенаправлены на страницу регистрации. Но сейчас этот пункт можно пропустить, нажав кнопку «Skip For Now». Рис. 54 - основное окно Kinematic Kitematic - это графический клиент для Docker (Рис. 54). Здесь будут отображаться создаваемые нами контейнеры, здесь же ими можно будет управлять без командной строки, а также быстро создавать контейнеры на основании имеющихся в хабе образов. 4.4. Установка Docker на Linux При показе действий в этой части пособия я буду использовать виртуальную машину на базе 64-битной Ubuntu 16.04. 45 Никита Грызлов. Пособие релиз-инженера 1C Пользователи операционных систем, в которых присутствует пакетный менеджер, скорее всего, привыкли ставить программы из репозитория пакетов. Однако, версии Docker, находящиеся в официальных репозиториях пакетов, обновляются редко. Поэтому обратимся к официальному сайту Docker за инструкцией по установке. (Рис. 55) Откроем браузер. Введем в поисковой строке Docker for Linux и перейдем на страницу установки на сайте docs.docker.com. Install Docker on Unux distributions - Docker Document f 4й . docier.com docker does ij -« ti и :к®7' о install Docker on EL,, L-ion/bn / o. Guides □ С О, Помех Product Manuals Glossary' Reference Samples Install Docker on Linux distributions Docker Engine Is supported on several Linux distributions. Installation instructions are waO&bie for the following; о e * Docker а о (current)* G? 6$ss*spage v* Request docs changes ? б&змрроп On this page; • Arch linux • CentQS • CRUX Linux • Debian • Fedora • Gemdo • Grade Unux • Red Hat Enterprise unux • openSUSE and 5USE Unux Enterprise • ubuntu Puc. 55 - инструкции по установке Docker для Linux На сайте представлено несколько инструкций для различных популярных дистрибутивов. Выберем Ubuntu и начнем выполнять необходимые шаги, описанные в этой инструкции. (Рис. 56) Рис. 56 - инструкции по установке Docker в Ubuntu 46 Silver Bulleters, LLC Как видно из раздела OS requirements, Docker официально поддерживается следующими версиями Ubuntu: • Bionic 18.04 (LTS) • Xenial 16.04 (LTS) • Trusty 14.04 (LTS) Install Docker Yew cm install Docker te different ways, depending on your needs: • Most users set up Dorter's repositories and install from them, iv ease af installation anti upgrade tasks. This Is the recommended approach. « Some users download the DEB package and install it manually and manage upgrades completely manually. This Is useful In situations such as installing Docker on air-gapped systems with no access to the internet Install using the repository Before you install Docker for the first time on a new host machine, you need to set up the Docker геряввгу. Ateward, yae ш fnstal »nd epdete Евкtor ten the repestotyt SET UP THE REPOSITORY The procedure for seeing up the repository is different for Docker CE and Docker EE. Docket CE 1. Install packages to allow apt: to use a repository over HTTPS: $ suOo apt-get install \ apt-transport-https V cn-certificates. \ curl \ so f tware-properties-ceraason Puc, 57 - раздел документации Install Docker Пролистаем инструкцию ниже, до раздела Install Docker. (Рис. 57) Первый шаг, который нам необходимо выполнить для установки Docker на Linux - это добавление репозитория в список репозиториев apt. Обратите внимание, что эта инструкция составлена таким образом, чтобы вы могли копировать команды из нее и выполнять их в консоли. 47 Никита Гоызлов. Пособие релиз-инженера 1C t* foot<3>nix«l-VlrtuebMachinc: /home/nixel nixelgnixet-Vtrtuai-Machine:•$ sudo su [sudo] пароль для ntxel: rootgnixet-virtual-Machine:/home/ntxels sudo apt-get Install \ > apt-transport-https \ ca-certificates \ > curt \ > software-properties-common Чтение списков пакетов. Готово построение дерева зависимостей чтение информации о состоянии, готово > Уже установлен пакет ca-certificates самой новой версии (20168164ubuntul), Уже установлен пакет apt-transport-https самой новой версии (1.2,19). Уже установлен пакет software-properties-common самой новой версии (0.96,20.5). НОВЫЕ пакеты» которые будут установлены: curl обновлено ©, установлено 1 новых пакетов, для удаления отмечено 0 пакетов, и б п акетов не обновлено. Необходимо скачать 139 кБ архивов. После данной операции, объем занятого дискового пространства возрастет из 338 кВ Хотите продолжить? [Д/н] I Рис. 58 - выполнение команды в консоли Поэтому откроем терминал и первым делом перейдем в режим суперпользователя, чтобы начать выполнять команды по установке Docker: (Рис. 58) sudo su После этого скопируем первую команду, которая позволит apt работать через https и выполним ее в терминале. | apt-get install \ apt-transport-https ca-certificates \ curl \ software-properties--common ' 8^ 1 . j XL J На вопрос об установке пакетов ответим "у" и дождемся окончания. Следующий шаг-добавление ключа подписи Docker: (Рис. 59) 2. Add Docker's official 6PG key: 5 curl -fsst https; Z/йежЛеав. docker ,скж/11лмх/«1м»в<а/дрд | suds apt-key «to Verify that the key fingerprint is ВДС8 5822 9FC7 DO38 854A E2D8 №81 803C 0EBT CD88 S eudo apt-key fingerprint ввРСвВй pup 40»6R/9bSFCD88 2017-82-22 Key fin^rprint = 9DC8 5822 9FC7 0D38 854A uld SUft E2D8 №81 803C SEflF CD88 Becker Release' (Cl sfeb) ^dectarfescAar.сеяв» 40SSR/F273FCB8 2017-82-22 Puc. 59 - добавление ключа подписи Скопируем с сайта команду для этого шага: 48 (I .. Silver Bulleters, LLC curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - Проверим, что у нас добавился корректный ключ. Выполним команду sudo apt-key fingerprint. Инструкция просит нас проверить, что полный отпечаток ключа соответствует указанному на сайте (9DC8 5822 9FC7 DD38 854А E2D8 8D81 803С OEBF CD88). В нашем случае, ЭТО ТЭК (РИС. 60). root@ntxel-Virtual-Machine:/hone/ntxelF curl -fsSL https://download.docker.con/l inux/ubuntu/gpg j sudo apt-key add OK root@nlxel-virtual-Machine:/hone/nixel» sudo apt-key fingerprint 6EBFCD88 pub 40968/0EBFCO88 2917-02-22 uid sub Отпечаток ключа = 9DC8 5822 9FC7 0038 854A E2DS 8081 S63C OEBF CD68 Docker Release (CE deb) «dockergdocker.con» 4096R/F273FCD8 2017-02-22 rootgnixel-Virtual-Machine:/hone/nixel# __ Puc. 60 - результат работы apt-key add Следующий шаг-добавление официального репозитория пакетов в Docker. 3. Use the following command to set up the stable repository. Note; The lsb_release -cs sub-command below returns the name of your ubuntu distribute, such as s "1 " Sometimes, tn a distribution «fee Unux Mint, you might have to change $( isb release -cs) to your parent Ubuntu distribution. For example; If you are using Linux Hint Rafaela , you could use trusty , To add the edge repository, add edge after stable on the last Itne of the command. For information about stable and edge Solids, see Docker variants. s sudo saa-apt-repository \ "deb [arch=a»iEl64] https:/zoownload.docker.cow/llnux/ubuntu % lease -cs) \ stable* Learn about stable and edge builds. [email protected]/howe/nixel# sudo add-apt-repository \ » "deb [arch-and64] https://download.docker.con/llnux/ubuntu \ > 5<lsb_release -cs) \ > stable" r ootjgn txel-yi r tual- Machine: /hone/nixel# [____________ ________ ____ Puc. 61 - результат выполнения команды add-apt-repository Вставьте в консоль команду из инструкции и дождитесь результата выполнения. (Рис. 61) Дальнейшие разделы инструкции содержат различные рекомендации по установке конкретных версий Docker на production-системах. Нас это уже не интересует, поэтому эти инструкции мы пропустим. После установки пакета Docker у нас появится возможность выполнить команду docker version 49 Никита Грызлов. Пособие релиз-инженера 1C Вывод этой команды аналогичен выводу на Windows-системе. Здесь также отображается версия клиентской части Docker и серверной - Docker-демона. Обратите внимание, что в текущем виде docker не позволит нам оперировать контейнерами без предоставления прав суперпользователя. Мы можем убедиться в этом, если выйдем из режима суперпользователя (командой exit) и снова попробуем выполнить команду docker version. Будет выдана ошибка доступа. Для решения этой проблемы обратимся к соответствующему разделу инструкции. В самом низу страницы мы можем найти соответствующую ссылку - Post-installation steps for Linux и, перейдя по ней, прочесть раздел «Manage Docker as non-root user» (Рис. 62) Manage Docker as a non-root user The docker daemon tends to a Unix socket instead of a TCP port бу default that Unix socket is owned by the user root and other users can only access it using -«ado . The docker daemon always runs as the root user, if you don't want to use sudo when you use the docker command, create a Unix group called docker and add users to It. When the docker daemon starts, it makes the ownership of the Unix soctet read/wrttable by the docker group. Warning; The _wr group grams j.reneges equ .atent»the root user, For details ors how this impacts security in your system, see Docker Daemon Aitack Surface, To t rsate the docker group and add your user: f. Create the barter group, S sudo gruupadd docker 2. Add your user to the docker group. S sudo useraod -afi docker MB Puc. 62 - настройка доступа к Docker под обычным пользователем В этом разделе содержится инструкция по настройке работы с Docker под пользователем без прав суперпользователя. Для этого нам предлагается: • Добавить новую группу docker - в нашем случае такая группа уже существует. • Добавить текущего пользователя в эту группу. • И, чтобы изменения прав применились, выйти из системы и зайти в нее заново. Данное действие выполняется командой usermod в терминале: Sudo usermod -aG docker $USER После выхода и входа в систему откроем снова терминал и попробуем выполнить в нем команду docker version 50 Silver Bulleters, LLC Теперь docker выдаст ответ, аналогичный ответу docker для Windows. Вернемся опять к инструкции. Следующий раздел инструкции-это настройка автостарта сервиса Docker. Скопируем команду по настройке и выполним ее в консоли. Configure pocker to start on boot Most current Linux distributions (RHEL, CewfOS, Fedora, ubuntu 16.04 and higher) use syseend to manage which services start when the system boots, ubuntu 14,10 and below use up»t*rt . systemd S s«ie eysfceefcl enable decker To disable this behavior, use disable instead. S sudo systemctl disable docker Puc. 63 - автозапуск демона docker Скопируем команду из инструкции в консоль и выполним ее (Рис. 63) После этого сервис Docker будет автоматически стартовать при каждом включении системы. 4.5. Установка docker-compose Для работы нам также потребуется утилита Docker Compose. Откроем поисковик, наберем в поиске «docker compose» и обратимся к официальному разделу документации. в docker compose Be* вид» Карт®» Имев» кяв Ев* Нявтряйи» 0, (Ьютрумвити Результатов: аримернп Si? ов (0.4? сек.,} Docker Compose - Docker Documentation https:#i3»es,tteter.OTmteKBtsse/ * Перевести эту страницу hitradueeon and Overview of Compose . Compose is a tool for defining and running muilecontalner Doeker appheations, To learn як about Campese refer to... Рис. 64 - результат поиска docker-compose Перейдем по первой ссылке и откроем документацию по установке. Пункт инструкции называется «Install Docker Compose». 51 Никита Грызлов. Пособие релиз-инженера 1C docker-compose - это удобная утилита для организации работы нескольких контейнеров, как единого целого. Она позволяет запускать и согласовывать между собой несколько контейнеров и согласовывает управление ими. Install Docker Compose EsjaiMWri 6яне 3 «гаоыйм You can run Compose on macOS, Windows and 64-tott Unux, To install It, you'll need to install Docker first b To install Compose; do the following: 1. install Docker engine: о macCS installation о Windows installation о Ubuntu installation о Other systems 2. The Docker Toolbox installation Includes both Engine and Compose, so Mac and Windows users are done installing. Others should continue to the next step. 3. Oo to the Compose repository release page on GttHub, 4. Follow the instructions from the release page and run the curl command, which the release page specifies, in your terminal. Note: if you get a -permission denied" error, your /usr/ideal/tin directory probably isn't writable and you'll need to install Compose as the superuser. Run sudo - i , then the two commands below, then exit . Puc. 65 - инструкция по установке docker-compose Первые шаги по установке мы уже сделали - движок Docker у нас уже установлен. Поэтому сразу обратимся к странице релизов утилиты (https://github.com/docker/compose/releases) 52 Docker Compose на GitHub (Рис. 65) Silver Bulleters, LLC Найдем последнюю стабильную версию - в моем случае, это будет 1.11.2. (Рис. 66) Данной командой можно установить Docker Compose, если запустить ее в консоли в режиме суперпользователя. Рис. 66 - страница актуальных релизов docker-compose Открываю консоль в режиме суперпользователя, выполнив команду sudo su, а затем скопирую команду для установки утилиты со страницы релизов на GitHub и вставлю ее в терминал. curl -L https://github.com/docker/compose/releases/download/1.21.0/dockercompose-'uname -s'-'uname -m' -o /usr/local/bin/docker-compose chmod +x /usr/local/bin/docker-compose Обратите внимание, что команд две, и при копировании из буфера обмена вторая команда может не отправиться на выполнение. В таком случае, поможем ей, нажав еще раз Enter. Теперь утилита Docker Compose установлена. Мы можем проверить это, набрав в консоли docker-compose --version Должна отобразиться информация о версии docker-compose. Если ошибок не выдано, значит, все утилиты, необходимые нам для работы Docker, установлены. 4.6. Hello, Docker! Давайте, наконец, попробуем запустить какой-нибудь контейнер. Для запуска новых контейнеров служит команда docker run. Откроем командную строку и выполним команду docker run hello-world 53 Никита Грызлов. Пособие релиз-инженера 1C Если у вас есть работающее интернет-соединение, то результат выполнения данной команды будет таким, как на рисунке ниже: (Рис. 67) l:\Users\te3tMJbfker run hello-world rtabli (u find in щн *bei3o-wwld: latest’ locally letests Pulling Ilbrapy/fcelle-WFl-e f8445dd*S222s Pull complete ttgest; sha2Sb:c55157S8d4c5ele838e9cd3e7f6c6a9d62eb5ee7e6fSf27be?de5f6dl28lac8d7 status: Downloaded newer image for hello-world:latest teilo -from Decker! 'his message shows that your installation appears to be working correctly. To generate this message, Docker took, the following steps: 1. The tectar client contacted the teeter daeeson. if 2. The Docker daeeson pulled the "hello-world" image from the Docker Hub. 3. The Docker daemon created a new container free that lege which rims the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. ’© try something яюге ambitious, you ев» run an Ubuntu container with; $ decker* пи -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: httpst/Zdead. docker, comZ w мэге esBepies and ideas* : https://dot s,docker.сот/engine/u serguide/ ; VJser sites t> Puc. 67 - результат выполнения контейнера hello-world Давайте разберемся, что же произошло. Как следует из сообщения, которое вывелось у нас на экране: • Сначала Docker-клиент обратился к Docker-демону, который запущен у нас внутри виртуальной машины с Linux. • После этого, Docker-сервер обратился на Docker Hub и скачал образ под названием "hello-world". Лог выполнения этого шага мы видим сразу же после запуска нашей команды: о Первая строчка говорит о том, что образа "hello-world" последней версии не было обнаружено на локальной машине. о В следующей строчке зарегистрировано обращение к Docker Hub. о Дальше идет информация обо всех слоях образа, которые были скачаны (в случае "helloworld: - это единственный слой). о Следующие строчки показывают нам hash-сумму скачанного образа и уведомляют нас о том, что образ был обновлен. • После скачивания образа Docker-демон создал контейнер. В настройках этого контейнера указано, что при его запуске нужно выполнять специальный скрипт, который и выводит это сообщение. • Последним шагом - вывод из Docker-контейнера был отправлен на Docker-клиент и в эту консоль. 54 Silver Bulleters, LLC И, хотя данный контейнер сам по себе не слишком впечатляющий, факт того, что мы видим это сообщение, означает, что Docker работает. Обратите внимание, что в этом примере нам также предлагают выполнить еще более интересную команду: запустить полноценную Ubuntu и открыть в ней терминал bash, выполнив команду: (Рис. 68) docker run -it ubuntu bash В данном случае, Ubuntu - это точно такой же образ, который будет скачан с Docker Hub, когда мы попробуем запустить контейнер. Давайте разберемся, что означает предложенная команда: • docker run-запуск нового контейнера • -it -это флагтого, что контейнер запускается в интерактивном режиме, и мы сразу же к нему подключаемся. • ubuntu - это имя образа, который ляжет в основу нашего контейнера • и bash - это команда, которая будет запущена в контейнере после его поднятия. C:\Users\testxJocker run -it ubuntu bash Unable to find image ’.ubuntu latest locally latest: Pulling from library ubontu d54efb8dbMd: Pull complete f8b84Sf4Sa87: Pull complete e8db7bf7c39f: Pull complete в«'54с4Де9в79: Puli complete 6d9ef359eea0: Poll complete Digest : :dd78eSdB?9?<4ЯГ1зЗЬ4Сй1isr f80/Cfdl? SG4<Wf Brfl Status? Downloaded newer image for ubuntu:latest root£8643b4e97222:/# cat /etc/lib-release OISTRIB_ID=Ubuntu blSTRIB RELEftSE-16.B4 toiSTRiB CODgMAME-xenial Д298$И8£г; 53S IDISTRIB .DfcSCRIPUCt^"UbuntU lb.04.2 ITS" Irooxf0b43Me97222:/» exit exit * : itest;--, Puc. 68 - работа контейнера ubuntu Здесь мы уже видим более подробный лог скачивания слоев нашего контейнера, после чего у нас появляется командная строка, запущенная внутри нашей Ubuntu. Эта ubuntu ведет себя, как полноценная независимая операционная система. Т.е. легко убедиться в том, что контейнер внутри выглядит, как виртуальная машина. В случае Ubuntu данные о текущей системе лежат в специальном файле lsb-relea.se. Мы можем посмотреть его содержимое, выполнив команду cat и указав путь к нему: cat /etc/lsb-release Как вы видите, система рапортует о том, что это - Ubuntu 16.04.2 LTS-версия. Выйти из командной строки Ubuntu обратно в нашу операционную систему можно командой exit. 55 Никита Грызлов. Пособие релиз-инженера 1C Давайте посмотрим, какие же контейнеры у нас запущены в данный момент. Для этого служит команда docker ps (Рис. 69) C:\Users\test>dock«r ps CONTAINER ID IMAGE NAMES COMMAND CREATED STATUS PORTS C:\Users\test» Рис. 69 - работа команды docker ps В выводе команды вы видите, что ни одного контейнера сейчас не запущено. Это произошло потому, что по умолчанию, контейнеры завершают свою работу после отработки стартовой команды: • Контейнер "hello-world" вывел приветственное сообщение и выключился. • Контейнер с Ubuntu после выхода из терминала bash также выключился. :\Users\test>docker ps -а IMAGE CONTAINER ID ubuntu 0643b4e97222 hello-world 4fb3b31eb9bb COMMAND "bash" "/hello" CREATED 9 minutes ago 16 minutes ago STATUS Exited (0) About a minute ago Exited (0) IS minutes ago PORTS NAMES fervent_»clean naughty_newton |c:\Users\test>_______________________________________ Рис. 70 - вывод всех известных контейнеров docker ps -а Для отображения всех контейнеров - и запущенных и не запущенных, у команды docker ps есть флаг -а. (Рис. 70) Как видите, команда docker ps -а показала нам два контейнера - ubuntu и hello-world: • Их идентификаторы; • Имена образов, на основании которых мы создали эти контейнеры; • Команду, которая была выполнена при создании контейнера; • Когда они были созданы; • Их текущий статус; • Ив самой правой колонке указаны их имена - эти имена были сгенерированы автоматически, так как мы явно не указывали Docker, как именовать наши контейнеры. Если мы еще раз запустим контейнер "hello-world" командой docker run hello-world, а потом снова выполним docker ps -а, то увидим, что в этом списке появился еще один контейнер с новым именем. 56 Silver Bulleters, LLC run hello-world С: Hello from Docker1 This message shows that your installation appears to be working correctly. To generate this message, Docker took the following steps: 1. The Docker client contacted the Docker daemon. 2. The Docker daemon pulled the “hello-world" image fro® the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. to your terminal. try something more ambitious, you can run an ubuntu container with; $ docker run -it ubuntu bash t© Share images, https://cloud.docker.cos/ -- •= free oodter ID: For more examples and ideas, visit: https://docs.docker.com/engine/usecguid^/ :\Us.ers\test>docfcer ps -a CONTAINER ID IMAGE helio-world 3ef7SeO3ee9c Й42Ь4е97222 ubuntu hello world «fh3b3Ieb9bb COMMA® “/hello*' “bash” “/hello” CREATED S seconds ago 16 minutes ago 17 minutes ago STATUS Exited (g) S seconds ago Exited (®> 3 minutes ago Exited (D) 17 minutes ago PORTS NAMES peaceful ..beaver fervent, fflcl ears naughty_newt<M C:\Users\t@st> Puc. 71 - создание еще одного контейнера hello-world Мы можем явно указать имя нашего контейнера, указав в команде docker run параметр --name. Например, назовем наш контейнер "hello-world" именем "hello". Указываем: docker run --name hello hello-world Если мы теперь еще раз выполним команду docker ps -а, то увидим еще один созданный контейнер с указанным именем "hello". Обратите внимание, что повторный запуск контейнера командой docker run --name hello helloworld выдаст ошибку. Так происходит из-за того, что команда docker run помимо запуска контейнера также пытается его создать на основе образа, а контейнер с именем "hello" уже зарегистрирован в нашей системе. Для запуска уже имеющегося контейнера мы можем воспользоваться командой docker start, передав ей имя или идентификатор контейнера. Например: docker start hello С;Wsers\test>dQcteer start hello hell-o C:\Users\test> Как видите, наш контейнер запустился, однако мы не увидели результатов его работы (текста «Hello from Docker...». Так происходит потому, что мы запустили этот контейнер без связи с нашей текущей консолью. Для того чтобы запустить контейнер и перенаправить его вывод в текущую консоль, существует параметр -i. Выполним: docker start -i hello 57 Никита Гоызлов. Пособие релиз-инженера 1C Приветственное сообщение от контейнера отобразилось в нашей консоли (Рис. 72). C;\Users\test?dotker start -1 hello Hello fro» Docker! This message shows that you- installation appeals to be working correctly. To generate this «essapr, Decker took the following steps. 1. The Docker client contacted the Docker dac-nc-. 2. The Decker daemon pulled the "hello world" image from the Docker Hub. 3. The Docker daemon created a new container from that image which runs the executable that produces the output you are currently reading. 4. The Docker daemon streamed that output to the Docker client, which sent it to your terminal. To try something more ambitious, you can run an Ubuntu rortainer with: > docker run -it ubuntu bash Share images, automate workflows, and more with a free Docker ID: https; //cloud. docker. com/ for «юге examples and ideas, visit: https;//dots.docker,com/engine/userguide/ C; Wsers\test>, Puc. 72 - результат работы контейнера hello 4.7. Управление контейнерами с помощью Kitematic Давайте попробуем с помощью Docker сделать что-то более впечатляющее. Многие программы уже упакованы в готовые контейнеры и опубликованы на Docker Hub. Например, вы могли слышать о таком новом появившемся GIT-сервере Gitea. Для того чтобы быстро запустить у себя этот GIT-сервер, достаточно ввести в Docker одну команду. В случае с Gitea это будет: docker run gitea/gitea Однако я хочу вам продемонстрировать запуск этого контейнера с помощью графического интерфейса Kitematic. Рис. 73 - поиск сервера Gitea в Kinematic Откроем Kitematic. Наберем в поиске «gitea» (Рис. 73) и выберем контейнер «gitea» от пользователя «gitea», нажав для него кнопку Create (Создать). 58 Silver Bulleters, LLC Kitematic запускает скачивание образа и после его завершения запустит новый контейнер на базе скачанного образа. В окне Kitematic вы можете видеть логи текущего выбранного контейнера. После запуска мы можем нажать на область WEB PREVIEW, чтобы открыть Gitea в браузере. (Рис. 74) ®‘ ! Containers © т H£W gitea {вуздеп*) © © © c? gitea I CQKTAINER LOGS wes prro sssjtsfex ЯМР tytfea* btW’toe; «ивуйо» wj.M.a betWMieg bMMWSfS:ing /aete/ssh/eststset.dsj.fcey.... hetto he--ie~<tso!ie naughty.ne«ton psscefu5_b«3ver Лю> 5» 15:59;W «MSfUJ-s Stiver llstwts* Ж. s; sort га. port л. iwa-15d>9:91 «яМ$$£|; Server ШЯяжХЧг. в» ж9/ш.т 15:ЗД-«2 15; И:«г т'й’-г «Н' ■ т-.адле жотщ 15:»:«2 15; W:»? гглде/гз 1S:59:«. 2а2?/йда 1S:S9:«2 ... геййШ |5г«№;Ж,:'-М1?ЛМЙ 15;59г«2 . авхулда 1S;S9i«2 • ‘ ждааз/п lsse.ei язт/валм »$;»;« atwa l$:S9:ft2 ■ KsMMK ЙгЙЙй 15;.»i*2 гвхт^йУа 15.59:*! лиулв/гг 15-5«;в! ж»«мй 15 59 «г Servian | -: |: »«te with s»ld 11 Ж»»йа »: 59:«г Щ кй <fe «rasa. VOLUMES i8||g|g g> @ Puc. 74 - установка образа в Kinematic 59 Никита Грызлов. Пособие релиз-инженера 1C В окне первоначальных настроек выберем тип базы данных SQLite3, скопируем из адресной строки порт, на котором запустилась Gitea. Введем его в поле порт HTTP и нажмем кнопку «Установить Gitea». (Рис. 75) Рис. 75 - веб-интерфейс приложения Gitea Мы видим стартовую страницу с предложением ввести первоначальные настройки. Что же произошло: • Приложение Gitea вместе со своими файлами, настройками и операционной системой в целом - находилось в «образе» • Из этого образа был запущен экземпляр этого приложения - «контейнер». Название «контейнер» означает, что приложение изолировано внутри своей виртуальной среды и не влияет на хост-систему. • Из контейнера наружу выставлен сетевой порт, по которому можно обратиться, например, из браузера • В браузере мы видим ответ от работающего сервера Gitea После нажатия кнопки «Установить Gitea» сервер начнет выполнять действия, необходимые для начала работы. Если мы вернемся в окно Kitematic, то увидим в окне логов информацию о происходящих сейчас действиях. Еще раз нажмем на окошко WEB PREVIEW для перехода к Gitea. 60 Silver Bulleters, LLC Puc. 76 - окно сервера Gitea после установки Как видите, данный GIT-сервер установлен и готов к работе. (Рис. 76) При этом единственное, что мы выполняли на нашем компьютере из административных действий - это запуск контейнера через Kitematic. Ненужные нам контейнеры можно удалить. Это можно сделать: • Либо из интерфейса Kitematic, нажав на крестик справа от названия контейнера • Либо из командной строки, выполнив команду docker rm и передав имя или идентификатор контейнера. Например, мы можем удалить наш контейнер hello: docker rm hello Если мы снова выполним docker ps -а, то контейнера "hello" мы уже не увидим. Обратите внимание, при создании контейнера Kitematic автоматически присвоил ему более понятное имя, так как образ назывался gitea, то и имя контейнера по умолчанию тоже gitea. Если мы попробуем удалить контейнер gitea командой docker rm gitea, он не удалится, поскольку на данный момент он запущен. Docker просит нас: • Либо остановить контейнер (это можно сделать, выполнив команду docker stop gitea); • Либо выполнить удаление с флагом -f (force) - принудительно. • гя -f gite® NER 10 Sef?5c03ec9s ■ ps -з IWH3S hells-world ubuntu отше ’/'belle' “bash* CREATED 23 minutes ago 39 ed notes ago STATUS Exited (в) 28 minutes ago Exited (D‘s 33 minutes a*?© PORTS twtss peaceful_beayen fervent_«clean Рис. 77-в списке отсутствует удаленный контейнер После выполнения команды: 61 Никита Грызлов. Пособие релиз-инженера 1C docker rm -f gitea контейнер gitea удалится - мы можем это наблюдать, выполнив docker ps -а. (Рис.77) Как вы видите, Docker позволяет быстро запускать приложения, даже те, которые вы ни разу не устанавливали. Нет необходимости читать огромные мануалы по установке и по требуемому окружению - большую часть работы Docker сделал за нас. 4.8. Dockerfile. Собственный образ Docker Попробуем создать собственный образ. Например, попробуем создать собственную реализацию образа "hello-world". Все образы Docker создаются на основании специального файла с описанием, который называется Dockerfile. Описание синтаксиса этого файла можно найти на официальном сайте Docker. (Рис.78) dockerfile Веж Видео Картинки Ноеостм Карты Ещб Настройки Инструменты Йиртшпп» приварив 1 ЕЙО ООО (0 36 се»: 1 Dockerfile reference - Docker Documentation r>,nps7«ocs.d<xker.comrerigine/retefen«.r'bui»er:' * Перевести эту страницу Traditionally the Oocfeertite is called Docktrriile and located in the toot of the context Увы use the 4 tag wWi docker boM to point to a Ooetetflto anywhere in Puc. 78 - результат поиска документации no Dockerfile Откроем браузер, наберем в поиске «dockerfile» и перейдем на страницу Dockerfile reference-на данной странице будет представлена информация по сборке образов и по подготовке собственного Dockerfile. Перейдем к разделу Format, где рассмотрен формат описания Dockerfile. Как вы видите, он довольно простой: 62 • Вначале идет ключевое слово (или команда, которую будет выполнять Docker) • За ним следуют аргументы этой команды. Silver Bulleters, LLC Besfunm «bcs changes Format s Here is the format of the ооемйн!» . ©n tills Mt; Ж Cswrenf INSTRUCTION armaments b The instruction fs not case-sensaws. However, convention is for them to be uppercase to distinguish them from I format 1 Parser «grecssaes 1 escape arguments more easily. Docker runs instructions in a tfecfeerfUe in order. The first instruction must be ‘ FROM' sn order to specify the environment ss^Sbcemenc site Base Image from wftirij you are building. Docker treats lines that fag/na®» 1 Usage f asaconwient.un)es$thefe№isavaltfparsef«fcreowe.A », marker anywhere else in a line is treated as an argument This allows statements like; FROM Si RUN 8 Known «swe.|RliM RW echo aw running * of c<K»i things' CMC LABEL Line continuation characters «not supported in comments. MAJNTAWO ^recewts) £XPOSI Puc. 79 - раздел документации no Dockerfile В словаре языка Dockerfile (Рис.79) всего порядка 15-ти ключевых слов, поэтому вы с легкостью сможете найти множество примеров использования по каждому ключевому слову. Минимальный Dockerfile состоит из двух инструкций: (Рис. 80) • Первая инструкция - это FROM. После ключевого слова FROM указывается имя базового образа, на основании которого мы будем формировать собственный образ. • Второе ключевое слово, которое мы будем использовать - это CMD. Как следует из описания, команда CMD служит для задания команды по умолчанию при выполнении контейнера. 63 Никита Гоызлов. Пособие релиз-инженера 1C FROM FROPI Or <imege»:<tag> Or <iraage>|teH.gest> The from instruction sets the Base image (or subsequent instructions. As such, a wild ооскййДе must have from as its first instruction. The image can be any valid image <- it is especially easy to start by pulling an image from the Public Repositories. • • from must be the first non-comment instruction in the awefcerfitlle . from can appear multiple times within a single Oockerfile tn order to create multiple images. Simply make « note of the last image ID output by the commit before each new from command-. • The teg- » digest values ere optional , if you omit either of them, the buMter assumes a latest- by default The builder returns an error if it cannot match the teg value. CMD The ело Instruction has three forms: • сиз • cud l~fmri№,i~,-per№i‘i • сто (exec form, this is the preferred form} j (as befault parameters to £NTRypc»nt} рлгая! prci isreUfarm) There can only be one i сив : snstructisn in а offlkertttie . if you list more than one сто then only the fast eno will take effect. The main purpose of a a® is to provide defaults for an executing container. These defaults can include an executable, or they can omit the executable, in which case you must specify an еттютстмт instruction as well. Now: if o® is used to provide default arguments for the егявурохкт, instruction, both the сто and gniRypoinT instructions should be specified with the jSON array format. Note; The exec form is parsed as a JSON array,, which means that you must use double-quotes о around words nest single-quotes Q, Puc. 80-минимально необходимые инструкции файла Dockerfile 64 Silver Bulleters, LLC Описывать наш образ мы будем в редакторе Visual Studio Добро пожаловать - Visual Studio Code Файл 0 Правка Выбор Вид Code. Откроем его. Для упрощения работы с форматом Переход Справка РАСШИРЕНИЯ — У Dockerfile установим расширение Docker. Для этого Добро иожалс откроем вкладку с расширениями, в поиске наберем docker 1 Docker Пемпагрюигь т he ■ < „_____ Vienz.oft ________ от Microsoft и Давайте создадим новую папку в нашем рабочем В|1|нн|||йиа|1И 1 I каталоге и откроем ее в Visual Studio Code. Это можно ккотшвиео кеу s»...... сделать с помощью команды «Файл/Открыть папку» - Установить прямо в окне выбора папки мы создадим новую папку Docker lintcr Б расширение Залу согласимся перезагрузить редактор. (Рис.81) Adds syntax bgWtgtrtmg. sni.„ о установим «docker», р Lint perl. python aod/or rub... «hello-docker» и выберем ее. Пос/ Установить CodcLift Uploads cuiienl project to C... Установить Рис. 81 - установка расширения для работы с Dockerfile Теперь в папке hello-docker нам нужно создать новый файл с именем Dockerfile. (Рис. 82) Для этого мы можем воспользоваться командой создания нового файла на панели проводника. Обратите внимание, Dockerfile - это файл без расширения. -на ,йГ £”4 Dockerfile - hello-docker - Visual Studio Code Файл Правка 0 Выбор Вид Переход гакзаодник ОТКРЫТЫЕ РЕДАКТОРЫ Р О Справка Добро пожаловать Dockprhle Dockerfile г X 1 ubuntu:latest 'ГО (“ecw", “Приват, мир! HTUO-DOCKER Dockerfile Рис. 82 - создание минимального Dockerfile в Visual Studio Code Напишем первую обязательную команду для нашего образа (укажем базовый образ). Для этого наберем ключевое слово FROM и укажем имя базового образа - я предлагаю использовать ubuntu. Для явного указания того, что мы используем последнюю версию образа ubuntu, через двоеточие укажем специальный зарезервированный тег - latest (последняя версия). У нас получится: FROM ubuntu:latest Образ ubuntu уже содержит приложение, которое выводит переданный текст на экран. Это команда echo. Поэтому на новой строке с помощью ключевого слова cmd укажем Docker, что при запуске контейнера он должен будет выполнять эту команду. Параметры для ключевого слова cmd, если их больше одного, рекомендуется создавать в квадратных скобках. CMD • Первым параметром будет выступать имя нашей команды - это echo. • Вторым параметром, через запятую, будет выводимый текст. ["echo", "Привет, мир!"] 65 Никита Грызлов. Пособие релиз-инженера 1C После этого файл для нашего образа готов к сборке. Сохраним его. Сборка образа производится из командной строки. Для этого мы можем открыть интегрированную в Visual Studio Code командную строку сочетанием клавиш <ctrl+~> или из главного меню (Вид Интегрированный терминал). (Рис. 83) Для сборки образа служит команда docker build, где в качестве аргумента этой команды необходимо передать путь к каталогу, где находится Dockerfile. Так как терминал открыт в нашем рабочем каталоге hello-docker, путь к этому каталогу мы можем передать, указав точку: docker build . Если мы выполним команду в ее текущем виде, то нам будет тяжело отличить наш собственный образ от других - у него не будет имени, у него будет только служебный идентификатор. Более понятное имя готового образа можно указать, добавив параметр -t и имя нашего образа my_hello_world. docker build -t my_hello_world . После выполнения команды нажатием Enter в терминале отобразится лог сборки, после чего мы можем просмотреть созданные образы командой docker images. PS C:\workspace\hello-docker> docker images TAG IMAGE ID REPOSITORY myhelloworld latest 0af4elec9c78 latest 8120d3f99869 gitea/gitea bba72ff00078 latest gogs/gogs 0cf2e©8ed3fa latest ubuntu 48bS124b2768 latest hello world PS C:\workspace\hello-docker> | Puc. 84 - созданные образы docker 66 CREATED S4 seconds ago 2 days ago 9 days ago 3 weeks ago 2 months ago SIZE 130 MB 72.6 MB 103 MB 130 MB 1.84 kB Silver Bulleters, LLC Давайте попробуем запустить наш новый образ. Сделать это можно точно так же, как мы это делали раньше - командой docker run и указанием имени образа. (Рис. 85) Напишем: docker run my_hello_world В консоли отобразилась надпись: «Привет, мир!» PS. C:.\»rks.pace\helis-do€.ker> docker ran Привет, мир! PS C:\workspacc\bello <tocker> $ rid Рис. 85 - результат выполнения контейнера Часто при запуске приложений необходимо выполнять более сложные операции. Обычно они указываются в специальном исполняемом файле, путь к которому передается в аргументах команды cmd. Давайте попробуем написать такой внешний исполняемый файл. Создадим в рабочем каталоге новый файл. Так как образ у нас на базе ядра Linux, он должен иметь расширение *.sh. Назовем его «run.sh». Обратите внимание, для корректной работы на Linux-системах файлы *.sh должны иметь переводы строк LF. В правом нижнем углу вы можете найти переключатель используемых переводов строк. (Рис. 86) На Windows-машинах файлы по умолчанию создаются с переводами строк CRLF. Переключим на LF. Рис. 86 - переключение режима переводов строк для файла Наш исполняемый файл будет состоять из всего одной команды - это команда echo с аргументом «Привет, мир!». echo "Привет, мир!" Сохраним наш командный файл. Для того чтобы мы могли запустить этот файл внутри нашего Docker-контейнера, нам необходимо передать его внутрь образа. Для этого в Dockerfile служит ключевое слово copy. Вернемся в наш 67 Никита Грызлов. Пособив релиз-инженера 1C Dockerfi 1е и перед выполнением cmd добавим команду COPY. (Рис. 87) У нее очень простой синтаксис - сначала указывается, какой файл или каталог вы хотите скопировать, а потом - куда. Напишем: COPY run.sh Рис. 87 - содержимое DockerfНе Одиночный слеш указывает путь, куда мы должны поместить этот файл - мы его поместим в корневой каталог. И, поскольку теперь наш файл будет находиться в корневом каталоге нашего образа, мы можем указать путь к нему непосредственно в команде cmd - поэтому поменяем наш прямой вывод в консоль с помощью команды echo на запуск run.sh, указав CMD /run.sh * it powwiWIw мрмлчад 4- 0 х Step 2/3 : СОРУ rtm.sh / - •> Using cachg —> Step 3/3 : /rwi.sh - ■> Using cache ---> фМЮЗЫЮсчй Successfully built SECURITY ЙАЖ1Ж ¥« are building a Gsck»- iwge from bfindews against а nen-Hiudsews ttoefeer host., All files and directories added to build context will have *-rwxr-xr-x‘ ^emissions. it is to double check and reset penal ss Ions' files and directories. PS C: \kK>rkspace4feelia-docker> docker run ssyjiell©^worid ‘ Ориает, м«р 1 • ~ч ~ -с. PS С:\wrksp3cettello"docker> д____________• Рис. 88 - результат работы контейнера Сохраним наш Dockerfile и заново выполним сборку образа, выполнив команду: docker build -t my_hello_world . После сборки образа попробуем запустить новый контейнер. В консоли также отображается «Привет, мир!», однако, это уже результат работы нашего скрипта. (Рис. 88) С помощью Dockerfile в образе можно производить еще множество различных действий - например, после получения базового образа Ubuntu можно запустить обновление установленных пакетов, установить дополнительные приложения, произвести манипуляции с файловой системой и т.п. На Docker Hub вы можете найти большое количество примеров Dockerfile - все они, в основном, располагаются на GitHub. 4.9. Монтирование разделов Одна из особенностей при использовании Docker - это недолговечность контейнеров. Поскольку вы будете регулярно пересобирать собственные контейнеры или обновлять образы, полученные из Docker Hub, для вас может быть критичным сохранение накопленных в контейнерах данных. Это могут быть различные данные, начиная от готовых конфигурационных файлов, на основании которых работает ваш контейнер, до используемых вами баз данных. 68 Silver Bulleters, LLC Дело в том, что любые изменения, сделанные приложением в контейнере, пропадут после удаления контейнера. Созданные файлы, измененные настройки и тому подобное существует только на время существования контейнера и пропадет при его пересборке. Обеспечение возможности монтирования разделов - инструкция VOLUME в Dockerfile Для решения проблемы сохранения данных в Docker существует механизм монтирования разделов - для указания возможности такого монтирования служит ключевое слово volume. С помощью этой инструкции вы в своем Dockerfile можете объявить, что определенный каталог, находящийся внутри контейнера, нужно пробросить в вашу операционную систему. За примерами обратимся на Docker Hub: откроем в браузере сайт hub.docker.com и найдем здесь уже используемый нами образ gitea от пользователя gitea. В большинстве случаев на странице с образом есть информация о Dockerfile: • Она будет либо отображаться разделом в описании образа; • Либо же сможем посмотреть Dockerfile в исходном репозитории этого проекта. PUBLICREPOSITORY gitea/gitea ☆ Raj» Wo Т«§» Short Descnpfton I Gitea: Git with a cup of tea —-------- --- „ .— FuSI Description Managed by go-jyttgjytea, buiit and pushed with Drone C Puc. 89 - ссылка на репозиторий-источник образа Gitea В описании gitea указана ссылка на их репозиторий - перейдем по ней. (Рис. 89) Найдем в репозитории файл Dockerfile и перемотаем его ближе к концу, где обычно находится описание монтируемых разделов. На данной строке вы как раз можете увидеть ключевое слово volume и путь к каталогу внутри Docker-контейнера, который можно будет смонтировать на вашу операционную систему. (Рис. 90) 69 Никита Гоызлов. Пособие релиз-инженера 1C При монтировании <г С Й GitHub. Inc. [US] https: ■ aithub.com.-tjo. jitta/'grtea/Wob/ nastet/Deckertife nt -rf \ /wr/esebe/spU/* IS \ eiagfw 1 21 -s e test» \ (it 88 \ Hauser \ -S -H T) \ -ft /dkWgit \ • s /feift/beslj \ -a ДО \ -6 git t Bit *s \ I snaiSSsvr. | tjasefr* I head rchs *sitiS{4ete » c 12)” [ cftpassMd git £f*V GXt£A_CUSTOH /data/gitea cHV GOOf 3LiiS=netdrtS=gc IZ vouk | fc ЕИТДуРЩИТ (*7u5f/sin/entryscint*’] O© [*/t».in/W‘5Vscan*, “/etc/si*’] СОРТ eo«»«r / L -Л. СОИ gitea /kpp/gitkk/gitk* Рис. 90 - инструкция монтирования VOLUME внутри Dockerfile Монтирование разделов при запуске контейнера из командной строки За монтирование разделов при запуске контейнера из командной строки отвечает одноименный параметр volume (или его короткая версия -v). При использовании Docker for Windows нам необходимо предварительно разрешить Docker использование наших дисков. Для этого откроем настройки Docker, щелкнув в трее правой кнопкой и выбрав пункт Settings. (Рис. 91) 70 Silver Bulleters, LLC Перейдем на закладку Shared Drives, укажем, что диск С является общим для наших Docker-контейнеров и применим изменения. (Рис. 92) Settings X General Shared Drives Shared Drives Select the local drives you want to be available to your containers. Advanced Drive Shared . Network 0 C Proxies Daemon Diagnose & feedback 01!.ств4сГ, Reset - 0 X i cj/OserSi/dat» aflpine Is , date * Eteeksr >s. running Reset credentials,» Puc. 92 - опции монтирования дисков хост-машины Здесь важно отметить, что само разрешение использовать диск С: в качестве общего не позволит контейнерам писать в произвольное место на этом диске - при запуске контейнера вам все равно нужно явно указывать каталог, который будет являться точкой монтирования для Docker с помощью параметра volume (или -v) После применения изменений Docker запросит у вас логин и пароль пользователя, под которым он будет осуществлять монтирование. Здесь также важно, что Docker на данный момент не позволяет монтировать файл от пользователя, у которого не установлен пароль. Поэтому укажем имя пользователя и пароль, и нажмем кнопку ОК. Теперь мы можем использовать диск С для монтирования разделов. Давайте попробуем примонтировать раздел data на наш локальный диск. Для этого в рабочем каталоге workspace мы создадим папку, которую будем указывать, как точку монтирования. Это будет каталог gitea в папке volumes. Скопируем путь к этому каталогу в буфер обмена. Рис. 93 - команда запуска контейнера с монтированием volume 71 Никита Грызлов. Пособие релиз-инженера 1C Следующим шагом попробуем запустить контейнер gitea с параметром volume. (Рис. 93) Для этого воспользуемся командой docker run, для которой с помощью параметра volume (или -v) укажем точку монтирования: • Сначала указываем каталог на нашей файловой системе (C:\workspace\volumes\gitea) • И через двоеточие указываем каталог внутри файловой системы контейнера (/data) И после этого указываем имя контейнера gitea/gitea. Итоговая команда будет выглядеть как: docker run -v С:\workspace\volumes\gitea:/data gitea/gitea Рис. 94 - ошибки файловых прав на Windows Если мы выполним данную команду, то увидим ошибки, которые нам будет рапортовать Gitea (Рис. 94). Поэтому прервем выполнение, нажав сочетание клавиш Ctrl+C. ~ gitea 2 В Гяммм » ф Ледсямгма » Этот комгмжзтер » Ажаявм-ий двое (OJ » wwlctpece » «йжпе$ » gitra » Ими Л" Быстрый доступ Дата изменения 1 яп Рлвмер Лига с файвми В 9'* В! Рабочий СИЛ < Загрузки * + Документы < •- Изображения < д«м Я и*1 НЧё W Плике с файлами Папка < файлами git workspace 2 Видео Рис. 95 - проброшенные файлы из контейнера К сожалению, GIT-сервер Gitea не умеет корректно работать с разрешениями на файлы и папки при монтировании раздела на операционную систему Windows. Однако, если мы откроем каталог, куда мы 72 Silver Bulleters, LLC смонтировали данные нашего контейнера (у нас это - C:\workspace\volumes\gitea), то мы увидим, что сами файлы из контейнера пробросились на нашу машину. (Рис. 95) Это один из подводных камней при «смешивании» Linux-образов и файловой системы Windows. Тем не менее, видим, что сам процесс монтирования хостовой файловой системы в Linux-контейнер выполнен успешно. Аналогичным образом мы можем настроить проброс любой точки монтирования из контейнера на нашу систему. Монтирование разделов при запуске контейнеров с помощью Kitematic Попробуем сделать то же самое и с Kitematic. Для этого откроем Kitematic, и выберем какой-нибудь из контейнеров, созданных на основании Gitea. В его настройках перейдем на вкладку Volumes. (Рис. 96) Как видите, здесь также указан список точек монтирования, которые предоставляет нам Docker- контейнер и места их монтирования на нашей машине. Чтобы указать свой путь к точке монтирования, нам нужно нажать на кнопку CHANGE. Однако Kinematic требует, чтобы монтируемые разделы находились в пользовательском каталоге. Это может быть: • либо папка «Документы», • либо корневой пользовательский каталог - в моем случае, это каталог СУПользователиДеБТ Мы создадим в каталоге О/ПользователиДеэ! аналогичный каталог volumes, а в нем папку gitea, и выберем ее в качестве точки монтирования. После того, как наш контейнер перезапустится, мы, открыв этот каталог, также сможем наблюдать в нем файлы данных Gitea. 4.10. Композитное docker-приложение Docker очень хорошо соответствует духу микросервисной архитектуры, когда приложение вместо тяжелого монолита представляет собой набор независимо развертываемых и обслуживаемых сервисов. Часто такие сервисы взаимодействуют между собой через сетевые протоколы, например, это общение сервера приложений с базой данных. Изначально, Docker-контейнеры изолированы друг от друга, однако, мы можем их объединить в одну виртуальную сеть и разрешить им общаться с помощью этой сети. Такое объединение в Docker называется линковкой. В классическом виде оно производится при запуске контейнера из командной строки с указанием специального параметра. Однако на практике команду по запуску Docker-контейнера с большим количеством параметров неудобно редактировать, 73 Никита Гоызлов. Пособив релиз-инженера 1C хранить и, тем более, запускать. Для упрощения связи контейнеров между собой и упрощения запуска этих контейнеров был разработан инструмент Docker Compose. По сути, Docker Compose представляет собой обертку над обычным запуском Docker-контейнеров. Главное отличие - это наличие специального конфигурационного файла, в котором указаны все передаваемые контейнером параметры. Использование утилиты Docker Compose и формат конфигурационного файла также описаны на сайте Docker. Откроем браузер, наберем в поиске «docker compose» и перейдем в раздел документации Docker Compose. Docker Compose -w Ж г F Compose is a too! for defining and running multi-container Docker applications. TcHeam more about Compose refer to the following documentation: • Compose Overview • install Compose • Getting Started • Get started with Drupe! • Get started with Django • Get started with Rails • Ges stangtf with WofdfTess • Frequently asked questions • CommandTine reference • Compose fife- reference • Envirwwientftle О To see a delated tet of changes for past and current releases of Docker Compose, please refer to the CHANG ELOG. Puc. 97 - документация no работе c compose Полное описание конфигурационного файла можно найти по ссылке Compose file reference. Однако я хочу сразу продемонстрировать вам работу с этим инструментом на живом примере. Поэтому мы перейдем в раздел Get started with WordPress (Рис. 97) Этот раздел рассказывает нам, что настройки для Docker Compose лежат в специальном файле-dockercompose.yml. 74 Silver Bulleters, LLC Давайте создадим этот файл в нашем рабочем каталоге. Для этого откроем редактор Visual Studio Code и создадим новый файл с именем docker-compose.yml. (Рис. 98) Н} dock ercompose.yml - hetio-docker - Viiu;it Stud» Code Тз.-- Праекэ Выбор Вид Перевод С трагга. ПЙЖЭЙЙЙК 0 1южаж‘вгть dodtef-cxxnpose.yml X 1 -» ОГЮ’ЫНЫЬ РЕДАКТОРЫ Добро пожаловать Р docker-compo\eymi и ннкхххх. ‘j b О ■’(г о docker comjxwe.yral Ooderfite 1НП..Ф Рис. 98 - создание заготовочного файла docker-compose.yml fife that w«i start your 3. Create а ;blog and a separate MySQi instance with a volume mount for data регс&аке,: ver»s«m; ‘2‘ services: dfe: iwtget нрфМ mimes: - <fЬ_й«a; / v#7 libZmysql restartг always wfvinwwnt; wordpress MYS45ijSSTABASfi ^repress WSQLJ»ASSWOI®; wordpress k KOrdprts,; - db image: wordpressslatest Rrts; - wW»rW’ restarts always *wira»anm W0ftmgS5_0e„WST: dfe:33'M WOKOPRSSS^DB^mSSWOfiOS wordpress NOTE:: The-dueter volume tfejfea wiii perw any updates marie by worspressts the database, team , more about docker volumes Puc. 99 - содержимое compose-файла для WordPress Вернемся к документации. В третьем разделе этой инструкции представлен пример готового конфигурационного файла для запуска WordPress в связке с MySQL (Рис. 99). Давайте его скопируем в наш файл и рассмотрим поподробнее. Язык YAML - это простой язык разметки. Главное, что необходимо помнить при редактировании YAMLфайла - это строгое соблюдение отступов строк - увеличение отступа в этом формате можно сравнить с вложенным тегом XML-файла. Рассмотрим содержимое файла docker-compose.yml для связки wordress и mysql подробнее. • YAML-файл начинается с указания версии стандарта конфигурации. В нашем случае - это версия 2. • Далее следует коллекция сервисов - с именем db и с именем wordpress. о Первым объявлен сервис с именем db. 75 Никита Гоызлов. Пособие релиз-инженера 1C * Секция image указывает, что он будет представлять собой Docker-контейнер, поднятый на основании образа MySQL версии 5.7 (mysql:5.7) * В подразделе volumes указаны точки монтирования. • Здесь используется так называемый «именной раздел» db_data, о котором я расскажу чуть позже. * В секции restart указана необходимость перезапуска контейнера, если его выполнение прекратилось (restart: always) * Далее в секции environment следуют переменные среды. • Здесь у нас указан пароль суперпользователя, • Имя базы, создаваемой по умолчанию • Пользователь по умолчанию • И пароль пользователя по умолчанию Список используемых в образе переменных среды обычно указывается в его информации на Docker Hub. о Второй используемый сервис носит название wordpress * В секции depends_on мы видим указанную зависимость от сервиса db. Это означает, что данный сервис будет поднят только после того, как будет поднят сервис db. * Секция image показывает нам, что данный сервис будет использовать последнюю версию образа wordpress (wordpressdatest) * В секции ports указано, что 80 порт из Docker-контейнера будет пробрасываться на порт с номером 8000 в нашей операционной системе. В случае Wordpress это означает что, если мы в браузере откроем адрес http://localhost:8000, мы увидим Wordpress. Секция restart аналогично указывает утилите Docker Compose, что этот сервис должен быть поднят постоянно. * В переменных среды указываются пути к серверу баз данных. Это переменные: • WORDPRESS_DB_HOST -путь к серверу базы данных • WORDPRESS_DB_PASSWORD - пароль базы данных Обратите внимание, что благодаря тому, что Docker Compose автоматически свяжет эти два сервиса, они смогут общаться друг с другом по своему имени. В данном случае, хост db будет разрешаться адресом docker-контейнера с именем db. Теперь пару слов о секции volumes. В данном конфигурационном файле использована возможность Docker-демона создавать монтируемые разделы и присваивать им имена, которые в дальнейшем можно будет использовать при запуске Docker-контейнера в параметре volume. Это удобно на Linux- системах и на Windows при использовании Windows-контейнеров, поскольку в этом случае папки с данными будут лежать в предсказуемом месте, рядом с установкой Docker и легко могут быть скопированы или заархивированы. Однако в нашем случае, при использовании Docker for Windows такая возможность Docker нам неудобна. Все дело в том, что эти разделы будут создаваться внутри виртуальной машины MobyLinuxVM и достать их оттуда на домашней системе—довольно нетривиальная задача. Если нам необходимо будет сохранять какие-либо данные из Docker-контейнера, то более удобным способом будет указание пути 76 Silver Bulleters, LLC монтирования прямо в настройке сервиса. Например, в секции volumes сервиса db мы вместо db_data можем указать явный путь на нашей дисковой подсистеме (например, c:/data). При использовании такого режима секцию volumes можно будет удалить. Пока же, для простоты, я позволю Docker создать этот именованный раздел. В общем и целом, этот конфигурационный файл уже готов к запуску. Естественно, при использовании на production-среде нам следует поменять стандартные названия баз и паролей, однако тестовый запуск мы можем произвести уже прямо сейчас. Для запуска этих связанных сервисов мы откроем интегрированный терминал и выполним команду fill docker-compose up ..|...... В результате выполнения этой команды Docker Compose передаст Docker стандартные команды по скачиванию образа с Docker Hub, автоматически создаст виртуальную сеть при запуске и слинкует эти контейнеры между собой. Дождемся подготовки образа. После подготовки образов Docker Compose создает и запускает новые контейнеры и выводит в терминал логи каждого из контейнеров. (Рис. 100) • I 2в1?-вЗ-23Т13:35:24.0911992 8 (Warning) 281? 03-2ШЗ: 35;?4„@912232 й (Warning) 2017 03 13113:35:24.8912322 8 (Warning) 281 ?-03-23И 3:35:24.8957792 0 (Warning) ‘user’ entry ‘mysql.sys^lecalhust” ignored in --skip-пдие-resolve mode. ’db' entry 4ys «ys^l .sysfl<xaihobt‘ ignored in skip naw-resolve ‘proxies priv’ entry ’ ignored in skip-мате» woive ‘tablesj>riv’ entry 'sys^tonfig sysql.sys^iocsihost’ ignored in --skip-naise-resolv e «Ф1 . i 2«.l7-03«азт:35:24.1229622 8 (Mote) Event Scheduler: Loaded 0 events 7817 03-23113:35:24.1231342 в (Mote) Executing ’SELECT • НЮИ WES;’ to get a list of tables using tb e deprecated partition engine. vou «у use the startup optis» ’ -disable-partitifle-engii^^check’ to skip fidscheck. 5 Ж7-83-23Г13:35:24.12.33492 e [Mote] Beginning ef list of non-natiwely partitioned tables 201/-93-23713:35:24.1ППП © (Mote) End of list of non natively partitioned tables'^' ' ' ’ 1 i. -• 211? 83-23113:35;24„1769922 0 [Mote] eysqld: ready for connections. Version: ’5.7.17* socket ’/var/rw/ffiyscjidZesysqld.sotk'' port: 3306 , c-¥i ,, Муш towiuni|.y -server Puc. 100-логи запуска композитного приложения Через некоторое время в консоли появится сообщение об успешном поднятии WordPress и MySQL. После появления в логах надписи о том, что MySQL готов к принятию сообщений, мы можем перейти в браузере по адресу http://localhost:8000 (Рис.101) Рис. 101 - окно приложения WordPress 77 Никита Грызлов. Пособие релиз-инженера 1C Откроем браузер и перейдем по адресу http://localhost:8000 . У нас появляется приветственное окно WordPress и после выполнения базовых действий вроде выбора языка, имени пользователя, его почты, мы можем выполнить полноценную установку. После небольшого ожидания у нас откроется административный интерфейс WordPress. Если мы что-нибудь изменим в нашем изначальном конфигурационном файле, то Docker Compose при поднятии сервисов автоматически пересоздаст контейнеры на основании наших настроек. С помощью Docker Compose также, как и с обычным Docker, сервисы можно запускать в так называемом Detached-режиме - когда утилита Docker Compose начинает работать в новом процессе, не блокируя наше окно командной строки. Для этого служит флаг -d. Вернемся в редактор Visual Studio Code, остановим работающий сервис по Ctrl+C, и запустим команду: docker-compose up -d Сервисы запустились, однако наша консоль больше не заблокирована, но и логов мы тоже не видим. Для изучения текущих логов наших контейнеров мы можем воспользоваться командой dockercompose logs. Для того чтобы вывод логов не прекращался, а продолжал выводиться в текущее окно командной строки, мы можем воспользоваться флагом -f (--follow). docker-compose logs -f В консоль вывелись логи наших сервисов. Если мы будем осуществлять какие-то действия, например, переходить по страницам WordPress, здесь же мы увидим логи самого WordPress. Нажатие комбинации Ctrl+C в этом режиме не остановит работу контейнера - мы просто выйдем из режима получения логов. 2017-03-23113:54:13.9469992 8 [Warning] ‘tatjJesjsriv* entry *sys_config «pqi.sysglocaltost' ignored in -resolv db_l е mode. 2017~03-2STX3:S4; П.9542752 0 [totej Event Scheduler; Loaded « events 20X7-03-23113:54:13.954633Z 0 [Mote] Executing ’SELECT * lKFORHATim_SOtf«A.TABLES;' to get a list of tables using th db 1 e deprecated partition engine. You may use the startup option ‘--di sable-part it ion-engine-creek * to skip this check. j 2S17-03-23113:54; 13.9547402 8 [Mote] Beginning of list Of «m-natiwly partitioned tables db„l db~l ! 2S17 03-23113:54:13.972150/ @ [tote] End of list of non-natively partitioned rabies } 201J-03-23113:54:13.8724932 8 [tote] mysqld. ready for connections. J | Version: “5,7.17’ socket: Vvar/ron/mysqld/myiqld.sock* pert: 3306 МуЖ Coflewnity Server (GPL) db 1 Aborting. PS C:\workspace\hello-do£ker> docker ps £0MtAIMER 10 §«а6св5738Й IMAGE wordpress: latest er wordpressl ссташ “doefeer-entrypoint,... ” CREATED 4 minutes ago STATUS Up 2 minutes “docker-©ntrypoint. 23 minutes ago Up 2 ainut«&>- PGftTS WAMES в.вД.вдаев - >Wtcp bellodock 7 МУьййск er_db_l PS C:\work5pace\hellodccker> Д Puc. 102 - работающее композитное приложение Убедиться в этом мы можем, набрав команду вывода запущенных контейнеров docker ps. Как видите, здесь присутствуют два запущенных нами контейнера - mysql и wordpress (Рис. 102). 78 Silver Bulleters, LLC Раздел 5. GIT-сервер 5.1. Обзор имеющихся GIT-серверов Как только с репозиторием начинают работать несколько человек с различных рабочих мест, возникает потребность в установке GIT-сервера - доступного по сети хранилища GIT-репозиториев. И, несмотря на то, что в GITуже встроены утилиты для разворачивания такого сервера в режиме командной строки, от работы с сервером хочется чего-то большего: • Веб-интерфейс; • Минимальный баг-трекер с привязкой к коду; • Возможность обсуждения кода и задач; • И прочие сервисы. К счастью, нам необязательно придумывать что-то свое. В сети существует большое количество различных GIT-серверов - от совсем миниатюрных, предоставляющих только веб-просмотр истории репозитория, до портальных систем, позволяющих покрыть полный цикл работы с продуктом - от появления идеи о новой функциональности, до публикации ее на production-сервере. Возможность/Продукт GitHub GitLab Gogs/Gitea BitBucket Forks,Pull-requests, + + + + за большие деньги есть бесплатная версия с бесплатно за большие деньги - - Issues, Wiki Self-hosted богатой функциональностью Доска задач + + Приватные за деньги Бесплатно репозитории бесплатно с лимитом (нет публичного сервера) Центр уведомлений + + только в Gitea Интеграция очень + + API Code review + + есть, в 2GB, дальше за деньги - готовых в основном плагинов очень мало Atlassian Stack Нет + вокруг комментирования строк коммитов Сборочная линия интеграция Встроенная - встроенная, агенты только от Atlassian Локализация - +/- «Переведен на 40%» + - Я составил небольшую сравнительную таблицу, в которой выделил наиболее известные GIT-сервера и их возможности. На данный момент из известных GIT-серверов можно выделить: • GitHub; • GitLab; • Gogs и его форк Gitea; • И BitBucket. Все эти репозитории имеют: • Встроенный баг-трекер; • Вики; 79 Никита Грызлов. Пособив релиз-инженера 1C • Возможность создавать собственные версии репозиториев (форки); • И возможность отправлять предложения на изменение кода (pull-request'bi). Однако у каждого из них есть свои особенности, которые хочется отметить: • Часто в Enterprise особое внимание уделяется информационной безопасности, поэтому важной функциональностью GIT-сервера является возможность развернуть его на собственных инфраструктурных мощностях организации. о У GitHub и BitBucket такая возможность предоставляется за деньги; о Gogs и его форк Gitea можно развернуть бесплатно, о У GitLab есть две версии - Community Edition и Enterprise Edition: * Community Edition - это полнофункциональный GIT-сервер, который можно установить у себя бесплатно; * Ав Enterprise-версии присутствуют дополнительные возможности, важные для больших организаций - вроде синхронизации пользователей по протоколу LDAP или сложных проверок на отправку данных в репозиторий. • У каждого из представленных GIT-серверов есть доступная в интернете веб-версия, базирующаяся на мощностях компаний, разрабатывающих эти продукты. В этих веб-версиях есть возможность создавать приватные репозитории. Доступ к таким репозиториям выдается персонально их владельцам, а правилами обслуживания гарантируется приватность данных (без вашего явного согласия в письменной форме даже сотрудники компании-разработчика данного GIT-сервера не будут иметь к ним доступа). о В веб-версии GitHub такая возможность доступна за абонентскую плату, о в GitLab эта возможность предоставляется бесплатно, но на проект устанавливается лимит в 10 Гб, о о В BitBucket эта возможность бесплатная с лимитом в 2 Гб, Ав Gogs и Gitea ситуация несколько другая - их публичный сервер служит только для ознакомления с продуктом, и располагать там реальные проекты не рекомендуется, так как данные этого сервера периодически очищаются. • Все большую популярность при разработке набирают доски задач - возможность управлять задачами в режиме досок есть в GitHub и в GitLab. • При активном использовании GIT-сервера возникает потребность не пропустить важные события. о Все представленные GIT-серверы имеют механизм подписок на события по проекту и ленту активности, в которой отображаются: о * Новые коммиты; * Открытия задач; * И обсуждения. Дополнительно к этому у GitHub, GitLab и Gitea есть центр уведомлений, куда собираются все события, важные именно для вас: • * Явное упоминание вашего логина в обсуждении; * Назначение вам задачи; * Или запрос на слияние с вашим репозиторием. При построении контуров CI-CD важным аспектом в работе GIT-сервера являются возможности интеграции. 80 Silver Bulleters, LLC o GitHub имеет очень богатое API, и, так как он является самым популярным GIT-сервером, для него разработано большое количество различных плагинов. о GitLab менее популярен, однако его интеграционные возможности сопоставимы с GitHub. о Свое интеграционное API имеют также Gogs и Gitea, однако готовых плагинов интеграции с ними крайне мало. И если вы захотите разрабатывать для них собственные плагины, то можете столкнуться с имеющимися ограничениями. о Интеграция с BitBucket в основном, построена вокруг Atlassian Stack. Atlassian - это компания, которая разрабатывает BitBucket, сервер сборок Bamboo, систему учета задач и управления проектами Jira и многие другие продукты. Если в вашей команде уже активно применяются продукты компании Atlassian, то BitBucket отлично впишется в вашу инфраструктуру. • Критически важной возможностью при коллективной разработке является возможность просмотра и комментирования изменений кода от других пользователей. И если с просмотром изменений все эти GIT-серверы справляются «на ура», возможности построчного комментирования кода в Gogs и Gitea явно проигрывают - такой возможности эти серверы на данный момент не предоставляют. • Относительно связи с сервером сборок: о GitLab однозначно впереди, в нем уже: * Встроен собственный сервер сборок GitLab Cl * Есть поддержка сборочных линий * Отображение статуса сборки по каждому коммиту * Информация о прохождении сборки прямо в запросе на слияние кода * В случае использования веб-версии агенты сервера сборок могут быть как публичными, так и развернутыми на собственных мощностях * Также в наличии поддержка Docker * При этом если вы решитесь использовать сторонний сервер сборок, вся прелесть по отображению информации о сборке прямо на GIT-сервере остается - здесь нам поможет богатое API GitLab о Похожую функциональность в последнее время пытается предоставить BitBucket — в нем также появилась поддержка сборочных линий и информация о коммитах. Однако в роли агента может выступать только Docker-контейнер, поднимаемый на мощностях Atlassian. Да и саму эту возможность BitBucket обещают скоро сделать платной. о GitHub, король интеграции, отдает предпочтение сторонним серверам сборок. Наибольшей популярностью пользуются бесплатные для открытых проектов сервера Travis Cl и Appveyor. А также в наличии интеграция с Jenkins о При этом максимум, что может сделать Gogs и Gitea - это вызвать удаленный сервис через веб-хуки при новом коммите или запросе на слияние • Единственное неоспоримое преимущество Gogs и Gitea для русскоязычных пользователей - это поддержка локализации, в том числе и на русский язык. GitHub и BitBucket пока что доступны только на английском языке. GitLab локализован на 40% - локализация начата в 2017 году. Таким образом, при выборе бесплатного GIT-сервера на собственных мощностях наиболее привлекательным оказывается GitLab, который мы и будем использовать далее в этом пособии. Относительно выбора веб-версии для организации приватных репозиториев мнения расходятся: 81 Никита Гоызлов. Пособие релиз-инженера 1C • Кто-то выбирает наиболее популярный в мировом сообществе и легко интегрируемый со всем, с чем только можно интегрироваться, GitHub • А кому-то достаточно возможностей бесплатной версии https://gitlab.com/, где в веб-режиме используется полнофункциональная Enterprise-версия. Тем более что выбор платного варианта сильно зависит от потребностей организации 5.2. Git La b СЕ - способы установки Познакомимся со способами установки GitLab. Откроем сайт https://about.gitlab.com/ и перейдем в раздел Download. (Рис. 103) Рис. 103 - страница GitLab Разработчики GitLab рекомендуют ставить свой продукт с помощью так называемых Omnibus-пакетов. Эти пакеты помимо самого GitLab содержат все необходимые компоненты: • PostgreSQL в качестве СУБД • Nginx в роли веб-сервера • Redis для журналирования • И прочие продукты Такой пакет «все в одном» позволяет установить GitLab без дополнительных сложностей, поскольку обновления оперативно поставляются самой компанией, а пакеты собираются для многих популярных Linux-дистрибутивов. Однако, позже при использовании такого способа установки могут возникнуть некоторые неудобства из-за того, что конфигурирование такого сервиса распределено по множеству мелких конфигурационных файлов. Также на этой странице дана ссылка, где описана информация об альтернативных способах установки - перейдем по ней. (Рис.104) 82 Silver Bulleters, LLC Other official installation methods • « : :wtoiriiciii *■. ’ feu you Install Gitlab for development purposes, It Is isolated In a directory and raw, with a single make command ^iBbGmnlburtoteesfccanbeusefJfarpreduelsti . het Installations Линии» • p to set up a production server on Ubuntu with detailed and complete step-by-step instructions • Dock?- ’stall*---on inch -iaions for a container based on theOmntbus packages • Auras» Web-Seryteis (AWS) АМЕ» for GitLab Community Edition and Enterprise Edition • »oit A’ure Is Microsoft's business cloud. Through the Azure Marketplace, you can spin up a pre-configured GitLab VM in just a few clicks. Get started with; tutorial. • .Ki.-iti 5i о i « Is the marketplace far trusted and validated docker! zed software, fau can download a certified GitLab docker image for the i - yi ri and Enas®so Ed It ) n on Docker Store. • Gitlab Ti e for Pivotal Cloud HaiBiv provides an easy, scalable Installation for (Sttab ErAo o<Be Edition е-жвигв customers on their own PGF Infrastructure, • 4ssosp)trre!X to universe has GittabCE and EE packages available for one-click Installation. Check out mis article Ю; iosnutttons and tw-mkh... • o n?!.-', users can Install GltLab using the official Helm chart with the package manager. Checkout oh MMan pa fat thedwrt and ustrectiens, • BtdH«t OpenShlft template for Installing GittabCE. Check out this,:--. >> hx instruct; - ns„ Puc. 104 - страница выбора способов установки GitLab Альтернативные способы установки GitLab можно условно разделить на три категории: • Установка из исходников • Установка с помощью Docker-образа • И развертывание на облачных серверах (например, таких, как AWS от Amazone и Azure от Microsoft) GitLab поставляет официальный Docker-образ для своих продуктов, но лично у меня заставить его стабильно разворачиваться и работать не получилось, хотя я и не уделял этому много времени. Здесь нам поможет обширное GitLab-сообщество. В сети можно найти файлы для Docker Compose, содержащие готовый к работе GitLab в связке с необходимыми сервисами. Такие образы часто готовятся с упором на простоту конфигурирования и обслуживания. docker gitlab Вое- Видео Новости Карпеесм Пгжутеи Ещ-й Настройки Мнструмемты Per»- ккатов примри® 505000 (0.54 см j gitiab/gttlab-ce - Docker Hub https 4hufc:.d<»cketcorn'f;gitiafc/giKab-ce' • Перевести эту страниц, Gitlab backet images The official Gfttab Community Edition Docker image is available an Docker Hub The official GrtLab Enterprise Ed№oo Docker image is Tags Sameersbn»gftlab GftlaWgMab-se Dockerfile Вы посещали эту страницу нисколько раз £4) Дата последнего посещен** 05.02.1? GitHub - sameersbn/doeker-gitlab: Dockerized GttLab https.cgtthub-cjm.'sameersbn/aockef-gfflab ▼ перевеет эту страницу Dockerized Gitlab Contribute to docker-gitteb development by creating art account on GitHub Docker-ewnpose yml 214 releases Kubemetes Containe»_reg!shy md Вы посещали эту страницу несколько ри- (4) Дитв паслея«ег® посещен» 23 03 17 Рис. 105 - как найти готовый образ Gitlab 83 Никита Грызлов. Пособие релиз-инженера 1C Наиболее известный и стабильный Docker-образ для GitLab можно найти в репозитории автора sameersbn, размещенный на GitHub. Сам этот репозиторий довольно легко ищется поисковиком. Наберем в поисковой строке «docker gitlab» и на первой странице увидим ссылку на репозиторий https://github.com/sameersbn/docker-gitlab . Перейдем по ней. (Рис.105) Данный репозиторий помимо файла docker-compose.yml, который мы будем использовать, содержит обширный Readme по работе с этим образом. В этом Readme содержится подробная информация: • О начале работы • О конфигурировании различных сервисов • О выполнении задач обслуживания - таких, как: • о о Сохранение бэкапов Восстановление из бэкапов о И выполнение апгрейда GitLab И т.д. Available Configuration Parameters Please refer the docker run command options for the --eov-fi U flag where you can specify all required environment variables in a single file. This will save you from writing a potentially long docker run command. Alternatively you can use docket- compose. Below is the complete list of available options that can be used to customize your gitlab installation. Parameter Description DEBUG Set this to true to enable entry-point debugging. 6ITLAB_HQ5T The hostname of the GitLab serve-. Defaults to localhost GITLAS_CI_HQ5T redirection to the Gitlab service so that your existing runners continue If you are migrating from GitLab Cl use this parameter to configure the to work without any changes. No defaults. The port of the Gitlab server. This value indicates the public port on which the Gitlab application will be accessible on the network and appropriately configures Gitlab to generate the correct urls. It does not affect the port on which the internal nginx server will be listening on. Defaults to 443 if GtUABjffTPS-ti'ue, else defaults to 80. Encryption key for Gitlab Ci secret variables, as well as import credentials, in the database. Ensure that your key is at least 32 GIT LAB_S££RET5 JCB¥_BASE characters long and that you don't lose it. You can generate one using pwgen -Bsvl 64. If you are migrating from Gitlab Cl, you need to set this value to the value of giilab_ci_secrets_db_kev_8ME . No defaults. Рис. 106 - документация по настроечным параметрам образа gitlab Большинство настроек, которые нам понадобится выполнить при разворачивании этого образа, вынесены в переменные среды. В данном Readme вы найдете подробную таблицу с перечислением всех доступных переменных среды и описанием каждой. (Рис. 106) Эту таблицу можно найти в разделе Configuration и подразделе Available Configuration Parameters. 84 Silver Bulleters, LLC 5.3. Установка GitLab через Docker Compose Установка PostgreSQL PostgreSQL является рекомендуемой СУБД для работы GitLab. Если вы выполняете команды изданного пособия на машине под управлением Linux, вам не обязательно выполнять дальнейшие действия по настройке PostgreSQL - эта СУБД без проблем поднимется с помощью Docker Compose. Но если вы выполняете команды из данного пособия на машине под управлением Windows, перед запуском GitLab вам потребуется установить Windows-версию PostgreSQL локально, поскольку Docker-контейнер с PostgreSQL для Linux-ядра имеет одну крайне неприятную особенность-если мы смонтируем каталог с данными PostgreSQL на Windows, то PostgreSQL не сможет себя запустить, потому что в версии для Linux для работы с файлами используются специальные возможности этой операционной системы, которые не имеют реализации в Windows. Я не буду уделять много времени установке и первоначальной настройке PostgreSQL для работы - мы выполним лишь минимально необходимые действия. The «сиId's most advanced open source database, PostgreSQL RVffUUon » Downloads Binary Source Windows installers Interactive installer by EnterpriseOB » Software Catalogue Г______ -_____ „ '■ File Browser This installer includes the PostgreSQL server, pgAdmin: a graphical tool for managing and developing your databases, and StackBmlder; a package manager that can be used to download and install additional PostgreSQL tools and drivers. Stackbuilder includes management, integration, migration, replication, geospatial, connectors and other tools. I-i ’ ; : - ■ E I-I|r 5 ■ I :..pr„;ited PostgreSQL versions This installer can run in graphical or silent install modes. The installer is designed to be a straightforward, fast way to get up and running with PostgreSQL on Windows. Advanced users can also download a c p arch .. « of the binaries, without the installer. The download is intended for users who wish to include PostgreSQL as part of another application installer. Puc. 107-сайт загрузок PostgreSQL Перейдем на официальный сайт https://www.postgresql.org/download/windows/ и выберем установщик EnterpriseDB. (Рис. 107) Выберем версию PostgreSQL 9.6.2 и укажем операционную систему (в моем случае, это будет Windows х86-64). После завершения скачивания запустим инсталлятор PostgreSQL. Далее, в мастере установки укажем каталог установки - можно оставить по умолчанию - C:\Program Files\PostgreSQL\9.6 Важным моментом является указание каталога для данных (Data Directory). В принципе, его можно также оставить по-умолчанию. - C:\Program Files\PostgreSQL\9.6\data (Рис. 108) 85 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 108-указание каталога Data Directory Для суперпользователя PostgreSQL укажем пароль (я укажу «postgres»). (Рис. 109) Номер порта и локаль системы оставим без изменений. Нажмем кнопку Далее для начала установки. 86 Silver Bulleters, LLC Puc. 110- окно установки StackBuilder После окончания установки я откажемся от запуска Stack Builder и нажмем «Finish». (Рис. 110) Настройка разрешений для корректной работы PostgreSQL Для того чтобы Docker-контейнер с GitLab мог подключиться к PostgreSQL, нам необходимо выполнить две вещи: • Первое - это открыть порт 5432, который мы указали при установке • И второе - прописать в настройках PostgreSQL разрешение на подключение из сети с Dockerконтейнерами 87 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 111 - создание правила брандмауэра Начнем с порта. Откроем настройки брандмауэра Windows, выберем ветку правил для входящих подключений и создадим новое правило. Тип правила укажем «Для порта». (Рис. 111) Мастер содами» прям» для итого гардо подкгаочеии» X Протокол и норты Укажите протоколы и порты, к которым £^1Мв№МЮ1 данное правите Вик » Tw? фйЙИРЙ Укажите протокол. к. котором? будет Я|этекятьс8 это (•) Премжлл TCP « ХЬйезше О Г|ж>т«жрй UOP ♦ ГрОфИЙЬ Укажите порты, к которым будет примените» это правиле. О Все локальные порты (♦) Огрелеленные локальные порты: и...........................I Пример 80.443. 5093-5010 Рис. 112 - указание портов TCP В поле «Определенные локальные порты» напишем «5432» (Рис. 112) а на странице действие-укажем «Разрешить подключение». 88 Silver Bulleters, LLC Puc. 113 - страница настройки профилей сети Применять данное правило мы будем для всех профилей сетей. (Рис. 113) Рис. 114 - расположение файла pg_hba.conf Перейдем к настройкам безопасности самого PostgreSQL. Для этого запустим «Блокнот» от имени администратора и в каталоге C:\Program Files\PostgreSQL\9.6\data\ выберем файл pg_hba.conf (чтобы выбор этого файла стал доступен, нужно переключить фильтр на «Все файлы»). (Рис. 114) 89 Никита Грызлов. Пособие релиз-инженера 1C "3 pg_hb«.conf — Блекнет Файл Правка Формат — Вид □ X Справка # use ”pg_cti reload’* to do that. # Put your actual configuration here # ........................................................................................... f # If you want to allow non-local connections, you need to add »re # "host"’ records*. In that case you will also- need to вайе PostgreSQL # listen on a non-local interface via the listen_addresses # configuration parameter, or via the -i or -h command line switches. # TYPE DATABASE USER ADDRESS METHOO # IPv4 local connections: host all all 127.0.0.1/32 ■dS # IPv6 local connections: ::1/128 host all all nd5 # Allow replication connections from local-host* by a user with the # replication privilege.postgres 127.0,0.1/32 skS5 (thost replication •host replication ■45 postgres : :1/128 host all all 1 I ______________________ Puc. 115 - содержимое файла pg_hba.conf В конце файла укажем необходимую настройку - подключение с типом host для всех баз, для всех пользователей. (Рис. 115) Дальше нам необходимо указать адрес сети, из которой будут выполняться подключения. Мы можем узнать его из настроек Docker. Из системного трея возле часов правой кнопкой щелкнем по иконке Docker и откроем его настройки. (Рис. 116) •’* Settings General Shared Drives X Network Configure the way Docker interacts with the network. Advanced internal Virtual Switch Network Subnet Address: Proxies Subnet Mask- p 0.0.75.0 255.255.255.0 dc/svit J&0.75.0 d^wJr255.25i2S5.0 DNS Server Daemon Diagnose & Feedback • Automatic 3 fixed: 3.3.8.S Reset • Dotter« wn-ng Doctor wiB «Sit Mien applying these settings. Рис. 116-сетевые настройки Docker 90 Apply Silver Bulleters, LLC На закладке «Network» можно увидеть, что для работы Docker была создана виртуальная сеть с адресом 10.0.75.0. Маска подсети здесь указана как 255.255.255.0 - этой маске соответствует короткая запись 24. Итого, адрес виртуальной сети с указанием маски будет выглядеть как 10.0.75.0/24. ’,Ц pg_hhs.ccrf—Блошист Файл Прйегэ Форист • use — О X Справка * reload" to So that. • Put your actual configuration here »............ -.............................. — • • If you want to allow non-local connections, you need to add more ♦ "host" records. In that case you will also need to stake PostgreSQL # listen on a non-local Interface via the ilsten_addhesses # configuration parameter, or via the -i or -h command line switches. # TYPE DATABASE USER ADDRESS METHOD # IPv4 local connections: host all all mdS 127.0.0.1/32 # IPv6 local connections: host all all :: 1/128 ЙК15 » Allow replication connections fro» localhost, by a user with the • replication privilege. •host replication postgres 127.8.0.1/32 nsdS •host replication postgres :: 1/128 ™<i> host all all 10.0.75.0/24J password Puc. 117 - конечный вариант настроек pg_hba.conf Этот адрес виртуальной сети мы указываем в конфигурационном файле. (Рис. 117) И, поскольку методом аутентификации у нас будет связка login/password, в последнем параметре укажем password. Сохраним данный файл и закроем его. Теперь нам нужно перезапустить службу PostgreSQL. Для этого откроем «Службы» Windows, найдем там postgresql-x64-9.6, и в контекстном меню выберем «Перезапустить». 91 Никита Грызлов. Пособие релиз-инженера 1C Создание базы PostgreSQL pijAdrnin 4 Connect to Server Please enter the password for the user postgres' to connect the server "PostgreSQL. 9.6" Save Password pgAdmin is an open source adminisiraoon and management tool for me PostgreSQL database. T he toots include a graphical administration interface, an SQL query tool, a procedural code debugger and much more The tool is designed to answer the needs of developers DBAs and system administrators aitse Puc. 118- подключение к серверу Postgres После задания настроек подключения нам необходимо создать для сервера GitLab базу PostgreSQL. Вместе с PostgreSQL у нас установилась утилита pgAdmin 4 - запустим ее и выберем подключение к локальному серверу PostgreSQL 9.6. Введем пароль суперпользователя, который мы указывали при установке и нажмем «ОК». (Рис. 118) 92 Silver Bulleters, LLC Puc. 119 - создание пользователя в Postgres Создадим служебного пользователя для GitLab. Для этого щелкнем правой кнопкой мыши по элементу «Login/Group Roles» и выберем «Create - Login/Group Role». (Рис. 119) Укажем имя нового пользователя «gitlab». Create Login/Group Rote SQL На вкладке «Definition» зададим пользователя gitlab и пароль для запомним его ■hr для использования в дальнейшем (Рис. 121). На вкладке Definition задайте пароль пользователя и запомните связку логин:пароль, которая Рис. 121 - задание пароля пользователя gitlab Перейдем на вкладку «Privileges» и разрешим этому пользователю: (Рис. 120) • Заходить в систему (Can login) • И создавать новые базы (Create databases). Сохраним настройки. Рис. 120 - окно привилегий пользователя gitlab 93 Никита Грызлов. Пособие релиз-инженера 1C Теперь создадим базу для нашего сервера GitLab. Для этого, в левой панели, в дереве правой кнопкой щелкнем по узлу «Databases» и выберем «Create - Database». Рис. 122 - окно создания базы данных для gitlab Укажем имя базы данных, например, «gitlab», владельцем назначим пользователя «gitlab» и нажмем «Save». (Рис. 122) Для корректной работы GitLab нам также необходимо установить расширение pg_trgm. Щелкнем правой кнопкой по узлу «Extensions» внутри базы данных gitlab и выберем «Create - Extension». (Рис. 123) rt Brww В § jft Dashboard «5 g =• , ,<-•> £ < * jeJStew ‘ (1) 5 «Р »ast3«SQt 9.6 © ©Oatabase* (1) Й © в>И«Ъ $ Casts ■3 Ф Cataloea 5 extensions Event Тгфрег* ■ 6 £- 3 C Refresh Schemas % Query To©S togm'Group RoielTTTJ "" '&> eiBab Tablespaces Sessions locks Prepared Tfarwcdons J. AppkcetXM? /*» Q 1 РЮ j User 5S$2 postures pgAdmin 4 - DB 3<Bsb ' CfeOl ' | 1 BaekeMl start 2017-03-2413 5$ ?2M3K Puc. 123 - установка расширения в интерфейсе pg_admin 94 ) State i «№» Ш8 Event BtoChtnO РЮ» j Silver Bulleters, LLC Укажем имя расширения «pg_trgm» и нажмем «Save». Теперь наша база данных готова к подключению GitLab. Настройка docker-compose.yml В sameersbn / docker-gitlab Issues 189 О Code Branch, master ” ©Um».«eb» Projects 0 Pu8 requests 25 -*-• Pulse * Unct» 279 Find We Jk pteterUnge upgrade to 8.17.4 ж* Ли 151 lines (124 sloe) 3.75 КЗ у Fort. 920 Jjjj- Graphs docker-gitlab / docker-compose.yml 17 contributors sCl 2b 3.833 Copy path обbee87 3 days ago 9l feS Raw History az® version: *2' services: •I redis: restart; elways iwege: s«№eersbn/r*ais;latest - --loglevel warning - Zirv/decker/gitlab/reiJis:/var/lib/redis:Z oostgresal: restart: always Puc. 124 - отображение исходного кода в интерфейсе github Откроем репозиторий https://github.com/sameersbn/docker-gitlab с Docker-образом GitLab и найдем там файл docker-compose.yml. В окне просмотра docker-compose.yml нажмем кнопку «Raw» для отображения исходника. (Рис. 124) И нажмем комбинацию клавиш «Ctrl+S» для сохранения в файл. Сохраним этот файл в нашем рабочем каталоге, создав в нем папку «gitlab». Изменим предлагаемое расширение файла с *.txt на обычное *.yml. Давайте теперь откроем файл docker-compose.yml в редакторе Visual Studio Code. (Рис. 125) Как вы видите, в данном файле для Docker Compose обозначено три сервиса: • redis-сервис журналирования, • postgresql - СУБД • И сам gitlab. Теперь потребуется внести несколько правок в полученный файл docker-compose.yml. 95 Никита Гоызлов. Пособие релиз-инженера 1C docker-compose.yml X version: *2 res-art: always . ъ ,j n -■; g ameersfen/ red s 5; latest - --loglevel warning - /s rv/docker/gitlab/redi 5:/va г/1ib/red is: Z pcrtgr-sqi;j restart-: always image: san&brs.bn/pastgresql;9.6-2 /sr\*Z docker/gitlab/postgresql: / var/lib/postgresql; Z environment; - 06_US€R=gitUo • B6 J’AS£~password - Cn_MAME=gi tlabhq_protfut t ion - D©_£KTEN5.TW-'^_trg?a restart; always ■ : sameersferj/gitlabiS. 17.4 depends on: - "IRese.88" - "10022:22" - /ьrv/docker/giilab/gltlab:/he®*?/git/data: 1 Puc. 125 - правки в файл docker-compose.yml СУБД PostgreSQL у нас установлена локально, поэтому: • удалим описание сервиса postgresql из данного файла. • Дополнительно у сервиса gitlab удалим строчку postgresql в секции depends_on. Перейдем к настройкам GitLab и опишем подключение к PostgreSQL: (Рис. 126) • В качестве адаптера базы данных (DB_ADAPTER) у нас будет выступать postgresql, • А вот имя хоста (DB_HOST) нам необходимо будет поменять на текущий IP-адрес виртуальной сети, которую нам создал Docker. 96 Silver Bulleters, LLC - "16022:22" volae»»; - /-'dockf-rZgit irfb/gitlab. /hiw/git/iriirta:Z «Jf:v i' Onaent: - GteuC’falsft - 06 jftOAPП:Я-> pMTg«- !.a 1 - w_i»5T-te.e.7S.l - BBmPftRl-S412 - MJ_l!$FR»gitl,sis - DB _ PASS -pas swrtf - ЕЮ HAME«gitlab ?^iBMffiSbss№Sia®ssissssasaaB^sassS^irasaaissssasifausessa; * RE01bJ«K?-peSis - SEOI5 РОЯТ-сз7'? Puc. 126 - задание параметров окружения для сервиса gitlab Узнать этот адрес мы можем из центра управления сетями. Для этого в панели управления системы откроем «Центр управления сетями и общим доступом». (Рис. 127) V Ц««тр управления сетами и общим доступам ф □ У > Па«ел» уярвздеми» * Сел»и Интернет > Центр управления сетями и общим доступом Панель управления — домашняя страница w Пшся ж панйьшупрйжйен^й» X J> Просмотр основных сведений о сети и настройка подключений Просмотр активных сетей Сеть 2 Т ил доступа; Общедоступная сеть Подключения; Иеогюзнзнная есть Тип доступа; Без доступа к сети Общедоступная сеть Подключения; 4 ^Ethernet (DockerNAT) Интернет $ Ethernet параметры общего доступ! Изменение сетевых параметров Создание и настройка нового подключения или сети Настройка широкополосного, коммутируемого или VPN-подключения либо настройка маршрутизатора или точки доступа. [W? Устранение ндеоладж Диагностика и исправление проблем с сетью или получение сведений об устранении неполадок. Сая« также брандмауэр Wind» Домашня» группа Инфракрасная связь Свойства браузера Рис. 127 - центр управления сетями и общим доступом Зайдем в «Изменение параметров адаптера». Найдем сеть vEthernet(DockerNAT) и в контекстном меню выберем пункт «Состояние». (Рис. 128) 97 Никита Гоызлов. Пособие релиз-инженера 1C •f t Панель управления » Сеть и Интернет » Сетевые подключение > Упервячив * cmcoro устройства Диагностике сюяслкгчешю Псрскмеисимиие пвдалчз te wftheme» (PockwNAT) Н«ЙвШ»№зя {№► Mhaewsdt Нур»-¥ Neewerit Adtp... ф Отключить (Нрояиие ну , Дадгнестко Ф Настрой» мосте Создать ярлык Ф ТИДИП, ф Переименовать —-------- —— ------------- ----- Ф Свойстве Puc. 128 - свойства сетевого адаптера Docker В сведениях об этой сети мы видим адрес IPv4. В моем случае это адрес 10.0.75.1. Вернемся к настройкам Docker Compose (Рис. 126): • В настройке DB_HOST укажем адрес сети vEthernet(DockerNAT). • Порт PostgreSQL мы не меняли (DB_PORT=5432) • Имя пользователя (DB_USER) для GitLab - gitlab. • В качестве пароля (DB_PASS) укажем то, что устанавливали для пользователя gitlab (в моем случае это password) • 98 И имя базы данных (DB_NAME)- мы создавали просто базу данных gitlab. Silver Bulleters, LLC Давайте теперь создадим каталоги для монтирования разделов из Docker-контейнеров. Для этого откроем наш рабочий каталог, зайдем в его подкаталог volumes, и создадим здесь каталоги redis и gitlab. (Рис. 129) i > Q } { = i tnriunMS Подадите * * Ф » щИ Имй # Быстрый доступ И Рабочий стол # 9«м Вид > Дкмммйд КО > л > «fame * Twt Мс 14 Рмшр Пагьл < фийламя > ts .• fTЛ.-T ■# Загрузи Ц Документы Изобрети»» д? # Ц System^ S' биде© Jl Музыи» йй, OmsBiwe £03 Этт компьютер i# Ста Рис. 129 - создание каталогов монитирования redis и gitlab Пропишем путь к данным каталогам в настройках сервисов docker-compose.yml и заменим слэши на прямые.(Рис. 130) Рис. 130 - прямое указание путей монтирования Также для GitLab очень важна настройка почтовых рассылок - он умеет как отправлять, так и принимать электронные письма. Нам крайне желательно настроить хотя бы отправку писем, потому что без них 99 Никита Грызлов. Пособие релиз-инженера 1C наши пользователи не получат уведомления о регистрации на GitLab или ссылку на смену пароля и также не смогут получить информационные сообщения об активности на сервисе. За настройку отправки писем отвечает секция SMTP. (Рис. 131) • • Чтобы письма отправлялись, в переменной SMTP_ENABLED надо будет поставить значение true. В переменной SMTP_DOMAIN указать домен вашей организации (в общем случае, он может быть произвольным) • В переменной SMTP_HOST указать адрес почтового SMTP-сервера • В переменной SMTP_PORT - порт SMTP сервера. • В переменных SMTP_USER и SMTP_PASS задается логин и пароль. • Если ваш SMTP-сервер использует TLS (а так делает большинство современных серверов), в переменной SMTP_STARTTLS поставьте значения true, если иначе-false. • И тип аутентификации (SMTP_AUTHENTICATION) чаще всего - login. Для скрытия используемого реального адреса электронной почты можно указать переменную GITLAB_EMAIL. От имени, указанного в этой переменной среды и будут отправляться письма. C.3TLAB f ЧЛЦ ,Heart 01 f LAB Hr И. •, то» .<« yto сс’гр! <•. com ж SUtAB JNCOWHC- CTAIt_ADORESS«reply§e*iHiple .c«l Sliyya BACW.JJCHUM»Maily - 61 ПАВ _RAC KOP _ T IH£«ei -..ee ! S.W.. KAcLED^fal.se SMTP KTWi«?*2w. e ’. «Bijjle. t oil! - SMTP UOST-seta.gBiail.con SWIHWl -se? -■ 7 ТА - SMTP USER=s»alIs>06example. tce - $MTp_PASS=pessw0r0 SMTP,STARTfLS-true SMTP_ ЛС'ТНЕ fine AT iweag i If IW _fcNABU=O*f3lse 1МДР КК.Г-- iep . gfs.fl j j ,ton - гндр jsjrt * TMftP 1,'Sf R. Tiai "pxseple,£: ■!?! - lfW__PASS «password 1МмР SSI" - T.‘UP_$TARTTtS«felse Рис. 131 - почтовые настройки GitLab Для корректного отображения времени в GitLab нам необходимо указать часовой пояс, в котором работает наш сервер - этот часовой пояс указывается в двух переменных окружения - TZ (timezone) и GITLAB_TIMEZONE. Я пропишу: (Рис. 131) TZ=Europe/Moscow GITLAB_TIMEZONE=Moscow Последнее, что нам необходимо сделать, это - задать специальные секретные строки, которые будут использоваться G it La b для генерации ключей. Согласно документации эти строки должны быть длиной 64 символа и состоять из цифр, прописных и строчных букв - для их генерации мы можем 100 Silver Bulleters, LLC воспользоваться любым онлайн-генератором паролей. Откроем поисковик, напишем «password generator online» и выберем, например, сайт http://onlinepasswordgenerator.ru/ . Зададим требуемые настройки и нажмем кнопку «Создать пароль». (Рис. 132) © vwft«.onljnepasswordgenerator.ru UWU BS ЙИ Генератор паролей Хотите сгенерировать пароль? Просто заполните форму ниже и нажмите кнопку "Создать пароль". -Настройки генератора —---- -—————•— ------------------------ ----------—— ------- - -----И Цифры Прописные буква Я Строчные буквы U Спец, символы).?. Длина пареия:)б4 $• - _ [-символов Защитите важную информацию от шифровальщиков, с сервисом от Дата8 и Microsoft DRTW Создал, пароль Ваши сгенерированные пароли: . g9¥2XK?rr,30SNrMsefdrUu?a70HH!ggw8sglBdZSXe>tpw,'t32aw{)9Ep3MKd?Rtgp • VvJxonwN9WHOpEjW2Vmpz4SOaVSe2g3Ppi4NCyOogQZELmuybZQ7eWKGPyLfuT • JfUL3OILR!scittKJLdgku9HaxB6gUQNjhV3atuTxrXVxciazpFR64GfaOMKFznogGc . fx 1Ab2AYZ Ld2utat6VzyxghOgS8V3tVbbQDYPiNL|ANPZC N 5dOn 1 eRJFPwmMtjxkO . xRr>'THqY3JrHtf)|KwCA0rEh5IUM(350«as87xPWViflOt3SCp149f07n?sZJetlC . AAxBreD5cus**^mTYyn7IWUCP(MwNfP0hWtkSO76LWA7z49QJKGpeTCJIrY6vCS • 1 BUq 10k8aD5ccrPJGZY!aXUrAi!!J5JLXtWhS\'=Vbdxw6!8YOs!fOy YUkaS9gCxp • sTxR3zvArxPQy3NA94NvMW65№«e6dw9cYfltZspWiN£e1?vmLxSnMKAggUsi9c • B4Ll2'№(rmkxgS7RNq03pxamet>c34Oiek5XxchOk3sDH3pieAXgAlw(ttAavBz8w . cb4.fXWga8q.O1ZhKbL4Zm.jeY4wyOT7Fld9e£qVpLc2OteMb9su3nxMAz0xEk3 Puc. 132 - результат работы генератора паролей Скопируем сгенерированные пароли в соответствующие переменные среды. (Рис. 133) • Один пароль у нас уходит в переменную GITLAB_SECRETS_DB_KEY_BASE • Второй - в переменную GITLAB_SECRETS_SECRET_KEY_BASE • И третий в GITLAB_SECRETS_OPT_KEY_BASE Наш конфигурационный файл готов. Сохраним его. - йТЛАВ;JWT» шв - 6iTtj®_ssn_pa«T-ieej2 - t,111. LA?I Vf . URL_MX! F“ . - GlTtiB StCRBS .«_№V-Stti?g9Vl*Y»3eWMsSfdr»v;d?C«Mlgg*K;;.glBoZS»yp>jWiai&hTt>9epi'-‘r:.i?HgO - GXTm_»CBETS_SECRET_KEY_BASE»W»eJWnw«9WTir;pE>)2Vtep4SedVB«ig3Ppj«pfcy8o^f l.MiybWe“*r^p' - fur - bniAB;5£CRe»S_<np:jiiCY_8A5£-Mi(a3Slt.Rt^MLdg^u;!HdXJ(Sg«)UjA3aluT3frXYx(3«:i»; K=aSra©rtki mugvr Puc. 133-задание секретных строк в файле docker-compose.yml 101 Никита Грызлов. Пособие релиз-инженера 1C Установка GitLab Откроем интегрированный терминал Visual Studio Code и перейдем в каталог, где расположен файл docker-compose.yml: Выполним команду: docker-compose up -d bfe Г ? 1И1 Docker Compose скачает все необходимые образы, слинкует их в виртуальную сеть и запустит. (Рис.134) Рис. 134 - результат работы команды docker-compose up После запуска откроем логи docker-compose, выполнив команду (Рис. 135) docker-compose logs -f ■ I .• •• • . ■ 1 ■ . ■; ■ t ■ - ■ 3 ; гДт-йЬ . i ; 2017-03-74 22:38:14,395 WARN Included extra tile Veto/supervisor/«mf.d/croo.conf” during parsing 2817-03-24 22:38:14, r> 09 INFO RPC interface ’supervisor’ initialized 2817-03-24 22:38:14,509 С8ГГ Server ''unlx http server' running without any HTTP authentication checking i 2817-83-24 22:38:14,510 INFO supervisord started with pid 1 2817-03-24 22:38:15,513 INFO Spawned 'sideklq' with pid 517 2017-03 24 22:38:15,516 INFO spawned ‘unicorn’ with pid 518 2017-03 24 22:38:15,524 INFO spawned ‘gitiabworkhorse' with pid 519 Ж7-83 74 22:38:15,529 INFO spawned *WSfl’ with pid 520 ( 7837-03-24 22:38:15.530 INFO spawned ’n&lnx’ with pid 523 2817-03-74 22:38:15.544 INFO spawned ’sshd’ with pid 524 2817-83-24 72:38:16.613 INFO success sidefciq entered ROWING state, process has stayed up for > than 1. seconds (start sets) 2817-83-34 22:38:16,613 INFO success unicorn entered RUNNING stale, process has stayed up for > than 1 seconds (startsecs) ( 2817-03-24 22:38:16,615 INFO success gitlab-wuHchorse entered Running state, process has stayed up for s than i seconds (staptsecs) 2817-83-24 22:38:16,616 Info success cron entered RUNNING state, process has stayed up for > than l seconds (startseesV ' 1 2817-83.24 22:38:16,616 INFO success nginx entered RUNNING state, process has stayed up for > than l seconds (Msrt&ecsJ ■ . . 2817 03 24 22:38:16.617 INFO success sshd entered RUNNING state, process has stayed up for > than l seconds (stac.tsecs^ i I _________ Рис. 135 - вывод логов первого запуска GitLab В логах мы видим сообщения от GitLab о настройке для первого запуска. Данная операция может занять несколько минут. После появления последних надписей о том, что процессы GitLab перешли в состояние «Запущены», подождав еще 1-2 минуты, мы можем открыть браузер, перейти по адресу localhost с указанием порта 10080. 102 Silver Bulleters, LLC <- C 'c<■ - | M Please create a password for your nvw account GitLab Community Edition Open source software to collaborate on code change your password New password Manage Git repositories with fine-grained access controls that keep your ............ code secure. Perform code reviews and enhance collaboration with merge requests. Each project can also have an issue tracker and a wtki. confirm rtv, password___________________ Didn't lecetve a confirmation «mail? ftequeit a new ore Already have login and password' Sign in Puc. 136- окно авторизации в gitlab Откроем браузер и укажем там адрес http://localhost: 10080/. Первое, что мы видим, это требование от GitLab сменить пароль администратора. Укажем новый пароль (например, password) и нажмем кнопку «Изменить пароль». (Рис. 136) На следующем шаге GitLab просит нас войти в систему. Укажем для входа: • Имя суперпользователя в G it La b - root • И пароль, который мы задали в качестве пароля администратора (в моем случае - password). Все. Наш GitLab готов к дальнейшей работе. (Рис. 137) Рис. 137-главная страница нового экземпляра GitLab Было замечено, что в данной сборке после не корректного завершения работы Docker может не запускаться Gitlab или же пропадать существующие репозитории. Для этого необходимо остановить Gitlab командой: docker-compose down 103 Никита Грызлов. Пособив релиз-инженера 1C а затем запустить заново: docker-compose up 5.4. Первоначальная настройка GitLab Создание и настройка прав пользователя Для начала создадим себе личного пользователя. X О localhost 10980/,’admm M Admin Area Overview Momienng Messages System Hooks д]ж X Search Applications / Abuse Fteports C * Forks 0 Sign up Issues 0 LDAP Merge Requests 0 Cravatar • Gitlab Workhorsi^r Notes 0 QmniAulh О Gitlab API Snippets 0 Reply by email 0 SSH keys 0 Container Registry Milestones 0 Rails 4.2.7.1 Active Users 1 postgresqi 9A2. • Projects Gitlab 8.174 Gitlab Shell 4.1.1 Grt S vd / 2.ИД 2.3.3p222 Groups 0 О Latest groups Latest projects 1г<д-:О-Т 'XSO'adwir. uscrz’ г-еа Puc. 138 - создание нового пользователя GitLab Для этого перейдем в раздел «Администрирование» и нажмем кнопку «New User». (Рис. 138) Укажем: • Его имя; • Его логин (Username); • И его почту. • Если вы настроили отправку писем, то после создания пользователю придет письмо со ссылкой на сброс пароля. Если вы не настраивали отправку почты, то после сохранения пользователя вы можете снова его отредактировать и задать конкретный пароль. • В группе Access Level назначим права своему пользователю - я ради удобства назначу себе права администратора, поставлю переключатель Admin. Сохраним изменения нажатием на кнопку «Create user». 104 Silver Bulleters, LLC Далее в этом пособии мы будем настраивать репликацию 1С-хранилища в репозиторий. Обычно для этих целей на GIT-сервере создается специальный пользователь - давайте создадим такого пользователя заранее. (Рис.139) Hew user Account a-bdt Name I " tequired Username d-bot * required Email j obotS-example com) Password Password Reset J ink will be generated and sent to the user. User will foe forced to set the password on first sign in. Рис. 139 - создание служебного пользователя • В качестве имени мы будем использовать что-то, что позволит нам однозначно идентифицировать этого пользователя, как некого бота - обычно для таких целей пользователя называют ci-bot • Укажем ему такой же логин, • И укажем почту (при этом ей необязательно существовать). Нажмем «Create user». Еще раз зайдем в режим редактирования данного пользователя для того, чтобы явно задать ему пароль. Укажем в поле «Password» желаемый пароль (в моем случае, это «password») и повторим его в поле подтверждения пароля. Нажмем «Save changes». Теперь, выйдем из аккаунта суперпользователя для того, чтобы зайти под нашим собственным пользователем. Для этого, в правом верхнем углу щелкнем по аватарке и нажжем «Sign out». 105 Никита Гоызлов. Пособие релиз-инженера 1C На почту мне пришло письмо от GitLab с информацией о том, что для меня был создан новый пользователь. В письме есть ссылка на сброс пароля. Щелкнем по ней. (Рис. 140) Account was created for you шедяоге >■ ■К Giltab <ntxel20'07@gmafl. com> ■I кому: мне * Hi Nikita Gryzlov! Your account has been created successfully •ogh.......................... .................. ntartatW—Mdtl ■ <*» Click here to set your password This link is valid for 2 days. After it expires you can request a new one. View it on Gitlab You’re receiving this email because of your account on local host If you’d like settings Puc. 140 - фрагмент регистрационного письма от GitLab Мы будем перенаправлены на наш GitLab с предложением ввести новый пароль. Введем его и нажмем кнопку «Change your password». (Рис. 141) GitLab Community Edition Open source software to collaborate on code Change your password New password Mintage Git repositories with fine-grained access controls that keep your code secure. Perform code reviews and enhance collaboration with merge requests. Each project can aho have an issue tracker and a wiki. Didn't receive a ccnftrmauort «те»!? Reouest a new one Already have and password? Stgn in Puc. 141 - окно смены пароля после подтверждения из почты 106 Silver Bulleters, LLC Создание и настройка групп пользователей и проектов J™ 5 Projects Z А ©- Welcome to GitLab Code.test and deploy You can create a group for several dependent projects. Groups are ’b® be&way to manage projects and member». You don't have access to any projects right now Voc e» up ie 106 prsgeefe Ww proves Puc, 142 - кнопка создания новой группы в главном окне gitlab Предполагается, что GitLab будет использован для большого количества ваших проектов. Для того чтобы не привязывать репозиторий проекта к конкретному пользователю, можно создать группу. Группа - это способ организации в проекте нескольких пользователей, которые с ним работают. На главной странице GitLab нажмем кнопку «New group». (Рис. 142) Рис. 143 - окно параметров новой группы пользователей Введем имя группы - например, «trade» и укажем, что данная группа видна только для пользователей, прошедших авторизацию. Нажмем на кнопку «Create group». (Рис. 143) Также создадим новый проект - репозиторий, где будут лежать наши исходники и сценарии поведения. Для этого на странице группы trade нажмем кнопку «New Project». 107 Никита Гоызлов. Пособие релиз-инженера 1C Укажем имя проекта - например, также «trade». Укажем, что это - внутренний репозиторий и нажмем кнопку «Create project». (Рис. 144) == Projects Mew project Z * <? - l Swh P-rajert path Projec t name ©r impart yw ргфст tram рорЫж Grt яйа» hade the same («яйро? Create a group Want t© ha«s« s«wt3f dependent projects import project from OGftHufe §B«bwefcet WGfUbxom G Google Code »fegfoygz R&tea Rep© by URL GitUbrapcrt Project doserlpSon (optional) Sessjsptfat format Vistbrhty Level (?) УЙЙЙгЬтй© n в й pww ♦ . Pi’ ♦ ф rntema? ‘ _________ The ptp^a can be cloned by any lagged Ь user. a Butts The p?o>rt can be cloned without w suthenhcatton Puc. 144 - окно параметров нового проекта Создатель проекта автоматически добавился в его участники. Если вы хотите добавить новых участников в этот проект, вы можете щелкнуть по иконке с шестеренкой и выбрать Members (Участники). (Рис. 145) 108 • В таблице внизу страницы можно просмотреть состав пользователей проекта. • В верхнем поле можно набрать имя пользователя, чтобы добавить его в данную группу. • Ав следующем поле можно указать уровень разрешений для добавляемого пользователя. • Подробнее о разнице в уровнях разрешений можно прочесть по ссылке «Read тоге». Silver Bulleters, LLC = trade / trade * Iftisprojesl Search z a € О ’ Project Actsv’ty F'lpeteiss issues 0 Merge Requests fi №1 Members Add a new member to trade Search for members by name, username, or email or invite new ones using their email address ExisUng members and groups Members with access to trade О Find existing membeis by name Name, ascending Nikita Gryitov ^na.gryztov С°ЖД trade e Joined 13 mmules ago Puc. 146 - добавление служебного пользователя в участники проекта Добавим пользователя ci-bot в список участников проекта. Для этого выберем пользователя ci-bot, укажем ему уровень разрешений Developer для того, чтобы он мог осуществлять push в репозиторий и нажмем кнопку «Add to project». (Рис. 146) Наш GitLab готов к работе. 109 Никита Грызлов. Пособив релиз-инженера 1C 5.5. Обновление сервера GitLab Важными элементами в работе любого сервиса являются его своевременное обновление и выполнение бэкапов. GitLab уже настроен для выполнения бэкапов ежедневно - соответствующую переменную среды вы можете найти в файле docker-compose.yml. А вот обновление сервиса GitLab нужно производить вручную. [US] • https; gittwb.conv'sam«ersbn/d<x:ker.g;!i36*upgrjding Upgrading Important Notice Since GitLab release e.e.S PostgreSQl users should enable pg_trge extension on the Gitlab database. Refer to Gitlab's Postgresqi Requirements tor more information If you're using saiwersbn/postgresql then please upgrade to sawersbn/posterest|l;9.4-18 or later and add oe_£XTEtSTON-pg_trg« to the environment of the PostgreSQl container (see: httpsy/githubxom/Mmeersbn/docker- grtlab/Wob/master/docker-compose.yml#lfi). GitLabHQ releases new versions on the 22nd of every month, bugfix releases immediately follow. I update this project almost immediately when a release is made (at least it has been the case so far}. If you are using the image in production environments I recommend that you delay updates by a couple of days after the gitlab release, allowing some time for the dust to settle down. To upgrade to newer gitlab releases, simply follow this 4 step upgrade procedure. Note Upgrading to sa»*erstin/gitlab:9.e.e from siweersbn/gitiab'.T.x.x can cause issues. It is therefore required that you first upgrade to sateeesbn/gltlsbte.e.S-l before upgrading to saaeersbn/gitlM-.S.l-e oi higher. • Step 1; Update the docker image. decker pull ssaeersbn/gitlabrs.e.e • Step 2: Stop and remove the currently running image Puc. 147 - фрагмент документации по обновлению gitlab Обратимся к разделу документации, в котором описано обновление https://githiib.eom/sameersbn/docker-gitlab#upgrading (Р и с. 14 7) GitLab выпускает обновление своего продукта 22-го числа каждого месяца. А также несколько инкрементальных релизов с исправлениями ошибок в течение месяца. После публикации новой версии файла docker-compose.yml обновление GitLab можно выполнить в четыре шага. 110 Silver Bulleters, LLC Шаг первый - обновление локальной версии образа GitLab. 0 ш ••• Добро пожалован. * * oiKJWMfc идлпюры Доёре лежалое*».. ■ Р - ей» dpctercOTpcsayml О Запусшп» Быёфыессыжи : Общие ся«дей<{£«жфНй«> Л' -ЛЧ.. Й’Л А 4,>У5ИЗ|Ийв <!iW <л«& S Последние вЧИвЫ •><>-. ч *Ur id Цасюеая тема •'-«■ - Чгч-Т'- р.-=\ч-=арй кщ удс&ьй» Увамоао скйшжййхп^иш '< Г-V V Ч| )»*$ j . Найти и выпет,нить все команды . i: powetshetae + Й * : Window?. PowerSfelit (С> Корпорация Нффософ» (HUrosefl Cerporat sort), ,2816. 8<«-права, жмим. PS C:\worksp3t e\gUlBb> docker pull S^eersbn/gltlab:9»8.e 9.8.0: Pulling free satneersbn/gitlab 10dS<Jtb48fc8: already exists 8eCd7fBM39e Already exists *6ee9927bb81. AJ<fesdy exists ?e67a4d67bA4 Already exists 7d9dd91SS4Ba AlfUady exists I«d496l8a9fd: Already exists Ia5?cc2d6de5 Pull ct'gBplet»' 3?adab@4lf6a PuH complete 0&9Sfffd9f82. Extracting eS12b8labc/8 Osfcfeload complete J W.S Ив/27/.'^Ш™- Download cceplete Puc. 148 - работа обновления образа во встроенном терминале VSCode Откроем в редакторе Visual Studio Code каталог, в котором располагается файл docker-compose.yml (это - подкаталог gitlab в моем рабочем каталоге). (Рис. 148) В меню «Вид» вызовем интегрированный терминал и вставим в него команду по обновлению образа (из инструкции): docker pull sameersbn/gitlab:9.О.О Пока скачивается наш образ, подготовим список изменений для файла docker-compose.yml. Это можно сделать несколькими способами. • Если вы клонировали данный репозиторий, вы можете воспользоваться утилитами git diff или сторонними утилитами сравнения, чтобы увидеть, что изменилось в файле docker-compose.yml • Но гораздо проще получить разницу в этом файле прямо из веб-интерфейса GitHub. Откроем браузер, откроем новую вкладку с данным репозиторием и допишем через слэш compare. Ill Никита Грызлов. Пособие релиз-инженера 1C . . | | Рис. 149 - сравнение версий в интерфейсе github Мы попадем на специальную страницу сравнения изменений между ветками (ее также можно открыть из списка активных веток). (Рис. 149) В качестве базовой ветки укажем нашу текущую версию файла docker-compose.yml (в моем • случае, это файл версии 8.17.4). В качестве сравниваемой версии укажем версию, на которую мы хотим обновиться (в моем • случае, это 9.0.0). <- 0 Й <5tHub Inc [US] https 'github.com-сi74...5.£ j ☆ * ✓ tWSsiy release ®.й.в мМймай Showing 12 changed files with 79 additions and 50 deletions «««♦в «/"авав* Unified Split •ft -e amass • Cnangek>g.md • Docfc«f«e - 4 “4 №№№SSSs- Ц .RSADMEmd •27 ~ЙТ ОШ: • VERSION -1 •' assttvbuWift&aiLsh • assets/runtime/config/g itlabhq/gitab уm ’ -2 -2 »B « • 3ssetsZFURfim^/&i»-!fig/ngiox/g«iafe'fs«g«<;-^l -4 -4gSBSm^ • assets/runt3»e/fa'ic?ions ■ t-o« . I ■ | >1 -lea asm • doci/conujngr^fegsstry.fnd ►8 -8 » . kubemetes/aSab'-fcyfhl *1.-1 e»e Рис. 150 - сравнение изменений в конкретном файле Мы увидим список коммитов и чуть ниже, список изменившихся файлов. Найдем файл docker- compose.yml. (Рис. 150) 112 Silver Bulleters, LLC В моем случае, единственное, что мне нужно будет изменить в файле docker-compose.yml - это версию образа gitlab. Если вы увидите какие-то более существенные изменения, например, добавленные или удаленные переменные окружения, их необходимо будет также перенести в ваш файл. (Рис. 151) Наш образ уже скачался, мы можем перейти ко второму пункту обновления. Шаг второй - остановить и удалить контейнер gitlab В инструкции приведены команды для использования Docker без Docker Compose. Однако мы можем их легко модифицировать под наши нужды. Откроем редактор Visual Studio Code и в интегрированном терминале укажем команды остановки и удаления нашего сервиса GitLab. В случае с Docker Compose это будет выглядеть так: docker-compose stop gitlab. i -r Д t ” — a* зТ J- S-T -Ws ’ >г’’V. ‘ ’ ’’i" После остановки сервиса удалим его. Для этого выполним команду: docker-compose rm gitlab. На вопрос удаления сервиса ответим утвердительно. После успешного удаления вернемся обратно к инструкции. Шаг третий - создание бэкапа. • Step К Create a backup docker nun — лее gitlab -it —гя (OPTIONS) \ sawersbn/gitlab: se, >e , xj app.; rake giti sh; backup:create Replace x.x.x with the version you are upqrjding from. For example, if yon are upgrading from version 6.0.rtcsel ..to -, .: e.e.e Puc. 152 - фрагмент инструкции по созданию бэкапа GitLab Для создания бэкапа нам необходимо выполнить встроенную в образ GitLab команду: (Рис. 152) app:rake gitlab:backup:create с помощью временного контейнера. Скопируем из инструкции эту команду и ее аргументы и перейдем в редактор Visual Studio Code. В случае Docker Compose строка для формирования бэкапа будет выглядеть так: 113 Никита Грызлов. Пособив релиз-инженера 1C docker-compose run --rm gitlab app:rake gitlab:backup:create Где: • --rm-это флагудаления контейнера после выполнения команды • gitlab (имя нашего сервиса) • и сама команда app:rake и ее аргументы gitlab:backup:create. Выполним получившуюся команду и дождемся окончания формирования бэкапа (Рис. 153). | PS С: \workc.pa< e'.gi t lab> docker-compose run --r® git 1 Initializing logdlr... Initializing datadir... Installing configuration teeplates... CoafijpHng gill ab - ■■ Configuring gitlab ;:database VOlltigO t l ab :redis ... Configuri ng g1t1ab : Configuring gitlab :: sideMq... Configuring gitlab ::gitIab-«rkhftr se... Configuring gitlab : : unicorn... Configuring gitlab : :tinezone... Configuring gitlab ::rack attack.,. Configuring gitlab ; :ci,.. дке g i t lab; backup zcreate 1 : < ■ ■ Рис. 153 - выполнение резервного копирования После выполнения команды убедимся, что бэкап успешно создался. Для этого откроем каталог, который мы смонтировали, как каталог данных GitLab (в моем случае, это мой рабочий каталог, подкаталог volumes и gitlab). В нем перейдем в папку backups и в нем увидим файл с расширением tar это архив, который мы можем распаковать, например, архиватором 7zip. Вернемся к инструкции по обновлению. Последний шаг - это запуск контейнера с новым образом. Вернемся к нашей вкладке со сравнением версий файла docker-compose.yml, запомним, что нам на 25 строке, где указан образ gitlab, нужно изменить его версию. (Рис. 154) 2 ■■ View - Ф giU&P? resort t » restU h? • postfresoi Puc. 154 - различие в docker-compose старой и новой версии 114 Q v Silver Bulleters, LLC Откроем Visual Studio Code, откроем docker-compose.yml, применим к нему эти изменения и сохраним. (Рис.155) Дойре г:>»dockeT-cornpL-se.ymt X - 2" 0 4 ПРЭвОДНЯК окгам редлккюы Р ф Добро пожаловать services: reate: ... - й - "1: always dockri-cornpose.yirri J «ИА» ttaete -EOjiipaaj.'jTOl to «с : sameersbn/т-е <s: latest <§> - --fftglfjvfl warning setose s: -to:/«orkspactovaitees)f,"edis s/ver/llb/pedis: 2 . Ctttto: -igstaiPt; aba.i . . ; ■ [ -. reals ■ терминал Creatine hfefcsp archive: 'SA»MS999_2OT7_03_??_g.itlab_fe»«lcup,ter .-Uploading backup archive to remote storage ... skipped Deleting tap directories ... ; PS C:\worfcspacp\gitlabs docker-compose up - gitlab. redls.1 is up-to-date J Creating gitlab...gitlab...,l -- > _________ ,. | gitlab __________ Puc. 155 - запуск контейнера новой версии непосредственно в VSCode Поднять отдельный сервис мы можем с помощью команды docker-compose up. Чтобы контейнер запустился в отдельном потоке, укажем ключ -d, а поскольку нам нужно обновить только GitLab, укажем имя сервиса - gitlab.: docker-compose up -d gitlab После создания контейнера откроем логи Docker Compose для того, чтобы убедиться, что все прошло нормально. Для этого напишем: docker-compose logs -f Часто при смене мажорных версий будет выполняться миграция базы данных - этот процесс может занять некоторое время. 115 Никита Гоызлов. Пособие релиз-инженера 1C Через некоторое время мы можем открыть окно браузера и убедиться, что наш GitLab обновлен. В окне с информацией о системе мы увидим новую версию GitLab. (Рис. 156) Если вместо этого окна вы получили сообщение об ошибке с номером 502, попробуйте обновить страницу через минуту (поднятие сервиса GitLab может занимать до нескольких минут). 116 Silver Bulleters, LLC Раздел 6. Серверы непрерывной интеграции 6.1. Обзор имеющихся серверов сборок Есть хорошая поговорка про рутину: «Первый раз выполни операцию руками, второй раз-руками, но призадумайся, а третий раз напиши скрипт». В современном мире разработчику приходится пользоваться массой инструментов, решающих различные задачи. Часть из них-утилиты одноразовые (или крайне редко используемые), но остальные плотно входят в ежедневный цикл разработки программного обеспечения. Нажимать кнопки в их графическом интерфейсе может быть весело и интересно только до определенного момента, пока это не становится рутиной. В определенный момент возникает потребность автоматизировать все рутинные операции, потому что компьютер должен помогать нам в работе, а не требовать к себе постоянного внимания. Но, даже после упаковки всех операций по работе с инструментами в код скриптов перед разработчиком встает проблема их запуска: мало кому понравится работать на машине, у которой сильно загружен процессор или вообще в произвольный момент времени на экране начинают появляться различные всплывающие окна. Чтобы увести рутинный запуск инструментов с машины разработчика и привязать сам запуск к различным событиям, и придумали сервера сборок. По своей сути сервера сборок - это отдельные серверные машины, которые по определенным событиям начинают выполнять заложенные в них действия по тестированию и сборке продукта. Если добавить к этому: • Удобное получение данных о результатах тестирования; • Рассылку отчетов; • Сохранение истории; • И накрыть все это веб-интерфейсом; то получим удобный инструмент, который позволит разработчикам разрабатывать, меньше отвлекаясь на прочие действия. Во зможиость/ПродуИТ Jenkins Gitlab С! Стоимость free Free Seif-hosled master * ■f + Seif-hosted bodes Бесплатные облачные коды ■ - Использование docker для выполнения задам ♦ ОС агента Wtn/Linux AppVeyor Travis.ci Free/Paid Free/Paid * - - * - - + + VSTS/TFS * Win/hnux t t Wsn/Linux Win Liriux/Mac OS Рис. 157 - сравнительная таблица серверов сборок Сейчас в сообществе представлено довольно большое количество серверов сборок. Одни появились совсем недавно, другие - переживают свои вторые, третьи и N-ые редакции, продолжая наращивать 117 Никита Грызлов. Пособие релиз-инженера 1C свою функциональность. Мы составили небольшую сравнительную таблицу (Рис. 157) имеющихся серверов сборок и рассмотрим такие популярные сервера сборок, как: • Jenkins; • GitLab Cl; • VSTS (или TFS) от Microsoft; • AppVeyor; • HTravis.ci. С точки зрения стоимости: • Jenkins и Gitlab Cl полностью бесплатны. • VSTS и TFS - это платные продукты от Microsoft. • AppVeyor и Travis.ci-это облачные сервера сборок, которые доступны: о Бесплатно для публичных репозиториев на GitHub; о И платно для приватных репозиториев. С точки зрения возможности самостоятельного развертывания: • Jenkins, GitLab и TFS можно развернуть на собственных мощностях. • AppVeyor и Travis-это облачные решения. Сточки зрения подключения агентов сборки: • Для Jenkins, GitLab и TFS есть возможность подключить собственных агентов. • Для AppVeyor и Travis - агентами выступают их публичные сервера. Что касается бесплатных облачных агентов: • В веб-версии GitLab вы можете для выполнения сборки бесплатно использовать встроенный облачный агент. • AppVeyor и Travis также предоставляют своих агентов бесплатно. Отдельно хочу выделить, что Jenkins не имеет публичного сервера сборок. Если вы хотите использовать Jenkins, его необходимо поднимать на собственной инфраструктуре. Все указанные здесь сервера сборок позволяют для выполнения задач использовать Docker. В качестве поддерживаемых операционных систем для агентов: • У Jenkins, GitLab и TFS выступают Windows и Linux. • AppVeyor доступен только на Windows, • Travis только на Linux и MacOS. У всех представленных здесь серверов имеется активное сообщество, которое старается расширить возможности каждого сервера сборок путем разработки плагинов. Указанные в этой таблице различия на первый взгляд, незначительны. Можно было бы выбрать подходящий сервер сборок по некоторым ключевым показателям: например, по стоимости и 118 Silver Bulleters, LLC используемой операционной системе. Основное отличие этих серверов заключается в их визуальной составляющей. • Все, что покажет вам Travis.ci и AppVeyor - это текстовый лог сборки и финальный результат (была ли сборка успешной или нет). • GitLab Cl дополнительно может разбить логи по выделенным этапам сборки, однако, глобально все еще остается отображателем логов и результатов. • Дополнительным фактором является то, что у Travis, AppVeyor и GitLab Cl единственным • VSTS и TFS предлагают: интерфейсом настройки является единый конфигурационный файл. о визуальный интерфейс для редактирования этапов сборки о более структурированный вид логов о вывод результатов тестирования для нескольких популярных тестовых фреймворков в виде графиков и диаграмм с детальной информацией по каждому тесту (в том числе с изменениями по времени) • Лидерство же отдается Jenkins: о Он поддерживает как графическое, так и скриптовое описание этапов сборки о За счет огромного количества написанных для него плагинов позволяет выводить результаты тестирования в графическом виде о Его можно использовать для большинства популярных тестовых фреймворков о Он позволяет измерять и отображать различные статистические данные в виде трендов о У него очень удобное представление артефактов сборок (он позволяет даже отображать полноценные динамические сайты), о Jenkins поддерживает большое количество систем контроля версий о И даже позволяет полностью изменить свой интерфейс о В целом, Jenkins среди всех серверов сборок сейчас обладает наибольшей функциональностью, совмещенной с богатыми возможностями по графическому представлению результатов сборки. 6.2. Jenkins Cl - способы установки Для изучения возможных способов установки перейдем на официальный сайт Jenkins - https://jenkins.io, и нажмем кнопку «Download». (Рис. 158) 119 Никита Грызлов. Пособие релиз-инженера 1C ... о Ф © й https://jenkins.io Jenkins Blog Documentation Plugins Use-cases - Participate Sub-projects » ; Q, Поиск Resources - About - j Download ] Jenkins Build great things at any scale The leading open source automation server, Jenkins provides hundreds of plugins to support building, deploying and automating any project. Documentation \ Puc. 158 - страница загрузки Jenkins Jenkins поставляется в виде двух релизов: • LTS - это релизы с долгосрочной поддержкой, которые выходят раз в месяц; • И еженедельные релизы - соответственно своему названию выходят раз в неделю. Каждый из релизов имеет несколько способов установки: • Основной - через скачивание файла с расширением *.war и запуска его из командной строки командой java -jar jenkins.war (*.\л/аг-это специальным образом упакованное веб-приложение, написанное на языке Java). • Кроме этого Jenkins предоставляет установочные пакеты для Windows, MacOS и большинства популярных Linux-дистрибутивов. • А также доступен образ Docker. И хотя Jenkins доступен в виде установщика под операционную систему Windows, мы будем использовать недельный Docker-образ. 120 Silver Bulleters, LLC 6.3. Jenkins master - установка ☆ h ® fl httpsyyjenkinsJo/download/ B;a§ ПОИСК Documentation ■? Jenkins Build great things at any scale The leading open source automation server, Jenkins provides hundreds of piugins to support building, deploying and automating any project, i Documentation Еза Getting started with Jenkins The Jenkins project produces two release, feres, LTS and weekly. Depending on your organization's needs, one may be preferred over the other Both release lines are distributed as .tar files, native packages, installers, and Docker containers. Packages with the Й gear icon are maintained by third parties. Long-term Support (LTS) Weekly LTS (Long-Term Support) releases are chosen every 12 weeks from A new release is produced weefdy to deliver bug fixes and features to the stream of regular releases as the stable release for that time users and plugm developers. period. Learn more... Changetogi Past Releases Chengeteg | Upgrade Guide S Past Releases 63 Deploy Jenkins 2.8S.4 £3 Download Jenkins 2.108 for: Arch Linux У2 63 Download Jenkins 2.89.4 fan Docker FreeBSD Gentoo Mac OS X OpenSSD E& openSUSE openSUSE Red Hatffedora/CeniOS Red HaLFedora/CentOS Ubunlu©ebian Puc. 159 - раздел выбора варианта поставки В колонке недельного релиза, выберем установку для Docker, щелкнув по соответствующей строчке (Рис. 159) 121 Никита Грызлов. Пособие релиз-инженера 1C Ш 1 -Я|^ЙЦВЦ1 rb.docker .аио/г^ел kins/jenkins. Q | Explore Help | Sign up Sign In | PUBLIC REPOSITORY jenkins/jenkins ☆ ........... . . . . . Jc.. . ; .................. _ ..........................................' -S..____ Л, Docker Pull Command Short Description The Full Description Jenkins Continuous Integration and Delivery server. This is a fully functional Jenk О Jenkins .< III 11; if iffl - • '®7 <*Г;; docker pull ! • i iff- '■Д| 1 ■ Zif-j ■V-;'! 1 1 -S' Рис. 160- страница Jenkins на Docker Hub Перейдя по ссылке, попадаем на страницу репозитория на Docker Hub (Рис. 160). Здесь мы найдем информацию о тома как получить последнюю LTS-сборку и последнюю недельную сборку. Для чтения полной документации по установке Jenkins через Docker нам предлагают перейти по ссылке на github-репозитарий. 122 Silver Bulleters, LLC OS README.md Official Jenkins Docker image The Jenkins Continuous Integration and Delivery server. This is a fully functional Jenkins server, http://jenkins.io/. Jenkins Usage docker run -p 8080:8080 -p 50080:50600 jenkins/jenkins:Its NOTE: read below the build executors part for the role of the 50000 port mapping. This will store the workspace in /var/jenkins_home. All Jenkins data lives in there - including plugins and configuration. You will probably want to make that an explicit volume so you can manage it and attach to another container for upgrades : docker run -p 8080:8080 -p 50000:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:Its this will automatically create a 'jenkins_home' volume on docker host, that will survive container stop/restart/deletion. Puc. 161 - раздел документации на Github Откроем документацию и пролистаем ее до раздела Usage (Использование). (Рис. 161) Как следует из инструкции, запустить Jenkins из Docker довольно просто. Для этого нужно: • • Открыть два порта: о Первый порт (8080) используется для отображения веб-страницы Jenkins; о Второй порт (50000) - для связи между агентами. Также нам предлагается смонтировать каталог /var/jenkins_home (основной каталог Jenkins, в котором основной узел будет хранить все свои данные). Скопируем указанную строчку в буфер обмена. 123 Никита Гоызлов. Пособие релиз-инженера 1C |а V -ОХ jenkins Падеяитьсв • т б* Вид м- ь Этот компьютер • Локальный диск (С.) * workspace > lenktns Дата измйиеиня Им» Поиск: Jenkins Д» Размер Тип #• Быс трый доступ У1 Рабочим стол а? Загрузки & (&'] Документы $ Изображении System32 workspace # Эта папка пусг*. Вид > Со-ртмрогкя > Группировке > Обновить § Видео £ Музыка Настроить папку... Вставить /а» OntDrive CCi Этот компьютер ES$t Сеть Вставить ярлык Отменить переименование ОТ.-2 GK GUI Нее G« Bash Неге И1 Open with Code . .............................. Поделиться Создать. И I. . ■■!11 > > Свойства Элементов; О Рис. 162-в созданной директории откроем VSC Создадим в нашем рабочем каталоге папку jenkins и откроем в ней редактор Visual Studio Code. (Рис. 162) Рис. 163 - изменение символов перевода строк для открытого файла Для установки Jenkins мы будем использовать простой shell-скрипт. Создадим новый файл, назовем его run-jenkins.sh и переключим переводы строк в режим LF (для этого в правом нижнем углу щелкнем по переключателю переводов строк и выберем LF). (Рис. 163) 124 Silver Bulleters, LLC run-jenkins.sh • Добро пожаловать docker run -p 8080:8086 -p 50080:50000 -v jenkins_home:/var/jenkins_home jenkins/jenkins:Its Puc. 164 — содержимое run-jenkins.sh Вставим строку по установке Jenkins из буфера обмена. (Рис. 164) Рис. 165- путь к директории с данными Jenkins Для сохранения данных Jenkins в папке volumes нашего рабочего каталога создадим подпапку jenkins именно ее мы будем монтировать в каталог var/jenkins/home (Рис. 165). Добро пожаловать run-jenkins.sh • docker run --narae jenkins -d -p 8880:8080 -p 50000:50000 -v C:/workspace/volumes/jenkins:/var/jenkins_home jenkins/jenkins:Its Puc. 166- добавили в строку запуска путь в рабочему каталогу Теперь модифицируем скрипт (Рис. 166): • Скопируем путь к каталогу сохранения данных и укажем этот путь в нашем shell-скрипте вместо jenkins_home (не забудем поменять обратные слеши на прямые). • Для того чтобы упростить идентификацию нашего контейнера среди запущенных, явно укажем контейнеру имя - для этого добавим параметр - -паше j enkins. • Чтобы запуск файла не блокировал окно консоли, добавим параметр -d (detached). В итоге у нас получится такая строка: docker run --name jenkins -d -p 8080:8080 -p 50000:50000 -v C:/workspace/volumes/jenkins:/var/jenkins_home jenkins/jenkins Наш файл готов к работе. Сохраним его и откроем интегрированный терминал. PS С:\worksp«ce\jenkins> ,/run-jenkins.sh PS С:\workspace\jenkins* | Рис. 167 - запуск скрипта в окне консоли Давайте попробуем запустить наш Jenkins. Для этого наберем в терминале: ./run-jenkins.sh И нажмем Enter (Рис. 167). 125 Никита Гоызлов. Пособив релиз-инженера 1C Каким образом вы хотите открыть этот файл? Использовать это приложение Git for Windows Другие параметры Visual Studio Code Создать НаЙ и приложение в Магазине Еще приложения Ф □ Всегда использовать это приложение для открытия ,sh файлов Рис. 168 - диалог выбора приложения для открытия файла Если система спросит у вас, чем открыть указанный файл, выберите «Git for Windows» - в нем есть встроенный интерпретатор bash. (Рис. 168) Р5 C:\wcw’k5pdce\jenkin5> ./run-jenkins.sh PS C.:\workspace\jenkins> docker ps CONTAINER ID IMAGE N»WS 5ес26з425е57 jenkins/Jenkins S. 0.8.0; 50000->Ь8вев/ир COMMAND CREATED STATUS PORTS "Zbin/tini -- /usr,..“ 25 seconds ago Up 21 seconds 0.0.0.0:8080->86S6/Up, 3 hours ago Up 3 hours 443/tcp, 0.6,0.0:10022» 2 days ago Up 6 hours &3?9/tcp Jenkins fGSe59ddfa91 saSK?ersbn/gitlaib:9.8.8 “/sbin/entrypoint...." 22/tcp, 8.0.0.0:30080 >88/tcp gitlabjgftlab~3 28646989 J0ce sameersbri/redis: latest “/sbin/entrypoint... gi t labored is.1 PS C;\Morkspace\jenkins> | Puc. 169 - список работающих docker-контейнеров Дождемся запуска контейнера. Убедимся, что наш контейнер запустился-для этого выполним команду: docker ps Видим строчку с контейнером Jenkins. (Рис. 169) 126 Silver Bulleters, LLC Puc. 170-журнал работы контейнера Jenkins Проверим логи этого контейнера. Для этого выполним команду: docker logs -f jenkins В логах отразилась информация о том, что Jenkins полностью поднялся и запущен. Чуть выше мы можем видеть секретный пароль, который необходимо ввести при первом запуске Jenkins (Рис. 170). Скопируем его и откроем браузер. Getting Started Unlock Jenkins To ensure Jenkins is securely set up by the administrator, a password has beers written to the log (nau.j e where» / var/ and this file on the server. ns_b«s£/ sec ret s/inS ti&lAdm nras s-word Please copy the password from either location and paste it befow. —---- -- —---- —— Puc. 171 - страница разблокировки Jenkins 127 Никита Грызлов. Пособие релиз-инженера 1C Перейдем по адресу http://localhost:8080/ . Как вы видите, Jenkins просит себя разблокировать. Вставим сюда тот пароль, который мы нашли в логах, и нажмем кнопку «Continue» (Рис. 171). Getting Started Customize Jenkins Plugins extend Jenkins with additional features to support many different needs. Select plugins to install Install suggested plugins Il Install plugins the Jenkins community finds most useful. 1.'S Select and install plugins most suitable for your needs. Jehus 2.52 Puc. 172 - страница выбора набора расширений После разблокировки Jenkins предлагает выбрать: • Либо установить рекомендуемые плагины; • Либо выбрать список плагинов вручную. Для первой настройки нам хватит предложенных Jenkins плагинов, поэтому выберем вариант «Install suggest plugins» (Рис. 172). Дождемся окончания установки плагинов. 128 Silver Bulleters, LLC Getting Started Create First Admin User Имя пользовтяя nbt«B007 Пароль Повторите пароль ------ ... ФИО Никита Грызлов Адрес электронной почты . ntxel2807^maii corn) -AlWbctt Continue as admin Jenkins 2.52 Say® and Finish Puc. 173- Создание первого пользователя в системе Зададим настройки первого пользователя. Для этого укажем: • Его имя; • Пароль; • Реальное имя; • И адрес электронной почты. После заполнения полей нажмем «Save and Finish» (Рис. 173). Getting Started Jenkins is ready! Your Jenkins setup is complete. Start using Jenkins Puc. 174- все готово для начала раобты Наш Jenkins готов. Нажмем кнопку «Start using Jenkins». (Рис. 174) 129 Никита Грызлов. Пособие релиз-инженера 1C Рис. 175 - начальная страница Jenkins Перед нами открылся начальный интерфейс Jenkins. (Рис. 175) 6.4. Базовые настройки Пара слов о структуре Jenkins: Глоссарий раздела: • Нода - один из узлов/серверов Jenkins • Мастер/Master - управляющий узел Jenkins • Слейв/Slave - подчиненный узел Jenkins • Задача/ltem/Job - описание шагов сборки, триггеров, прочих настроек (подготовка каталогов, установка переменных среды и пр.) • Сборка/Build - конкретное выполнение «Задачи» • Артефакт сборки - полезный остаток от сборки - инсталлятор продукта, результаты тестирования, отчеты о качестве. Вся полезная работа в Jenkins выполняется на так называемых «нодах». Это может быть: о Отдельно выделенный сервер о Или Docker-контейнер, который объединяется в кластер Jenkins. Все узлы делятся на два типа: о Первый - это master-нода. Master - это главный управляющий узел. Он отвечает за передачу выполнения задач на подчиненные узлы и за настройки сервера. о Подчиненные узлы называются Slave - на них лежит вся основная нагрузка по прохождению по сборочной линии. Сборочные линии описываются в виде задач. В задаче указаны: о 130 Все шаги сборки; Silver Bulleters, LLC о Описаны триггеры запуска; о Подготовительные действия, такие, как подготовка служебных каталогов, установка переменных среды и т.д. Выполнение задачи в конкретный момент времени порождает сборку. В терминах объектно- ориентированного программирования задачу можно расценивать, как класс, а сборку - как конкретный объект данного класса. После выполнения сборки остаются артефакты. Артефактом может быть, например, инсталлятор продукта, результаты тестирования или набор отчетов о качестве. Связь этих элементов укладывается в несколько диаграмм: • Все подчиненные узлы Jenkins (Slave) связаны с одной Master-нодой: (Рис. 176) • На основании одного описания задачи формируется несколько сборок (билдов) (Рис. 177): • А конкретная сборка состоит из нескольких шагов сборки, которые могут выполняться на различных подчиненных узлах, а могут и все на одном (Рис. 178): 131 Никита Грызлов. Пособие релиз-инженера 1C Основные настройки Jenkins Пройдемся по основным настройкам нашего сервера сборок. В раздел с администрированием Jenkins можно попасть, нажав ссылку «Настроить Jenkins» на стартовой странице. Рис. 179- страница настроек Jenkins В данном разделе собраны ссылки на различные страницы с настройками Jenkins (Рис. 179). Здесь можно найти: Общее конфигурирование системы; Настройку используемых утилит; Управление плагинами; 132 Silver Bulleters, LLC • Управление пользователями; • А также прочие настройки. Общее конфигурирование системы Перейдем к общему конфигурированию системы, нажав ссылку «Конфигурирование системы». В данном разделе нас могут заинтересовать несколько параметров: I & помех -g Jenkins Jenkins ■ Нм кагга Грызлов i выход о Дооаимвя директория -од- Создать него Расшареммые- Люди История споро». •3% Ф Настроим Ос тайное сообщение настроить Jenkins © Му Vews credentials (Plain text) ГЬедпроемотр Очередь сборов - Очередь сборок пуста Состояние сборщиков Количество cSopmwoe 2 Метки - 1 В сииданки Испальзваание Use this node as much as possible Зедера ка перед сборкой 5 2 Б о»идами»» Количество попыток обращения • SCM для выгрузки проегтое • © в 0 ■ Restrict project naming Рис. 180- Настройка количества сборщиков на мастере • Первый - это количество сборщиков. Он отвечает за количество одновременно выполняемых задач на Master-ноде (Рис. 180). Spitcm clock cm» format mm Е«лрмС1 tene fcnrurt ’ФН1 rwn » S'<Jb> ’ Adrntai!**trattк» monitor» conllguiMion ПнХЛХ»», Jsfikim Location Jvrkm URL Aajpec Me («№ j; PitMnie *et » Нсий nam?, railed «й loC4tfei>« <> М&ОД AM «этЙфжЮ y« < Puc. 181 - настройки плагина Timestamper и адреса сервера • Далее интересными будут настройки плагина Timestamper - вспомогательной утилиты, которая будет добавлять информацию о текущем времени в каждую строку лога. • Для того чтобы в сообщениях от Jenkins использовались корректные ссылки на его элементы, в поле «Jenkins URL» нужно задать реальный адрес расположения сервиса Jenkins. • В поле «Адрес администратора» задается имя и адрес электронной почты, от имени которого Jenkins будет рассылать свои письма (Рис. 181). 133 Никита Грызлов. Пособие релиз-инженера 1C Git plugin GJobai СопПд username Value ci-bot Global Config user email Value > © ci-bot@example com Create new accounts base on author/committer's email в bi Puc. 182 — настройки плагина GIT • Следующий интересующий нас блок настройки - это настройка GIT-плагина. В этом плагине по аналогии с консольной версией GIT необходимо задать имя и почту пользователя, из-под которого Jenkins будет выполнять команды, предоставляемые GIT-плагином. Укажем здесь нашего пользователя ci-bot и его почту. • Галка "Create new accounts..." позволит нам автоматически создавать пользователя Jenkins на основании авторов и коммитеров из GIT (Рис. 182). ( SMTP Е 4гым1 WotHfertion server © DeOJ! user £<«мЗ © Pee ширенные _ CMeuft Cont-enl Type PlMn Text CWtpUr,! u U»eUg«-i0&a*IHMd«r U Pwwfcree 6пи4 © © © © ftepty TeUM © Emergency rarotrfe © Recipe*.* © [Mfcj? Subject IPfiOJCCTNAUE - 8uM « SBUslOW-MBER - M«lO_STATUSi © © DeteuB Ссгеоп! SPROdECT-NAUE ■ вМИ»Ж1МЯ_ММ8£К • »UIIOSTATUS Check console output et $BUUO_URL to vsew the results © Puc. 183 - настройка отправки писем • И последний, наиболее многочисленный блок настроек - это настройка отправки писем (Рис. 183). Здесь необходимо: о 134 Указать адрес SMTP-сервера; о Параметры авторизации; о А также можно задать шаблон отправляемого письма. Silver Bulleters, LLC Уведомление почтой Сервер SMTP © smtp gmail com Суффикс адреса по умолчанию в в * Использовать аутентификацию для SMTP Имя пользователя nixel20G7@gmail com Пароль Использовать SSL Ф в 465 © Порт SMTP Reply-То Address Charset UTF-8 Проверить установки отправкой сообщения администратору Рис. 184 - настройка доступа к SMTP-cepeepy • Часть настроек по отправке писем также необходимо будет продублировать в блоке «Уведомления почтой» (Рис. 184) - для того чтобы Jenkins мог корректно отправлять как системные письма, так и письма, формируемые отдельным плагином с расширенной настройкой, вам необходимо заполнить оба этих блока. На иллюстрациях представлен пример, в котором в качестве SMTP-сервера используется сервер gmail. о Адрес сервера: smtp.gmail.com; о Включено использование аутентификации; о Задано имя пользователя; о Пароль; о Используется шифрование SSL; о При использовании SSL Google предоставляет порт 465; о Кодировка сообщений: UTF-8. Уведомление почтой Сервер SMTP Доменное имя почтового сервера Оставьте пустым для использования сервера ло-умолчанию (обычно это тот сервер запущен на localhost) Ck Jenkins использует JavaMail для отправки почты JavaMail имеет возможность дополнительной настройки через системные свойства установленные в контейнере Смотрите документ для полного списка параметров и их описаний (from j,jgfeiaa,,Mailer ,P.i.uato f Puc. 185- пример справки по параметрам Практически у каждой настройки с правой стороны от поля ввода есть значок с информацией (Рис. 185). Если вы нажмете на него, то получите расширенную информацию о данном параметре. После задания всех настроек нажмем кнопку «Сохранить». 135 Никита Гоызлов. Пособив релиз-инженера 1C Настройка используемых утилит Global Tool Configuration Maven Configuration meven ьв„,^ Default settings provider b Default global settings provider Use maven seHing5 JDK JDK установок Добавить JDK Cn*so« ЛЖ уста«эво< s этой мете»® Git Git installations Git Default Name Path to Gh executable 9* Install automaticaBy e Apply Puc. 186- настройки используемых утилит Вернемся к странице настройки Jenkins и выберем пункт «Global Tool Configuration». (Рис. 186) В данном разделе осуществляется настройка используемых утилит. Здесь указываются некоторые значения по умолчанию, а также можно настроить автоматическую установку утилит на Slave-агентах. Управление плагинами Рис. 187 - список установленных плагинов Для управления списком плагинов существует страница «Управление плагинами». Здесь можно увидеть: 136 Silver Bulleters, LLC • Список плагинов для которых доступно обновление; • Просмотреть список доступных для установки плагинов; • Посмотреть список установленных плагинов (Рис. 187); Дополнительно Конфигурация HTTP Proxy © * Сормр Порт © Имя оейзеюзеяя © (Taponi. No Proxy Host Рэешире миме... Загрузить плагин Здесь Вы можете устаноаить плагин rje из центрального репозитория, загрузив .hp-файл Файл j Выберите файл Файл не выбран Сайт обновлений .Адрес URL http 7/updates jenkins-ci or^'update-cewe< json .22 часе® назад I проверить сейчас Рис. 188 - дополнительные настройки менеджера плагинов • А также задать дополнительные настройки, (Рис. 188) вроде: о Настройки подключения к прокси-серверу; о Установки плагина из файла; о Или использования стороннего сайта обновлений. 137 Никита Грызлов. Пособие релиз-инженера 1C 6.5. Задача Hello, world! Создадим первую простую задачу для демонстрации работы Jenkins. Рис. 189 - создание первой задачи Для этого выберем команду «Создать Item». (Рис. 189) Jenkins ф Никита fрызтюв | выход Введите имя Item'a | hello world Создать задачу co свободной конфигурацией 1 Это - основной и наиболее универсальный тип задач в Jenkins. Jenkins будет собирать ваш проект комбинируя любую SCM с любой сборочной системой Данный тип проектов может использоваться для задач отличны** от сборки ПО Pipeline Orchestrates tong-running activities that can span routtspie build slaves Suitable for building pipelines (formerly known as workflows} and’or organizing compte* activities (hat do not easily fit in free-styte job type External Job Этот тип задачи позволяет вам сохранить результаты выполнения процессов выполняющихся вне Jenkins (возможно даже на удаленных серверах! Он разработан таким образом чтобы вы могли использовать Jenkins совместно с вашей существующей системой автоматизации Мультиконфигурзциоммыи проект (у Подкадит для проектов, требующих большое количестве различных конфигураций таких как тестирование в разнообразных средах пявтформезаеиснмые сборки и тд a container that stores nested teas in it Useful fa grouping things together. UhKke a fitter a folder creates a г namespace so you can have multiple things of the same name as long as they are in different folders Puc. 190 - создание первой задачи Для создания задачи нужно: • Ввести имя новой задачи - пускай это будет «hello world»; • И выбрать ее тип. Самый простой тип задачи, в котором можно настроить все доступные плагины в графическом интерфейсе, это «Задача со свободной конфигурацией». Выберем этот тип и нажмем кнопку «ОК» (Рис. 190). 138 Silver Bulleters, LLC ^Jenkins Никите Грызлов | выход Jenkins i hlfe worid Puc. 191 - окно настройки задачи В окне настройки задачи (Рис. 191) мы можем: • Установить общие настройки задачи; • Настройки получения исходного кода; • Установить триггеры; • Настроить среду сборки; • И прописать все шаги нашей задачи: о Выполнение конкретных действий по сборке о И послесборочные операции. a GilHufe project - Throttle bvltds © * Удалять устаревшие сборка Strategy | © Let, Rotation * Сколько дней хранить результаты сборки Если у газано. информация 0 сборках будет храниться это количество дней Скейж вляеяних е€врж хрмжть { М Если указано, будет храниться информации об этом количестве сберег Расашрвмные... Приостановить сборки © © Риреваяь параллельный запускзадав» © Ого • перамегриэманквя сборке Рис. 192 настройка хранения сборок Хорошей практикой перед наполнением задачи сборочными операциями будет настроить ротацию логов. Это позволит нам избежать излишнего разрастания каталога с данными о сборках и хранить только актуальную информацию. Это делается: • Установкой галки «Удалять устаревшие сборки» • И указанием количества дней и/или количества сборок, которые нужно хранить - укажем здесь 10 (Рис. 192). 139 Никита Грызлов. Пособие релиз-инженера 1C Среда сборки Delete wotfespace Мэю b»M stalls У Abort the build If it s stock 9 " 8t 1Ж s«M*S textte) or Puc. 193 - добавим вывод времени в вывод консоли Также в любой задаче полезно будет видеть информацию о времени выполнения каждого шага. Для этого в разделе «Среда сборки» отметим галкой пункт «Добавление отметок времени в вывод консоли» (Рис. 193). Сборка Дооаавть шаг сборки » «woke Qradle sen р? Rwn wMkftMeut SettwiW status to ’pendtne' on GitHub commit SusKWife Amt Вызвать ирли Mavm веруете уровня вывешить даман» Windows Выло,-пять даман» shell fu Рис, 194 - добавление шага сборки Перейдем непосредственно к сборке. Добавим новый шаг сборки, который будет выводить в консоль «Hello, world!» Для этого выберем шаг «Выполнить команду shell». (Рис. 194) Сборка © Вьтогшйть команду §Ы11 Команда echo "Hello, World?"J I Расширенные^ ДоОавкть шагсверим » Рис. 195 - содержимое команды В теле команды укажем echo "Hello, World!" (Рис. 195) Сохраним нашу задачу и попробуем ее запустить. 140 Silver Bulleters, LLC Puc. 196- запуск сборки Для этого на странице задачи «hello world» выберем пункт «Собрать сейчас» (Рис. 196). Jenkins запланирует новую сборку и через некоторое время ее выполнит. Для обновления данных на странице мы можем нажать F5 либо включить автообновление - для этого служит гиперссылка в правом верхнем углу «Включить автообновление страницы». Откроем информацию о сборке. Для этого мы можем нажать на гиперссылку с номером сборки. (Рис. 197) Рис. 197 - страница конкретной сборки Здесь представлена сводная информация о сборке: • Время ее запуска; • Время ее выполнения; • И слева гиперссылка на команду «Вывод консоли». 141 Никита Гоызлов. Пособив релиз-инженера 1C Назад к проекту Вывод на консоль Ц Статус изменения Started fry user Никита Грузло^ Building In wrk space /var/jesfelns^ho^e/wonfespscs/hall© world ЕВ Вывод консоли Просмотреть как неформатированный текст Редактировать информацию сбор* *» [hello **orld] $ Zbin/sh -x« /t^p/jenkins7S23428935115261369,sh * echo Hello, Horldl Hello, Worldf Finished: SUCCESS ® Хйалить cSofHty fTtoaMamps l^lJsebrowserlJmezatw ' EiapswJ time None Puc. 198 - флажок использования часового пояса браузера Откроем гиперссылку «Вывод консоли» - мы увидим логи выполнения нашей задачи. • Старт задачи; • Выполнение команды echo "Hello, World!"; • Ее результат; • И общий результат сборки - успешно. У каждой строки лога слева указана информация о времени выполнения. Это - работа плагина TimeStamper. Отметив галочку «Использовать часовой пояс браузера» мы можем привести время к нашему часовому поясу. (Рис. 198) Рис. 199 - главная страница Jenkins со списком задач Вернемся на главную страницу Jenkins. На ней отображаются все имеющиеся на сервере сборок задачи и статус их выполнения. (Рис. 199) 142 Silver Bulleters, LLC 6.6. Jenkins Slave - установка и подключение Задачи на сервере сборок должны выполняться на подчиненных узлах. Несмотря на то, что Jenkins позволяет выполнять задачи на Master-ноде, необходимо сократить количество таких задач до нуля. • Во-первых, нагружать сервер приложений, отвечающий за управление задачами, сборщиком и веб-интерфейсом, нежелательно - мы можем получить общее замедление работы контура. • Во-вторых, подключение нескольких подчиненных узлов позволит вам распараллелить некоторые задачи сборки между несколькими машинами и операционными системами. • В-третьих, в связи с особенностями реализации Jenkins даже последовательное выполнение задач на Master в долгосрочной перспективе ведет к деградации производительности. И даже если запустить подчиненный узел Jenkins на той же машине, что и Master, общая производительность системы будет выше. Рис. 200 - добавление нового узла для Slave Давайте создадим новый подчиненный узел, который будет работать на нашей Windows-машине. Для этого нажмем на гиперссылку «Состояние сборщиков» и выберем пункт меню «Новый узел». (Рис. 200) Укажем: • Название узла - например, «windows-1» • И выберем единственный тип агента «Permanent Agent». 143 Никита Гоызлов. Пособие релиз-инженера 1C поиск Jenkins Jenkins » (I» Никита Грызлов | выход Htxfes в в > Домой настроить Jenkins ■ ноёыйуэея Настройки Корень удалшдай ФС С TworkspaceJjenkinsjsisve gitsync bed Согажййй^ёодшоЕСй 1 8 ояш»«ж Способ запуска Use this node as much as possible в Launch agent via Java Web Start © 2 В «задании Доступность Keep this agent sn^sw as mush as possible Node Properties Environment variables U Tool Locations Save Puc. 201 - настройки slave-агента На данной странице есть несколько важных параметров. (Рис. 201) • Первый - это «Количество одновременно работающих процессов-исполнителей». Он отражает количество задач, которые можно будет выполнять параллельно на данном узле. • Следующий параметр - это «Корень удаленной ФС», путь к директории, где будет располагаться рабочий каталог данного узла. Для задания этого параметра я создам в своем рабочем каталоге новый подкаталог jenkins_slave. Путь к этому каталогу я укажу в параметре «Корень удаленной ФС» узла Jenkins. • Важной концепцией в серверов мире сборок является понятие «метки». Метка - это некое общее свойство, которое вы можете устанавливать нескольким узлам. подчиненным Например, вы можете поднять несколько машин под управлением Windows, присвоить им единую метку (например, BDD), а в задаче по проверке BDD указать, что она исполняется на машинах с данной меткой. Master-узел Jenkins будет распределять выполнение задач между несколькими подчиненными узлами на основании их загруженности. Данный узел у нас будет использоваться для двух целей - на нем будет происходить синхронизация 1С-хранилища с Git и выполнение нашей общей сборочной линии. Поэтому зададим для данного узла две метки. • о Первую метку назовем gitsync, о А вторую метку - bdd. Метки разделяются пробелами. Способ запуска оставим «Launch Agent via Java Web Start». Нажмем «Сохранить». 144 Silver Bulleters, LLC В списке узлов мы видим наш новый узел windows-1. Однако он выключен. Для того чтобы он мог начать выполнение задач, его необходимо перевести в активное состояние. Выберем узел «windows-1». (Рис.202) Jenkins Jenkins ? Nodes ' Никита Грмзпов | выход > s KacwnbJenkeis Щ новый узел Архитектур» ИМЯ ; Разница в настройке системного времени Свободно» дисковое пространство N‘A WA In sync 47 47 G8 23 минут 22 минут Жа ж Liny** ianK&Ji Полученные данные 22 минут й®е Sw®p Spas» Fre №24. С® «В 22 минут » мастер 1 Вшадаййй 2 Ввиящиви Ц, windows-1! (ewi«w*e«| Рис. 202 - неактивный добавленный узел На данной странице Jenkins предлагает нам несколько способов запуска. • Первый способ запуска - это запуск Java-апплета, открываемого из браузера. • Второй способ запуска - это запуск из командной строки. Для упрощения автоматизации данного действия воспользуемся вторым способом. Для этого нам необходимо скачать указанный файл slave.jar. Это можно сделать, нажав на его название и сохранив файл. (Рис. 203) Рис. 203 - скачивание программы-агента 145 Никита Грызлов. Пособие релиз-инженера 1C Переместим скачанный файл slave.jar в рабочий каталог jenkins_slave и здесь же создадим командный файл запуска с указанием этого файла и секретного ключа для подключения к Jenkins. Это будет файл start.cmd (расширение *.cmd укажем для упрощения запуска под Windows). Вставим в файл start.cmd строку по запуску агента, указанную в примере для второго варианта и несколько модифицируем ее. (Рис.204) Первое, что нам нужно будет сделать - это обеспечить возможность выполнения данного командного файла с правами администратора. При запуске командного файла с правами администратора текущий рабочий каталог командной строки устанавливается в системную директорию, однако, мы можем принудительно перейти в текущую директорию запускаемого файла. Для этого перед запуском агента добавим команду по переходу в текущий каталог-для Windows эта команда выглядит так: cd /D %~dp0 Где: (Рис.205) • /D - параметр для указания флага смены диска - если такое произойдет • дальше следует один из шорткатов командной строки windows - %~dpO. Данная команда совершит переход в каталог, где располагается данный командный файл - тогда slave.jar найдется по относительному пути. < jisrUmS—(лакнет — ОМ Право Формат Вид cd /Р го 65ЯРл java -0fU«.>ncodlng-4TF-a( -jar slave.jar -jnlpllrl http://loc»lhost:8e30/co«iputer/windo«s-l/jl*ve-agent.jnlp -secret bftiJB' Puc. 205 - изменения в командном файле запуска агента Следующая проблема, с которой часто сталкиваются пользователи Jenkins на Windows - это несовпадение кодировок вывода программ, логов и отображение их в веб-интерфейсе. Для того чтобы привести вывод к UTF-8, нужно выполнить два действия: 146 Silver Bulleters, LLC • Первое - переключим активную кодовую страницу в текущей консоли в режим UTF-8. Для этого выполним команду: chop 65001 • Второе - укажем Java необходимость работы в режиме кодировки UTF-8. Для этого первым параметром добавив в строку запуска установку кодировки: -DFile.encoding=UTF-8 Сохраним файл и попробуем его запустить. Щелкнем по файлу start.cmd правой кнопкой мыши и укажем «Запуск от имени администратора». Рис. 206 - успешный запуска slave-агента В случае успешного выполнения нашего файла, последней строчкой в окне консоли будет информационное сообщение «Connected». (Рис. 206) Вернемся к Jenkins. Обновим страницу и увидим, что агент windows-1 подключен через JNLP агента. (Рис. 207) Е Jenkins Ф # Вернуться к списку << Статус Delete Agent Д настроить j* Истории сборок Статистика использования Щ консоль сценариев В"0™ Ц Agent windows-1 Никита Грмзлпв ( выход Пометки, экгг уэея ка» «в премеано иеджт иммй Паакдючен черв? JKP отит». =Метки: йй яйзупс Проекты, привязанные к windows-1 Не? «-«фермацда К Системная информация Отключить Рис. 207-агент сборки активен 147 Никита Гоызлов. Пособие релиз-инженера 1C Вернемся к задаче «hello world» - настроим ее так, чтобы она выполнялась на агенте «windows-1». Для этого перейдем на главную страницу Jenkins, откроем нашу задачу «hello world» и выберем пункт «Настройки». т^йвирчие .к General Strategy S «кои Срада сборки if»..- -I. > > j lee Rotation i sp»a №хя&..6пр«н»!Н1мжрк:и( .*» ..... . —ЛЩеИ- ~ * . ... . ... . -.г,-г.-ч.йю:..... t СхоЛьхо дней хранить результаты сборе н > Если ухазано. информация о сборнях будет храниться это количество дней &одьл пжяедних сбсрс* хранить itt Вели указано, будет храниться информация об этой хопичестве оборот Ра с узыренных?... ■ © e ® © • Это - парамегриоованкая ейоря И Приостановить сборки . ■ Разрешить параллельный запуск задачи Ограничить twite сборирл». которые могут исполнять дени»® задачу Label Expression i bdd | UftSlfa»1» «««iced by 1 node Рис. 208 - установка «метки» для фильтрации сборщиков На вкладке «General» отметим галку «Ограничить лейблы сборщиков, которые могут исполнять данную задачу». (Рис. 208) В поле «Label Expression» мы можем указать: • Либо конкретное название нашего узла («windows-1»); • Либо метку, которую мы настраивали для данного узла - «bdd». Сохраним изменения и попробуем выполнить задачу. Jenkins Ф Никита (рмлюн I выход ittz-TZt M-ssfcga&a ;5£*g£« Jf На главную Проект hello world Статус Пыптиочотьедаегз ) Сборочная директория | «,-J Q - • : '■■■ ‘ —1 Сборочная дкрйутория удалить проект b настройки История сборок Постоянные ссылки • Пб£ледка«-£.йзуа t*1fo 41 шаш назад Посп^дняя ста^ычая .с§в&»а.^15), W масое цазад 1 find 28 0: 201? ifese ''I 'и- nftflhir j г» й.и .Tfow i>ii нагла ■■«■■■ — I Последняя пасйалкашаясл сборками») 41 секунд назад Las» fontoM&d buM ralG) 41 сегуна назад Рис. 209 - история сборок в интерфейсе Jenkins В моем случае сборка упала. Откроем информацию о сборке и посмотрим вывод консоли. (Рис. 210) 148 Silver Bulleters, LLC Ihlii Jenkins Ф Никита Грыат» f нытод ф Нщзад орсдату i Вывод на консоль Ж С**: а изменения 22:54:24 Starts fey MS Щ Вывод консоли 12:54:14 feuildlRg reefed? on jdadM.-l {Ш fttsync) in «гквркс® C: !H«©HtspM4\>fid:te^lawW!“fcsp«£:e\beIls »r2d ? Лрошозрет» мж неформтарованный лжет ?¥дадаровать дафзркэцию сбсзрш © удалить сворку ф Предающая сед® •Hreesiamps Vfe as екйПгеЖ # SysfeKS «tack tire® ® tbe клюет lemszow •- Elapsed Шла - N®ng UtMilt_____________________I - - ‘ '......... ______________ -U..... ............................ 12:54:2? The syst** cannot find the file specified 22:54:17 РАТМт гаикю^ «кйЙййЕЬй failed 12:»:2? j«**8.Io.lo®x«g^S.on: Creawt^ess «erer«2, *«• y#wrtc« яа&т* у*а»ан*4<$ файл 22:54:17 st jaWailang.PrxjcessJ^l.creste^Hstive Method) 12:54:17 st java.ieng.Pr»C«SK^>l.<iRitS<Onk«Oii«» Source) 12:54:17 at ja^a.iang.Process^sl.start(ШЬк»«5 Source) 12:54:27 at j«»lhng<Pms»4»iitt«r.stm<u^noe soor«) 12:54:17 at hodsgn.Proc$LocaiWoc.<init»<Proc.javs:245) 12:54:17 at h«sisan,Proc$L®«:eSProe.cinit>(Proc. j»ss:214) 12:54: 17 22:»: 17 at taKtsae. ta«ncfcer$t»caIteBndwr. 1ждасЦ1авпеЬег. Jsws: S46) «t 'hithtwt. . start (kaeocfear, j»»: ЭМ) 12:54 г 27 at hudsw. taunehergaeseotetauftchUlis W&. tall(имсЫг Java: 2255) 12:54:17 et h^»e«,taoncherP6w»oteta«ncKailafei».c«ll(Le«®cfeer. java.Il&e) 1.2:54:27 at H«dss«*re»oting,H®erRe4west,perf»m(w«rReq.ues.t,jaw»s253) .12:54:17 at fcwds-», rtssotteg.Vs«rRfi4«est>. ^Иот<Ш«гRequest 4w«;» ) 22:54:17 12:54:17 at had$».re»oting.R44uestO,n:n(Re4»est-j»v»:3WH et Hudson, reacting. i«terceptir^ExecwtorService|I .e^<Xot*rc«pting£x*C«t£K-$ervice,>va: S4) 12:»;17 at 12:54:17 ,cc»WMfre®t.Fwt«r4T*s)s.r«ri{ttsfcnewn 5йкге«) M jwa.Mtn .«wcsswent*»$»» '. * • «гntor< гм(«вйНн»“{Ш:»«»и| Source) Puc. 210 -логи сборки Все дело в том, что в нашей задаче мы пытались вывести «Hello, world!» с шагом выполнения команды shell, однако на текущей машине shell не установлен. Решить это можно двумя путями: • Либо установить shell на текущую машину (например, включив возможности встроенной в WindowslO ubuntu); • Либо переведя шаг сборки на выполнение команды Windows. Рис. 211 - замена шага «shell» на шаг «Команда Windows» Вернемся к задаче «hello world», выберем настройки, перейдем в раздел «Сборка» и добавим новый шаг «Выполнить команду Windows». Из шага «Выполнить команду shell» перенесем нашу команду в шаг «Выполнить команду Windows». А шаг с командой shell удалим. (Рис. 211) Сохраним изменения и соберем проект еще раз. 149 Никита Грызлов. Пособив релиз-инженера 1C Рис. 212 - отображение логов в истории сборок Как видите, следующая сборка удалась. Откроем лог сборки. Быстро это можно сделать, нажав небольшую черную стрелочку справа от времени выполнения и выбрав пункт «Вывод консоли». (Рис. 212) В логах мы можем увидеть: • Что данная задача выполнялась на ноде «windows-1», • С указанием рабочего каталога C:\workspace\jenkins_slave • И результатом - выводом команды "Hello, World!" 6.7. Переменные среды - уровень задачи, ноды, сервера В скриптах часто могут повторяться некоторые данные - например, используемая версия платформы 1C или пути к служебным каталогам и утилитам. Чтобы не хранить такие изменяющиеся данные в скриптах и использовать одинаковые значения в различных задачах, часто используют переменные окружения. По умолчанию, Jenkins не позволяетустанавливать переменные окружения на уровне задач, однако, мы можем сделать это с помощью специального плагина. 150 Silver Bulleters, LLC Puc. 213 - установка плагина Environment Injector Перейдем в настройку Jenkins, выберем «Управление плагинами», откроем закладку «Доступные» и найдем плагин «Environment Injector». Отметим его галочкой и нажмем кнопку «Загрузить и установить после перезагрузки» (Рис. 213). Также отметим галкой «Перезапустить Jenkins после окончания установки при отсутствии активных задач» для того, чтобы установка плагина произошла прямо сейчас. Дождемся перезапуска Jenkins. Рис. 214 - параметры задачи после установки плагина Environment Injector После перезапуска откроем нашу задачу «hello world», перейдем в «Настройки» и в разделе «Среда сборки» мы можем увидеть новые галки. (Рис. 214) 151 Никита Гоызлов. Пособие релиз-инженера 1C • В параметре «Properties Content» мы сможем указать интересующие нас переменные окружения и их значения. Имя переменной и ее значение отделяются знаком «равно». Например: TEST = Значение • Также для чтения переменных окружения можно использовать специальный файл, путь к которому можно указать в параметре «Properties File Path». • Аналогичным образом можно добавлять в переменные окружения данные о логинах и паролях из хранилища логинов Jenkins. За это отвечает галка «Inject passwords to the build as environment variables» - добавить пароль в сборку как переменную окружения. 152 Silver Bulleters, LLC Puc. 216- переменные окружения на уровне узла Общую для нескольких задач, выполняющихся на одном сервере переменную окружения можно задавать на уровне узла Jenkins. Для этого надо перейти на главную страницу, открыть интересующий нас узел, его настройки. Здесь можно аналогично (Рис. 216): Отметить галку «Environment variables» и добавить переменную окружения в виде пары «Ключ- • Значение», указав имя и значение. Либо отметить галку «Prepare jobs environment» и загрузить список переменных окружения из • файла. Jenkins ■ Настройка нзсынремные „ История сборок Системное сообщение настроить jenwns « Му Views СгевеШИ» {Plain text} ftoeanpecMOtB ОчврвДЬ сборок Оодзреа«. сборок пусти ft мастер Количестве сборщиков 2 Метки Иеяапьзвааиме Use this node as much м posstee Задержка перед сборкой g * 1 8 ожидании 2 В ожидании windows 1 1 8 ожидании Количество попыток обращения г. 5СМ для выгрузки проектов $ ; Restrict project «питд Глобальные настройки т-i Erreimrsmenl В Pretwfe jobs «wjfonmen! 0. feotUcatiws Usage Statistics Уиасчюввть e swuiaeww Jenkins веем»» анонимные данные no «•епопьэввэмпо и muerw о сбои»i УепЙ*5 : НВНННН ф иазд»-1' Рис. 217 Общие для всего сервера переменные окружения задаются в глобальных настройках Jenkins. Для этого перейдем на главную страницу Jenkins, выберем пункт «Настроить Jenkins» и перейдем в раздел «Конфигурирование системы». Здесь мы можем увидеть две галки по установке переменных среды, аналогичные настройке на узле (Рис. 217). Однако, переменные среды, настроенные на данной странице, будут установлены на всех подчиненных узлах Jenkins. 153 Никита Грызлов. Пособив релиз-инженера 1C Таким образом, переменные окружения для использования в задаче, можно настроить в трех местах: • В настройке самой задачи, • В настройке узла, на котором будет выполняться данная задача, • Ив глобальных настройках Jenkins. При совпадении имен переменных на нескольких уровнях, приоритет будет отдан более детальному. Переменная на узле переопределит глобальную переменную, а переменная в задаче переопределит переменную узла и глобальную. 154 Silver Bulleters, LLC Раздел 7. Синхронизация хранилища 1C c GIT 7.1. Подготовка репозитория Для того чтобы начать экспортировать исходники из хранилища в GIT-репозиторий, нам нужно его подготовить. Для получения информации о необходимых подготовительных действиях при работе с GitSync перейдем на страницу https://github.com/oscript-library/gitsync и найдем в Readme раздел «Выполнение настройки для начала выгрузки». (Рис. 218) Выполнение настройки для начала выгрузки Файлы настройки Для «встройки выгрузки используются 2 файл* • вйяя - содержит номер текущей выгружеииой версии хранилища 1C • authors - содержит информацию о связке пользователей хранилища 1C и пользователей репозитария Git Указанные файлы должны находиться в корне каталога выгрузки исходников, который может не совпадать с корнем репозитария Git в зависимости от выбранного сценария организации хранения исходников. Файл version имеет формат xml-файла Пример файла, е котором указано, что выгружено ТО версий: Oxs’ veriioB»"!.®" ®.-ico.(jlrsg»''UTf-8""?> «тавй» да/«ав» Файл authors имеет формат ini-файла А#1мнист}»тйр«Л«я»»эвзтеяь1 Вася имное-Д»то« пользователь Siteen-«ser§iseil.i©Mb А I ' ЩКЯ •. I слева указано имя пользователя хранилища 1C Рис. 218 - фрагмент документации gitsync Как следует из описания, в нашем репозитории нужно расположить два служебных файла: • Файл с версией (файл VERSION) - xml-файл с единственным тегом VERSION; • И файл с авторами (файл AUTHORS), ini-файл. Скопируем из Readme указанный пример файла VERSION. Если вы еще не клонировали в свой рабочий каталог пустой репозиторий trade из GitLab, то сейчас самое время это сделать. Либо же, можно создать пустой репозиторий на своей машине и связать его впоследствии с удаленным репозиторием trade из GitLab. С клонированием понятно, а в целях изучения git, сейчас мы пойдем по второму пути. В папке «git» рабочего каталога создадим репозиторий «trade», где для хранения исходников мы будем использовать служебную папку «src». И, поскольку у нас в этом репозитории будут храниться исходники 155 Никита Гоызлов. Пособив релиз-инженера 1C и конфигурации и обработок, создадим в папке «src» подкаталог «cf», где создадим новый файл, который назовем «VERSION» (Рис. 219) Этот компьютер > Локальный диск <03 > workspace > дй ? trade » src > d * быстрый доступ ■ Рабочий сад / Загружу & Де«ум««ты # С? ПЬйОЕ cf Рашер Имй J Sml ■ Открыть с тданош^то i ■ OperwithCosk CRCSHA Я Проверка с использованием Windows Defender... SystwSZ volumes в прежнюю версию ОпеОдае .......... Рис. 219 - структура каталогов в новом репозитории Вставим в этот файл xml из документации <?xml version="1.О" encodings"UTF-8"?> <VERSION>0</VERSION» В теге VERSION указывается последняя успешная выгрузка из хранилища в GIT-репозиторий. • Для выгрузки с начала истории хранилища в теге VERSION нужно поставить значение 0. • Если ваше хранилище имеет большое количество версий, то выгрузка с самого начала может занять продолжительное время и потребовать значительных вычислительных ресурсов. Для решения этой проблемы можно воспользоваться двумя способами: о В теге VERSION указать конкретную версию ближе к последней - тогда будут выгружены только несколько последних версий хранилища о При выполнении команды gitsync использовать параметры, управляющие списком выгружаемых версий (-minversion; -maxversion; -limit) Наше хранилище небольшое, поэтому поставим в теге VERSION значение 0 и сохраним файл. Настроим файл авторов для соотнесения пользователей хранилища с пользователями GIT. Для этого в том же каталоге, где лежит файл VERSION, создадим файл AUTHORS - также без расширения. Отредактируем этот файл в редакторе Visual Studio Code - перенесем туда пользователей хранилища. (Рис. 220) Рис. 220 - фрагмент файла AUTHORS 156 Silver Bulleters, LLC Формат описания этого файла довольно простой: • Сначала указывается пользователь хранилища; • Далее ставится знак «=»; • После этого указывается некое обычное имя пользователя; • И его почта, заключенная в угловые скобки (о). Когда GitSync будет находить в хранилище помещение от автора «ГрызловН», он будет выполнять коммит в GIT от имени «Никита Грызлов» с указанной почтой. Обратите внимание, для корректной связки пользователя GitLab с автором коммита в GIT данная почта должна быть добавлена в профиле пользователя - это либо почта, на которую он регистрировался, либо дополнительная почта, которую нужно будет добавить вручную. Сохраним файл и зафиксируем наши изменения. Для этого откроем репозиторий в Git Bash: Добавим файлы в индекс командой git add git add . И выполним git commit с комментарием «Добавлены служебные файлы gitsync»: git commit -m "Добавлены служебные файлы gitsync" Так как репозиторий новый, нам нужно связать его с репозиторием на GitLab. Рис. 221 - выбор формата ссылки HTTP на gitlab Откроем GitLab (он у нас работает по адресу http://localhost:10080/), перейдем в репозиторий trade и скопируем путь к репозиторию - если вы не используете SSH, то здесь необходимо выбрать HTTP. (Рис. 221) Теперь вернемся в консоль и добавим репозиторий на GitLab к нашему репозиторию как внешний, командой git remote add origin <АдресРепозиторияИзБуфераОбмена> 157 Никита Гоызлов. Пособие релиз-инженера 1C Теперь наш локальный репозиторий «знает» про то, что есть еще и внешний репозиторий. После этого можно выполнить команду отправки изменений в удаленный репозиторий: git push Так как ветви локального и удаленного репозиториев еще не связаны, GIT просит нас указать имя ветви удаленного репозитория. Связать текущую ветку master с удаленной веткой master на GitLab, мы можем, указав параметр - -set-upstream (или его короткую версию -и). Выполним команду git push еще раз, с указанием имени внешнего репозитория, имени ветки и флагом -и. git push -u origin master Git запросит пароль для входа в GitLab. В зависимости от настроек системы, пароль может быть запрошен прямо в консоли, либо с средствами хранилища паролей Windows (Рис. 222) Рис. 222 - окно менеджера паролей Windows После выполнения push в репозитории на GitLab мы сможем увидеть два наших служебных файла. Подготовка репозитория окончена. (Рис. 223) = Л trade / trade * master Нате Project Repository fHo Одаин ss-jMi;Sranew Merge Requests j Wg® Ptpeime: panvibuws Wtfci Сатрап Q ЙМЙ» trade •' src 2 cf .' Last ёвттй > «e#2«ss; SP 10 wsass ago • Добавлены служебмме файлы gstsyrsc Найяу ffi AUTHORS 2 VERSION Л - Last Update ШЖВУШ Добавлена»» служебные файлы ptsyftc Рис. 223-локальные изменения попали на сервер 158 •> + Ж tB ейЬцйеж аде Silver Bulleters, LLC 7.2. Запуск GitSync из консоли Перед запуском GitSync на Jenkins давайте научимся запускать его из консоли. С: \workspec#\git\traife>aitsynE GitSynt V2.1.1 ОШИБКА - некорректные аргументы командной строки Возможные команды; help - Вызод справки по параметрам done - Клонирует существующий репозиторий и создает служебные файлы init - Создает новый репозиторий и создает служебные файлы set-version - Устанавливает необходимую версию в фаA VERSION all - Запускает синхронизацию по нескольким репозиториям export - Выполнить локальную синхронизацию, без pull/push sync - Выполняет синхронизацию хранилища 1C с glt-репозиторием (указание имени команды необязательно) version - Выводить версию приложения С: \workspace\git\traciey_ Рис. 224 - встроенная справка gitsync Откроем новую командную строку в нашем репозитории и выполним команду gitsync. (Рис. 224) GitSync имеет несколько режимов работы. Так как получением и отправкой исходников в репозиторий мы будем заниматься со стороны Jenkins, то нам подойдет режим export. Для получения справки по команде export можно набрать: gitsync help export C:\workspace\git\tradeygitsync help export GitSync v2.1.l export - Выполнить локальную синхронизацию, без pull/push Параметры: «ПутьКХрзнияшцуУ - ©айлевый путь к каталогу хранилища конфигурации 1C. <ЛокэльныйКаталогГит> - Каталог исходников внутри локальной копии git-репозитария, -email - «домен почты для пользователей git> -vSversion - «Маска версии платформы (8.3, 8.3.5, 8.3,6.2299 и т.п.)> -debug - conjoff> -verbose - con|off> щ -format - «hierarchicalIplainy ~ -«inversion - «номер минимальной версии для выгрузкиу maxversion • «номер максимальной версии для выгрузкиу -limit - «выгрузить неболее limit версий от текущей выгруженной у -tempdir - «Путь к каталогу временных файлову C:\Horkspace\git\tradey_ Рис. 225 - справка по команде export У этой команды есть ряд параметров: (Рис.225) • • Два обязательных параметра: о Путь к хранилищу; о И путь к каталогу, в который будет выполняться распаковка исходников. А также необязательные: о email - при указании домена почты для пользователя GIT, если автор хранилища не будет найден в файле авторов, его почта будет собрана из его логина и указанного в этом параметре домена. о -vSversion - этот параметр позволяет зафиксировать версию платформы, на которой производится выгрузка. о Флаги -debug и -verbose позволяют получить отладочную информацию. 159 Никита Грызлов. Пособив релиз-инженера 1C о -format - этот параметр отвечает за формат выгрузки конфигурации - hierarchical или plain (иерархический или плоский, с раскладыванием файлов по папкам на основании точек в их имени): * При использовании платформы 8.3.6 и новее по умолчанию выбирается иерархический формат. * На более старых версиях - плоский с автоматическим раскладыванием по папкам. о Параметры -minversion и -maxversion позволяют ограничить снизу и сверху номер выгружаемой версии. о - limit отвечает за количество версий за один запуск инструмента, о -tempdir позволяет переопределить каталог временных файлов, например, вынеся ее на более быстрый диск. В своем базовом варианте нам достаточно указать только первые два параметра - путь к хранилищу и локальный каталог GIT. Попробуем сформировать команду gitsync export. Наберем: gitsync export C:\workspace\storage_trade ./src/cf В качестве параметров: • Хранилище у меня располагается по адресу с : \workspace\storage_trade • А выгружать я буду в локальный каталог . /src/cf Обратите внимание, для работы GitSync необходим доступ к хранилищу по файловому протоколу. Доступ по TCP или по HTTP работать не будет. После выполнения команды в логах начинает отображаться информация по выгрузке. В нашем случае количество коммитов небольшое, поэтому этот процесс пройдет довольно быстро. В любой момент выгрузку исходников в репозиторий можно прервать, нажав Ctrl+C. . =■ 0 - « Главна* Поделиться “ Ф ...> » Этот компьютер » Локальный диск (С;) 4" Имя v 6 workspace » grt > trade > stc » cf » Дата изменение Iwn Размер Быстрый доступ Папка с файлами Асе umulationRegisters Ж Рабочий стол Папка с файлами Catalogs Загрузки d Документы Ж Изображения Documents * * ,епюпз ConfgDumplnfo.xm! System^ Configurationucml volumes о renames.txt ' VERSION Папка с файлами Палка с файлами Languages ' 1 ДЦТНОР5 &52 Файл 1 КБ 5&ЗО Документ ХМ1 3 КБ Документ XML §КБ t&SS Текстовый данеуы... 1 КБ 1&3S Файл 1 КБ workspace Ass, OneDnve E3 Этот компьютер Сеть •4 Домашне» группа Рис. 226 - результат экспорта исходников в GIT 160 □ X © Вид Поиск: С< Silver Bulleters, LLC Если мы откроем каталог src/cf нашего репозитория, то увидим там конфигурацию, разложенную на файлы. (Рис. 226) Эти действия мы и будем пытаться повторить на Jenkins, добавив туда отправку данных в репозиторий. 7.3. Задача GitSync Перейдем к настройке GitSync на Jenkins. й поиск ф Jenkins jenkins ф Никита Грмзгюн (выход Все Введите имя Item's j gitsync Создать задачу co свободной конфигурацией Это - ооов^ и наиболее универсальный тип задач в Jenkins Jenkins будет собирать ваш проеег комбинируя любую SCM с любой сборочной системой Данный тип проектов мдает использоваться для задач сттымых от сборки ПО Рис. 227 - создание новой задачи на Jenkins для gitsync Создадим новую задачу Jenkins: • Укажем имя задачи - «gitsync». (Рис. 227) • И выберем тип «Задача со свободной конфигурацией». Рис. 228 - параметры задачи синхронизации Сразу же установим ротацию логов на 10 последних сборок. (Рис. 228) 161 Никита Гоызлов. Пособие релиз-инженера 1C Первым шагом нашей задачи будет получение актуальной кодовой базы нашего репозитория. Для этого в разделе «Управление исходным кодом» выберем тип системы контроля версий «Git» и укажем адрес репозитория. В качестве адреса сервера будем указывать IP, присвоенный нам в сети, созданной Docker: http://10.0.75.1:1008Q/trade/trade (с указанием порта 10080 и именем репозитория trade в организации trade). Как только мы выйдем из режима редактирования этого поля нажатием кнопки «ТаЬ», появится сообщение от Jenkins о том, что он не может присоединиться к указанному серверу, потому что аналогично с PostgreSQL, сейчас у нас на компьютере этот порт закрыт. (Рис. 230) Управление исходным кодом Управление исходным кодом о Не? ♦ О» Repcsdertes ® Repository URL К http ‘"10 0 751 1006(Mradft,'trade 0 Tailed to connect to repository : Command "git Isa emote -h Ьпр:«1в.в.75.1:10080Лгайе:вайе HEAD" returned ctMm code 138: stdout: stderrt (Mat; unable to accaaa Ъир://10.0,75..1;1ШМ«ай«№аЛЛ Failed to connect to 10,75.1 port 1WW: Connection timed out Credentials -none- ’ a-Add Puc. 230 - задание адреса расположения репозитория 162 © Silver Bulleters, LLC Перейдем в настройки брандмауэра, создадим новое правило для входящих подключений, тип правила-для порта. (Рис. 231) Мастер «вдани» праепла дяа нового етедщцстэ подключен»» X Тип правит тип тресте» гаад-ш Шат Правило какого типа вы котите создать7 * Тилп$«млз ф Протэкад!» парны * £Ыетэие « Гсс^и/ъ * Имя С' Япо программы Правило. у^раолтвошее поатло-епим-м дав (8J Для порта дав порта TCP мяк ODP Правило. >грзвдявщ«« О Предопределенные 8to&M<sdw ■ -г^йвр^йй»1^ е' WS©) Правмяо.. управляющее тдазвечемияии да? отвзраиий Windows. Вз Bi О Настраиваемые Настраиваемое правило. Рис. 231 - добавление нового правила брандмауэра Windows Номер порта 10080, Действие - «Разрешить подключение», Для всех профилей сети. На последней странице зададим понятное имя для правила. Например, «GitLab». Теперь Jenkins нам должен выдать другую ошибку-Access denied, наш репозиторий на gitlab закрытый и доступен только для пользователей, аутентифицированных на GitLab. * ® Repositories Repository ЦИ. http '.ПО 9 75 1 «ЖЛяАйга* Failed to connect to repository; Command "grt Is-remete -h HttpJtlO.O 75.1 ilOOeOfnede'Hede НЕАГГ returned status ««!« «8: ■ Q stdout: stdee-j: rwnotet HTTP Basic; Scows denied - .. fatal; Authentication tailed for ЪпрЛЮ.а.Т^Л.10088‘trade trsde.glt" Credentials; -none- ’ *-Ad* ••j dentine © <6 © fc , Add Repository Puc. 232 - ошибка авторизации на Jenkins Для того чтобы Jenkins смог выкачать исходники с нашего GIT-сервера, необходимо указать ему параметры аутентификации. Для этого добавим новую настройку аутентификации, щелкнув по кнопке «Add» в поле «Credentials» и выберем провайдера «Jenkins». (Рис. 232) 163 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 233 - сохранение параметров авторизации в хранилище паролей Jenkins Укажем параметры пользователя ci-bot:, которого мы создавали на GitLab ранее (Рис. 233) • Имя пользователя - «ci-bot»; • Пароль, который устанавливался - «password»; • А также заполним описание, что это учетная запись пользователя «Ci-Bot GitLab». Нажмем кнопку «Добавить» и выберем данную настройку аутентификации. ReposiKxws © Repository URL http:OT0 075 1 WSfelradrtrade Credenftate { cl-bct,'"*(Cl-BotGHiab, *1 ® «-АО Name © Refspec © Add Repository Puc. 234 - указание настройки авторизации в задаче Jenkins Теперь, надпись о запрете доступа пропала. (Рис. 234). Это значит, что Jenkins, пользуясь указанным паролем, смог увидеть репозиторий на GitLab. 164 Silver Bulleters, LLC Теперь добавим сборочный шаг. Для этого перейдем в раздел «Сборка», добавим новый шаг сборки «Выполнить команду Windows» и перенесем из командной строки готовую команду по экспорту исходников через GitSync. (Рис. 235) В случае успешного выполнения данной команды нам необходимо отправить полученные GitSync коммиты обратно в репозиторий. Для этого служат послесборочные операции. Мы добавим в этот раздел новый шаг с типом «Git Publisher»: (Рис. 236) Сборка Послесборочные операции © e GitPuBliAw Push Only If Build Succeeds s Merge Results If pre-build merging is configured push she result back to the origin farce Push Add force option so git push Tags Add lag Tags to push So remote repositories Ki Branches Branch to push master I Targe» remote name origin Puc. 236 - настройка шага послесборочных операций 165 Никита Гоызлов. Пособие релиз-инженера 1C Укажем галочку «Push only Is Build Succeeds» (отправлять изменения, только если сборка закончилась успешно) и укажем ветку «master» удаленного репозитория с именем origin. В завершение ограничим выполнение нашей задачи только на узле с меткой «gitsync». Для этого перейдем в раздел «General», отметим галку «Ограничить лейблы сборщиков, которые могут исполнять данную задачу» и укажем «gitsync». (Рис. 237) General сборе»: Расширенные., S Эю - параметризованная сборка © В Привстаиовкть сборе» в Разрешить «мраллеяьный запуск задачи :<{8> И Ограничить пеййпы сборщик ов которые могут исполнять данму» аздачу ©) Label Expression © gitsync There’s по egentfcloud Met ratfches this assignment. Did yoo таевп %dtf instead of "gi»'? j Расширенньв» Puc. 237 - опция ограничения сборщиков Наша задача готова. Сохраним настройку задачи и выполним сборку. Откроем консоль сборки для слежения за работой. Обратите внимание, Windows повторно запросит логин и пароль пользователя для получения изменений. Укажем нашего ci-bot и нажмем кнопку ОК. Рис. 238 - сбой кодировки в логах Jenkins В логах отражается информация о сборке, но, к сожалению, в виде иероглифов. Остановим сборку для расследования причин. Для этого нажмем в правом верхнем углу на красный крестик. (Рис. 238) Все дело в том, что по умолчанию, Jenkins выполняет команду, переданную ему в шаге сборки «Выполнить команду Windows» в системной кодировке по умолчанию - 866. Это наследие времен MS 166 Silver Bulleters, LLC DOS или более ранних. Jenkins ожидает логи в более приличном виде. Добавим в наш шаг команду по переключению кодировки консоли. Для этого откроем задачу «gitsync», выберем «Настройки», перейдем к разделу «Сборка» и перед выполнением команды gitsync пропишем команду смены кодировки страницы - chcp 65001, где 65001 - кодовая страница Unicode. Сохраним изменения и выполним нашу задачу еще раз. (Рис. 239) •! Elapsed time : hone 17:27:22 С? workspace \jenki ns_slave4»rkspace\gitsyeesehcp 65061 17:27:21 Active code pages 65881 J7;27;2t 17:27; 23: 17:27:25 expert с s SitSync vU.i 17:27:23 ИййЖУйЯ №мнае выгрузят? исходнике® 17:27:23 начало с«мхр©и«»ц>»и с git 17:27:23 Номер силкрвйниз^кжвммой версии г 8 17:27:23 1%жер последней версии a храни/тиа^е; 4 17:27:23 Падуч«м «еда» дел »ер>мн 1 17:27:4® Раскладываем 17:27:41 Текст «саммите: «Саадами© храмипи®» конфигурации по папкам йэйй&смо и&рарж; «тадзнтгх 17:27:42 Вь^олннтвКоэдийтТйт: Вызов git cowdt вернул мод 17:27:42 ТШучеем исходники для oepcv* 2 17:27:57 8Н©0Р?ШЖЯ Раогдгдываеж модули по ла«ам сагпаси© иерархии метаданных 17:27:57 Текст кеядажт®; <gp&SM«rss жетддоижые> 17:27:58 ВытаянитьКоммитРкт; Вызов s« .coemit вернул «дд <е®> 17:27:58 ИНООР^^АЦР Я Получаем исходники для версии 3 17:28:13 тЮРМАЦйЯ Раскладываем модули по лапкам согласно иерархии метаданных 17:28:14 ИНВОтЩИЯ Текст комикта: «Реализована запись движений приходной накладной;» 17:28:15 ^«ноянитсд-омметггп Вызов git emit вернул мд <6> 17;»; 15 Вручаем всходммкм для верея» 4 17:28:38 swwr Рммааыбаем ’«дули до «апжда» согласи© иерархия з 17:28:38 ^формаций Текст коммит»; «Добавил форму документа с дви*©**»»*»*» > 17:28:32 бтелмит^оммйтТШ: Вызов git ©emit вернул вод с®> 17:28:32 ^ФОРМАЦИЯ Штружа smgfwm* 27;28:13 Pushing H£AS to branch wster M repo &Hg±« 17:28:33 > git «-version « tlmewt*!® „sing Sit «5ОИ! to s»t t-ria.ti.1. Ci-Sot 8ttl,b I1 iitliiSJ-- ‘uusU: • s«35 7 ------- =----------------------------------------------" I' Puc. 240 - корректное отображение кириллицы в логах Теперь в логах сборки кириллица отображается корректно. Как вы видите, после завершения сборки Jenkins отправил наши изменения в удаленный репозиторий. Откроем GitLab, чтобы в этом убедиться для этого перейдем по ссылке в выводе лога. (Рис. 240) 167 Никита Грызлов. Пособие релиз-инженера 1C Из главного окна репозитория перейдем в просмотр списка коммитов. Как вы видите, коммиты из-под пользователя хранилища ГрызловН привязались к пользователю GitLab Никита Грызлов. 7.4. Триггеры задачи GitSync Последний штрих в нашей задаче синхронизации хранилища с GIT - это настройка триггеров, условий, по которым будет запускаться данная задача. В принципе, эту задачу можно запускать по расписанию - например, проверять изменения хранилища каждые 10 минут. Однако, можно воспользоваться возможностями Jenkins по запуску задач после изменения файла. Для настройки такого триггера нам нужно установить еще один плагин. Перейдем в раздел «Настроить Jenkins» - «Управление плагинами». (Рис. 242) Выберем закладку «Доступные» и найдем плагин «Filesystem Trigger Plug-in». Отметим галочкой необходимость установки и нажмем кнопку «Загрузить и установить после перезагрузки». 168 Silver Bulleters, LLC Отметим также галку «Перезапустить Jenkins по окончании установки и отсутствии активных задач» и дождемся перезапуска Jenkins. Откроем задачу «gitsync», перейдем в ее настройки и выберем раздел «Триггеры сборки». У нас появились два новых триггера от плагина FSTrigger. Отметим галкой «FSTrigger - Monitor files» и нажмем «Добавить новый файл для мониторинга». (Рис. 243) • В пути к файлу укажем основной файл хранилища. Это C:\workspace\storage_trade\lcv8ddb.lCD. • Атрибуты этого файла (например, время последней модификации) будут меняться не только на операции помещения в хранилище - этот файл также меняется при захвате или отмене захвата объектов в хранилище. Чтобы предотвратить постоянный запуск этой задачи, отметим галкой «Inspect file contents» • Явно укажем триггеру, что нужно следить за изменением содержимого файла - выберем поведение «Monitor a change of the content». • Оставим отмеченной галочку «Ignore modification date» (игнорировать дату изменения). Рис. 243 - настройка мониторинга файла хранилища Зададим также расписание запуска такого мониторинга. Для этого служит поле Schedule. Здесь в формате cron необходимо указать периодичность запуска проверки. Для запуска каждые 5 минут запись будет выглядеть таким образом: Н/5**** Сохраним изменения нашей задачи. 169 Никита Грызлов. Пособие релиз-инженера 1C •(& Jenkins Jenkins » gflsync > На главную < Проект gitsync Статус *3* Изменений Щи Сборочная директорий 0 Собрать сейчас Сборочная днрд. тария О удалить Проект € Настройки Недавниа изменения □ FSTrigger Fikes Log I Постоянные ссылки 5 Рис. 244 - команда журнала мониторинга файлов Теперь для задачи «gitsync» у нас появилась новая команда «FSTrigger Files Log». Проверим работу нашего триггера. Откроем 1C, подключимся к хранилищу и захватим какой-нибудь объект, например, документ «Приходная накладная». Jenkins > gilsync [FSTrigger] - Monitor files Polling started on Наг 29, 201? 3:04:00 PM Polling for th« job gitsync Looking nodes where the poll can beh^un. Looking for a candidate node to run the poll. Trying to find an eligible node with the assigned project label gitsyncPolling remotely on windows-1 Checking one file: ‘C:\workspace\storage_trade\lcv8dsfb. ICO’ . Inspecting the contents of 'C:\workspoce\storagc_trodc',1cv8ddb.ICD* Polling complete. Took 0.21 sec. Puc. 245 - журнал триггера мониторинга файлов После этого перейдем по гиперссылке «FSTrigger Files Log» для задачи «gitsync». Здесь отображаются данные по последней проверке модификаций нашего файла. Последнее выполнение отрапортовало о том, что никаких изменений не было произведено. (Рис. 245) 170 Silver Bulleters, LLC Однако предыдущая проверка, которая выполнялась в 17:59, GitSync все-таки запустила. Если мы посмотрим логи GitSync, то увидим следующую информацию: (Рис. 246) 17:59:16 C:\workspacs\jenkins_£lave\workspaceVgitsync>chcp 65861 * Use browser timezone - Elapsed time 1C None 17:59:16 Active code page: 65061 17:59:16 17:59:16 C:\wockspace\jenkin5_5la¥e\Mork5pace’‘,gitsync>gltsync export c: \workspace\storage_trade .Zsrc/cf 17:59:17 GitSync V2.1.1 17:59:17 ИНФОРМАЦИЯ - Начинаю выгрузку исходников 17:59:17 ИНФОРМАЦИЯ - Начало синхронизации с git 17:59:17 информаций - «онер синхронизированной версии: 4 17:59:17 ИНФОРМА1>4Я - номер последней версии в хранилище; 4 17:59:18 ИНФОРМАЦИЯ - Выгрузка завершена 17:59:24 17:59:24 Pushing НЕАО to branch «aster at герб origin > git --version a tiaeout-l© 17:59:24 using GIT_ASKPASS to set credentials CI-Bot Gitlab 17:59:24 > git push h£Ui//lg,3,75,trade HEAD: «aster 17:59:26 Finished: SUCCESS Airupan яа'J Puc. 246 - фрагмент логов запуска gitsync • GitSync получил версию из хранилища под номером 4; • Увидел, что в репозитории лежит версия под номером 4; • И прекратил работу. Таким образом, Jenkins будет автоматически запускать gitsync при каждом обнаруженном изменений хранилища, и при наличии свежих коммитов - отправлять их на сервер GitLab. А мы получим историю изменений кода 1C в современной системе хранения версий. 171 Никита Гоызлов. Пособие релиз-инженера 1C Раздел 8. Сборочная линия 8.1. Понятие сборочной линии в Jenkins Задачи со свободной конфигурацией, которые мы рассматривали на прошлых уроках, позволяют быстро автоматизировать запуск каких-либо действий и получить работающее решение. Их универсальность и простота настройки, конечно же, приносят свои плоды, однако, имеется и ряд недостатков. • Первый среди них - это особенность хранения конфигурации задач. о Задачи со свободной конфигурацией хранятся на Master-ноде Jenkins в виде набора xml, которые без графического интерфейса просматривать и редактировать неудобно. о А из-за того, что изменения конфигурации задачи хранятся и версионируются отдельно от проекта, понять, как собирался проект месяц назад, или запустить сборку проекта на состоянии настроек месячной давности, очень сложно. о Не говоря уже о том, что вы не сможете с легкостью использовать одну и ту же настройку задачи для разных веток в системе контроля версий - вам придется создавать новую задачу, настроенную на другую ветку. • Второй недостаток - ненадежность. Несколько задач со свободной конфигурацией, логически объединенных в сборочную линию с помощью триггеров, могут не выполниться из-за плановой или внеплановой перезагрузки Jenkins. Например, первая задача успела выполниться, и после этого произошла перезагрузка Jenkins. Триггер второй задачи не успел сработать, и ваш сборочный процесс не дошел до конца. • Третий недостаток - отсутствие достаточной гибкости. Задачи со свободной конфигурацией не позволяют реализовывать достаточно сложную логику процесса сборки: о Циклы; о Параллельное выполнение; о Слияние результатов; о Использование сторонних библиотек и инструментов - в задачах со свободной конфигурацией все это либо недоступно, либо тяжело реализуемо. Для решения этих проблем был разработан механизм Jenkins Pipeline - представление сборочного процесса, как кода: • Все задачи и шаги сборочной линии упаковываются в специальный скрипт под названием Jenkinsfile. • Скрипт пишется на языке Groovy (это надстройка над Java)-там удобно реализовывать сложную логику и есть, например, доступ к стандартной библиотеке Java. • Jenkinsfile кладется в репозиторий разрабатываемого продукта, соответственно, и версионируется он вместе с продуктом. • Ав Jenkins создается единственная задача с простой настройкой - указанием пути к репозиторию, где лежит Jenkinsfile. • За распределением этапов задачи между подчиненными узлами и успешностью их выполнения следит отдельный сервис на Master-узле Jenkins. • Дополнительным преимуществом при использовании Jenkinsfile является наглядная визуализация всего процесса сборки в одном окне с представлением информации об успешности и длительности каждого этапа сборки. 172 Silver Bulleters, LLC Давайте рассмотрим пример простой сборочной линии, реализованной с помощью Jenkins Pipeline. 0 Примерjenbnsfile.ixt X Р pipeline { agent any stages { stagef'Itui let) { steps { ❖ sh *#,«,< } } stage(‘test’){ steps { sh ' «фе check' ■jurat ’ reports/' } } stage(‘Depict") { steps { ■ sh *nwke publish* } } } J Puc. 247 - сборочная линия в виде кода В данном примере есть две глобальные секции настройки сборочной линии. • Первая - это agent (указание агента). Здесь можно: о Либо ограничить запуск этапа сборки на конкретном узле или на узлах с определенной меткой; о Либо разрешить выполнение на любом узле, как в данном случае, подставив значение any. • Вторая глобальная секция - это stages (этапы сборки). В ней определено три этапа сборки (stage): о stage(1 Build1) о stage(1 Test1) о stage(1 Deploy') Каждый из этапов сборки может содержать несколько шагов (steps): • Этап 'Build' содержит единственный шаг с выполнением команды shell sh 'make'. • Этап 'Test'содержит два шага: о о Выполнение команды shell: sh 'make check' И публикация результатов тестирования в формате junit: junit • 'reports/**/*.xml' Третий этап- 1 Deploy'. Содержит один шаг - команду shell sh 'make publish' 173 Никита Грызлов. Пособив релиз-инженера 1C Несмотря на видимую строгость в указании выполняемых операций, внутри шага мы фактически вольны выполнять произвольные действия. Например, мы можем добавить проверку условия для переменной окружения, и, в зависимости от ее значения, выполнять дополнительные действия. stagef' ь.t'){ steps { И (етг,«бет*165) { echo "«ssage. is f Жй)' } sh 'sieke check1 jimit ' ■'og-orts/r." ‘ } } Puc. 248 - условный оператор в ходе сборки В Jenkinsfile это будет выглядеть так (Рис.248)- для проверки условий используется ключевое слово if, в круглых скобках указывается логическое выражение - проверим заполненность переменной окружения env.GREETINGS. И, если она заполнена, можем вывести ее на экран, выполнив команду echo. Запись переменной в строке с помощью знака $ с фигурными скобками называется интерполяцией строк - она позволяет нам автоматически пробросить значение, хранящееся в переменной среды env.GREETINGS внутрь строки. (Рис.249) stage(‘Test'){ steps { и' (env.6REETlMGS> { □ message - env.GRfcfctlMGb echo 1 liiessege Is ^(message}” } sh 'make check' juh.lt ' - -por*s / ■ ’ /*. >■?j * } Puc. 249 - интерполяция строк В Jenkinsfile мы можем объявлять и собственные переменные. Для этого служит ключевое слово def, имя переменной и ее значение. Эти переменные также можно будет использовать внутри строк с помощью интерполяции. Дополнительно мы можем использовать: • Циклы, • Попытки, • Обработку исключений, • Тернарные операторы • И любые другие конструкции, доступные в языке Groovy. Более подробную информацию по синтаксису Jenkinsfile можно найти на официальном сайте Jenkins, на странице https://ienkins.io/doc/book/pipeline/. 174 Silver Bulleters, LLC Во | n jenkins pipeline вида# Картинг»» Иввесш Еиф Карты Настр««ж Q Инструмвли ■ 523Ввв (€.42сж j Рвзуяьлнт. п’- ~ Pipeline - Jenkins https7'jenMns йШ£Язюад>^:мпе/ * 'Перевести w страницу Jenkins Pipeline is a suite of plugins which supports rapSe-tenling and integrating continuous tteflveiy pipelines into Jenkins Pipeline provides an extensible Getting Started -«№ Pipeline Pipeline Syntax • JenMnsBte JUnit plugin Puc. 250 - результат поиска документации no jenkins pipeline Откроем браузер, наберем в поиске «jenkins pipeline» и перейдем на официальную страницу на сайте Jenkins.io. (Рис. 250) Jenkins Downloads» PWgins Use-cases - Participate Sub-prajecls. • Resources » Securfiy Press Conduct Guided Tour > trade* « Best Hidex . Seang Sannis with ftpstw «» « CreMeymir first Pipenne • Runntng multiple steps • Defining execution environments • Using environment vanaotes • Recording test results and artifacts • Cleaning up and notifications • Deployment User Handbook «•> Pipeline This chapter wffl cover all aspects of Jenkins Rpe«ne. from running Pipelines to writing Pipeline code and even extending Pipeline «self Chapter Sub-Sections Getfing Started with Pipeline This chapter is «tended to be used by Jenkins users of all ski» ifcveK but Using a jentesfite beginners may- need to refer to some sections of Using Jentes”to Branches and Pun Requests understand some topics covered «this chapter Extending with Shared Libraries Pipeline Syntax » Getting started wtm jentes tf you are not yet familiar with basic Jenkins terminology and features, start « Using dentes wh Getting started ш dentes., • Managing Jenkins • Seat Practices • Pipeline What is Pipeline? j ?3«« Contents What s Pipeline’’ Why Pipeline? j Pfpesne T«r« • dentes Use-cases dentes Pipeline is a suite of plugins which supports tmpiemenmg and • Operating, dentes • Scaling jenkins integrating conwws delivery pipelines into Jerttes Pipeline provides an extensible set of fools for modeling srmpte-to-comptex delivery pipelines "as code" via tne Pipeline DSL 5?J . Appendix • Glossary Typically this ’Pipeline as Code* would be tetters to а эвлЫйвШе and checked «to a projects source con«<u repository? for example Puc. 251 - страница описания технологии Jenkins Pipeline Здесь собраны используемые термины, синтаксис и различные примеры использования Jenkinsfile. (Рис. 251) 175 Никита Гоызлов. Пособие релиз-инженера 1C 8.2. Hello from Pipeline! Попробуем написать собственную сборочную линию. Рис. 252 - создание задачи с типом Pipeline На главной странице Jenkins создадим новый элемент: (Рис. 252) • Введем имя элемента - например, «test pipeline». • И тип задачи - «Pipeline». Рис. 253 - окно настроек задачи Pipeline При использовании Pipeline в настройке доступно меньшее количество опций, так как вся основная логика должна быть заложена внутри самой сборочной линии. Перейдем к разделу Pipeline и попробуем написать нашу первую сборочную линию. (Рис. 253) Как мы помним из примера, сборочная линия начинается с конструкции pipeline. Тело конструкции pipeline обрамляется фигурными скобками. 176 Silver Bulleters, LLC Далее нам необходимо указать, на каких агентах может выполняться наша сборочная линия. Для этого служит ключевое слово agent и далее - либо метка, либо имя компьютера, либо any. Давайте ограничим запуск нашей сборочной линии на компьютерах с меткой bdd, Для этого после ключевого слова agent поставим фигурные скобки и укажем agent { label 'bdd' } Имя нашей метки должно быть указано в одинарных кавычках. Следующая секция - это секция stages - в ней будут указаны этапы нашей сборочной линии. • Внутри секции stages объявляем секцию stage с именем этапа, например, stage('Hello world'). • Внутри секции stage нам нужно объявить секцию с шагами - steps. • Внутри секции steps как раз и будет располагаться наша команда - вывод приветственного сообщения. Сформировать корректную команду по выводу сообщения нам поможет раздел «Pipeline Syntax». Рис. 254 - окно Snipper Generator Если мы перейдем по гиперссылке Pipeline Syntax, то мы попадем в раздел Snippet Generator. Здесь мы можем выбрать один из шагов, который можно использовать внутри сборочной линии - в нашем случае, это «echo: Print message». (Рис. 254) 177 Никита Грызлов. Пособие релиз-инженера 1C > Back Overview •i** Snippet Generator Thn Snippet Generator will help you learn the Pipeline Script code which can be used to define various steps Pick a step you are interested in from the list, 0 Step Reference 0 Global Variables Reference 0 Online Documentation configure It click Generate Pipeline Script and you wrtB see a Pipeline Script statement that would art the step with that configuration You mey copy and paste the whole statement into your script, or pick up just the options you care about (Most parameters are optional and can be omitted in your script leaving them at default values ) Steps Sample Step 6chQ pfinJ Mwsage , inteau IDEA GDSL Generate Pipe*» Script _________ Li___________ echo Привет мир»' Рис. 255 - результат работы Snippet Generator В поле «Message» укажем сообщение: «Привет, мир!» и нажмем кнопку «Generate Pipeline Script». (Рис. 255) В текстовом поле под кнопкой вывелась строка по запуску команды echo с данным параметром. Скопируем ее и вставим в наш скрипт внутри секции steps. Definition Pipeline script Scrip! 1 ’ pipeline { 2* agent { label ’bdd’ 3 4 > 5 6* stages < 7* stege(’Helio World’) { steps { 8* echo 'Нр«вет# ийр $ Й 11 ) 12 } 13 14 } © > I у Use Groovy Sandbox Pipeline Syntax Puc. 256 - вставка сгенерированного шага в сценарий сборочной линии Сохраним наш скрипт и попробуем его выполнить. (Рис. 256) 178 © Silver Bulleters, LLC Первое, что бросается в глаза - на странице начала заполняться секция «Stage View» (Рис. 257). • Здесь будут отображаться все этапы нашей сборочной линии; • Время их выполнения; • И статус (если этап окрашен в зеленый цвет - он выполнился успешно). Back to Dashboard Pipeline test pipeline Status "р- Changes Собрать сейчас Весей .Changes (j) Удалить Pipeline настройки Stage View О% Fun Stage View Hello world О Pipeline Syntax 974ms тренд еэ История сборок I find х Л *2 30 03 2017 13 43 ’ I * gЕ ОМлг зо Г-ЙГ-1 ; ‘ C-tianqet 974ms ! WtMt *3* Changes Puc. 257 - отображение секции Stage View Откроем логи сборки для более детального изучения. (Рис. 258) •ф Jenkins Jenkins » lest pipeline » #2 * Back to Project Status Вывод на консоль Changes Я Вывод консоли Просмотреть как неформатированный текст "Зё Edit Зим Information (5 Удалить сборку /'■* Replay Pipeline Steps Started by user Никита Грызлов JetpelW] Running on windows-1 in C:\workspace\jenkin5_5lave\workspece\test pipeline [PtpelW] { [Pipeline] stage [Pipeline] ( (Hello world) [Pipeline] echo примет, мир! [Pipeline] } [Pipeline] // stage [Pipeline] ] [Pipeline] // node [Pipeline] end of Pipeline Finished: SUCCESS Рис. 258-логи сборочной линии В логах серым цветом отображаются команды, относящиеся к Jenkins Pipeline. • Первой командой был переход для выполнения на узле windows 1. • Далее мы зашли в stage('Hello world') • И выполнили команду echo "Привет, мир!" 179 Никита Грызлов. Пособив релиз-инженера 1C Дополнительные программные настройки Pipeline - timestamps, ротация логов и установка триггеров При настройке задачи мы не выполнили два пункта, которые выполняли для задачи со свободной конфигурацией - это: • Вывод времени выполнения в консоли • И ротация логов. Эти настройки мы также можем указать внутри Jenkins Pipeline. Вывод времени выполнения в консоли Для вывода времени выполнения каждого действия мы можем обратиться к уже знакомому помощнике Pipeline Syntax, и выбрать шаг «timestamps: Timestamps». Нажмем кнопку «Generate pipeline script». В текстовом поле мы видим, что для добавления в консоль данных о времени выполнения, нам нужно заключить команды выполнения внутрь блока timestamps. Pipeline Definition Pipeline scrip! * scrip, i’ pitHiinc < © 2» agent { 4 3 } 5 6• 78- stages < stage( 'Hello worW) { steps { label ’Wd' tine stamps { 9» 10 Я и I J 13 14 ) 15 16 ecu© ‘Hawser, «ир!' } 11 } yg Use Groovy Sondbox ©' Pipgfint Swut Puc. 259 - вставка секции timestamps в сборочную линию Перейдем в наш скрипт и заключим нашу команду echo внутрь секции timestamps. Не забудем закрыть фигурную скобку. (Рис. 259) 180 Silver Bulleters, LLC Установка ротации логов Настройку ротации логов, в принципе, мы можем выполнить и в графическом режиме соответствующая галка есть в настройках секции General. Но также мы можем научить сборочную линию выполнять эту настройку автоматически. Для этого необходимо заполнить секцию options. Pipeline Definition т Pipeline script Script *’ 3 4 5 6’ 7 8 1811’ 121314 15 ie 17 <» - © pipeline { agent { label ‘bdd1 r 1 : options { fcuil<£>iscarderClcg?lorator(nuraTcKeepSrr: ’18*)) stages { stagel'Hello world') < steps { timestafgps { echo Привет, м*ф1* > > ) у Use Groovy Sandbox © Pipeline Smtox Рис. 260 - вставка секции options с ротацией логов В документации можно найти вот такой сниппет. В секции options мы можем указать Jenkins хранить, например, 10 последних сборок (Рис. 260). Установка триггеров Аналогично, мы можем настроить автозапуск данной задачи. Для этого служит секция triggers, в которой мы можем настроить запуск задачи по cron, вызвав функцию cron () с передачей ей в качестве аргумента настроек периодичности выполнения. Конструкция cron ('Н/5 ****') заставит нашу задачу выполняться каждые 5 минут. Pipeline Definition Pipeline serf# 1 • z* pipeline < agent { 3 4 5 6* 7 8 18’ 11 12 13 14 ’ 15 * 1617’ label 'bdC triggers ( cron('H/5 I options ( feuildDiscarder(lcg«otator(numToKeepStr- )} ) stages { st*ge(‘Hello world'} ( steps ( timestaaps { о ✓ Use Groovy Sarxtx» Puc. 261 - вставка секции triggers Сохраним и попробуем еще раз запустить. 181 Никита Гоызлов. Пособие релиз-инженера 1C Переопределение конфигурации задачи Jenkins программными настройками Для начала откроем логи сборки нашей задачи. • У строки «Привет, мир» появилось время выполнения. • Также при начале выполнения данной задачи вывелось два предупреждающих сообщения о том, что настройки задачи были переопределены настройками, указанными в самой сборочной линии. Jenkins Jenkins test pipeline (2? Пикша Г рынок | выход « # Back to Project Вывод на консоль Status 3* Changes Started by user ttotl ГйвДПСР □й Вывод консоли Просмотреть как неформатированный текст ”3- Edit BuW information UASIHKG: The properties step «ill remove ell TobPropcrtys currently configured in this job, either free the Ul or free an earlier properties step. This includes configuration for discarding old builds, parameters, concurrent builds and build triggers. hAMIKG: Removing existing job property ’Build triggers’ Q удалить сборку Running on windOMs*l in C:\eerkspatevjenklns_slave\worfcspMe\test pipeline [Pipeline] { Replay [Pipeline] stage {Pipelisej < (Hello йогid5 У RtpeJine Steps ф Previous BuSd ць Next Вши [Pipeline] tieestwpa [Pipeline] ( {7:00:34 Привет, мир! Vir-.y as piam te»t Timestamps [Pipeline] /7 tiwetamps [Pipeline] } [Pipeline] // Stage [Pipeline] ) • System dock time afc Use browser timezone ! | Elapsed time [Pipeline] /У rode $ None [Pipeline] Snd of Pipeline Finished'- SUCCESS Puc. 262 - результат работы модифицированной сборочной линии 8.3. Параллельное выполнение задач Часть операций по сборке продукта можно выполнять параллельно. Например: • Подготовка окружения; • Клонирование репозиториев используемых инструментов; • Создание служебных каталогов; • И прочее. В этом нам поможет конструкция parallel. Откроем настройки нашей сборочной линии и попробуем реализовать этап сборки, шаги которого будут выполняться параллельно. 182 • Объявим новый этап - stage (' prepare ' ) • И второй этап - stage ('build') Silver Bulleters, LLC В секциях stage ('prepare') и stage ('build') обозначим шаги (steps) и начнем их заполнять. Stages ( stage{‘prepare') < steps { parallel first: { sleep 13 echo ‘f ), second: { sleep 5 echo '2‘ У, foilFest; t’-ut ) ) stage(*build*) { steps { echo ‘3* ) Puc. 263 - параллельный запуск этапов Допустим, на этапе stage ( 1 prepare ') мы хотим выполнить две операции параллельно, а после этого на этапе stage (' build') запустить еще одну операцию - в роли операций у нас будет вывод строки на экран (Рис. 263): • Для секции stage ('build') сразу же добавим вывод echo '3' • А для секции stage ('prepare') будем использовать новую конструкцию parallel. Синтаксис конструкции parallel вы также можете посмотреть на странице Snippet Generator. Выглядит он так: о Сначала указывается идентификатор ветки (например, first). После него двоеточие и блок шага в фигурных скобках, где выводится команда echo ' 1': first: echo о { '1' } Для второй параллельной ветви используем похожую конструкцию-через запятую передаем идентификатор второй ветви (например, second), двоеточие, фигурные скобки, и в них echo '2': second: echo { '2' } о И последним параметром мы передадим флаг необходимости завершения работы всех параллельных ветвей в случае ошибки в одной из них: failFast: true Для того чтобы эмулировать длительность работы в данных шагах, добавим в каждую ветку конструкцию sleep-это просто конструкция ожидания с указанным количеством секунд: • В первой ветви пускай у нас будет sleep 10, • А во второй sleep 5. Сохраним и попробуем запустить. 183 Никита Грызлов. Пособие релиз-инженера 1C Jenkins lest pipeline > ■9 Back to Dashboard ’ Pipeline test pipeline Status Changes R»c«nt Оипри Собрать сейчас <§) Удалить Pipeline •£$> Настройки Stage View Full Stage view Q Pipeline Syntax История сборе» build 12s Is 12s 1s тренд «в шuni: find eof prepare 17.29 30 03 201? 14 23 I Chesges i Puc. 264-Stage View из двух этапов Первое, что бросается в глаза - это перестройка секции «Stage View». Теперь в ней отображаются две колонки, по именам двух этапов сборки, объявленных в сборочной линии (Рис. 264): • prepare • build. Откроем логи сборки. В логах видим (Рис. 265): 184 • Для 1-й ветви выполнение команды sleep на 10 секунд; • Для 2-й ветви - sleep на 5 секунд; • Сначала на экран выведено "2"; • А потом " 1" (в соответствии с таймерами, которые мы выставили); • И после этого из этапа сборки stage ('build') выведено "3". Silver Bulleters, LLC Вывод на консоль started by user agaasj^aaaas [ P 1|»11ж) proper* ie» HMfflNk The properti©^ step will reeve «11 fefeProper&ys currently cmfigured in this job, either fro* the У1 or fro® ®n earlier properties step. This includes configuration for discarding old builds, parameters, concurrent builds and build triggers. «AR8IH6: Removing existing job property 'Discard old builds’ WAAfflMS; Removing existing job property 'Build triggers' iHRlSwj hode Running on windows *•! in C: Xworks^ace^enkins^slaveV^orkspaceXtest pipeline [Pipeline] ( [Pipeline] stage [Pipeline] ( (preF«> (Pipeline] parallel (Pipelinej [first] < (Branch; first) (Pipeline] [second] tf (Branch: second) [Pipeline] [first] sleep [first] Sleeping for 1$ sec [second] sleep [second] Sleeping for 5 sec [PipelineJ [second] gefess [second] 2 [Pipeline] [second} J [first] 1 I Pipe 11»j [first] es#» (FipeHs%e'| [first] J [Pipeline] // parallel [Pipeline] } [Pipeline) // [Pipeline] stage (Pipe line] { (buiW> [Pipeline] echo |Pipeline] // ctage [Pipeline] ) [Pipeline] // node (Pipeline) End of Pipeline ткезция Window success. Puc. 265-логи сборки в параллельных ветках Аналогичным образом вы можете распараллеливать выполнение шагов в ваших сборочных линиях. Например, можно выполнять параллельно тестирование на разных платформах, операционных системах и т.п. 185 Никита Гоызлов. Пособив релиз-инженера 1C Раздел 9. Тестовый контур 9.1. Создание тестовой базы Для проверки успешности прохождения сценариев и тестов нам понадобится отдельная тестовая база, недоступная для других пользователей. Желательно, чтобы эта база была серверной. • Во-первых, так вы сможете протестировать работу своего продукта в клиент-серверном варианте и обнаружить некоторые ошибки кодирования, которые незаметны при использовании файловых баз. Например, передачу мутабельных значений с сервера на клиент; • Во-вторых, сервер 1С:Предприятия позволяет управлять подключенными сеансами и разрывать их в случае необходимости. На данной машине у меня уже развернут сервер 1С:Предприятие. В качестве СУБД мы будем использовать официальную сборку PostgreSQL для 1C от компании Postgres Professional. И, поскольку в коде 1C для общения с СУБД жестко зашит порт 5432, после установки PostgreSQL для 1C нам дополнительно придется изменить настройки PostgreSQL, поднятого ранее для GitLab, изменив стандартный порт 5432 на нестандартный 5433 везде, где он был задействован: • В конфигурационных файлах PostgreSQL; • В docker-compose.yml; • А также в настройках брандмауэра Windows. Для выполнения работ по данному пособию вы можете использовать файловую базу, однако механизм отключения сеансов будет для вас недоступен. Выполнению работ это не помешает - главное, что когда вы будете настраивать реальный разработческий контур, вы уже будете знать, как решить проблему с активными соединениями. 186 Silver Bulleters, LLC Puc. 266- параметры создания клиент-серверной базы на основе СУБД PostgreSQL Создадим новую базу 1C: • Назовем ее «Торговля тестовая». • Укажем расположение - на сервере 1С:Предприятие • Кластер серверов располагается на localhost • Имя информационной базы - trade_bdd • Тип СУБД - PostgreSQL • Сервер баз данных также находится на localhost • Имя базы данных, аналогично trade_bdd • В качестве пользователя базы данных буду использовать стандартного пользователя postgres Нажмем «Далее» и «Готово». Тестовая база создана. (Рис. 266) 9.2. Использование Deployka для обновления тестовой базы В качестве инструмента автоматизации обновления будем использовать инструмент под названием Deployka. Это - приложение для OneScript, которое можно установить с помощью пакетного менеджера орт. (Рис. 267) Откроем командную строку и наберем opm install deployka 187 Никита Грызлов. Пособив релиз-инженера 1C :\ysers\test{«stall deployka OneScript Package Manager V0.9.4 ЙНР0РЖЦИЯ - Скачиеж файл: deplsyka.ijspx инэдйчацйя - Устаи-авдамва*! пакет йерЗоукд ИНФОРМАЦИЯ - Устанавливаю аавасажехчь: logos ИНФОРМАЦИЯ - logos уже установлен. Пропускаем. ИНФОРМАЦИЯ - Усганааииваю эависмжсть: cmdlirte информация - с «d line уже установлен. Пропускаемы информация Устанавливаю зэвиомзстъ: v8runner ИНФОЙШ#® уйгоппег уже устаноааен, Пропуска®,. Ин©ОРЖцИя Регистрация приложения: deployka ИЧФОРЖ’ЛИЯ Установка завершена С ; Miser5 Vtest > Рис. 267 - установка утилиты Deployka После установки из командной строки доступно приложение Deployka. Если мы в командной строке вызовем deployka без параметров, мы увидим справку по продукту. * С: Misers ItestxJep loyka O'.. P Г< Ч А - Н ,oppek 1 “Nf* аргумент» командной строги ВО SM-O <И К (1 манд®,: help Вывод . правки по параметрам loadcfg Загс уз«:з/обнобйение конфигурации loadrepo Обновить из хранилища првми-чени-,-з базу session Управление сеансами информационной базы sbupdaxe * Обновление хомфиг урации 6-азы дайны.'. 1 run Улраш’ени® запуском в режиме предприятия дян лодсказк:« я© конхретифй команде наберите help «коиакда» С:\User sites Рис. 268 - встроенная справка утилиты deployka Deployka умеет: • Загружать конфигурацию из исходников, из cf, из cfu • Обновляться путем подключения к хранилищу • Управлять активными сеансами • И выполнять обновление конфигурации базы данных Типовой процесс обновления выглядит таким образом: 1. Сначала мы блокируем базу на вход для новых пользователей 2. И отключаем активных пользователей 3. Обновляем основную конфигурацию 4. Потом производим обновление конфигурации базы данных 5. А после завершения обновления снимаем блокировку работы пользователей Данная последовательность может быть изменена. Например, для уменьшения времени неработоспособности базы вы можете сначала выполнить пункт обновления основной конфигурации, а только потом блокировать базу и выполнять обновление конфигурации базы данных. 188 Silver Bulleters, LLC Команда обновления базы конфигурацией из хранилища - deployka loadrepo Начнем с самой главной команды-обновление базы конфигурацией из хранилища. Для этого в Deployka служит команда loadrepo. Получим справку по ней, выполнив команду Рис. 269 deployka help loadrepo С : .Users',restXJeployka help loadrepo loadrepo - Обновить из хранилище подключенную базу Параметры: <Стро» ^Подключения) - Строка подключения к рабочему контуру' <АдресХранилища> - Путь или сетевой адрес хранилища 1C -db-user - Пользователь информационной базы -db-pwd - Пароль пользователя информационной базы -storage user - Пользователь хранилища конфигурации - storage pud Пароль пользователя хранилища конфигурации - storage-ver Версия (номер) закладки в хранилище - необязательно -vSversion - Маска версии платформы 1C -uctode - ключ разрешения запуска < . . . -' :. • ■ ' ___________________________________________________ Рис. 269 - получение справки команды loadrepo утилиты deployka Как следует из справки, у команды loadrepo есть: • • Два обязательных параметра: о Строка подключения к базе данных; о И адрес хранилища. А также несколько необязательных параметров: о -db-user и -db_pwd - логин и пароль пользователя информационной базы о -storage-user и -storage-pwd -логин и пароль пользователя хранилища о -storage-ver-номер той версии хранилища, которую мы хотим загрузить о -vSversion — версия платформы о и -uccode - ключ разрешения запуска, если была установлена блокировка входа пользователя Попробуем сформировать данную команду. Укажем: deployka loadrepo "/Slocalhost\trade_bdd" "С:/workspace/storage_trade" -storage-user ci-bot -storage-pwd password Где: • • Строку подключения мы формируем для серверной базы, поэтому в кавычках указываем: О /S о Имя сервера без пробела о И имя базы через обратный слэш Следующий параметр - это адрес хранилища. Здесь в кавычках необходимо указать либо путь к каталогу, где располагается хранилище, либо сетевой путь. В нашем случае хранилище лежит по адресу "С: \workspace\storage_trade". Заменим обратные слэши на прямые • Пользователей в нашей информационной базе нет, поэтому параметры db-user и db-pwd нам не понадобятся • В хранилище был создан служебный пользователь ci-bot. Укажем его параметры подключения через параметры -storage-user и -storage-pwd 189 Никита Гоызлов. Пособие релиз-инженера 1C • Маску версии платформы 1C можно опустить • Ключ разрешения запуска также не будем указывать, так как наша база еще не заблокирована Выполним получившуюся команду. C;\User$\test><ieployk3 loacirepo "ZSl-ocaihost\tra<Je_bdd** "С:/work space/storage_trade” -storage-user ci-bot - storage-pv.-d pas sword ИНФОРМАЦИЯ - Обновление конфигурации из хранилиаа успешно зн^ершено G:\Users\test>_______________________________________________________________________________________ ___ ;t Рис. 270- обновление конфигурации из хранилища Наша конфигурация небольшая, поэтому данная команда выполнилась довольно быстро. Зайдем в конфигуратор тестовой базы, чтобы убедиться, что обновление действительно выполнилось. Откроем 1C, выберем базу «Торговля тестовая» и зайдем в режим конфигуратора. Видим, что конфигурация содержит справочники и документы и находится в состоянии не обновлённой конфигурации базы данных. Закроем конфигуратор и вернемся в командную строку. Команда обновления конфигурации базы данных - deployka dbupdate После загрузки конфигурации нам необходимо выполнить обновление конфигурации базы данных. Получим справку по команде dbupdate. Выполним: deployka help dbupdate ;vJsers1 est Xfieployiert help dbupdate Ibupdate - Обновление конфигурации базы данник Тарамет ры: <строкаПодклкзчений> - Строка подключения к рабочему контуру -db-user - Пользователь информационней базы -db-pwd Пароль пользователя информационной базы -vBversion - Каска версии платформы 1C -uccode • ключ разрешения запуска -allow-warnings - Разрешить предупреждения С:\Users\test>................... ....... ........................................... Рис. 271 - получение справки команды dbupdate В данной команде нет пользователя и пароля хранилища конфигурации, нет адреса хранилища, однако есть дополнительный необязательный параметр: • -allow-warnings (Разрешить предупреждения). Если его указать в строке запуска Deployka, предупреждения, появляющееся при обновлении конфигурации игнорироваться Напишем команду по обновлению конфигурации базы данных (Рис. 272): deployka dbupdate "/Slocalhost\trade_bdd" -allow-warnings Где: 190 • Строка подключения к серверной базе - "/Slocalhost\trade_bdd" • Пользователя и пароля у этой информационной базы нет базы данных, будут Silver Bulleters, LLC • А вот флаг -allow-warnings (разрешить предупреждения) мы, пожалуй, передадим Cr\Use?'b'-..tebt>ceployka dbupdate ’‘/SIoralhost'-,tnadejxfd'' -аНок-warnings [ИН®О?ИАЦИЯ - Запускав обнйвдайЬе кцнфигураци*» 6Д ИЯРОРМАЦИЯ - обновление конфигурации базы дамнмк Обработка структуры &ази данных.., Сбор служебной информации,,, Новы»? объект Справочник.Товары Новый объект Справочник.Склады Новый объект Документ.ПрнхвднаиН л< ладная Новый объект Региг трНакопления. Сг таткиТовар.те Создана таб л ица гпций кланов видов расчетов лздаиа таблица опций ■■.праеочннкоа создана таблица опций планов ендов характеристик Создана таблица опций планов счетов Грииятме изменений.,. Шиеаммие конфигурации fаШ Ддашю. угпешме за«йае*й У lysesо У est>_ Рис. 272 - команда обновления конфигурации базы данных - deployka dbupdate Выполняем команду по обновлению конфигураций базы данных - в логах видим информацию о новых измененных объектах и надпись о том, что обновление конфигурации базы данных успешно завершено. Проверим это, запустив нашу базу в режиме 1С:Предприятие (Рис. 273). Откроем 1C, выберем базу «Торговля тестовая», режим 1С:Предприятие. Как можно убедиться, в интерфейсе появились объекты нашей конфигурации. Закроем 1C. 191 Никита Гоызлов. Пособие релиз-инженера 1C Возможности сервера 1С:Предприятия по управлению сеансами Разберемся с управлением сеансами. Для управления сеансами базы Deployka использует утилиты ras и гас (сервера и клиента администрирования кластера серверов). Схема работы - простая. На компьютере, где располагается сервер 1C, запускается также и служба ras - сервер • администрирования На компьютере, где необходимо выполнять действия по управлению сервером, запускается • утилита гас - клиент администрирования с указанием параметров подключения к серверу администрирования ras В нашем случае и сервер и клиент будут располагаться на одной машине. В реальных условиях клиент администрирования необходимо до установить. Обратите внимание, данные утилиты поставляются вместе с дистрибутивом сервера 1С:Предприятие. Для получения клиентской утилиты на стороннем компьютере нужно будет установить сервер 1С:Предприятия, однако, запускать его не нужно. 0 □ Гемма» Пойееитш* © > Этет компьютер * Локальный диск (О) * Program Ffe s(xS6) > 1cv8 > «.1Ы125 > bin > « ф| ^нтиекии W Им» # Быстрый доступ Я Р&бемнйо&и # в W |ЙЯ I * й Дмуммм # О Изображения Ж Ж 6 Размер НрнЖ&оРтйе >11 Пргяедаяг SIS Кб Ф сМ№.р* >13 Приложение 185 КВ & 090 КВ в efewuere >13 Приложение >13 Прмлеженж 52 КБ System32 Я db^s-exe >13 Приложение 159 Кб volumes Я dumper.еке >14 Приложение 52 Кб workspace Ввсв ‘ №маи1 | >15 Приложение 197 КБ 48» QneOwe Я ras.ese ( IJ Этот комгыютер Приложение 39 КБ >15 Приложение 61 КБ 1жд rmngi.exe >15 Приложение! 39 КБ >15 Приложение 39 КБ gif' £®ТЬ Я sphost-e® | j acait,ti% >11 Расшир®«ие jsatt *4 Дмнимн фуада I >12 Р;£СШИр®НМЙ 2278 КБ acentuhdll ’ adom.dl! Расширение гр»®» 173 КБ >' addnccm.d?! Расширение пр»со8тт® 73 Кб (| Расширение пдолеавмм 77 КБ b sddnmrs.dll 14 anaon-dH ; Элементов: 465 bacttm* >11 А 714 в О '.. р 853 КВ Я envsfeft.e*e ; jCnkifH ПжеЬ» »ии««фвйв iW >11 4,- Энгрум» X Вид Расширение прйжеййж 30 КБ Расширение приложений 442 КБ Расширение г^и«к«иж 3 588 КБ ■ Состояние: S Общий доступ Рис. 274 - размещение утилит ras и гас Утилиты ras и гас располагаются там же, где и основные запускаемые файлы 1С:Предприятие - по пути "С: \Program Files (х8б) \lcv8\<КаталогСВерсиейПлатформы>\Ып". (Рис. 274) Рис. 275- пример использования утилиты ras 192 Silver Bulleters, LLC Утилиту ras (сервер администрирования) для удобства использования обычно запускают в режиме службы - это позволяет производить его автоматический запуск при старте системы и не держать постоянно открытым окно командной строки. (Рис. 275) Для создания новой службы воспользуемся встроенной в Windows утилитой sc. Откроем командую строку от имени администратора и создадим новую службу: • Вызовем приложение sc • Передадим ему команду create и начнем заполнять параметры данной команды • Первый параметр-это имя создаваемой службы-"1C: Enterprise RAS" • Далее необходимо указать путь к исполняемому файлу и его параметрам. Для этого служит параметр binpath="", он содержит знак «равно», после которого в кавычках указывается команда запуска нашей службы • Запускать мы "С: \Program будем утилиту ras.exe, поэтому кавычках в укажем ее путь: (х8б) \ lc v8 \< Катал огСВерсиейПлатформы>\Ып\ras . ехе" Files Так как путь содержит пробелы, его нужно обрамить дополнительными кавычками (для экранирования кавычек необходимо воспользоваться обратным слэшом) - добавим обратный слэш и еще одну кавычку в начале и в конце пути к утилите ras • Далее через пробел необходимо указать параметры, передаваемые утилите ras: о Для запуска в режиме сервиса используются параметры cluster --service о После этого необходимо указать порт, по которому будет отвечать сервис ras - обычно устанавливается --port=1545 о Далее следует адрес сервиса 1С:Предприятие с указанием порта агента - localhost:1540 В итоге у нас получится следующая строка запуска: sc create "1C:Enterprise RAS" binpath="\"C:\Program Files (x86)\lcv8\<КаталогСВерсиейПлатформы>\Ып\газ . exe\" cluster --service --port=1545 localhost:1540" Выполним данную команду и проверим, что наша служба действительно создалась. 193 Никита Грызлов. Пособив релиз-инженера 1C ЙЬ а*.*,, Файл Действие Вид Справка й » * н <ют«р} Свойства; 1С.Сг«егр4Ш RAS (, Воеа в с»К;тшу RA5 Имя службы Звйишмюспн К.Ь*вфЛ» RAS QfoSpisH»»» гашйИ миг. Автоматвме., Исполняемы* Файл:: "С XPnsgtwi Fie» ^^Mcv8\83J82125^feir>W exc'cLate -ssmce -pt Се Яс Автоматиче.,,. Дс band PubfebU Вручную (ас,„ Дс Ьет IP-адреса - Автоматиче... До Ы push^coobu;... Ifnscache) кэш... Вручную (ак.« Дс ОетзиовгЙАа Выполняется Автомгтиче-.. Се Выполняется Авпзмвтиче- Дс между MS... Вручную (эк.„ Сс >6мен coo€... Вручную (ак_ Дс virtual appli... Отключена Дс «спознаваты.» storage, Вручную Дс Выполняется Авгемгтиче... Се storage. Выполняется Аатоматиче.,, Се Fideo B^enen... Вручную До on a Sh... ика управл... Отключена Дс Вручную Се Гки» Вы может® указать иасаме-рь- запуска, прлмечйбмае гтои запуске службы из этого аналогового вина ' " <Ж '□ сь— КЙШ5 Вручную Выполняется backend setvi... НаймеW3arrOT £ .. До Автоматы ч«„ Тип запуска «Течжчкгэвр. Дс Врртиув Выполняется | описание. Ко... Ьп between syst... 3wam. Тип запуска Выполняется <7 Оплсамлг Состояние Состояние г произвол... Выполняется Аятоматнче... Дс в работы со 5В . Выполняется Автоматиче... Дс \ Расширенный Д Стандартный / Рис. 276-свойства службы lC:Enterprise RAS Откроем «Службы» и найдем службу " 1C: Enterprise RAS". (Рис. 276) В свойствах службы установим тип запуска - «Автоматически», применим изменения и нажмем кнопку «Запустить». Теперь мы можем администрировать наш сервер из командной строки. С: Mirsdcuslsyst р.я32>чС : VFfo.gr’ a® Files f xS6 }1' vK .8, J. 1Й. 2121': Bjr; rac . exe" cluster list alf239?6-540O-4£49-bf48-402? 270749:1 .'luster host DESKTOP-SCI. SOSO port isai name "Локальный кластер” expiration-1 iraeoot в e lifetiae Unit max тсгаогу-size в raax - «могу -t in» -1 ia.it •S в security-level в .session-1 suit - tolerance -level : .в load-balancing-mode perfor-mance s в errors-count-threshold ki11-problem-processes * 0 C: \wlftdous\syste!a32> Рис. 277 - использование утилиты гас, информации о кластере Для проверки работы службы сервера администрирования выполним в командной строке команду получения информации о кластере: "C:\Program Files (х86)\1ст8\<КаталогСВерсиейПлатформы>\Ып\гас .exe" cluster list Укажем путь к утилите гас и передадим ей в качестве аргумента команду cluster list 194 Silver Bulleters, LLC Утилита гас подключилась к серверу администрирования, который по умолчанию располагается на localhost: 1545, и получила информацию о кластере. (Рис. 277) Возможности Deployka по управлению сеансами Вернемся к командной строке с Deployka - получим справку по команде session. Для этого выполним: (Рис. 278) c:\Users\testxdeployka help session Управление сеансами информационной базы session Параметры: СДевствмо - lock'unlock|kill -ras - Сетевой адрес RAS, по умолчанию localhost:1545 -гас - Команде запуска НАС, по умолчанию находим в каталоге установки 1с -db - Имя информационной базы -db-user - Пользователь информационной базы -db-pud - Пароль пользователя инСрмационкой Ьазы -cluster-admin - Администратор кластера -cluster-pwd - Пароль администратора кластера -vfiversion - Маска версии платформы 1C -lockmessage - Сообщение блокировки -lockuccode - Ключ разрешения запуска kockstart - Время старта блокировки пользователей, время указываем как '264В-1?•Э1Т23:59:59' -lockstartat - Время старта блокировки через п сек |C:\ysers\test>,_ Рис. 278 - справка по команде session deployka help session Команде session передается: • • Одно из действий: о lock-заблокировать о unlock-разблокировать о kill - завершить сеансы И несколько необязательных параметров: о -ras - адрес подключения к серверу ras (по умолчанию, localhost: 1545) о -гас - путь расположения утилиты гас (по умолчанию, в каталоге установки 1C) о и др. Команда блокировки сеансов - deployka session lock C:\Users\testxieplOyka session lock -ras localhost:1545 информация - Получав список кластеров информаций - Попуча® список баз кластера db trade bdd lockmessage ‘'test” lockuccode 123 ИНФОРМАЦИЯ - Получен УИД базы информация - Сеансы запрещены C:\Users\test>______________________________________________________________________________________________________ Рис. 279 - команда блокировки сеансов - deployka session lock Попробуем заблокировать базу. Для этого выполним команду (Рис. 279): deployka session lock -ras localhost:1545 -db trade_bdd -lockmessage "test" lockuccode 123 • В параметре -ras укажем путь к серверу: localhost ■ . 1545 195 Никита Гоызлов. Пособие релиз-инженера 1C • Утилита гас должна определиться автоматически • В параметре -db передается имя базы данных trade_bdd • Пользователя информационной базы нет • Администратора кластера нет • В параметре -lockmessage установим сообщение блокировки "test" • И в параметре-lockuccode установим ключ разрешения запуска "123" Выполним команду. В логах отразилась информация по установке запрета соединений. Рис. 280 - сообщение о блокировке работы сеансов 1C Если мы откроем 1C и попробуем подключиться к данной базе, то увидим наше сообщение о блокировке «test». (Рис. 280) Команда завершения активных сеансов - deployka session kill se-rs\test>deployfca session kill -ras localhost:1545 - j -lockuccode 123 ИНФОРМАЦИЯ ПОЛуча® список кластеров информация - Получай список баз кластера Получен УВД оазы ИнСОРМАцИЯ ИнС<РМЛ41Я • Сеансы запрещены ИНФОРМАЦИЯ - Отключаю существующие сеансы к Рис. 281 - команда завершения активных сеансов - deployka session kill Для принудительного закрытия активных соединений используется команда kill: deployka session kill -ras localhost:1545 -db trade_bdd -lockmessage "test" lockuccode 123 Нам достаточно просто поменять параметр lock на kill и все активные сеансы, которые были запущены в данный момент в базе, будут закрыты. (Рис. 281) Команда разблокировки сеансов - deployka session unlock Для снятия блокировки используется команда unlock I ession unlock -ras localhost: 154$ -db trade_bdd ИНФОРМАЦИЯ - Получал список кластеров ИНФОРМАЦИЯ Получал список баз кластера Получен УИД базы ИНФОРМАЦИЯ ИНФОРМАЦИЯ - Сеансы разрешены ( . . ■ ■ lockitassage "test*' -lockuccode 123 к &t> Рис. 282 - команда разблокировки сеансов - deployka session unlock 196 1 Silver Bulleters, LLC deployka session unlock -ras localhost:1545 -db trade_bdd -lockmessage "test" lockuccode 123 При использовании команды unlock передавать параметры -lockmessage и -lockuccode необязательно.(Рис. 282) 9.3. Сборочная линия - Обновление тестовой базы После того, как мы разобрались, как работать с приложением Deployka из командной строки, реализуем нужный нам сценарий в Jenkinsfile. Формировать наш Jenkinsfile мы будем в редакторе Visual Studio Code. > DOCKER master О О0 A 0 § И Share Puc. 283 - кнопка синхронизации с удаленным репозиторием Перейдем в редактор Visual Studio Code и откроем папку с нашим репозиторием С: \workspace\git\trade. Получим последнюю версию данных из репозитория на GitLab, выполнив в интегрированном терминале команду git pull или нажав на кнопку синхронизации в нижней части экрана. (Рис. 283) Структура Jenkinsfile Рис. 284 - структура Jenkinsfile По умолчанию Jenkinsfile располагается в корне нашего репозитория. Добавим новый файл Jenkinsfile в корень нашего репозитория и начнем описывать нашу сборочную линию. (Рис. 284) Заполним обязательные секции: • pipeline • agent - с указанием метки bdd • stages • В stages добавим новую стадию stage ('Обновление тестового контура') 197 Никита Гоызлов. Пособие релиз-инженера 1C Внутри stage объявим секцию steps, где для выполнения команд Windows будет использоваться шаг bat. В качестве аргумента мы передадим ему строку, которую необходимо выполнить. Например, мы хотим выполнить команду (Рис. 285) oscript -version. Jenkinsfile * pipeline { agent { label ‘bdd’ } stages { stage(‘CtiHBenrtwt1 iffwiia- i ) f steps Й bet osc-'ist - .version esc r1pt - -wrsion } « 1 } } Puc. 285 - строка, которую необходимо выполнить Если мы хотим выполнить в рамках одного командного файла несколько команд, мы можем заключить их в три двойные кавычки и писать команды, как обычный bat-файл. Создание кросс-платформенной функции запуска приложений Существует некоторое неудобство Используя шаг bat, мы привязываемся к операционной системе Windows. Чтобы сделать наш Jenkinsfile более универсальным, можно воспользоваться маленькой хитростью. Мы можем объявить собственную функцию, которая будет определять, в какой операционной системе выполняется переданная ей команда, и в зависимости от этого выполнять (Рис. 286): • Либо шаг bat-для Windows-систем • Либо шаг sh для Linux-систем ■V-- ся<Це«иизп4) { If <isunix()) { sh and}" } else { bat " i r j 1 Puc. 286 - функция «маленькая хитрость» Делается это несложно: • После блока pipeline мы можем объявить новую функцию, написав ключевое слово def и ее идентификатор (например, cmd) 198 Silver Bulleters, LLC • Данной функции будет передаваться параметр «команда» - command • Тело функции заключается в фигурные скобки • Для определения используемой операционной системы воспользуемся встроенной Javaфункцией isUnixO, указав ее в условии, которое оформляется ключевым словом if, и круглыми скобками Все блочные конструкции в языке Groovy выделяются фигурными скобками: • Первый блок будет описывать логику для Linux. В нем мы будем использовать шаг sh и переданную команду. Для корректной передачи команды в шаг воспользуемся интерполяцией строк - внутри двойных кавычек напишем знак $, фигурные скобки и внутри в фигурных скобках переменную command Второй блок, отделенный ключевым словом else - это Windows-блок. Здесь запись аналогична - в качестве шага используется шаг bat и в двойных кавычках ему передается команда (Рис. 287) сйЩсижапй) { if (IsUnixO) ( sh “< f J { bat “chcp 6ieei\n$:cor-and}" } } Puc. 287- пример функция языка Groovy Одной из особенностей командной строки Windows является ее запуск в DOS-кодировке ср 866. При выводе кириллицы в такой кодировке в логах Jenkins будут отображаться «кракозябры». Для того чтобы явно привести командную строку в режим UTF-8 мы можем до выполнения нашей команды в шаге bat дописать команду chcp (смена кодовой страницы). • Напишем chcp 65001 (код UTF-8) • Для разделения операторов и эмуляции перевода строки добавим последовательность символов \п. 199 Никита Гоызлов. Пособие релиз-инженера 1C Jenkimfile pipeline { agent { label ' Md' } Stage? { stage{ ’Gh4«u, .‘4 steps { cmd(t«asend) { if (isunixQ) ( sh "JlsiQetTidndy } else- { bat "cbcp bieeilnif coasand '•" } Puc. 288 - пример функция по использования языковых страниц Таким образом, мы можем переложить определение необходимого шага (bat или sh) на плечи функции cmd. И шаг вывода версии OneScript будет выглядеть вот таким образом: cmd("oscript --version") (Рис.288) Перенос команд по работе с Deployka в шаги Jenkinsfile deployka session lock pipeline { agent { label ‘bdd’ } stages { stage(’Обновление тестового контура’) { steps { cmd (“deployka session lock -ras localhost: 1545 -db trade_bdd -lockmessage V’testV’ -lockuccode } } } } def cmd(command) { if (isUnix()) { sh ’’^{command}” } else { bat ’’chcp 65691\n${command)“ } } Puc. 289 - перенос команд по работе с Deployka в шаги Jenkinsfile Перенесем из командной строки первую команду по работе с Deployka. (Рис.289) Это команда: deployka session lock -ras localhost:1545 -db trade_bdd -lockmessage "test" lockuccode "123" 200 Silver Bulleters, LLC Поскольку команда вставляется в строковый литерал, сразу экранируем кавычки с помощью обратного слэша. cmd("deployka session lock -ras localhost:1545 -db trade_bdd -lockmessage \"test\" -lockuccode \"123\"") Первое, что бросается в глаза - это то, что в файле сборочной линии явно зашиты адрес сервера 1C и имя базы. Если мы перенесем базу на новый сервер или переименуем ее, нам придется также менять и Jenkinsfile. А, следовательно, выполнять новый коммит и отправлять изменения в репозиторий. В других командах у нас аналогично указаны логин и пароль. В целом, такие вещи не стоит хранить в файле сборочной линии: • Желательно их «зашивать» в переменные среды; • Либо в конфигурационный файл, который не будет находиться в репозитории. Мы воспользуемся первым способом - в Jenkinsfile будем использовать переменные среды, а на уровне задачи Jenkins их настроим. (Рис.290) stages { stage('Обновление тестового контура*) { steps { cmd("deployka session loci -ras env.Server 1C} -db Sfenv.PatabaselC} -lockmessage \“test\” -lockuccode \"123\’”’) } } Puc. 290 - использование переменных среды Для передачи переменных среды внутрь строки мы также можем воспользоваться интерполяцией строк: • Заменим localhost: 1545 на использование внешней переменной среды $ {env. Serverlc} • Аналогично заменим имя базы данных. Вместо trade_bddукажем $ {env.Databaselc} deployka session lock -ras ${env.ServerlC} -db ${env.Databaselc} -lockmessage \"test\" -lockuccode \"123\" Обращаю ваше внимание: чтобы корректно работала интерполяция, строка должна быть заключена не в одинарные кавычки, а в двойные - это особенность языка Groovy. Если внутри строки в двойных кавычках встречается символ двойной кавычки, нам необходимо экранировать его с помощью обратного слэша. (Рис.291) deployka session kill stages { stage('Обновление тестового контура') { steps {, cmdCdeployke session lock -ras ${enu.Server1C} -db ${erni.OatabaselC} -lockmessage \"test\" ^lockuccode V123V"') cnd("deployka session kill -ras ${en«■ Server 1C} -db ${env.DatabaseIC}| -lockmessage JVtestV. -lockuccode 123") } } Puc. 291 - экранирование строк Следующий шаг-это отключение всех активных сеансов. Для этого служит команда deployka session kill Добавим новый шаг cmd и вставим команду из командной строки: 201 Никита Грызлов. Пособие релиз-инженера 1C deployka session kill -ras localhost:1545 -db trade_bdd -lockmessage "test" lockuccode 123 Команда session kill неявно вызывает session lock, поэтому параметры • -lockmessage и - lockuccode удалять не будем. Не забудем их экранировать. Заменим путь к серверу 1C и имя базы данных на вызов переменных среды $ {env. Server 1C} • И ${env.DatabaselC} cmd("deployka session kill -ras ${env.ServerlC} lockmessage \"test\" -lockuccode 123") -db ${env.DatabaselC} - deployka loadrepo stages { stage('Обновление тестового контура') { steps { cmd("deployka session lock -ras ${env.ServerlC} -db ${env.DatabaselC} -lockmessage \”test\" -lockuccode \”123V"‘) cmd ("deployka session kill -ras ${env.ServerlC} -db ${env.DatabaselC} -lockmessage \*’test\" -lockuccode 123") cmd ("deployka loadrepo \"/S${en v. Ser verlC }\\£{ en «. Pat a ba s elC}\" ${ en v.StoragePat h } |-storage-user ci-bot -storage-pwd password") } } Puc. 292 - команда deployka loadrepo Следующий шаг-обновление конфигурации из хранилища. Добавим новый шаг cmd и вставим команду из консоли. (Рис.292) deployka loadrepo "/Slocalhost\trade_bdd" "С:/workspace/storage_trade" -storage-user ci-bot -storage-pwd password Здесь нам предстоит выполнить несколько дополнительных действий. • Во-первых, экранируем имеющиеся двойные кавычки с помощью обратного слэша. • Во-вторых, заменим localhost на $ {env. ServerlC} • trade_bdd на ${env.DatabaselC} • Между сервером 1C и именем базы данных стоит обратный слэш, являющийся символом экранирования. Чтобы явно указать Groovy, что вместо экранирования нужно использовать реальный обратный слэш, нам нужно написать его два раза. • Путь к хранилищу тоже стоит вынести С:/workspace/storage_trade ${env.StoragePath} на на уровень конфигурации, поэтому заменим использование переменной окружения cmd("deployka loadrepo \"/S${env.ServerlC}\\${env.DatabaselC}\" ${env.StoragePath} -storage-user ci-bot -storage-pwd password") Указание логинов и паролей в качестве переменных окружения с использованием хранилища паролей Jenkins Имя пользователя и пароль тоже можно было бы задать на уровне переменных окружения в настройке задачи, но лучше мы рассмотрим, как считывать логины и пароли из хранилища паролей Jenkins. Когда Jenkins понимает, что какие-то данные являются данными авторизации, он автоматически отлавливает их вывод в консоль и маскирует их звездочками. Кроме этого, Jenkins никогда не запускает на выполнение сторонние и непроверенные Jenkinsfile (не из основного репозитория) (Рис. 293.) 202 Silver Bulleters, LLC ■& Jenkins Jenkins • Credentials •(Ьг Создать Hem Credentials 4) Люди История Сборок Т Связи проектов Р Store . с№’.гг:д£кЁй1_ей1^ ЬЗс55е9&-Ю70-4540-Ь911-7Ь204ЬЗЗ<М4с isshkis. Значок SML настроить Jenkins Stores scoped to Jenkins My Views Credentials | Name ID Domain Domains Store . P £ System Jenkins .(sgflbaQj _________________ Очередь сборок - Очередь сборок пустз СзКй®ЖйЛЙШШИ£2в • мастер 1 В окидпиим 2 В ожвдаинм • windows-1 1 В ожидании Рис. 293 - данные авторизации Jenkins Для начала сохраним логин и пароль в хранилище Jenkins. Для этого откроем Jenkins, перейдем в раздел Credentials, откроем домен «global» (глобальный). (Рис. 294) поиск ■g Jenkins Jenkins ■ Credentials System > Back to credential domains •> Add Credentials ф Никита I рмзлон | выход Global credentials (unrestricted; Kind I Username Mth password Scope Global f Jenkins nodes items all child Hems etc) сНхя Password © © ........ © Storaoe_Trade_CiBo4 © Description в хранилище trade © Puc. 294 - сохранение логина и пароля в хранилище Jenkins И добавим новые данные авторизации: • Пользователь хранилища - «ci-bot» • Пароль - «password» • В качестве описания укажем, что это - «Ci-bot в хранилище trade» • Если мы не задаем идентификатор параметров авторизации (ID), то Jenkins по умолчанию заполняет его случайным GUID. В сборочной линии мы будем обращаться к данным параметрам по их идентификатору, и случайный GUID нам будет не очень удобен. Поэтому для упрощения явно зададим этот идентификатор - например, «Storage_Trade_CiBot» Сохраним данные, нажав на кнопку ОК. (Рис. 295) 203 Никита Грызлов. Пособие релиз-инженера 1C ICi поиск Jenkins Jenkins а Грмзлон | выход ■ «я* Создать Нет Люди История сборок Q* Связи проектов Проверить х>ш файла Настроить Jenkins Му views s W 0 > Й а Name . Последний успех Последняя неудача SKSi'Et 25 минут - 015 4 дня 2 часа - 15 секунд 0 6 дней 1 час - 017 6 дней 1 час • 016 0 56 секунд 0 4 дня 1 час - й2И Н-Д 28 секунд 0 4b Значок. § М L tes.t ве<й©£ Changes Пошхьь Credentials Последняя продолжительность H5S для всех сбооох (3 j СоСрагь сейчас £3 BSSjuki неудакге» сбору Q 9SS Для последних Сборок удалить Pipeline Очередь сборок (•*1- настрой»» Очередь сборок пуста <1 Full Stage View 0 Pipeline Syriai Puc. 295 - сохранение данных Вернемся на главную страницу. После того, как мы сохранили данные авторизации в хранилище паролей Jenkins, мы можем использовать их в сборочной линии. Сделать это можно двумя способами. Первый способ - использование специального шага withCredentials Откроем Pipeline Syntax (для этого можно перейти в нашу тестовую сборочную линию и нажать Pipeline Syntax) (Рис. 296) Bindings Username and password (separated) Username Variable Password Variable Credentials © StorageUsername StoragePassword ci-boV““** (Ci-bot в хранилище trade) . Ada- Дооавоть » Puc. 296 - окно Pipeline Syntax В окне Pipeline Syntax выберем шаг «withCredentials»: • Добавим новую связку с видом «Username and password (separated)» - разделенные логин и пароль • Здесь у нас есть возможность указать имена переменных среды, в которых будут сохранены логин и пароль для указанных параметров авторизации. Назовем переменные среды: 204 о Для логина - StorageUsername о Для пароля - StoragePassword Silver Bulleters, LLC • Выберем данные авторизации «CIBot в хранилище Trade». Если вы помните, его уникальный идентификатор мы задали как Storage_Trade_CiBot Нажмем кнопку «Generate Pipeline Script» - в текстовом окне появится готовый сниппет withCredentials. Все, что будет располагаться внутри фигурных скобок в шаге withCredentials, сможет использовать переменные среды StoragePassword и storageUsername — их значения будут заполнены на основании параметров авторизации, хранящихся в Jenkins под уникальным идентификатором Storage_Trade_CiBot. Использование шага withCredentials позволяет лучше ограничивать доступность переменных окружения с данными авторизации. Однако его использование является избыточным и усложняет сборочную линию. Второй способ - использование блока environment декларативной сборочной линии Есть второй способ. В формате декларативной сборочной линии (а мы с вами пишем именно такую) доступен специальный блок environment, оформляемый на верхнем уровне или на уровне конкретного stage и упрощающий чтение секции stages. Скопируем идентификатор storage_Trade_ciBot и вернемся в редактор Visual Studio Code. pipeline { agent { label ‘bdd’ environment { Storage = credentials('Storage_Trade_CiBot’) stages { stage('Обновление тестового контура*) { steps { cmd("deployka session lock -ras ${env.Server 1C} -db ${env.DatabaselC} -lockmessage V'testV* -lockuccode \’’123\”") cmd (’’deployka session kill -ras ${env.5erverlC} -db ${env.DatabaseiC} -lockmessage V'testV* -lockuccode 123") cmd(’*deployka loadrepo V*/S${env.ServerlC}\\${env.DatabaselC}\" ${env.StoragePath} -storage-user Sfenv.Storage Usr} -storage- pwd en v, St or a ge_Psm }f') } } Puc. 297 - использование блока environment декларативной сборочной линии Укажем блок environment. В этом блоке мы можем дать Jenkins команду прочитать данные авторизации в определенные переменные среды. Для этого передадим в функцию credentials идентификатор данных авторизации (Рис. 297): Storage = credentials('Storage_Trade_CiBot') В результате: • В переменной env. storage окажется связка логин - пароль, разделенная двоеточием. • К ней автоматически будут созданы две дополнительные переменные среды, с постфиксами _Usr и _Psw, куда попадут отдельно логин и пароль соответственно. В нашем случае это будут переменные env. storage Usr и env. Storage_Psw . Теперь мы сможем изменить использование явного указания логина и пароля на использование переменных среды: 205 Никита Грызлов. Пособие релиз-инженера 1C • Параметру -storage-user будет передаваться переменная среды env.storage_Usr • А параметру-storage-pwd переменная среды env.Storage_Psw Не забудем добавить обращение к структуре env (Рис.298) stages { stage(’Обновление тестового контура') { steps { cmd(’’deployka session lock -ras S{env.ServerlC'} -db ${env.DatabaselC} -lockmessage VtestV -lockuccode V123V") cmd("deployka session kill -ras ${env.Server10} -db ${env.Databaseic} -lockmessage VtestV” -lockuccode V123V") cmd(’’deployka loadrepo \“/S${en v.Ser verlC}\\${env.DatabaselC}\” ${en v.StoragePath} -storage-user ${env.Storage_Usr} -storage-pwd ${env.Storage_Psw} -uccode } } } Puc. 298 - обращение к структуре env Так как сейчас база находится в заблокированном состоянии, нам необходимо передать ей код разрешения входа. Для этого: • В команду loadrepo добавим еще один параметр этого в команде -uccode . Его код 123 мы установили до session lock. Напишем: -uccode \"123\" • Чтобы устанавливаемый в команде session lock и передаваемый в командах session kill и loadrepo ключи совпадали, обернем в этих командах ключ 123 в кавычки - не забываем, что двойные кавычки внутри строки с двойными кавычками необходимо экранировать deployka dbupdate stages { stage(’Обновление тестового контура’) { steps { cmd("deployka session lock -ras ${env.Server1C} -db ${env.Databaseic} -lockmessage VtestV -lockuccode Vl23\“”) cmd("deployka session kill -ras ${env.Server1C} -db ${env.Databaseic} -lockmessage VtestV -lockuccode V123V") cmd("deployka loadrepo \"/S${env.ServerlC}\\${env.DatabaselC}\’’ ${env.StoragePath} -storage-user ${env.Storage_Usr} -storage-pwd ${env.Storage_Psw} -uccode \"123\"“) cmd(" deployka dbupdate \ " /S$-f en v, Ser ver 1C } \ \ en v. Pat a ba s e 1C } \ " -allow-warnings -uccode У123У") Puc. 299 - обновление тестового контура Следующий шаг - обновление базы данных. (Рис. 299) Добавим еще один шаг cmd и вставим в него команду по обновлению deployka dbupdate. deployka dbupdate "/Slocalhost\trade_bdd" -allow-warnings Здесь нам также необходимо: • Изменить строку соединения с базой данных - скопируем ее из команды loadrepo • И указать ключ разрешения-uccode \"123\" cmd("deployka dbupdate \"/S${env.Serverlc}\\$(env.Databaseic)\" uccode \"123\"") 206 -allow-warnings - Silver Bulleters, LLC deployka session unlock stages { stage('Обновление тестового контура') { steps { cmdC'deployka session lock -ras ${env.Server 1C} -db ${env.DatabaselC} -lockmessage \"test\“ -lockuccode \"123V”’) cmdC’deployka session kill -ras ${env.Server 1C} -db ${env.DatabaselC} -lockmessage \’’test\” -lockuccode \"i23\”") . cmdC'deployka loadrepo \*7S${env.ServerlC}\\${env.DatabaselC}\" ${env.StoragePath} -storage-user ${env.Storage_Usr} -storage-pwd ${env.Storage_Psw} -uccode \’*JL23\"") cmd(”deployka dbupdate \"/5${env.ServerlC}\\${ertv.DatabaselC}\" -aHow-warnings -uccode \"123\“") cmdC'deployka session unipci -ras ${env.Server 1C} -db ${env.DatabaselC}“) Puc. 300 - блокировка сессий 1C Последний шаг в работе Deployka - это разрешение подключения к базе. Для ускорения копируем команду deployka session lock, вставим ее после dbupdate и заменим lock на unlock. Параметры -lockmessage и - lockuccode можно удалить. cmdC'deployka session unlock -ras ${env.ServerlC} -db ${env.DatabaselC}") Теперь все команды, которые мы пробовали запускать в консоли, перенесены в Jenkinsfile. Оптимизация Jenkinsfile - вынесение повторяющихся строк в переменные stages { stage('Обновление тестового контура’) { steps_i----------------------------- .--- ---------------------------------- | def connectionstring = и\7S$fenv.Serverl€}\\${env.PatabaselC}\,,‘* f cmdC’deployka session lock -ras v.ServerlC} -db ${env. DatabaselC} -lockmessage \"test\” -lockuccode \*’123\'”’) cmdC’deployka session kill -ras ${en v.Ser verlC} -db ${anv. DatabaselC} -lockmessage Y'testV -lockuccode \”123Y'”) cmdC’deployka loadrepo S-f connect ion St ring.} $4 env. StoragePath} -storage-user ${env.Storage_Usr } -storage-pwd ${en v.Storage_Psw} -uccode \"123V") cmdC’deployka dbupdate $-1 connect ion St ring }| -allow-warnings -uccode Y’123Y’") Puc. 301 - вынесение повторяющихся строк в переменные Немного «причешем» получившийся скрипт. Чтобы сократить дублирование между шагами, мы можем вынести повторяющиеся строки в промежуточные переменные: • Добавим новую переменную, воспользовавшись ключевым словом def • Укажем имя переменной - например, connectionstring • Укажем ее значение - скопируем внутрь двойных кавычек (так как нам необходима интерполяция строк) конструкцию строки соединения def connectionstring = "\"/S${env.ServerlC}\\${env.DatabaselC}\"" Теперь мы можем упростить шаги loadrepo и dbupdate, заменив данную строку соединения вызовом переменной. Делается это аналогично указанию переменных среды - $ {connectionstring} Однако если мы просто попробуем выполнить данный Jenkinsfile, мы получим ошибку компиляции. Дело в том, что относительно недавно компания, разрабатывающая Jenkins, представила новый формат описания Jenkinsfile - Declarative Pipeline (декларативная сборочная линия) - мы с вами пишем сборочную линию именно в этом формате. В Интернете вы можете найти большое количество примеров использования различных шагов для Jenkinsfile, но они, скорее всего, будут в старом формате - Scripted Pipeline (скриптованная сборочная 207 Никита Грызлов. Пособие релиз-инженера 1C линия). Сточки зрения структуры скриптованные варианты значительно проще: вам достаточно только указать агента, на котором будет выполняться данный Jenkinsfile (или его метку), и дальше вы вольны делать все, что угодно: • Объявлять новые стадии • Использовать шаги • Писать произвольный код Декларативный же формат более строг. В нем есть требования: • По структуре описания • По использованию одних блоков внутри других - например в блоке steps могут использоваться только шаги step, объявить переменную уже нельзя Однако разработчики Declarative Pipeline (декларативной сборочной линии) оставили нам возможность выполнять произвольный код - для этого они создали специальный шаг script, в котором мы можем написать любую нужную нам логику. stages { stage('Обновление тестового контура') { script { def connectionString = ''\”/S${env.ServerlC}\\${env.Datab3selC}\"" } cmd(’deployka session lock -ras ${env.server 1C} -db ${env.DatabaselC} -lockmessage VtestV -lockuccode V123V”) cmd("deployka session kill -ras ${env.Server 1C} -db ${env.DatabaselC} -lockmessage VtestV -lockuccode V123V”) cmd(”deployka loadrepo. ${connectionString} ${en v.StoragePath} -storage-user ${env.5torage_Usr-} -storage-pwd ${env.5torage_Psw} -uccode \!'123\"M) cmd("deployka dbupdate ^{connectionString} -allow-warnings -uccode У123V”) } } Puc. 302 - шаг script Обернем объявление переменной connectionstring внутрь блока script. Если мы попробуем выполнить данный Jenkinsfile, мы опять получим ошибку. Особенность языка Groovy и Java, на котором он построен - это то, что переменные, объявленные внутри какого-то блока (внутри фигурных скобок) доступны только внутри этого же блока. Для того чтобы мы могли использовать переменную connectionstring за пределами блока script, нам нужно объявить ее заранее (Рис. 303). 208 Silver Bulleters, LLC def connectionStnng pipeline { agent { label 'bdd' } environment { Storage = credential^'Storage_Trade_CiBot *) 1 } i; . ' ■!. stages { stagef‘Обновление тестового контура') { steps { script { fconnectionString = "V/S${en v. ServerДС}\\?н env .Database. } end("deployka session lock -ras ${env.Server 1C} -db S{env.batabaseiC} -locimessage \“test\" -lockuccode V123V") cmd("deployka session kill -ras £{en‘/.Server 1C} -db S{env.E>atabaselC} -lockmessage VtestV -lockuccode V123V") cmd("deployka loadrepo ${connectionString} ${env.StoragePath} -storage-user ${eriv.5torage_UsrJ -storage-pwd ${env.Storajge_Psw} -uccode V123V") and("deployka dbupdate ${connectionString} -a How-warnings -uccode V123\”") } } } Puc. 303 - объявление блока script это Сделаем вначале нашего Jenkinsfile, перед блоком pipeline, указав там def connectionstring. Так как мы уже объявили эту переменную, то ключевое слово def внутри блока script необходимо убрать. f connectionString def uccode def lockParams pipeline { agent { label 'bdd'* } environment { Storage = credentials(’Stcrage_Trade_Cieot’) } stages { stage('Обновление тестового контура*) { steps { script { connect ion St ring = "V/SS{env.Server lOT\S(en».C.'3tabaseiC uccode = "V 12:3 V" lockParams = "-lockmessage VtestV -lockuccode ${ucccde}" } cmd("deployka session lock -ras ${env.Server1C} -db £{er.v.batabaselC} ${lockParams}") cmd("deployka session kill -ras ${env.Server1C} -db ${env.DatabaselC} £{locl Par-ams}") cmd("deployka loadrepo ${conftectioriString} ${env.StoragePath} -storage-user $(env.Stcrage_Usr} -storage-pwd ${env.Storage_Psw} -uccode ${ uccode if1') cmd("deployka dbupdate SfconnectionString} -allow-wamings -uccode $fuccode}") } “ } } Puc. 304 - ключевое слово def внутри блока script Аналогичные действия выполним для ключа и текста блокировки. • Выделим ключ \"123\" в отдельную переменную uccode. Объявим ее в заголовке и в блоке script присвоим ей значение: uccode = "\"123\"" • Также объявим переменную lockParams, содержащую ключи -lockmessage и -lockuccode для команд session lock и session kill. Заменим в ней явное указание \"123\" на использование переменной uccode: lockParams = "-lockmessage \"test\" -lockuccode ${uccode}" 209 Никита Грызлов. Пособие релиз-инженера 1C Теперь мы можем заменить в командах • session lock и session kill параметры -lockmessage и -lockuccode на использование переменной lockParams А также можем заменить все указания \"123\" на использование переменной uccode • В принципе, такие простые действия вроде присваивания переменным строковых литералов можно осуществлять и в месте объявления самих переменных. Однако же вскоре мы добавим более сложную логику. Добавление в команду deployka loadrepo возможности загрузить из хранилища версию, определенную в теге VERSION файла VERSION Текущий вариант запуска команды loadrepo загрузит в информационную базу последнюю версию, существующую в хранилище. Однако такая схема может быть неудобной. Например, она не позволит тестировать каждое помещение в хранилище или запустить тестирование по непоследней версии конфигурации. Чтобы загрузить конкретную версию из хранилища конфигурации в базу данных, у команды loadrepo есть необязательный параметр -storage-ver, в который передается номер версии конфигурации в хранилище. Так как у нас в репозитории всегда лежит xml-файл VERSION, в котором и указан номер версии конфигурации, мы можем прочесть этот файл и передать его параметром команде loadrepo. Для чтения данных их файла воспользуемся имеющимся в Jenkins шагом readFile и возможностью извлекать текст с помощью регулярных выражений. Добавим в блоке script новые строки. (Рис.305) det connectionstring de- uccode def lockParams det versionText def versionValue pipeline { agent { label ‘bdd’ } environment { Storage = credentials (’St or age„Trade__C5Bot') } stages { stage('Обновление тестового контура') { steps { script { connectionstring = B\“ys${env.ServerlC}\\${env.OatabaselC}\.'‘” uccode = “\”123\’’" lockParams = “-lockmessage \”test\" -lockuccode ${uccode}*‘ versionText = readFile encoding:’UTF-8', file: 'src/cf/VERSION* vers ion Value = (versionText =~ Z >■ VERSION,-\ i VER5I0i4>/) [0] [1] }cmd(*'deployka session lock -ras ${env.Server10} -db ${env.DstabaselC}...... .... ${lockParams}") cmd(”.deployka session kill -ras ${eriv.Serveric} -db ${env.Dat-abaselC} ${lockPar<ms}") cmdC'deploykd loadrepo SfconnectionStrlng} ${env.StoragePath} -storage-user Storage_Usr} -storage-pwd ${eriv,Storage_Psw} -uccode ${uceode} -storage-ver version Value }{‘) • cmd ("deployka dbupdate S{connectionString} -аИоы-иаг-nings -uccode Sfuccode}”) Puc. 305 - новые строки в блоке script Для начала прочитаем все содержимое файла VERSION в переменную. Для этого: 210 • Объявим новую переменную - назовем ее versionText • И сразу же объявим вторую переменную, которая нам понадобится - versionValue Silver Bulleters, LLC Извлечем текст файла VERSION в переменную versionText. Для чтения будем использовать функцию readFile, передав ей два параметра: • encoding (кодировку) - укажем: encoding: • 'UTF-8' И параметр file - путь к файлу. Он у нас располагается по адресу file: 'src/cf/VERSION' versionText = readFile encoding:'UTF-8', file: 'src/cf/VERSION' Теперь нам нужно извлечь из текста файла конкретную версию. Для этого воспользуемся одной хитрой конструкцией извлечения текста из строки: versionValue = (versionText =~ /<VERSION>(.*)<\/VERSION>/)[0][1] Здесь в скобках указывается: • versionText - переменная, в которой хранится текст • =~ команда извлечения текста • И после этого следует регулярное выражение, заключенное в два прямых слэша. Само регулярное выражение довольно простое: • Сначала мы ищем в файле открывающие и закрывающие теги version <VERSION>...<\/VERSION> Так как слэш является символом окончания регулярного выражения, нам необходимо экранировать его с помощью обратного слэша • Далее мы читаем все, что находится между двумя этими тегами, используя конструкцию (. *) Это регулярное выражение возвращает нам специальный объект (match), в котором содержатся соответствующие этой конструкции совпадения в тексте поиска. Мы можем извлекать значения из этого объекта аналогично получению значений из многомерного массива: • Для начала обратимся ко всем результатам поиска, используя конструкцию [о] • А потом получим первое совпадение в этой группе, используя конструкцию [1] (на этот раз индексация идет с единицы) В результате из текста файла VERSION мы получим значение, находящееся между тегами version и запишем его в переменную versionValue, чтобы в дальнейшем использовать его при вызове команды loadrepo. Добавим в конце вызова этой команды новый параметр -storage-ver и передадим в него значение переменной versionValue, используя доллар и фигурные скобки. 211 Никита Грызлов. Пособив релиз-инженера 1C stages { stage(’Обновление тестового контура’) { steps { timestamps { script { connectionstring = "\"/S${env.-Server lC}\\${eriv.D'stabaselC}\''” uccode = ■'\"123\'"’ lockParams = “-lockmessage VtestV -lockuccode ${uccode}" versionText = readFile encoding:’UTF-8', file: ’src/cf/VERSIOW versionValue = (versionText =~ /< VERSION ■ t .*)< V/VERSIOM- /) [e] [ 1] } cmd(’’deployka session lock -ras ${env.Server 1C} -db ${env. Database®!} ^{lockParams}”) cmd("deployka session kill -ras ${env.Server 1C} -db ${env.DatabaselC} ${lockParams}") cmd(’’deployka loadrepo ${connectionString} ${env.5toragePath} -storage-user ${env.Storage_Usr} -storage-pwd ${env.storage_Psw} -uccode ${uccode} -storage-ver ${versionValue}“) cmdC’deployka dbupdate ${connectionString} -allow-warnings -uccode ${uccode}”) } } Puc. 306 - конструкция timestamps Заключительные действия по обработке Jenkinsfile В заключение обернем все шаги, которые находится внутри блока steps, в конструкцию timestamps для вывода времени выполнения каждого действия в консоль. ИЗ0 0 Добавлен Jenkimfile о / ИЗМЕНЕНИЯ й 1 Ft □ jf’nkjnsWe Е Рис. 307 - фиксация изменений в git Сохраним Jenkinsfile и отправим его в репозиторий на GitLab. (Рис.307) Для этого: • Перейдем на закладку GIT • Напишем сообщение Commit - «Добавлен Jenkinsfile» • Выполним фиксацию (• DOCKER р master О ОО А0 § [3 Share Рис. 308 - синхронизация изменений с внешним репозиторием А затем синхронизируем изменения с внешним репозиторием. (Рис. 308) 212 Silver Bulleters, LLC Настройка Jenkins для работы c Jenkinsfile Наш Jenkinsfile отправился на GitLab, а это значит, что мы можем добавить на Jenkins новую задачу с его использованием. Введите имя Item'a trade_pipeline | аймачтдаыя* /кие Создать задачу со свободной конфигурацией ’йвдяг Это - основной и наиболее универсальный тип задач a Jenkins Jenkins будет собирать ваш продат. комбинируя любую SCM с любой сборочной системой Данный тип проекте® может использозаться для задач. отличных от сборки ПО Pipeline Jsjrchestrates lon^jwminj activities ifta! can span multiple build slaves. Suitable for building pipelines (fonneily known as workflows)апФог ждапЫпд ccflipfex act»®» that (ft not easSy в in ttee-styte job fype Puc. 309 - новая задача Jenkins Перейдем в Jenkins и создадим новый элемент (Рис.309): • Назовем его, к примеру, «trade_pipeline» • Тип задачи - «Pipeline» И нажмем «ОК». Рис. 310 - раздел pipeline Перейдем в раздел Pipeline: (Рис. 310) • Укажем, что наш Jenkinsfile находится внутри системы контроля версий; • Выберем систему контроля версий Git; • Укажем путь к репозиторию - http://10.0.75.1:10080/trade/trade; • В качестве параметров авторизации используем данные «Cl-Bot GitLab» 213 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 311- настройка Pipeline Продолжим настройку: (Рис. 311) • Хорошей практикой является выполнить очистку репозитория перед началом работы. о • Для этого в секции «Additional Behaviors» добавим новый шаг «Clean before checkout» Первичное клонирование репозитория может занимать довольно много времени, особенно в случае больших конфигураций типа ERP - вплоть до получаса. По умолчанию Jenkins ставит таймаут клонирования равным 10 минутам. Мы можем изменить этот таймаут, задав дополнительное поведение о В секции «Additional Behaviors» нажмем «Добавить» и выберем «Advanced Clone behaviors» о 214 Здесь в параметре «Timeout» мы можем указать значение в минутах, например, 30 минут Silver Bulleters, LLC Jenkins I iracfe pipelme h 1 РгреЯпе имя tradejsipeftw 1 Описай** * Пр not allow concurrent builds GlHub project Тфйе builds Prepare an snvlronr^wrt for the run Удавить устареваме сварю* и Это - параметризованная сборка Puc. 312 - подготовка окружения для запуска В нашем Jenkinsfile используется несколько переменных среды. Нам необходимо задать их либо на уровне узла, либо на уровне задач. Большинство этих переменных связано с конкретным репозиторием: • Это имя базы • Сервер, где она располагается • И путь к хранилищу Зададим эти переменные среды прямо в задаче. Для этого перейдем на закладку «General» и отметим флаг «Prepare an environment for the run» (Рис.312) (подготовить окружение для запуска). Jenkins tradejptpeSne General ЙжМ I («дер, " 'Tejsss(rations 'Aeitiaricer! Pipgtor© Keep Jenkins Budd Variables Override Build Parameters a Properties File Path Properties Content Server 1C=localhost Oat abase 1 C=trede_bdd StoragePath=C ’workspaca'storape_trade Puc. 313 - настройка переменных среды В поле «Properties content» в формате Ключ=3начение зададим переменные среды. (Рис.313) Это: • ServerlC=localhost • DatabaselC=trade_bdd 215 Никита Гоызлов. Пособие релиз-инженера 1C • И путь к хранилищу StoragePath=C:/workspace/storage_trade Не забудем заменить в этом пути обратные слэши на прямые Рис. 314 - настройка триггеров Следующее, что нам необходимо настроить - это триггеры. Обычно при использовании Jenkinsfile, лежащих в репозитории, используют триггер «Опрашивать SCM об изменениях». Данный триггер позволяет настроить расписание, по которому Jenkins будет обращаться к GIT-серверу, чтобы узнать, были ли какие-то изменения в указанной ветке. Если GIT-сервер сообщает ему о том, что в данной ветке были новые коммиты, Jenkins запускает новую сборку. Если мы добавим секцию triggers в наш Jenkinsfile, то при первом же запуске сотрутся значения переменных среды, которые мы установили в настройке задачи. Поэтому зададим расписание опроса прямо здесь: (Рис.314) • Укажем расписание Н/5**** Сохраним изменения. 216 в формате cron - опрашивать сервер каждые 5 минут: Silver Bulleters, LLC Jenkins > trade„pwfe© Changes Started by user 2>sasl4_Cj25s3SSa Obtained Jenkinsfile fron git Jj fj| Вывод консоли Просмотреть как Xwmihg on windsfes-l in C:\wi'kspa<el.jenifins_slw«'4»'k5pace\trade_pipeUBe “✓ Edfl Suiid infcnnat&ft > 1 пгеаз Dump [Pipeline] tlieekjsrat > git rev-persa S»-*ia»ide»*w4i-tr«« « t Fetching chafes free the remote Git repository <Т Replay • git config name.origin.url ЬКйк//ДЙ<<и2Ь11ЖВ/ЛГ.ЙЙ«/Л£ДЙ • Cleaning workspace » git rev-parse --verify Нбдр « timeeut*10 Resetting working tree > git reset --hard « tineout^io • git clean -fix “ tineovt-10 Fetching upstreas changes from http://18.8.75,1ria^S'gctrede/trede ;. ■<- Ptpefee Steps • System clock lime НЙ Use » git - -version j» tieeout-ie using e.IT_ASKP6SS to set credential-. CT-Bot Sitlafe refs/reeotes/orxgirs/* « > git fetch -tegs -progress > git rev-parse *mfs/r»w>««s/erlgWimte'’"{ceesitj’' » tiw > git rew«perse 5/г^«тм/яг1§1п/»г|рп/«5т»’ (cswtriit f Checking out BeviSiSh 5b7fSeS894J8f«8dMe37875ee81«?ia8lt4f f« {ref &/remtes/origln/n»st«r) > git config <©?•«.sparjecheckout ■ tieeeot-18 • git checkout -f 5b?#te58«i4J8fe»Mb4«5787S*eamie«Tt4cf Ji Elapsed lime First tiee build. Skipping changelvg. [Pipeline' тестового «с«иеуи>1 Puc. 315 - логирование задания Jenkins Наша сборочная линия готова к тестовому запуску. Нажмем «Собрать сейчас» и проследим за выполнением (Рис. 315). Как вы видите, наш Jenkinsfile прошел проверку синтаксиса, и сборочная линия начала работу: • Первым делом выполняется своеобразный нулевой шаг - получение исходного кода из системы контроля версий • Потом начинается работа приложения Deployka • Мы видим сообщение, что база обновлена • И сборочная линия завершилась успешно Jwfcte f traste* • Вал to Dashboard Pipeline trade_pipeline . Status 5 Changes Собрать сейчас Весом Otansas (J Удалить Pipeline 4*^- Настройки Stage View 0^ Full Stage View 0 Pipeline Syntax История сборок ! ППЙ ass Declarative: Checkout SCM Обновление тестового контура 3s 23s 3s 39s тренд «в 71 I ' » © < aa Рис. 316 - отчет о выполнении задания Вернемся на страницу задачи. (Рис.316) В поле Stage View видим две колонки: • Первая - это получение исходного кода (его декларативная сборочная линия делает за нас). • Вторая - наша стадия обновления тестовой базы. 217 Никита Гоызлов. Пособие релиз-инженера 1C Раздел 10. Тесты поведения - BDD 10.1. BDD-тестирование с помощью продукта Vanessa-ADD Продукт Vanessa-ADD (далее будем называть его кратко ADD, т.е. Automation Driven Development) есть набор инструментов для проверки качества решений на платформе 1С:Предприятие. Миссия продукта - повышение качества https://github.com/silverbulleters/add. разработки. Официальная страница продукта Продукт позволяет проверять поведение различных систем на базе 1C и проверяет/гарантирует качество функциональности системы и ее составных частей. Возможности: • различные виды тестирования (модульного/юнит, приемочного, сценарного для 1C 8.3, интеграционного, TDD) • проверка поведения (BDD/Gherkin) • формирование автодокументации в формате Markdown и видео. ADD является наследником 2-х более ранних продуктов - xUnitForlC и Vanessa-Behavior и состоит из 2- х соответствующих подсистем-наследников: тестирование кодом (TDD) и тестирование сценариями поведения (BDD). Продукт устанавливается уже привычной командой opm install add Более подробное описание можно получить на официальной странице продукта. В качестве браузера тестов выступает обработка bddRunner. epf У всех, кто работает с ADD, рано или поздно встает вопрос: «Как же автоматизировать запуск всех имеющихся фич?» В ответ на этот вопрос ADD предоставляет возможность запуска BDD-тестирования из командной строки. Перейдем в официальный репозиторий инструмента https://github.com/silverbulleters/add и обратимся к разделу «Описание простого использования». (Рис. 317) 218 ADD по адресу Silver Bulleters, LLC Описание простого использования • пишем feature файлы в формате Gherkin о обычно используется редактор VSCode или связанный проект vanessa-bdd-editor # language: ru Функционал: Запуск и получение результатов запуска сценариев Как любой разработчик продукта Я хочу иметь возможность запустить проверку сценариев поведения на конфигурации 1С:Предприятие # Контекст сценария выполняется всегда перед каждым сценарием Контекст: Когда существует разрабатываемая мною конфигурация 1C И существуют требования заказчика к ожидаемому поведения в каталоге ".\features" # Каждый сценарий состоит из последовательных связанных шагов Сценарий: Запуск в консольном режиме Дано Пусть существует файл ".\vb-execute-profile.json" И в переменную окружения V83PATH установлено значение "C:\Prograni Files (x86)\lcv8\8.3.6.2151\bin\lcv8.exe" Когда я запускаю командную строку '%V83PATH% /Execute .XbddRunner.epf /C"StartFeaturePlayer;VBParams-.\vb-execute-prc Тогда появляется файл с результатами 1.\BuildStatus.log‘ И в каталоге ". \allurereport'" существует HTML отчет о результатах проверки сценариев Сценарий: Запуск в интерактивном режиме Дано Пусть я открыл обработку "bddRunner.epf" Когда Я нажал кнопку ''Загрузить фичи из каталога"' И указал каталог с требованиями заказчика равным ".\features" И затем нажал кнопку "Сгенерировать шаблоны обработок" Также в каталоге “. Xfeatures" возникли epf файлы идентичные имени Feature файла И при нажатии кнопки "Запустить сценарии" я вижу автоматизированный запуск обработок с признаком “pending" (ожидает f Рис. 317-описание простого использования BDD Здесь в формате Gherkin описан сценарий для запуска в консольном режиме. Прочитав его, можно сделать два вывода: • Первое - нам нужно подготовить специальный файл VBParams в формате JSON; • И второе - нам нужно: о Запустить 1С:Предприятие, о Передать в параметрах запуска путь к обработке для запуска BDD - bddRunner.epf. о Ив дополнительных ключах указать путь к json-файлу настроек VBParams .json. 219 Никита Грызлов. Пособие релиз-инженера 1C Пример файла VBParams можно посмотреть чуть ниже. (Рис. 318) Пример подобного JSON файла профиля: "КаталогФич": "С:\\add\features", "ВыполнитьСценарии": "Истина", "ДелатьОтчетВФорматеАллюр": "Истина", "KaTanor0utputAllureBa3OBbifi": "С: Wallurereport", "ЗавершитьРаботуСистемы": "Истина", "ВыгружатьСтатусВыполненияСценариевВОайл": "Истина", "ПутьКФайлуДляВыгрузкиСтатусаВыполнэнияСценариев": “С:\\BuildStatus.log", "СписокТеговИсключение":[ "IgnoreOnCIMainBuild", "Draft" ] } Много примеров json-файлов есть в каталоге tools проекта. Рис. 318 - пример VBParams.json В данном примере указывается: • Каталог фич вашего проекта; • Необходимость выполнения сценариев; • Необходимость формирования отчета Allure; • Путь к каталогу, в котором будут сохраняться данные при построении отчета Allure; • И прочие необходимые настройки. К сожалению, на момент подготовки данного пособия полного задокументированного описания всех имеющихся ключей настроек для файла VBParams. j son не существовало. На данном этапе выяснение того, какие же параметры можно указать в VBParams.json, сводится к просмотру исходного кода обработки bddRunner. epf. Посмотреть его можно прямо на GitHub. Для этого перейдем по адресу: Ьир5://кЛЬиЬ.сот/5ЛуегЬи11е1ег5/ас1с1/ЫоЬ/та51ег/ерТ/Ьбс1Ниппег/Рогт/УправляемаяФорма/Форма.Ь51, чтобы просмотреть модуль управляемой формы обработки bddRunner. 220 Silver Bulleters, LLC ЛНаКяиеите ФуИ*ЦИ« CowsTbCTpyxTi-P^aMX-rpoejjmycMi j Рез ■ Новый Структур»; Рез.Вставить;"StartFeaturePlayer", Ложь); Рез. ВставитьСКаталогв-нч", *“); Ре9,8етввить{"катвлсгибийпжвте«’, новый Массив); Рез-ВставитьССпвсввТеговИеклвчеяне*, ноемй Массив); Рез.Вставите;"СтвсокТеговОтбор", Новый Массив); Рез.Вставить{"ДеявтьСосбаеиияТваислитои", Ложь); Рез. Вставить;“СвэдаватьМмструкиивНТКС", Ло*ь); Рез. Вставить;"СоздаватъИнструктипНвгквоип", Лево»,; Рез.Вставить;■СсздаватьМнструкцмвВмдес", Ложь); Реа.Вставит&{"ЗемтьЯвгВь-толмечивСценвриев?*Р"^ Метима); Рез. Вставить; *ДелатьЛогВыяоРиеи«яй(еввриевВТе«;ст«^#йРайл", Том-.); Рез,Ставить;"НияввйлаЛогвыполнеиияСиенвриее", ; Рез,Вставить;“ЭакрвтьТез^иепеПоелеЗвпусквСцеивриев", Ложь); Рез.Вставить;-КатадогвитритМиетрукцияНВи", Рез.Вставить("КаталвгОихрихИнструЕцияМагкаоип- , —); Рез. Вставить (“ кат*яотШхр«гИистргкц«я8ндео" , ' “); Ре». Вст а вит в ("Дел»тьОтя ет8о6кз-трея»е»ворм»те“, Истин*); Рез.Вставить("Дедать&тчетвФорыатеАллвр", Истей*); Рез.Вставить;"KaTaaorSutputAllurs"', ""); Рез. Вст авить; "KaTamsrOutput А1 JureSasoewi", " * ); Рез.Вставить;'ietSTbCT-eTBiopwiTejUni’". Ложь); Рез. Вставите; •KaTa/torOwtpetjUnit”, ""); Рез.Вставить;"ДелатьОтчетЗФссматеСиситЬетЗзол*, Лгав»); Рез.Вставить;"КаталогОиСриССисижйегЗвоп”, Рез. Вставить (“ДобавлятьКМиеииСцен^жяУлоавявыгруэк-и”, Ломь); Рис. 319 - список всех ключей VBParams.json Список всех ключей можно посмотреть в функции СоздатьСтруктуруПараметровЗапуска(). (Рис. 319) Здесь указаны ключи и значения по умолчанию - из них можно понять, какой это тип (булево, строка или массив). 221 Никита Грызлов. Пособие релиз-инженера 1C Более подробный пример файлов VBParams . j son можно найти также в репозитории ADD, в каталоге tools/JSON по адресу https://github.com/silverbulleters/add/tree/master/tools/JSON. Здесь представлено несколько примеров json-файлов VBParams для разных версий платформы и режимов интерфейса. (Рис. 320) В CheckDocjson Добавил конфиги для сборки. 10 months ago gj Ma in .json Добавил служебный каталог для очистки. 2 months ago g] REAOMLmd Поменял правило снятия скриншота 11 months ago g| VBPara-ms820F.json Добавил параметр в Json. 9 days ago gj VBParams82U?json Добавил параметр в Json. 9 days ago jgj VBParams636OF.json Добавил параметр в Json. 9 days ago g VBParams836UF.json Добавил параметр в Json. 9 days ago gj VBParams836UK>»ecfcl>3C-json Добавил параметр в Json. 9 days ago VBParams837UF.json Добавил параметр в Json. 9 days ago g) V8Params838UF.json Добавил параметр в Json. 9 days ago g VBParams839VF.json Добавил параметр в Json. 9 days ago g VBParams839UFr)oSync.json Добавил параметр в Json. 9 days ago Рис. 320 - список примерных json-файлов Итак, для запуска ADD на Jenkins мы должны: • Подготовить файл VBParams. j son; • Сформировать строку запуска ADD с учетом файла VBParams; • И настроить автоматический запуск ADD с корректной передачей параметров с помощью инструмента Vanessa-Runner. 10.2. Подготовка базового VBParams.json Для автоматизации запуска BDD через ADD на CI мы с вами будем использовать файл VBParams. j son и запуск ADD с помощью инструмента Vanessa-Runner. 222 Silver Bulleters, LLC Начнем с подготовки файла VBParams. j son. Обычно этот файл располагают в служебном каталоге tools. (Рис. 321) Рис. 321 - создание VBParams.json Создадим в нашем репозитории каталог tools и в нем файл VBParams . j son. VBParams . j son-это файл JSON, который представляет собой объект, заключенный в фигурные скобки, внутри которых указываются ключи и значения, разделенные двоеточием. Сами ключи разделяются запятыми. Начнем заполнять наш файл VBParams . (Рис. 322) УВГагагпмчж X { *8ыполнитъСцен«рми": тг <?, "ЗаввримтьРаботуСистемы"; ‘ihs, "Зак(И4ТьТе$гСПеп1По<;леЗапускаСцвнар»1ев*: t ■>", "КатаяогФич-: “tworkspaceRoot?features", "Катаяогибиблмотех": [ “./features/libraries" b "ДелвтьОтчетМорнэтеАллюр”: true. "КатапогОчТриМПигеЬззовый": ">workspacefioct/out/allure", "ВыгрухатьСтатусВктолненияСчвнариеаВФамл": true, "ПутьХезйлуДлнВыгрузкиСтатусвеыяояненияСценариеа": "{wwkspaceRoot/out/пи)JdStatus.log* 1- } Puc. 322 - заполнение VBParams.json • Первый ключ, который нам понадобится - это флаг необходимости выполнения сценариев ВыполнитьСценарии. Значение - true (Истина). • Для того чтобы ADD завершала работу 1C, служит ключ ЗавершитьРаботуСистемы. Пока мы отлаживаем этот процесс, поставим здесь значение false. • По умолчанию Vanessa Behavior не закрывает открытые клиенты тестирования. Для указания необходимости закрытия служит флаг ЗакрытьТеБ^Иег^ПослеЗапускаСценариев. Значение этого флага можно сразу установить в true. • Фичи нашего проекта будут лежать в каталоге features папки trade. Одну фичу мы туда уже положили - это фича оприходования товара. Соответственно, ключом данной настройки является КаталогФич, а значением - каталог features. 223 Никита Гоызлов. Пособие релиз-инженера 1C о Но следует помнить, что обработка bddRunner при чтении файла VBParams все относительные пути строит от своего расположения. И нам, чтобы указать, что каталог features нужно искать в каталоге проекта, следует воспользоваться специальным макросом $workspaceRoot - когда ADD увидит этот макрос, она подставит вместо него путь к каталогу проекта. Таким образом, значением ключа КаталогФич будет являться конструкция $workspaceRoot/ features • Фичи, скорее всего, будут использовать библиотечные шаги, которые содержатся в Vanessa Behavior. Для указания пути к каталогам библиотек служит ключ КаталогиБиблиотек. Тип этому по значения - ключу массив. В формате JSON массивы оформляются в квадратных скобках. В качестве элемента массива мы укажем относительный каталог ./features/libraries - именно там ADD хранит свои библиотечные шаги. Обратите внимание, что местоположение этого каталога будет также строиться от местоположения обработки bddRunner. • Основной вид отчетов, которые мы хотим получить от ADD - это отчет в формате Allure. Для указания того, ADD что должен формировать отчет Allure, служит флаг ДелатьОтчетВФорматеАНиге. Значение — true. • Если мы собираемся делать отчеты в формате Allure, нам также необходимо задать место, куда ADD будет сохранять этого Для результаты служит выполнения параметр сценариев - в формате Allure. КаталогОиЬриЬАНигеБазовый. Для указания пути к каталогу мы также воспользуемся макросом $workspaceRoot. В его расположении укажем каталог out и в нем подкаталог allure - если необходимо, обработка bddRunner сама Итак, значением создаст все необходимые ключа каталоги и КаталогОиСрибАИигеБазовый положит в них отчет Allure. будет являться конструкция $workspaceRoot/out/allure • Для того, чтобы наш сервер сборок и инструмент Vanessa-Runner могли быстро получать статус успешности выполнения сценариев, мы можем задать еще два специальных служебных ключа: о Первый из них - ЭТО ключ ВыгружатьСтатусВыполненияСценариевВФайл, который определяет необходимость выгрузки статуса выполнения в файл. Выставим для него значение true. о А второй служебный ключ — ПутьКФайлуДляВыгрузкиСтатусаВыполненияСценариев. Он определяет путь к файлу выгрузки результатов выполнения сценариев. В качестве его значения мы опять используем макрос $workspaceRoot, его подкаталог out и имя файла buildstatus.log в виде конструкции $workspaceRoot/out/buildStatus.log Сохраним получившийся файл и перейдем к формированию строки запуска BDD-тестирования из инструмента Vanessa-Runner. 224 Silver Bulleters, LLC Для начала установим Vanessa-Runner. Это можно сделать из интегрированного терминала, выполнив команду: (Рис. 323) орш install vanessa-runner PS C; \torkspace\git\trades оря install vanessa-runoer OneScript Package Manager V0.9.4 иноормдиия - скачиваю файл: vanessa-runner.ospx информация - Устанавливаю пакет vanessa-runner информация - Устанавливаю зависимость: logos ИНФОРМАЦИЯ - Скачиваю файл: logos-0.S.ospx ИНФОРМАЦИЯ - Устанавливаю пакет logos ИНФОРМАЦИЯ - Установка завершена ИНФОРМАЦИЯ - Устанавливаю зависимость: скШпе ИНФОР«А1>!Я - cndllne уже установлен. Пропускаем. ИНФОРМАЦИЯ - Устанавливаю зависимость: teapflles ИНаОРНАСЦЯ - Скачиваю файл: tempfiles-B.J.l.ospx_____ Рис. 323 - установка vanessa-runner Запустим приложение vrunner для получения информации об имеющихся командах (Рис. 324). С:\projects\SB\add\features\libraries>vrunner help vanessa-runner vl.1.0 Возможные команды: help - Вывод справки по параметрам --help - Вывод справки по параметрам - Выводить версию приложения инициализируем пустую базу данных для выполнения необходимых тестов, version init-dev указываем путь к исходниками с конфигурацией, указываем версию платформы, которую хотим использовать, и получаем по пути build\ib готовую базу для тестирования. update-dev обновляет пустую базу данных для выполнения необходимых тестов, указываем путь к исходниками с конфигурацией, указываем версию платформы, которую хотим использовать, и получаем по пути build\ib готовую базу для тестирования. compileext загружаем расширение в конфигурацию из папки исходников updateext - обновляем расширение в ИБ decompileext - разбираем расширение из конфигурации в исходники decompileepf xunit разбираем внешние обработки на исходники штатно через выгрузку 1C 8.3 В каталоге выгрузки создается отдельный подкаталог для каждой внешней обработки Сохраняется структура подкаталогов, если выгружаем каталог Запуск тестирования через фреймворк ADD.xUnitFor1C vanessa - Запуск тестирования через фреймворк ADD.vanessa-behavior Выполнение команды/действия в 1C:Предприятие в режиме тонкого/тонкого клиента с передачей запускаемых обработок и параметров run updatedb Обновление конфигурации базы данных в режиме Конфигуратора unload - Выгружает файл конфигурации из ИБ unloadext - Выгружает файл расширения из ИБ compileexttocfe - Собрать из исходников cfe файл dump - Выгружает информационную базу в файл - Централизованная проверка конфигурации, в т.ч. полная проверка синтаксиса конфигурации loadrepo Обновление конфигурации из хранилища 1C. Обновление БД не выполняется. syntax-check createrepo - Создание хранилища 1C. bindrepo - Подключение ИБ к хранилищу конфигурации 1C. createrepouser - Подключение ИБ к хранилищу конфигурации 1C. unloadcfrepo - Выгрузить файл конфигурации определенной версии из хранилища 1C. Рис, 324 - команды vanessa-runner В выведенной справке мы можем узнать, что в инструменте Vanessa-Runner нам доступна команда vanessa, служащая для запуска BDD-тестирования через фреймворк ADD. 225 Никита Грызлов. Пособив релиз-инженера 1C Для получения справки по команде vanessa нам необходимо выполнить: (Рис. 325) vrunner help vanessa Z:\projects\SB\add>vrunner help vanessa zanessa-runner vl.1.0 /anessa Запуск тестирования через фреймворк ADD.vanessa-behavior 1араметры: --pathvanessa - [env RUNNER_PATHVANESSA] путь к внешней обработке, по умолчанию <OneScript>/lib/add/bddRunner.epf или переменная окружения RUNNER_PATHVANESSA --vanessasettings - [env RUNNERVANESSASETTINGS] путь к файлу настроек --workspace - [env RUNNER_WORKSPACE] путь к папке, относительно которой будут определятся макросы ^workspace, по умолчанию текущий. --additional - Дополнительные параметры для запуска предприятия. --no-wait - Не ожидать завершения запущенной команды/действия --ibconnection - Строка подключения к БД (/FfilePath или /SserverPath) Например, для файловых баз --ibconnection /FC:\basel или --ibconnection /F./basel или --ibconnection /Fbasel Или для серверных баз --ibconnection /Sservername\basename --db-user - Пользователь БД --db-pwd - Пароль БД --v8version - Версия платформы --root - Полный путь к проекту --ordinaryapp - Запуск толстого клиента (1 = толстый, 0 = тонкий клиент, -1 = без указания клиента). По умолчанию и< 4тать лог работы 1C в режиме Предприятие в управляемом интерфейсе. --nocacheuse - Признак - не использовать кэш платформы для ускорения операций с базой, а также не надо добавлять базу в список баз 1C пользователя --ibname - (устарело) Строка подключения к БД --language - Код языка запуска платформы --locale - Код локализации сеанса платформы --settings - Путь к файлу настроек, в формате json. По умолчанию имя файла env.json Рис. 325 — подсказка команды vanessa Как следует из описания, для запуска ADD нам необходимо: • В параметре - -pathvanessa передать путь к обработке bddRunner.epf, о Этот параметр можно не указывать, в этом случае автоматически будет подставлен путь к обработке bddRunner. epf из поставки ADD. • В параметре - -vanessasettings - путь к json-файлу настроек VBParams .json • Для возможности использования макроса $workspaceRoot задать путь к каталогу, который будет подставляться в качестве рабочего, с помощью параметра - -workspace. • А также заполнить такие общие для всех команд параметры, как: о --ibconnection-строка подключения к базе данных; о - -db-user - пользователь информационной базы, если он есть; о - -db-pwd - пароль пользователя, если он задан. Попробуем сформировать данную команду.(Рис. 326) C:\workspace\git\trade>vrunner vanessa --vanessasettings ./tools/VBParams.json --workspace . --ibconnection /Slocalhost\trade_bdd vanessa-runner vl.1.0 ИНФОРМАЦИЯ - Tестирую поведение с помощью фреймворка ADD__________________________________________________________________________ Рис. 326 - выполнение команды vanessa Укажем: vrunner vanessa --vanessasettings ./tools/VBParams.json --workspace ibconnection /Slocalhost\trade_bdd 226 . - Silver Bulleters, LLC • Заполним путь к VBParams с помощью параметра -vanessasettings. Здесь мы можем указать путь: относительный . /tools/VBParams.j son • По умолчанию, в качестве рабочего каталога (значения параметра -workspace) передается каталог build\out. Чтобы явно указать текущий каталог c:\workspace\git\trade, мы можем в передать данный параметр «точку». Укажем: --workspace . • Последний параметр, который необходимо заполнить - это -ibconnection, строка подключения к информационной базе. База у нас располагается на сервере 1С:Предприятие и путь к ней выглядит так: /Slocalhost\trade_bdd. Попробуем выполнить данную команду. Скорее всего, при открытии обработки bddRunner.epf платформа покажет вам окно с предупреждением о запуске внешних исполняемых файлов. (Рис. 327) Такое поведение значительно затрудняет работу сервера сборок и может приводить к неожиданным ошибкам. X 1С:Предприятие Ж Предупреждение безопасности Открывается "Vanessa Behavior" из файла "C:\projectsVSB\add\bddRunner.epf. Рекомендуется обращать внимание на источник, из которого был получен данный файл. Если с источником нет договоренности о разработке дополнительных модулей, или есть сомнения в содержимом файла, то его не рекомендуется открывать, поскольку это может нанести вред компьютеру и данным. Разрешить открывать данный файл? Да j j Нет Рис. 327 - предупреждение 1C при запуске ADD Для того чтобы отключить механизм проверки открытия внешних отчетов и обработок, можно выполнить одно из двух действий: • Либо для пользователя, под которым запускается менеджер тестирования, разрешить запуск внешних отчетов и обработок, • Либо в конфигурационном файле платформы добавить строку, выключающую такую проверку. Покажем второй способ: Запустим с правами администратора приложение «Блокнот» и откроем файл conf.cfg в каталоге C:\Progratn Files (х86)\lcv8\conf. Для возможности его выбора включим отображение всех файлов. (Рис. 328) 227 Никита Гоызлов. Пособие релиз-инженера 1C В файл conf. cf g необходимо добавить еще одну строку, где указать: DisableUnsafeActionProtection=.* Такая запись разрешит запуск внешних отчетов и обработок на всех базах текущей машины. Обратите внимание, в конце этой строкине надо ставить дополнительных символов. Если вы поставите здесь, скажем, точку с запятой, то механизм защиты от опасных действий отключен не будет. Сохраним файл и закроем его. Теперь после перезапуска 1C окон с вопросами разрешения открытия внешних отчетов и обработок появляться не будет. (Рис. 329) ,Л) conf,tfg — Блекнет Файл Праам Формат Вид Спрааеа SystBMLanguage-RU DlsableUnsafeActionProtettion», *|j Рис. 329 - изменение conf.cfg Вызовем команду запуска ADD с помощью Vanessa-Runner еще раз: 228 • Открылась информационная база trade_bdd в режиме менеджера тестирования. • В ней запустилась bdd-обработка ADD. • Подгрузились фичи из каталога features. Silver Bulleters, LLC • Первым шагом подключился клиент тестирования и начал выполняться сценарий, описанный в feature-файле. Рис. 330 -выполнение BDD-тестирования • После выполнения всех сценариев тест-клиент был закрыт, а тест-менеджер остался без изменений. • Пока менеджер тестирования не закрыт, Vanessa-Runner все еще ждет результатов работы ADD в файле buildstatus.log. • Закроем менеджер тестирования. - ОТКРЫТЫЕ РЕДАКТОРЫ VBPwamspon toob 5W6MM® -features > «ер_definitions Прихадсеэние1оыра.{е«иге cmi VBParamsjson lenkmsfiie вьжш терминал --db-pwd (env WJNWfR OBPUD} пароль пользователя PS C:\workspace\gitVtradex vrunoer -help vanessa vanessa-runner v8,8.2 vanessa Запуск тестирования через фреймворк vanessa-behavior » Sworiopaceftoot Параметры: --pathvanessa - [env RUNKERJ>ATMVAMESSA] путь к внеюней обработке, по умолчанию vendor/vanessa-behevior/vanessa-be hwlor.epf или переменная окружения RUNN£R_PATHVSHESSA --vanessasettings - [env RVWiER_VAAK5SA.SETTifiGS] путь к файлу настроек --workspace - [env RumER_UORKSPACE] путь к папке, относительно которой будут определятся макросы (workspace, по умолчанию текучий. —additional - дополнительные параметры для запуска предприятия, обцие для всех параметры -vSversioo Каска версии платформы (8.3, 8.3.5, 8.3.6.2299 и т.п.) —ibnane (env RlWWEftIВМАЯР} строка подключения к базе данных. --db-user [env RUWfEROeoSER] имя пользователя для подключения к базе --db-pwd [env RUNKEROBPWDJ пароль пользователя PS С:\Morkspace\git\trade> vrunner vanessa --pathvanessa C:\workspace\git\vanessa-behavior\vanessa-behavior.epf —v anessasettings ./tools/VBbaraMs.Json --workspace . --ibna*e /Sio£T»Jhost\trade.__bdd Wyi vanessa-runner* ve.8.2 : ""вт :rWr‘'"'' 15:31:81: нкюряация - Тестирую поведение с помочь» фреймворка vanessabehavlor 15:36:14: «коРМйция 85.84.2817 15:31:19 Фичи загружены. 85.84.2817 15:31:21 Работаю по сценарию: Прихедование товара 85.84.2817 15:31:38 TestCHent подключен на 1 538 порту. 85.84.2817 15:31:38 Все сценарии обработаны! 85.84.2817 15:31:39 Файл отчета Allure-report (C:\workspace\git\trade\aut\allureV54a85653-4ibc-46c7-b975-e51dc8f3a4 11-testsuite.xnl) записан. . , ... 85.84.2817 15:31:39 Записал файл статуса бняда; С:\ы<и^5расе\811игайе\<даЙйёЙЙ^&МУ1^^^ 1 ........ Чтобы активировать Windows. перейдите в раздел "Параметры". Рис. 331 - результаты BDD-тестирования в командной строке После завершения работы команды мы увидим (Рис. 331), что: 229 Никита Грызлов. Пособие релиз-инженера 1C • В командной строке отобразилась надпись «Тестирование поведения завершено» • Каталог out содержит файл builgstatus.log со значением о (в случае, если все тесты выполнились) • А каталог allure содержит XML-файл с результатами отчета в формате Allure. Далее укажем ADD необходимость закрытия менеджера тестирования после выполнения проверки поведения. (Рис. 332) Рис. 332 - указание завершения работы в VBParams.json Для этого в файле VBParams. j son ключу ЗавершитьРаботуСистемы присвоим значение true и еще раз выполним нашу команду: • Открылся менеджер тестирования с обработкой Vanessa Behavior; • Запустилась проверка поведения с клиентом тестирования; • Закрылся клиент тестирования; • И закрылся менеджер тестирования. В заключение зафиксируем наши изменения в GIT-репозитории. Для исключения лишней информации из репозитория в корне проекта создадим файл .gltlgnore, добавим в него каталог out и сохраним изменения. (Рис. 333) .gitignore X euV Рис. 333 - gitignore 230 Silver Bulleters, LLC Для того чтобы обработка, связанная с фичей приходования товара, разложилась на исходники, не забудем установить в данный репозиторий инструмент precommitlc. (Рис. 334) Для этого в командной строке выполним: precommitlc --install PS C:\workspace\git\trade> precommitlc ИНФОРМАЦИЯ ргессммШс v?.l.0 ■ Install ИНФОРМД1ИЯ - Копиру»: pre-commit информация - Копиру»: vSReader информаций Копиру»: vSfiles-extractor.os ИНФОРМАЦИЙ копиру»: tools информаций Установка завершена PS С:\workspace\git\trade> П Рис. 334-установка precommitlc в репозиторий Зафиксируем изменения. (Рис. 335) 0 о гат — Сообщение (чтобы зафиксер-Авать нажмите Ог1*ВЙ«1 Р ПРОМЕЖУТОЧНО СОХРАННО 1ЫТ И ЗМЕНГНИЯ *. .gitmorfules 2 *' vanessa-behavior : £*■•ИЗМЕНЕНИЯ О .gitignore Е » Г 1рмходоезн»№}свара,feature Ееаъда « ПриходовзниеТоварз.ерТ : .Мн-Лед, о VBParamsjson • J . Рис. 335 - перед коммитом в VSCode Текстом коммита будет "Подключили precommitlc (Рис. 336) VB и имеющиеся ИТ фичи". Дождемся окончания работы * □о 0 Р ПРОМЕЖУТОЧНО COXPAHFl II1ЫТ И ЗМЕНГНИЯ 6 Е * .gitignore * .gttmodules » npwxafloiMMMeToeapa.feature * ПриходовлнмеТовара.ерЕ * vanessa-behavior tort? * VBPargmsgson i ИЗМЕНЕНИЯ 0 Подключили VR и имеющиеся фичи gjjirftniftw» Рис. 336 - индексировали изменения в VSCode И после этого отправим изменения на GitLab. (Рис. 337) 231 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 337 - отправка коммитов в VSCode Наш репозиторий подготовлен для запуска проверок поведения на сервере сборок. 103. Конфигурирование Jenkins - подключение Allure Для отображения Allure на Jenkins нам необходимо его настроить: • Установить специальный плагин; • И настроить запуск приложения Allure Commandline. Рис. 338 - установка плагина Allure Перейдем в Jenkins, откроем «Настройки» - «Управление плагинами» и выберем закладку «Доступные». В поиске наберем «allure», отметим плагин «Allure Jenkins Plugin» (Рис. 338) Также нам потребуется плагин публикации HTML-страниц, найдем с помощью noncKa«HTML Publisher Plugin», также отметим его к установке, после чего нажмем «Установить без перезагрузки». Вернемся на главную страницу и откроем помощник «Pipeline Syntax». Jenkins > ■ hade_p«pei«ne Pipeline Syntax Sack Overview Snippet Generator This Snippet Generator wiB help you leam «he Pipeline Scnpt code which can be used io define various steps Pick a step you are interested in from the bst. configure it click Generate Pipeline Script and you will see a Pipeline Script statement that would саЯ the step with that configuration You may copy and paste © Step Reference the whole statement into your script ot pick, up just the options you care about (Most parameters are optional and con be omitted In your script leaving them at 0 Global Variables Reference 0 Onfine Documentation e in’.eftJ IDEA GDSL default values ) Steps SmpteSlep ab,eAto.Rwn Results Path aBure-r“suits '•Делить Добавить ■»»■» IB **iv "№/*» 0**c*»'*» £ ti targ«raair»-rc(ian bee' Jenkins needs to know where your Allure Commandline is installed. ® Please do so from the Global Tool Configuration. ь --------------------------------------------Расширенные^ Puc. 339 - помощник «Pipeline Syntax» 232 Silver Bulleters, LLC При выборе шага «allure: Allure Report» данная страница скажет нам, что для работы Jenkins необходимо знать, где располагается утилита Allure Commandline и предложит перейти по гиперссылке «Global Tool Configuration». (Рис. 340) Jenkins Global Tool Configuration Cradle Grade установок Добавить Gradle Списс-» угт»ив«о*. в этой системе Ant Ant установок Добавить Ant Слисеа Ant уствм-оао* в гтзй системе Maven Maven установок Добавить Maven Сгвмзо* Maven установок в этой системе Docket Docker установок Добавить Docker Спиеос уа*а«ом» в »тзА системе Allure Contmandline Allure CommendTine устаиово» Добавить Allure СоттагкШпе » Cewn’-B'fldhn* fC*e-"Cto«- • цттсчг еиетвм* Save AtW Puc. 340 - Окно Global Tools В разделе «Global Tool Configuration» найдем утилиту «Allure Commandline» и нажмем «Добавить Allure Commandline». Allure Commandline Alhwe Commandlme установок Allure Commandline Иия allure © * install automatically From Maven Central Версия 1 5 2 Удалять ус та«оой1жт До&ижь установи^* * УЛапжть Atture Cornmandtete Рис. 341 - настройка установки Allure из Maven Central Укажем новую настройку утилиты с именем «allure». Отметим флаг «Установить автоматически» В поле «из репозитория Maven Central» выберем последнюю доступную версию. 233 Никита Гоызлов. Пособив релиз-инженера 1C Сохраним изменения. (Рис. 341) Вернемся на страницу «Pipeline Syntax» и обновим ее - информация о необходимости настройки пропала. В идеале, нужно использовать генератор снипетов и стандартный шаг «allure», который отобразился в текстовом поле после нажатия на кнопку «Generate Pipeline script». В параметре Results указывается путь к файлу отчета allure, который был сформирован при прогоне сценариев поведения, в параметре Report path - путь к готовому отчёту allure. В результате мы получим сниппет, который опубликует наш отчет, тогда, шаг «10.5 Сборочная линия - Allure» будет заключаться только во вставке сгенерированного снипета в Jenkinsfile. Однако, на момент верстки книги стандартный шаг Allure работает нестабильно, поэтому в нашей сборочной линии мы воспользуемся другим способом: будем выполнять команду Allure из командной строки, а получившиеся результаты опубликуем с помощью плагина «HTML Publisher». Steps Sarnie Step ,00, a !00| (lom a preOefined Toat |„siaItatK>n Too! Туре Tool • Allure СоттзгкЙ-irte т allure т Generate Ptpefete Script tool name 'allure' type 'allure' Puc. 342- получение пути к инструменту allure Для получения пути к месту установки Allure Commandline мы можем: • Воспользоваться шагом «tool»; • Выбрать тип «Allure Commandline» и утилиту с именем «allure»; • И нажать «Generate Pipeline Script». В результате получим сниппет, который вернет нам путь к месту установки утилиты Allure - он нам понадобится, когда мы будем настраивать стадию публикации результатов Allure. К моменту выпуска книги, весьма вероятно, что стандартный шаг allure будет стабилизирован и можно будет использовать именно этот подход. 234 Silver Bulleters, LLC 10.4. Сборочная линия - запуск проверки BDD Перейдем в редактор Visual Studio Code. JenkimRe y-ore 4П1- cffld('sessi 3j • ciw${ ‘dteftloyka loadr--;< kill ${1йскг,«ги?г ServerlC} -da ras ) StoragePath}'” -storage-и sr-r ^{©rv.lStbrdg^^Osr} -storage-ршГ cedC'dC'ptiy'xa dbupdate ${садм<т1<т&1^Ъ?<} -alio*., warning*. aec&de f{uccode}") ciad('и .,r.i©ck -ras. verlC} db $’vTV.0a'ua«it-15 ") i } . ■ : ■■ . . n stage( ‘ Hjiasefasa поведения") { : . J.F L steps { tt tl®est»ps { } I } c»d( I. i Puc. 343 - вызов утилиты vanessa-runner Для формирования шага запуска проверки BDD в нашем Jenkinsfile: (Рис. 343) • Добавим в новый этап stage (’Проверка поведения’) и опишем секцию steps. • Сразу же обернем выполняемые шаги в шаг timestamps • И сформируем шаг по запуску Vanessa-Runner - это будет шаг cmd, куда мы скопируем из интегрированного терминала получившуюся у нас строку запуска Vanessa-Runner. Поправим, если она оказалась разбита на две строки, и выполним уже привычную замену строки соединения localhost/trade_bdd на использование переменной ${connectionstring}: cmd("vrunner vanessa --vanessasettings ibconnection /Slocalhost\trade_bdd”) ./tools/VBParams.json --workspace . - Таким образом, мы выполнили все необходимые действия для запуска BDD из Jenkinsfile. Сохраним изменения, зафиксируем их в GIT и отправим в удаленный репозиторий. ftrasfee_pipeline] Running batch script 18:2?:21 38:22:21 C:’workspace'' jenkins_slave\««srfe5pece\tra4e_pipeiine?chcp 65601 18:22:23 Active code page: 65001 18;2?s23 3.8:27:21 Z.: 'workspacetjenkins_ilave‘.werkspaceXtreaejjipeline'vrunner vanessa --pathvanessa -/tools. sn>essa-beh«vlo‘ ■ ^anesse- bowler,ep? --vanessasettings ./tool s/veoar-MB,^sen --'workspace - - ibname ,75localhost\cra£ie_b&l” 18:27:22 yebessa-runner vB.B.2 18:27523 28:27:22: ИМвОЧвуиЯ ■ Тестеру» nss«®«s £ nbwoutwe фреймворка vanessa-feefcsvisr 18:28:1© 18:28:10: ИНФОРМАЦИЯ - 05.©4.2017 1«:27;<2 ®«ч» аагруженш. 28:28:3® 18:28:2© ©5. ©*. 281? 18:27:84 Работав во снемари»: Ярмходоаамие товара 38:28:10 05.04.2017 18:27:53 TestCdient подключей на 3 538 порту. 18:28:1© 85.04.2817 18:28:03 Все сценарии обработан».'. 18:28:10 05.04.2817 18:28:03 ©ай.- отчета й!lure-report (С:\workspace\j«»Jeins_slave\worfcsfMce\trade_pipeIine\ottt\allure\98335475-6*de4915-9144-bb2fеа6001с4-testsuite.x»li записей. 10:28:3005.04.2817 18:28:04 записал вайя статуса билда: С:\могк:расе\jenkins_5lavc\Morkspaee\trade_pipelineSout\buildSxacus.log 18:28:30 38:2©:2© 18:28:1©: НКвОРЧАЦИВ - Тестирование <мж«дей*я sa»epee«c IFsp«Heej J (Pipeline| // ieltfcCreientials ) Finished; SUCCESS Puc. 344 -лог запуска сборки с генерацией отчета Allure Запустим новую сборку и откроем ее лог. (Рис. 344) На первой стадии начнет отрабатывать Deployka, 235 Никита Грызлов. Пособие релиз-инженера 1C • Затем начнется шаг «Проверка поведения»: о С помощью Vanessa-Runner запустится 1C; о Будут выполнены все имеющиеся сценарии; о И информация об успешности прогона всех сценариев появится в файле buildstatus.log. о Vanessa-Runner проанализирует этот файл: * В случае нахождения там единицы пометит сборку, как проваленную; * Если же там будет ноль, то шаг пройдет без ошибок и наша сборочная линия завершится успешно. Pipeline trade_pipeline Stage View Declarative: SCM 18 | Обновление тестового контура Проверка поведения 20s 36s 20s 36s 50s 19s 35s 49s Puc. 345- этапы сборки с пунктом «Проверка поведения» Перейдем в задачу «trade_pipeline» и увидим, что у нас появилась новая колонка «Проверка поведения». (Рис. 345) 236 Silver Bulleters, LLC 10.5. Сборочная линия - Allure Перейдем к публикации отчета Allure на Jenkins. Steps Sample Step |c0, (Jse a (Qo| ,[om a Tool installation 0 Tod Type Tod дциге СоттагнЙпе allure Generate Pipetee Script tool name 'allure' type 'allure' Puc. 346 - генерация сниппета tool Снова откроем «Pipeline Syntax»: (Рис. 346) • Выберем шаг «tool»; • Тип утилиты «Allure Commandline» и утилиту «allure». • И нажмем кнопку ««Generate Pipeline Script». Напомню, этот шаг вернет нам путь к установке утилиты Allure - скопируем его и перейдем в редактор Visual Studio Code. stage("Проверка поведения") { steps { script { timestamps { cmd("runner vanessa --settings tools/vrunner.json --vanessasettings ./tools/VBParams.json") } } } } stage("Публикация результатов") { steps { timestamps{ } } Puc. 347 - добавление блока «Публикация результатов» Добавим новый блок stage ('Публикация результатов’) и внутри него steps. (Рис. 347) 237 Никита Гоызлов. Пособие релиз-инженера 1C Здесь нам нужно выполнить две операции: • Сформировать отчет Allure; • И опубликовать его на Jenkins. stage('Пубяикзцяя результатов') { steps { script { allurePath - tool name: ai/ure , type: 'allure' /Bin/allure generate о out/allure-report cut/allure") } } } Puc. 348 — команда вызова allure в сценарии сборки Для получения пути к каталогу Allure будем пользоваться шагом tool, однако, так как нам необходимо объявить переменную, в которую мы получим значение этого шага, обернем все это в шаг script, где объявим новую переменную allurePath и присвоим ей значение шага tool: (Рис.348) def allurePath = tool name: 'allure', type 'allure' Формирование отчета Allure запускается с помощью команды allure generate, путь к исполняемому файлу которой мы записали в переменную allurePath. Запускать ее мы будем с помощью шага cmd, которому передадим следующую команду: cmd("${allurePath}/bin/allure generate -о out/allure-report out/allure") Где: • С помощью конструкции $ {allurePath}/bin/allure вызовем: о Исполняемый файл allure; о Который лежит в подкаталоге bin; о По пути, заданному в переменной $ {allurePath} • Передадим команду для генерации отчета - generate. • Зададим местоположение каталога с готовым отчетом с помощью параметра -о, указав путь out/allure-report • И последним параметром укажем путь, где лежат исходные данные для этого отчета - каталог out/allure. После выполнения данного шага в каталоге out/allure-report будет готовый HTML-отчет с результатами в формате Allure. Для публикации этого отчета на Jenkins мы будем использовать шаг publishHTML. Откроем Jenkins, «Pipeline Syntax»: (Рис. 349) 238 о Выберем шаг «publishHTML»; о Укажем путь к архивируемой директории - это out/allure-report ,- о И в качестве страницы оставим index.html. Silver Bulleters, LLC Для публикации этого отчета на Jenkins мы будем использовать шаг publishHTML. Откроем Jenkins, «Pipeline Syntax»: (Рис. 349) о Выберем шаг «publishHTML»; о Укажем путь к архивируемой директории - это out/allure-report ; о И в качестве страницы оставим index.html. Slept Sample Step pub65hHTML Publish HTML reports HTML cSr&clory 5o arc have Index pagelsj Report UK® out'allure-report © MexTitml ® HTML Report e Prtt*s«ne options-. Senerate Pipeline Script ] pubiishHTMUjaloaMissIng false atwaysLinkToLastBoild false keepAII false reportOSt 'ouValluie-report' leportFIles "index titml" repodNem» HTML Report'll Puc. 349 - генератор шага для плагина PublishHTML Нажмем кнопку «Generate Pipeline Script» и скопируем получившийся шаг в Jenkinsfile. stege(‘ОуЬликлция результатов") { steps f script { aJlurePath - tool name: , type: 'allure' ced("S{allarePath'i/W-n/slilure generate c cut'allure- report out allure") } publishHTML (|) slleHMissing: “■ alwaysLinkToLastBuild; id - , keepAll: i . reportOir: 'out di jure report", report Files: "index,И»!', report Wane: ‘КЗЧ Report’ ft) } Puc. 350 - вставка шага publishHTML в сценарий сборки После секции script вставим шаг publishHTML. И чуть отформатируем его для упрощения чтения. (Рис. 350) 239 Никита Гоызлов. Пособие релиз-инженера 1C stage('Пуб'.*'. steps f рёзулотзтов ) { script { allurePath - tool name: аПисе , type: сж1(“$-(аД1мгвР«Г!)/Ь1Л/а11иге generate ‘o oat/all re report otit/allure") } pUblishKTML target: f allohWissing: tt t alwayst inkTot rtStPuild: i s.l s ■, keepAll: 1 . ■ ■ ■, report Dir: ' пи I.;- 1 are ■ report', repoptFiles; .fi-raV, report Maae: Report’ il Puc. 351 - модификация шага публикации отчетов И выполним еще один важный шаг. Дело в том, что Pipeline Syntax для плагина Publish HTML сгенерировал сниппет, который изначально предназначен для скриптовой сборочной линии. В декларативной линии он не отработает - вы получите ошибку компиляции, в которой будет указано, что данному шагу не передан параметр target. (Рис. 351) Немного поискав в Google, вы можете найти такое решение: вместо круглых скобок в этом шаге нужно указать имя параметра target, поставить двоеточие и убрать закрывающую круглую скобку. В таком виде этот шаг отработает без ошибок. Отправим наши изменения в GIT-репозиторий. Для этого сохраним Jenkinsfile и выполним коммит. Не забудем отправить изменения во внешний репозиторий. Перейдем на Jenkins и попробуем собрать нашу задачу «trade_pipeline». 240 Silver Bulleters, LLC Дождемся окончания выполнения сборки. Откроем логи, спустимся к секции «Публикация результатов» и посмотрим, что происходит. (Рис. 352) [Pipelinej { ('Лубдика&и* результатов-} script { twl i Л..2~££ав4а1вАе,sic te|CJslave \ tools'^.yandex.qatool5.allure, jenkins.tools.AllureCcawendlinelnstallationKallo?^ on winctew$-l [Pipeline} isUrtlx (Pipeline] feat [tradejsipelineJ Running batch script C; Vwrks|^ce\jenitxns_slave\werk$p«e«\tradc_pip€lin«3'chcp 65ОЭ1 Actiw page: 6S@@1 C: \M>rfesp3ce\ jenkins~5lave\wrte£p3c.e\trade ^pipeline>-C:\«t>rkspace\jenfcins^slaveVtoaisVru.yandex.qatools.allure. jenkins .tools. AlloreCce andlinelnstallationXallure/bin/ellure generate -o oat/allure-report owt/allure Report successfully generated to the directory <out\allure-report>. Use 'allure report open* command to sh®« the report. 1ГЦЖ11ПВ1 1 (Pipeline! .// script l»ii»!iiel пчЬНчКМТЧ! [htaipufelishej] Archiving HTML reports... publisher] Archiving at PROMCT level C: \wark5pace\jenklns_5leve\workspace4trade_pipeline\out\allureTeport to rvar!5«BMjK.ho»*.’jobs/trad»jsiftlt»r > «elreportsi MTKt i»’isellss.j > (Pip#line] // stage [Pipeline] } (Pipeline] Z/‘ «1 the г edenttel s (Pipeline] } tPipeline! // «ode [Pipeline! end of Pipeline Finished; SUCCESS АОйЯаПЙЙ WM^fov^S Рис. 352 - отражение публикации отчетов в логах сборки • В первый раз Jenkins будет устанавливать на нашу Slave-ноду утилиту Allure Commandline. Скачает ее с репозитория Maven и разархивирует в подкаталог tools каталога jenkins_slave. • После установки утилиты Allure запустятся шаги allure generate • ИpublishHTML. •jjf Sack to Qashooaw <!, saws Pipeline trade_pipeline Changes 0 ceftpatt, сейчас (j aaaisnb Pipeline наСфойки Stage View fus Stage View U HTML Report Declarative: Checkout SCM Обновление тестовою контура Проверка поведения Публикация результатов Q W опроса Git 21» 36s 49s 40s 25s 36s 49s 40s ? История сборок Puc. 353 - ссылка HTML Report в окне сборки Вернемся на уровень задачи «trade pipeliпе» и откроем новую гиперссылку «HTML report». (Рис. 353) 241 Никита Грызлов. Пособие релиз-инженера 1C Рис. 354 - заблокированное содержимое для отчета Allure По этой ссылке должен отобразиться отчет Allure, однако единственное, что мы сейчас увидим - это окно загрузки. (Рис. 354) Если мы откроем инструменты разработчика Google Chrome и перейдем на вкладку «Console», то увидим большое количество ошибок, связанных с политикой блокировки отображаемого контента. Дело в том, что Jenkins по умолчанию блокирует все динамическое содержимое на отображаемых HTML-страницах - в том числе, шрифты, скрипты и загружаемые внешние ресурсы. Для того чтобы отчет Allure корректно отображался, эту защиту необходимо выключить. Сделать это можно двумя способами: Рис. 355 - вызов консоли Jenkins Первый способ - это выполнить определенный код в консоли Jenkins. Для того чтобы ее открыть, нужно в меню «Настроить Jenkins» выбрать пункт «Консоль сценариев». (Рис. 355) 242 Silver Bulleters, LLC В этом окне можно вставить определенный код, который выключит данные политики безопасности - однако это выключение продлится только до следующего перезапуска Jenkins. И второй способ - это настроить Master-узел Jenkins так, чтобы этот код выполнялся при каждом запуске Jenkins. Для этого в специальную папку на Master-узле Jenkins нужно положить файл с определенным кодом. Попробуем реализовать этот способ. fr •' +[_ Этш компьютер > Локальный диск (О) > workspace > volumes > Дате изменения Имя Тип Размер быстрей жктун .yoev/ И Р»6ямив Wfl ф Загрузжм jF g; Дс кументы * 1 ----- prints initgtocvy.d 4 log! nodes OneDnve fiine с файлами Пик» г фММк JOlK Systan32 Папка с файлами №45 csshe «sches Й53 Изображения common №55 №0 Папка с файлами ft» Папка 1 файлами К j Дата создания: I &44 S'BtJMep: 32B байт I Файлы-. !£p-!lave-agsnt-port.gfoe'jy j ■ Пало с Папка с файлами Г..plugins 17:56 Папка с файлами secrets iaaj Папка с файлами toots —J Этот компьютер Пыша с файлами Папка с файлами updates 1&4? Папка с файлами Рис. 356 - каталог init. groovy, d Перейдем в подкаталог volumes нашего рабочего каталога и откроем в нем папку jenkins (рабочий каталог нашей Master-ноды), где найдем каталог init.groovy.d (Рис. 356) Здесь располагаются скрипты, которые необходимо запускать при каждом старте Jenkins. Откроем этот каталог в редакторе Visual Studio Code. Рис. 357 - создание нового файла в каталоге init.groovy.d Создадим здесь новый файл, который назовем allure . groovy. (Рис.357) И вставим в него готовый текст необходимого скрипта: import j enkins.*; import hudson.mode1.*; import hudson.*; import jenkins.model; System.setProperty( hudson.model.DirectoryBrowserSupport.class.getName() + ".CSP", "default-src 'self1; script-src ’self' 1 unsafe-inline' 'unsafe-eval1 style-src 'self' 'unsafe-inline';" ) 243 Никита Гоызлов. Пособие релиз-инженера 1C В этом скрипте: о В текущую область видимости импортируются необходимые библиотеки jenkins и hudson о И вызывается процедура setProperty с указанием необходимых настроек безопасности. Сохраним данный скрипт. (д) шм jenkins jaawwej © Container © и gnDb.grttabJ gitUbjedisJ ©«завей ' ‘ . CONTAINER tOGS ISfO: ers-^in<fcmMisrfc.i«b.c<»rt>rxt..$M^rt;-St«ticWefe$^lica±iaM'ont*Kfc$ai?83*S.2: display ки» (fcsert Apr- м, 2ИТ 4;1S:S? ИХ ог<,£рНл<1га1ММС^.<«гИжй. wf»f^ri..A&*tr*«Applle.*t&ar»C(Xits«fJrt i»tainFw*bft*4rtF«£tQry Жз s*an *«.tory fopceMfast «*<. »«3*Arcgi#-*wrk, «*•««A.'ftKWy .%Ml»p<«rt Apr ®S» 24l£4:i§;17‘ Их ori^sprir^ft-aBKHSEjr»».feeasns-^a<£l©ry.laj^wwt.&Haalttiita&l^^FAStpry Puc. 358 - перезапуск Jenkins средствами Kitematic Перезапустим наш Jenkins. (Рис.358) Для этого откроем Kitematic, выберем контейнер «jenkins» и нажмем «Restart». Дождемся появления надписи, что Jenkins полностью поднялся. Откроем браузер, перейдем на главную страницу Jenkins, откроем задачу «trade_pipeline» и еще раз ее выполним. Дождемся окончания работы задачи. Рис. 359 - отчет Allure с результатами тестирования После завершения задачи снова откроем «HTML Report» и увидим работающий отчет Allure. (Рис. 359) 244 Silver Bulleters, LLC Здесь нам доступна наша фича «ПриходованиеТовара» Back to tratte pipeline Hndcxi mdex ГП , Allure I . X Fea; Приходование товара Гфмхбйеяайис "ЪеяраШр^дойанвй товара С Приходование товара Title * :=...; ■ ж . 1 test cases Writ» n?»>« ,, n* 1 Biekenft SOMA ■ Р«к»лд(0| BPOMOU) The lest Ms 0«о fussed! w, Duration ■ Status Steps Приходсезние товара 4?s35im$ SZZI (19.42 : й; lest started Ж Offee? i ■ s Дано Я открыл новый сеанс TesOent или оодключил уже существующий ' -« и Я закрыл все окна клиентского приложения l»ht aw ' 'S 43 3Sj И Я создаю fixtures йъХзкету ’Макет" 0 [1Э чЭ З'Н Когда Я нажимав топку командною интерфейса "Приходная накладная" ЯМ К. ' (19.4?. Л Тогда открылось окно "Приходной накладная" (19.43. .:.? И я нажимаю на кнопку "Создать" {19.43 Тогда открылось окно “Приходная накладная (созданиеГ : И я выбираю значение реквизита "Склад" из формы списка р 9 4з >| Тогда открылось ото "Склады* : z -oopse < ' •• -ЛИВ форме "Склады" в таблице Хписок" я перехожу к строй р..СДЧЙ'- ЙЩр МВТ I 1 '* ' I -:i л -. 4-л и я нажимаю на кнопку *ВыОрзть" Рис. 360 - фича «Приходование товара» и ее шаги в отчете И соответствующей ей сценарий «Приходованиетовара» (Рис. 360) 245 Никита Гоызлов. Пособив релиз-инженера 1C Раздел 11. Отчеты по тестам - BDD 11.1. Конфигурирование Jenkins - подключение Cucumber Reports Отчет Allure позволяет красиво отображать результаты проверки наших сценариев, однако он имеет один существенный недостаток - он не позволяет анализировать успешность выполнения тех или иных сценариев во времени. Накопление статистики по выполнению сценариев и некоторые другие возможности предоставляет плагин Cucumber Reports. Фреймворк ADD умеет выгружать результаты выполнения сценариев в формате для этого отчета. Рис. 361 - установка плагина Cucumber Reports Для подключения в Jenkins нам необходимо установить новый плагин. Перейдем на главную страницу Jenkins, откроем «Настройки» - «Управление плагинами» и перейдем на закладку «Доступные». Найдем плагин Cucumber Reports, отметим его к установке и установим его без перезагрузки. (Рис. 361) Откроем Pipeline Syntax, выберем шаг «step» и нажмем кнопку «Generate Pipeline Script». (Рис.362) Steps Sample Step step: General Build Step Build Step ............................ ........ _.. ........................... Cucumber reports Puc. 362 - генерация шага для Cucumber Reports Генератор должен выдать текст примерно следующего вида: 246 . ® Silver Bulleters, LLC step( [$class: 'CucumberReportPublisher'] , jsonReportDirectory: 'out/cucumber') filelncludePattern: '*.json', Стоит заметить, что генерируемый код зависит от версии Jenkins и версии плагина Cucumber Reports. У вас сгенерированный фрагмент кода может отличаться. В любом случае, сгенерированный фрагментэто то, что будет нам нужно. На этом, наш Jenkins готов к подключению нового шага в сборочную линию. 11.2. Сборочная линия - публикация результатов Cucumber Reports Для публикации результатов в формате Cucumber Reports в нашей сборочной линии нам нужно выполнить следующие действия: • Указать, что нужно формировать данные для отчета Cucumber Reports; • Ив сборочной линии создать шаг для формирования этого отчета. Перейдем в редактор Visual Studio Code. VBParamvpon • { “ВыполнмтьСценарии*: i “ЗавершитьРаботуСистсчы": i! , "ЗэкрьпьТеъГС! (егИЛослраапускаСценармев"*: “КаталогФич": , ;>4 \paceRoot/1 eatu«"es“, ’КзталогиБиблкотек*: [ ”./features/libraries" ]. "ДелагьОтчегВборматеДялкр**: ■, 5 засеко ?- "К.аталогОи1риТА11игеЬазоомй'': "ВыгружатьСтатусВыполменияСцеиармввВФайл*: slJuro", , "ПутьКСайлуДляВыгруэкиСтатусавыполирнинСценариея”: •’Jworksp.r ef ”Демть0тчете«орматеСиситЬег)5вп": . ' л • г>ц; Щ;- лгц ч. log", ., ’’KaiaflcrOutputCuCLWtberT'.on": “S«or>lespatpRoe’ /out/eucuRiber" } Рис. 363 - настройка параметров в файле VBParams Откроем файл VBParams.Здесь нам необходимо добавить два новых ключа. (Рис. 363) • Первый - это флаг необходимости формирования отчета в формате Cucumber.json - ключ для этой настройки звучит, как ДелатьОтчетВФорматеСиситЬегДБоп. Значение — true. • И второй параметр - это КаталогОиТриЁСиситЪег Json. к каталогу качестве его путь В результатов. значения Ключом укажем является конструкцию: $workspaceRoot/out/cucumber. Сохраним изменения. 247 Никита Грызлов. Пособие релиз-инженера 1C stage('Публикация результатов ) {! steps { script { • allurePath - tool name: .illr-', type: ' .u-e' о out/a; iure-report out/allure") ced( "J{allurePatf5}/bift/allwre generate } publishHTML target: [ allowMissing: alwaysLlnkToLastBuild: *'» 1 , keepAII: fr 1 reportOir: 'out allure■report', reportFiles: ' index.‘i’.nil', reportNene: ‘HTMl Report' step<[ Sclass: ' cucur,oc-*«cportPublis--er', filelntludePattern: . j' r , jsoflfteportDirectory: 'out/cix .;oi.rr ]) } a } ) Puc. 364 - вставка сгенерированного шага в скрипт сборки Перейдем к редактированию Jenkinsfile. В стадию публикации результатов добавим новый шаг для генерации отчета. Как вы помните, это шаг step, (Рис. 364) которому передаются параметры: • Имя класса — CucumberReportPublisher, • Маска файла с результатами - * . j son • И каталог, где их необходимо искать - out /cucumber. У плагина Cucumber Reports есть несколько дополнительных настроек, которые вы можете указать, передавая параметры данному шагу. Ключи этих настроек можно будет найти в репозитории, где разрабатывается этот плагин. 0 «т | |О Добавили шаг Cucumber reports Р ИЗМЕНЕНИЯ 2 * ienkinsfile « VBPaiams.json t Рис. 365 - фиксация изменений в Git Сохраним изменения и зафиксируем их. (Рис. 365), после чего отправим изменения в репозиторий GitLab. Откроем Jenkins, перейдем в нашу задачу и соберем ее. Дождемся ее выполнения. (Рис. 366) 248 Silver Bulleters, LLC {Pifjeline} // script pwfelb»on [hwlpublisher] Archiving HTML reports.«. [btslpufelisher] Archiving at PROJECT level C:\workspsce\jenfeins_slave^orkspace\tre«Je_j?ipci£ne\wt\ell«re-report to / var/jenfcins_ho.ae/ jobs /trade_pipel i rte Zhtal reports /ИТЖ_Йеро rt st«$» [CucueberReport] jpreparing Cucoaber Reports (Csc«berR.eport} Copied 1 json files f«» workspace rt€; XworkspaceAjenfeio5_slave\»rfespace4trade_pipeline\out\ci&cunifeer“ to reports directory ”/vaг/jeokins_bcзae/jobsZtrade_pipeliлe/Ыsild■s/12Zcuculйer-hшl-reports1/.£&che’, (CsscuebertSeport] Processing 1 json files: (CiKuaber^eport] /v«r/jenkins_hoflB«/johs/tr*ck_pip«Hfte/feuilds/l2/cucu»ber-ht«l-reports/, e at he/Cucumber 3 son, j son (Pipeline] } pipeline) // sttage (Pi|»n.R«3 } [PipeUr-j // «iti sOerfeetiJ [РЙеИМ ] (Pipeline] // nosh End И Pipe Use Finished: SUCCESS Puc. 366 - отображение публикации отчетов в логах сборки Jenkins Jenkins Iractejspetbe I wy | Back to Project <3^ Status "S Changes И Вывод консоли "(i Ed# 3uiM information удалить сборку / ф Git Buna Daa / О No Tags F p) Ctjcumber юроуа 'a* Pipeline steps ■Ц Previous BuBd Рис. 367 - новая ссылка на отчет в панели навигации Если мы откроем задачу, на панели навигации мы увидим новую ссылку «Cucumber reports». (Рис.367) Перейдем по ней. На данной странице мы можем видеть различную статистику по сценариям поведения, пройденным, упавшим, диаграмму выполнения тестов во времени и пр. (Рис.368) Рис. 368 - примеры отчетов Cucumber Reports 249 Никита Грызлов. Пособие релиз-инженера 1C На закладке «Steps» посмотреть используемые шаги; На закладке «Tags» посмотреть используемые метки и отфильтровать фичи по ним. На закладке «Failures» увидеть список упавших сценариев. Cuctmsfter Report Jemans Project Number Latest resafe Prevo» resuW Features Tags Steps Trends Fames Date . «Apr 29.7^2 Feature Report t * s,,!” Feature Г«‘“ ПриходованиеТовара ( F.«ur,S *ЯМПС" Fa,,.» йгрр.» Pending Undefined Total Passed Failed Total о о 0 0 26 1 0 1 Ouration j Status 12s 438ms j passes F.ature ЛргодаижкТмара Scenano Приходоезние rsatpa v дан» я оиЩл ноем? «даг '7«sse>t «к naowwt «п^мкяммр Когда Я н^жмаю кнопку командного тогда ощыпиь «не "Прихааная ш Иянахимкхатоеаг-Сгяарл,Тогда m.pvKics. ото "Приказ- И й бьй§йрз» значение регжшта 'тЗтад* мфорыь? списка И, если выполнить нашу сборку несколько раз, то на закладке «Trends» можно будет увидеть историческую информацию по прохождению сценариев. 11.3. Конфигурирование Jenkins-подключение Pickles Отчеты Allure и Cucumber Reports в первую очередь предназначены для оценки состояния прохождения сценариев - для понимания, насколько стабильна наша сборка и где у нас проблема. Исследовать имеющиеся фичи в таких отчетах тяжело и конечные пользователи, скорее всего, запутаются. Для изучения возможностей вашего продукта можно воспользоваться инструментами, которые предоставляют так называемую «живую документацию» - генерацию статических или динамических сайтов на основании имеющихся feature-файлов. Мы рассмотрим два таких инструмента: • Первый - это Pickles, инструмент, написанный на C# и доступный только для Windows, • И второй - это родной для Jenkins плагин Cucumber Live Documentation. Установка Pickles Установку Pickles можно произвести несколькими способами: • Этот инструмент доступен для установки на Windows с помощью пакетного менеджера choco, и вы можете добавить в ваш Jenkinsile подготовительный шаг по его установке на любую ноду. • Также Jenkins имеет несколько плагинов, которые позволяют загрузить произвольный zip- файл и распространять его на Slave-агентах. • 250 Но мы возьмем более простой вариант - это установка Pickles напрямую на Slave-агента. Silver Bulleters, LLC https//gitbub.cora/picKesd&c/picl<ies/feleas«s • Fix localisation of “Examples" in Scenario Outlines (440) (by ©dirkrombauts) • Make ExdudeTags available to MSBuild (444) (by ©dirkrombauts, based on an idea by ©pfeveffl) Downloads ЗЛ9М8 Puc. 369 - страница скачивания Pickles Откроем на GitHub репозиторий инструмента Pickles - https://github.com/picklesdoc/pickles. И перейдем в секцию «Релизы». Из последнего релиза скачаем zip-архив (Рис.369) Откроем данный архив и распакуем его в предсказуемое место, например, в свой рабочий каталог, в подкаталог jenkins_slave и уже имеющуюся здесь папку tools. Создадим здесь новый каталог pickles и извлечем содержимое архива в созданную папку. X Изменить переменную среды ------ --- -————•-- —--- =•------------ ---- 5. „--- -------------f,...... СЛРгрдит Files\Bocker\Docfcer\R«euree3\b«n Создать C:\PTogremDati’. 0racle''.Je',a'.jev»p4th %SystemRoot^\systera32 ■SSyUerwRootS Изменить , Обзор... %SystemRoot%\System32\Wbem %SY5TEMf®OT%\Sy,stem3AWindowsPowet5Siell\vt.J^ C:\Progwn Files txS6)\0neSenpt\b«n C:\Program Files (ri$6)\Grt\cmd | C:\wofkspa<e\jenkins_slave'itoek\p«efcies Удалить ШННШННШ Вверх Вниз Изменить текст... ОК Отмена Рис. 370- добавление Pickles в переменную PATH Для упрощения доступа к утилите pickles. ехе добавим данный каталог в переменную среды path. • Откроем «Свойства компьютера» - «Дополнительные параметры системы» - «Переменные среды», • Выберем системную переменную path и добавим сюда новую строку. Сохраним изменения. (Рис. 370) И для того, чтобы наш Slave -агент подцепил изменения переменной среды path, перезапустим наш стартер агента Jenkins - закроем активное окно Slave-агента 251 Никита Грызлов. Пособие релиз-инженера 1C па Средней рабеть,- с Рис. 371- перезапуск stave-агента А потом запустим его снова. (Рис.371) В зависимости от настроек используемой операционной системы такого действия может быть недостаточно. Если при запуске задачи на Jenkins вы увидите сообщение о том, что путь к утилите не найден в переменной path, выйдите из системы и зайдите в нее заново. Убедимся, что утилита Pickles работает. Откроем командную строку и выполним команду: pickles -v В выводе команды должна отобразиться версия инструмента. Установка Cucumber Living Documentation Plugin В заключение установим плагин, который будет генерировать живую документацию на основании имеющихся данных Cucumber Reports. Рис. 372-установка плагина Cucumber Living Documentation Откроем Jenkins, перейдем в «Настройки» - «Управление плагинами» - «Доступные» и найдем плагин «Cucumber Living Documentation Plugin». Установим его. (Рис.372) Данный плагин также не предоставляет готового шага для использования его в сборочной линии, однако мы вполне успешно сможем использовать генератор сниппетов для получения готового кода с помощью универсального шага «step». 252 Silver Bulleters, LLC 11.4. Сборочная линия - публикация результатов работы Pickles Сформируем строку запуска для Pickles. (Рис.373) C:\workspace\git\tradejpickles --help |Pickles version 2.15.0.0 -f, --feature-directory=VALUE directory to start scanning recursively for features -о, - - out put - dir ect or у=VA LUE directory where output files will be placed --trfmtл --test-res ults-format=VALUE the format of the linked test results (nunit | nuriitB |xunit |xunit2|mstest |cucumberjson|specrun|vstest) --lr, --link-results-file=VALUE the path to the linked test results file (can be a semicolon-separated list of files) --sn, --system-under-test-name=VALUE the name of the system under test - -sv, - -system-under-test - version=VALUE the version of the system under test -1, --language=VALUE the language of the feature files --df, --documentation-format=VALIJE the format of the output documentation -v, --version -h, -?, --help - -exp, --include-experiment a1-feat u r es whether to include experimental features --cmt, - -enableComments-VALUE whether to enable comments in the output --et, --excludeTags=VALUE exclude scenarios that match this tag C:\workspace\git\trade>_________ . Puc. 373-встроенная справка pickles Откроем в нашем репозитории trade командную строку и для получения справки по использованию Pickles выполним команду: pickles --help Нам необходимо заполнить несколько обязательных параметров: • -f - Путь к каталогу, где лежат feature-файлы, • -о - Путь к каталогу, где будет лежать наша живая документация, • -1-языкфич, • --df-формат документации • И один необязательный - это - - sn - заголовок страницы. Наберем в командной строке pickles и начнем заполнять параметры: • Для указания пути к фичам используем параметр -f и имя папки, где располагаются фичи features. • Для выходного каталога указываем параметр -о и путь, например, out/pickles. • Для указания языка добавляем параметр -1 и язьж ru- русский. • Pickles позволяет выводить данные в нескольких форматах. Наиболее функциональный из них - это dynamicHTML. Для указания формата dynamicHTML добавляем параметр - -df и значение dhtml. • Последнее - зададим заголовок нашей страницы, указав параметр --sn и в кавычках "Trade". Выполним команду: 253 Никита Грызлов. Пособие релиз-инженера 1C pickles -f features -о out/pickles -1 ru --df dhtml --sn "Trade" В нашем каталоге в папке out появился новый подкаталог pickles, в котором мы можем открыть файл lndex.html. (Рис. 374) сгруппированы по папкам, здесь будет строиться иерархическое меню. • И справа представлен выделенный feature-файл с подсветкой синтаксиса для ключевых слов и таблиц и разделением на блоки: о Контекст; о Сценарий; о И, если в вашей фиче будут использоваться теги, они также отобразятся здесь. В данной живой документации также есть возможность фильтровать по имеющемуся feature-тегу или по имени фичи. Перенесем текст команды по генерации документации Pickles в Jenkinsfile: (Рис. 375) • В стадию «Публикация результатов» добавим новый шаг cmd и вставим туда получившуюся у нас команду • 254 Не забудем добавить экранирование кавычек вокруг заголовка нашей страницы. Silver Bulleters, LLC stage(‘flybfw u»»« p4’3yfls,r.iioa') { steps { script { allurePatb >- tool name: аПич*, type; ";<ЦоЛ‘ cmd<"S{al,|,MpePatb}/Bift/alXure .generate -o eutMtSttpe-report out/a Hurt") } publishHTML target: [ allowMisslng: • -C ?, t, alwaysLiiikToiastBuiJd* 1-1 keepAll: i . , reportDir: 'out/;.lure report', reportFiles: , reportNpee: ' • Report* 3 step([ $ cla s s; ' Cue usbe ? ■ ft « sort Pub1i sь r ’, filelncludePattern: Is , jsonReportDirectory: ’-oi.-tA 3) £«d( ' kh-S -1 ft»* v о i . , • 1!«. 1 ft t-M JhJAt -SR s'Trady } Puc. 375 - вставка шага генерации документации с помощью pickles Данный шаг сформирует нам HTML-страницу, однако для того, чтобы она отобразилась в результатах работы Jenkins, ее необходимо опубликовать. Сделать это можно с помощью шага publishHTML, однако плагин Publish HTML не позволяет публиковать результаты два раза. Для того чтобы опубликовать и результаты отчета Allure, и живую документацию от Pickles, мы можем воспользоваться имеющейся в плагине Publish HTML возможностью публикации нескольких страниц. Для начала перенесем наш шаг стадо publishHTML. Для шага publishHTML скорректируем два параметра: (Рис. 376) • reportDir - путь к каталогу, где лежат данные, которые необходимо опубликовать- укажем в качестве значения параметра каталог out; • И reportFiles - список файлов. Укажем здесь: о Путь к результатам отчета Allure - allure-report/index.html о И через запятую путь к результатам отчета Pickles-pickles/lndex.html. 255 Никита Гоызлов. Пособие релиз-инженера 1C st»ge('Луб.'i’;. реяульип . ) { Steps { script { , type: ’ii.te*' allurePath • tool пая»; c»d(.rs.lurrPist'. >/ah/allMre generate г eet’>lkr?-«|»<-: wi i lure") } ciwJ('pi rides ’ ipeture о pet/pickh r. 1 ru - -df .rfbtftl --sn '"Trade\""} publishHTML target: [ alloHttssing: зIwaysLink hsLastBuild: t ilь2, keepAll: false, reportDir:. J’aut;., report Files: ‘ ’allure- report/ index ,д~ el, oi cfcles/i^jfe ,btal’, report Наше: *HIKL Report" J Step([ Sclass: * Cueuefeifr^eportPubi isher', filelneludePattern: *,json', jsonReportOireiTory: ’put/; J) } > Puc. 376 - правка параметров вызова publishHTML Обращаю ваше внимание, страница index.html в каталоге pickles начинается с большой буквы. Есть некоторая неоптимальность в получившемся шаге публикации. Такой вызов шага publishHTML заархивирует всю папку out вместе с buildstatus.log и прочими файлами, которые там могут находиться. Для сокращения данных переместим выходные каталоги allure и pickles в дополнительный служебный подкаталог publishHTML. (Рис. 377) • Укажем в качестве reportdir каталог out/publishHTML; • И скорректируем вызов allure generate, указав ему в качестве выходного out/publishHTML/allure-report. • 256 И вызов pickles out/publishHTML/pickles. каталога Silver Bulleters, LLC • Puc. 377 - изменение пути публикации отчетов И, наконец, добавим шаг с плагином живой документации. Перейдем в Jenkins, откроем страницу Pipeline Syntax: • Выберем шаг «step» • В качестве параметра «Build Step» укажем «Living Documentation». В параметре «Features dir» нам необходимо настроить путь, по которому лежат результаты в формате cucumber. j son — укажем здесь путь out/cucumber (Рис. 378) Рис. 378 - генерация шага вызова «живой документации» После чего, нажмем кнопку «Расширенные» для отображения остальных параметров данного плагина. 257 Никита Гоызлов. Пособие релиз-инженера 1C Advanced Option» wwtog йиаявййяНИ® 1йЯЙ к byword i_J #«£ 'K*n#fi© RWiM Hfafe step &ю $*t<№ к»й»йв W*»« Ц »» w«, Hi* tegi» » Puc. 379 - расширенные настройки публикации Здесь мы можем указать: (Рис. 379) • Заголовок гиперссылки, которая у нас появится по результатам работы данного шага; • Формат; • Расположение оглавления (например, слева); • А также настроить некоторые дополнительные параметры отображения. Нажмем кнопку «Generate Pipeline Script» и перенесем данный шаг в наш Jenkinsfile. (Рис. 380) Рис. 380 - вставка шага публикации в Jenkinsfile Осталось поместить наши изменения в Git и отправить их на сервер GitLab, как мы делали это ранее 258 Silver Bulleters, LLC После отправки изменений перейдем в Jenkins, откроем нашу задачу и соберем ее командой «Собрать сейчас» в панели навигации. Дождемся окончания сборки. После выполнения задачи обновим страницу и откроем гиперссылку «HTML Report». Здесь мы видим, что появилось две отдельных закладки: (Рис. 381) • Для Allure; • И для работы с Pickles. На странице Pickles/lndex отображается живая документация, которую сформировал этот инструмент. Рис. 381 - живая документация Pickles в результатах сборки Jenkins Вернемся в нашу задачу и нажмем на новую гиперссылку «Living documentation». TfeSsts ТаЫе of Co ntents Living Documentation 1. Summary 2. Features 2,1, ПриходованиеТовара 2.1 J, Scenario: (Fites ■. Summary Scenarios ■й Features: 1 Steps Passed Failed Total Passed Failed Skipped Fending Wefe»t Missing Total 1 0 1 26 0 0 0 0 0 26 Duration Status 14s passed 222ms Totals 1 0 1 26 0 0 $ 0 0 26 Ms 222ms Рис. 382- результат работы плагина Living Documentation По этой ссылке отображается страница, которую сгенерировал плагин Cucumber Living Documentation. (Рис.382) Здесь также имеется: • Оглавление со списком фич и их сценариев, • Есть общая информация о прохождении всех сценариев. • И сами сценарии. (Рис. 383) 259 Никита Грызлов. Пособие релиз-инженера 1C Tab's of Contents 1. Summary 2. Features 2. Features 2.1. Приходованиетовара 2.1.1. Scenario; Приходовав» товара 2.1. Приходованиетовара 2.1.1. Scenario: Приходование товара ь Я открыл новый сеанс TestCliem или подключил уже существующий Л (KssTSQms) И Я закрыл все окна клиентского приложения й (022ms) II Я создаю fixtures по макету "Макет" «А Рис. 383 - описание сценария в Living Documentation Такими несложными действиями вы можете предоставить вашим пользователям постоянную актуальную документацию по вашей системе. 260 Silver Bulleters, LLC Раздел 12. Тестирование кодом - xllnitForlC, TDD 12.1. Прогон тестов, в т.ч. и дымовых тестов, с помощью продукта Vanessa-ADD Подсистема «Тестирование кодом (xllnitForlC, TDD)», наследник xllnitForlC, из ADD (Раздел 10 выше) так же, как и подсистема «BDD» в ADD, имеет возможность запуска из командной строки. Например, vrunner xunit -settings tools/vrunner.json В качестве браузера тестов выступает обработка xddTestRunner. epf Одной из особенностей подсистемы является возможность простого запуска дымовых тестов. Базовые «дымовые» тесты - это такие, для которых не требуется написание сложного кода или выполнить перестройку схемы разработки конфигурации 1C. Тесты удобно использовать перед выпуском релиза/обновлений конфигурации и/или перед установкой релиза/обновлений в рабочую базу. В настоящий момент поддерживается два вида дымовых тестов, реализованных отдельными обработками: • Дымовые тесты открытия/закрытия форм объектов метаданных • Дымовое тесты ввода документов на основании Дымовые тесты открытия/закрытия форм объектов метаданных Данные дымовые тесты проверяют открытие/закрытие различных форм с учетом прав доступа (права "Использование/Просмотр") для пользователей с различными ролями (полные или ограниченные права). Проверяются следующие виды наиболее активно используемых форм: • формы списков и формы выбора справочников • форма элементов справочников • формы списков и формы выбора документов • формы документов • формы отчетов • формы обработок Также для каждого справочника проверяются 3 дополнительных теста с учетом прав доступа (права "Просмотр/Интерактивное добавление"): • создание нового элемента и открытие его формы (тип проверки "Новые") • копирование существующего элемента и открытие формы созданного элемента (тип проверки "Новые") • открытие формы существующего элемента (тип проверки "Существующие") 261 Никита Гоызлов. Пособие релиз-инженера 1C Для каждого документа проверяются 3 дополнительных теста с учетом прав доступа (права "Просмотр/Интерактивное добавление"): открытие формы существующего документа (берется последний по дате) (тип проверки • "Существующие") перенос существующего документа на текущий день и открытие формы этого документа (тип • проверки "ПереносНаДату") открытие формы нового документа (тип проверки "Новый") • Дымовое тестирование ввода документов на основании Данная обработка может быть использована и в тестах, написанных для подсистемы «Тестирование кодом (TDD)», так и подсистемы «Проверка поведения (BDD)». Запускать данный набора тестов рекомендуется базе данных в которой уже есть заполненные документы. Использование готовых дымовых тестов Нам нет необходимости писать собственную реализацию дымового теста, мы можем воспользоваться его готовым вариантом, который лежит в каталоге тесты_ОткрытиеФормКонфигурации.epf tests, подкаталог и обработка smoke (ее исходный код можно найти в этом же репозитории в каталоге src/tests/smoke). Попробуем сформировать строку запуска фреймворка для запуска дымовых тестов. Самый простой, удобный и быстрый способ автоматического прогона тестов это запуск через Vanessa- Runner. Откроем редактор Visual Studio Code, в нем откроем интегрированный терминал, и получим справку по инструменту Vanessa-Runner. Выполним: aillill help vrunner ~ , > '7-7'; F- .-- > i iilfc............. <1:1114:,= .. '"’‘«iieii (iitlili Видим результат: vanessa-runner vl.1 . 0 Возможные команды: help Вывод справки по параметрам --help Вывод справки по параметрам version Выводить init-dev необходимых к путь указываем версию по update-dev ~~~ базу пустую данных для выполнения ... тестов. получаем . | приложения инициализируем указываем и версию ‘'У‘~ исходниками с конфигурацией, платформы, которую хотим пути build\ib готовую базу обновляет - пустую использовать, для базу тестирования, данных для выполнения необходимых тестов. путь указываем версию и получаем compileext updateext 262 к указываем по исходниками конфигурацией, которую хотим build\ib готовую базу пути - с платформы, использовать, для тестирования, загружаем расширение в конфигурацию из обновляем расширение в ИБ папки исходников Silver Bulleters, LLC decompileext ш -.iii decompileepf - разбираем из обработки на внешние исходники в конфигурации исходники штатно через 8 .3 1C выгрузку разбираем расширение ; В выгрузки каталоге создается подкаталог отдельный для каждой внешней обработки структура Сохраняется подкаталогов, если выгружаем каталог xunit - Запуск тестирования через фреймворк ADD.xUnitForlC vanessa - Запуск тестирования через фреймворк ADD.vanessa-behavior Как вы видите, одна из команд для Vanessa-Runner-это xunit, запуск тестирования через фреймворк ADD.xUnitForlC. Получим справку по этой команде. Для этого выполним help vrunner xunit Результат: vanessa-runner vl.1.О xunit Запуск - через тестирования фреймворк ADD.xUnitForlC Параметры: <testsPath> или [env - встроенным к если указания варианты Возможные RUNNER_TESTSPATH] тестам, к Путь указан явно или каталогу конкретного подсистемы или к файлу с тестами --config-tests. ключ теста: Метаданные.Подсистемы.Тестовая Метаданные.Подсистемы.Тестовая.Подсистемы.Подсистема1 Метаданные.Обработки.Тест --workspace - [env RUNNER_WORKSPACE] путь к умолчанию по --config-tests - которой будут определятся текущий. [env RUNNER_CONFIG_TESTS] конфигурации в указанную подсистему --pathxunit - [env RUNNER^PATHXUNIT] в относительно папке, $workspace. макросы пакете путь загружать к внешней тесты, встроенные обработке, по в умолчанию ищу add --reportsxunit --reportsxunit - параметры формирования отчетов в формате вида: ФорматВыводаОтчета{Путь к файлу отчета};ФорматВыводаОтчета{Путь к файлу отчета}... Пример: reHepaTopOTneTaJUnitXML{build/junit.xml};reHepaTopOT4eTaAllureXML{build/all ure.xml} Пример (англоязычный вариант): GenerateReportJUnitXML{build/j unit.xml};GenerateReportAllureXML{build/allur e. xml} --xddExitCodePath статус Внутри - --xddExitCodePath путь к текстовому файлу, обозначающему выполнению. строка-значение файла --xddConfig --testclient Путь - к 0 (тесты пройдены), конфигурационному Параметры подключения к файлу 1 (тесты не пройдены) xUnitForlc тест-клиенту вида --testclient ИмяПользователя:Пароль:Порт Пример 1: --testclient Администратор:пароль:1538 Пример 2: --testclient ::1538 реквизитами менеджера (клиент тестирования будет запущен с тестирования) 263 Никита Гоызлов. Пособие релиз-инженера 1C - --reportxunit --additional --no-wait - --xdddebug - --ibconnection Например, Или для -db-user --db-pwd - 1 может завершать Не - Строка серверных Пароль - в прогоне БД тестов после (/FfilePath или --ibconnection /FC:\basel выполнения /SserverPath) или - -ibconnection /Fbasel /Sservername\basename БД Sh ч По применяться Предприятие при 1C:Предприятие к предприятия, команды/действия БД Запуск клиента). сообщения --ibconnection баз Пользователь запуска для запущенной работу баз (устарел) jUnit отчетом подключения файловых для с параметры завершения --ibconnection --ordmaryapp указания каталогу отладочные Выводить - no-shutdown или к ожидать Не /F./basel путь Дополнительные - в толстого = толстый, 0 = умолчанию используется значение 0 (тонкий случаях, клиента когда (1 нужно прочитать лог тонкий работы клиент, клиент). 1C в -1 = без Значение режиме управляемом интерфейсе. Как следует из описания, для запуска тестирования через фреймворк нам необходимо указать: • Один обязательный параметр - путь к каталогу или файлу с тестами или путь внутри конфигурации • А также несколько служебных: о - -workspace -каталог проекта, относительно которого будут вычисляться все пути всех файлов о - -reportsxunit - специальная строка запуска для получения результата тестирования в требуемых форматах. о -- xddExitCodePath - путь, куда будет выгружаться статус прогона наших тестов; о А также - -xddConf ig- путь к специальному конфигурационному файлу. В будущем мы будем использовать его для настройки исключений из дымовых тестов. Попробуем сформировать корректную строку. Напишем: vrunner xunit $addroot/tests/smoke --reportsxunit 'TeHepaTopOT4eTaJUnitXML{out/junit.xml}" --xddExitCodePath ./out/junitstatus.log --ibname "/Slocalhost\trade_bdd" Где: • Укажем идентификатор команды xunit. • В качестве браузера тестов будет автоматически подставлен путь к обработке xddTestRunner. epf из каталога установки ADD. • В качестве пути к каталогу с тестами будем использовать абсолютный путь $addroot tests/smoke. о Служебная переменная $addroot означает путь к каталогу установки ADD. • В качестве параметра --reportsxunit будем мы использовать настройку ГенераторОтчетаЛЛпЛХМЬ. Мы можем скопировать ее прямо из примера. Не забудем заключить данную строку в двойные кавычки: "Генератор0тчетаЛ1п1ЬХМЬ{out/junit.xml}" • Для параметра --xddExitCodePathукажем путь к файлу ./out/junitstatus . log • Последним параметром укажем строку подключения к базе данных: параметр - -ibname и в двойных кавычках строка "/Slocalhost\trade_bdd" 264 Silver Bulleters, LLC Запустим получившуюся командную строку. С помощью Vanessa-Runner запустилась сеанс 1С:Предприятие с передачей параметров для обработки xddTestRunner, почти незаметно для нас открылись и закрылись все формы конфигурации и в каталоге build/out у нас появился файл junit.xml (Рис. 384). Ktestsuites nMe-''c:\woricspace\git\xunitforIc\test5\snoke’ ti«e»“e.8?7“ tests»"!’ -failures»"??" errors»"О" skipped-"©’:* xtestsulte naee-"c:\Morkspace\git\xunltforic\tests\ssoke"> navLttnl ma ■* ЯУИ)£ <test suite гииве»“тесты_Отк{жпш»а>ор«Кон^игураиии"> _______________________________________________________________________________ <test suite паае»’¥пр®орма ж теспН5тхрытиеФор*«онфигураий»"> 'testease classnjrase-’znpeopm « тесты^?тк5тяеФорм(Со*фж'у|>амй»и паяе-’ТесгДаймн^Проаерйть&агПлзтфо^^жОт «tested»» classn«se»"ynp»op«a тесты_й«(фьйМ»Иор«Ко<1ф«гздш^»<’’ name-"Новые ; Документ ,Орй<Сйма«Наядадная.® <testcase с1а55паве«"УпрФор«а # тесты_0ткрутиеСадр«Конфигур4ции" папге-’Сувестаущие : Документ.Приходиамйакл </testsuite».: ■ , . . -<- ■ 0/tsstSoft«0 </testsultes> joratstatusJog xuratstatirsiog Puc. 384 - содержимое файла junit.xml Здесь мы видим три тестовых случая: • Открытие формы нового документа «ПриходнаяНакладная» • Существующего документа «ПриходнаяНакладная» • И отдельный тестовый случай, проверяющий, что у нас в процедуре «ПриОткрытии» есть исключение 12.2. Конфигурирование дымовых тестов В реальных конфигурациях часто встречаются формы, которые не должен открывать пользователь - это либо какие-то служебные обработки, либо документы, которые можно создавать только на основании других и прочее. Обычно в таких формах при открытии либо вставляют вызов исключения, либо закрывают форму безусловно с показом сообщения. Такие формы в дымовом тестировании будут отображаться как упавшие. 265 Никита Грызлов. Пособие релиз-инженера 1C Для того чтобы исключить некоторые формы из дымового тестирования, есть возможность создать специальный конфигурационный файл исключений. Пример настройки такого файла можно посмотреть в репозитории ADD: { "smoke": { "СтрогийПорядокВыполнения": "СпособГруппировки": true, "ПоВидуОбъекта", "ИсключитьФормыЗависящиеОтОтключенныхФункциональныхОпций" "ВыводитьСообщенияВЖурналРегистрации": "Справочники": "Списки": : true, true, { [ "ПростойСправочник.Форма.ФормаВыбора" ] , "Новые": [ "ПростойСправочник2" ] , "Подчиненные": { "ПодчиненныйСДвумяВладельцами": "ПростойСправочник2" К "ЗначенияРеквизитовНовых" : { "СправочникСОбязательнымРеквизитом": "ОбязательныйРеквизит": "Привет, { Мир!" } } }. "Документы": "Отчеты": false, [ "0тчет1" ] , "Обработки": [ "xddGuidShow", "ТестОбработка_Форма_ИсключениеПриОткрытии", "СериализаторМХЬ.Форма.УправляемаяФорма" ] } } Откроем репозиторий и перейдем к файлу smoke. example . j son В этом файле в формате JSON представлена простая настройка для плагина дымового тестирования "smoke". Здесь заданы исключения для открытия форм списков и форм новых: • • 266 У справочников; о ПростойСправочник - о ПростойСправочник2 - не открывается форма списка не открывается форма нового элемента Также здесь заданы исключения для открытия форм некоторых отчетов и обработок Silver Bulleters, LLC Попробуем исключить одну из наших форм из тестирования. Вернемся в редактор visual studio Code и создадим в каталоге tools новый файл. Назовем его xUnitParams.json. Например, исключим из дымового тестирования форму создания нового документа «ПриходнаяНакладная». Сформируем JSON-файл. Сохраним файл. Попробуем модифицировать запуск дымового тестирования: vrunner xunit $addroot/tests/smoke --reportsxunit 'TeHepaTopOTueTaJUnitXMLfout/junit.xml}" --xddExitCodePath ./out/junitstatus.log --ibname "/Slocalhost\trade_bdd" --xddConfig ./tools/xUnitParams.json Для указания пути к конфигурационному файлу xllnitForlC служит параметр - -xddConfig. Допишем в нашу строку запуска - -xddConfig и путь к данному файлу - . /tools/xUnitParams. j son. Запустим дымовое тестирование еще раз. ES$ EE jut&Jtml ctestsuites па«е-’Ч AwsHcspaceXgitXxunitforlcVtestsXsmoke “ tine*“0,679“ tests-"2** failures* errors* "a*’ skipped* " 0 ” > ctestsuite na»e-"c:\workspace\glt\xunitfori£\tests\s»oke~> ctestsuite паве* Упр«орма f тестм ОткрытиеФо|^<омф*(гурацми"> j документ,Прйходиаятоф) ctestcase с1а5&паве-"УпрФорма Л тесты_Откр«тмрЭор^Конфигурацми*' папе*нТестДолжен_Проаери?<^агПлатформмПр»Ютк| </testswite> 13 to- Л®/'-/!/• В В </testsuite> <ytestsuit«5> Рис. 385 - файл результата тестирования После завершения тестирования откроем файл junit. xml (Рис. 385) и убедимся, что для документа «ПриходнаяНакладная» тестирование формы нового документа больше не производится. Подобным образом и вы сможете исключить все служебные объекты, не предполагающие непосредственного открытия. 12.3. Конфигурирование Jenkins - Подключение junit reports Для публикации отчета в формате jllnit нам понадобится плагин jUnitReports. Обычно, если вы устанавливали Jenkins по варианту «Установить предложенные плагины», он у вас уже установлен. 267 Никита Грызлов. Пособие релиз-инженера 1C Рис. 386 - плагин JUnit Plugin Убедиться в этом можно, открыв Jenkins, вернуться на главную страницу, перейти в «Настройки Jenkins», и выбрать секцию «Управление плагинами». И на вкладке «Установленные» найти плагин JUnit Plugin (Рис. 386). Если в списке установленных вы видите этот плагин, значит, ваш Jenkins уже сконфигурирован. Если не видите, тогда его необходимо установить из закладки «Доступные». 12.4. Сборочная линия - Запуск xUnitForlC Перейдем к настройке Jenkinsfile. Откроем в редакторе Visual Studio Code наш Jenkinsfile: • Добавим новый stage (' Дымовое тестирование') • Укажем обязательную секцию steps • Для отображения времени выполнения обернем шаги в timestamps • И вызовем шаг cmd, куда внутрь двойных кавычек в качестве параметра перенесем из интегрированного терминала нашу команду • Уберем переносы строк и несколько доработаем шаг cmd stage("дымовое тестирование") { steps { timestamps{ cmd(“vrunner xunit Jaddroot/tests/sraoke --reportsxunit 'TeHepaTopOT4eTa3UnitXML{out/junit.XBil}\ --xddExitCodePath ./out/junitstatus.log --ibname connectionstring --xddConfig ./tools/xUnitParams.json") } } } } ___________________________________________ Puc. 387 - редактирование файла конфигурации Jenkins Выполняем шаги (Рис. 387): • 268 В параметре - -reportsxunit экранируем обратным слэшом двойные кавычки Silver Bulleters, LLC • В параметре --ibname заменим строку подключения из прямого указания на использование переменной ${connectionstring} • Параметр - -xddConf ig оставим без изменений 12.5. Публикация junit reports Для формирования шага публикации отчетов обратимся в Pipeline Syntax. Sample Step junit publish JUn» ’ tesul! (eport © XML файлы с отчетами о тестировании oui/jurWt xml мйпд tbet af »• **»•: n |n> даадмаьдй sm raw XML •epon «•* seen a* mВамо* © Retain long standard output/enor Health report amplification factor 1q О © 1% failing tests scores as 99% health 5% failing tests scores as 95% health Allow empty results Й Do not fail the build on empty test results © Generate Pipeline Script _________ I...,_______________ junit alloivEmptyResirits true tesfRestrits ouvjunit xml' Puc. 388 - pipeline syntax Перейдем в Jenkins, у нашей задачи trade_pipeline откроем «Pipeline Syntax» и выберем шаг «junit». В настройках шага (Рис. 388): • Укажем путь к xml-файлам с результатами работы ADD - это каталог out/junit .xml • Укажем флаг «Не завершать шаг с ошибкой, если в указанном каталоге не оказалось файлов» Нажмем кнопку «Generate Pipeline Script» и полученную строку перенесем в Jenkinsfile (Рис. 389). stage('Публикация результатов') { steps { script { def allurePath » tool naae: ‘allure1, type: 'allure' cmdCJ{allurePath}/bln/allure generate -o out/put>lishHTML/allure-report out/allure") junit allowEaptyftesults: true, testResults: 'out/junit.xal' cad(“pickle5 -f -features -o out/publishHTML/pickles -1 ru —df dhtal — sn \“TradeV'-) publishHTML target: [ allobHissing: false. Puc. 389 -jenkins файл Добавим полученный шаг в секцию «Публикация результатов» и сохраним изменения Укажем комментарий и выполним коммит. 269 Никита Гоызлов. Пособие релиз-инженера 1C • Видим, что изменился Jenkinsfile • И добавился новый файл с параметрами дымового тестирования Отправим изменения в удаленный репозиторий После этого откроем Jenkins и выполним нашу задачу trade_pipeline. Нажмем «Собрать сейчас». (Рис.390) Рис. 390 - команда запуска сборки Откроем логи и проследим за выполнением. Видим, что отработали стандартные команды Deployka. В секции «Дымовое тестирование» можно видеть запуск Vanessa-Runner в режиме xunit. I Pipe line ] tieesiaep'* (Pipeline] { [Pipeline] lsUnix I PipelineJ bat 16:47:44 [tradejpipeline] Running batch script 16:47:45 16:47:45 C:Vworkspace\jenkins_slave\warkspace\trade_pipeline>chcp 65001 16:47:45 Active code page: 65&Д1 16:47:45 16:47:45 C:\workspace jenkins_slave\work.space.trade_pipeli[^e>vrunner xunit .Ztools/xUnitForlC/Tests/Smoke --pathxunit ./tools/xUnitForlC/xddTestRumer.epf --reportbxunit "reHepaTopOTMeTalUnitXJ-ltfout/juftit.xral}" —xddExitCodePath ./out/junitstatus-log - isnase "/Slocalhost\trad*_bdd" - - xddConfig . /tools/ xVnitParaans. json 16:47:46 vanessa-runner ve.B.3 Выполняй тесты C:\workspace\ jenkins_slave\workspace\trade^pipeline\tools\xUnitForlC\Tests\S«oke 16:47:46 16:47:46: ИНООРМАЦИЯ - 16:46:01 16:47:59: ЖШЗРЧАЦИЯ - Выполнение тесто» »леериено pipeline] ) Рис. 391 - работа команд от Deployka 270 Silver Bulleters, LLC В секции «Публикация результатов» есть неприметный шаг «Recording test results» - это и есть результат работы шага junit. (Рис. 391) (Pipeline] stage (Pipeline) ( (Публикация реяулът (Pipeline) script [Pipeline] ( [Pipeline] tool [Pipeline] UUnix [Pipeline) bat [trade_pipeline) Running batch script C:\«»orkspace\ jenkins_slave\workspace\trade_pipeline>chcp 65001 Active code page: 65001 C:\workspace\3enkins_slBvc\irforkspece\trade_pipeline>C: Vworkspace\jenkins_slave’,.tools\ru.уandex.qatools.allure, jenkins.tools,AllureCone andlinelnstallarionXallure/bin/allure generate -o out/publishHTML/allure-report out/allure Report successfully generated to the directory <ovt\publishHTML\.allure-report>. Use allure report open' command to show the report. [Pipeline) } [Pipeline] // script [Pipeline] step__________ tor-ding test resalt; [Pipeline] isUnlx [Pipeline] bat Puc. 392 - секция «Публикация результатов» Вернемся в задачу, откроем наш 24-й build и перейдем по ссылке «Результаты теста». (Рис. 392) Рис. 393 - окно задачи Jenkins 271 Никита Грызлов. Пособие релиз-инженера 1C Здесь можно увидеть (Рис. 393): • Все наши имеющиеся тестовые сценарии (пакет root); • Конкретный тест «УпрФорма # • И несколько тестовых случаев: тесты_ОткрытиеФормКонфигурации»; о Форма существующего документа «ПриходнаяНакладная»; о И проверка исключения в форме «ПриОткрытии». • Рис. 394 - результаты тестов Также если выполнить эту задачу несколько раз, то на главной странице задачи будет отображаться график результатов тестов. (Рис. 395) Здесь можно увидеть тренд нашего модульного тестирования: • Общее количество тестов • И сколько из них было успешных и неуспешных Pipeline trade_pipeline График результатов тестов г г 1покааывать.тяпьУ9 неудами) увеличить • Рис. 395 - график результатов тестов Аналогичным образом вы можете подключить не только дымовое тестирование, но и уже имеющиеся у вас модульные/приемочные тесты на базе фреймворка ADD/xUnitForic. 272 Silver Bulleters, LLC Раздел 13. Подготовка поставки 13.1. Подготовка манифеста для Packman Основная часть нашей сборочной линии завершена: • Мы проверяем поведение нашей конфигурации на основании BDD-сценариев • И выполняем дымовое тестирование с помощью фреймворка xUnitForlC Заключительный шаг сборочной линии - это подготовка поставки для разворачивания на приемочном или продуктивном контуре. Рис. 396 - свойство версия конфигурации Первое, что мы должны сделать при подготовке поставки - это заполнить в свойствах нашей тестовой конфигурации значения поставщика и версии конфигурации (Рис. 396). Произведем необходимые изменения: • У корневого элемента конфигурации зададим «Поставщик» - Course • И укажем версию 1.0.0.0 Поместим эти изменения в хранилище конфигурации. 273 Никита Грызлов. Пособив релиз-инженера 1C Рис. 397 - поставка конфигурации Сборка тиражного дистрибутива 1C производится на основании специального манифеста. В нем указано, какие файлы включаются в данный дистрибутив, а также в какой каталог необходимо распаковывать файлы дистрибутива. Этот манифест можно подготовить двумя способами: • Из конфигуратора - через подменю «Конфигурация» - «Поставка конфигурации» (Рис. 397) • А также его можно подготовить с помощью инструмента Packman - он выполняет функцию «автоматического собирателя дистрибутива» на основании манифеста 274 Silver Bulleters, LLC Puc. 398 - установка утилиты packman Для начала установим Packman. В командной строке выполним команду: (Рис. 398) 1 opm install packman X tj* Открытие 4- » ф Упорядочит» » . « OneScript » lib » packman > м О а Солдат» name, А 2 Петек: рхИ» о Дата изменения Имя зФ быстрый доступ ■ \ ЯС ■ Рабочий сто < я 1»5? *: Г6еыощиикСедан»мМ*н*^естаПоставжя.ерГ Загрузки -* Ж: 0 Документы # №? V ГЪ»»ои4МикСозд»м»1*М»«4фестаПоставжиАсик1.ер1 1W » м СборИнформацииОМетадгнчыхерГ S4 Изображен»» * Д: packman System!? workspace xUnitfcrtC Ц A ОпеВйж Q Этот компьютер 1C файлы f.tkf.mxt’.epi;’.et - ["открыть J Отмена Puc. 399 - каталог библиотеки packman Помимо самого инструмента Packman, написанного на языке OneScript, в каталоге, где он располагается, также находится несколько служебных обработок. (Рис. 399) 275 Никита Грызлов. Пособие релиз-инженера 1C Откроем 1C, запустим ее в режиме «Предприятие» и откроем каталог C:\Program Files (х86) \OneScript\lib\packman. Как вы видите, в комплект пакета Packman входят два варианта: • С асинхронным режимом работы с файлами • И с синхронным Мы используем конфигурацию на базе 8.3.10 с запретом синхронных вызовов, поэтому откроем асинхронный вариант ЭТОЙ обработки — ПомощникСозданияМанифестаПоставкиАсинх . epf Помощник создания манифеста поставки (асинхронный) Сгенерировагь г. J Краткое имя системы 'trade Например hrm. accounting, trade Имя каталога для всех конфигураций поставщика внутри каталога шаблонов Например, mycompany Каталог шаблоне» поставщика (course Выходной файл Рис. 400 - окно «помощника создания манифеста поставки» Здесь нам необходимо заполнить несколько полей: (Рис. 400) • Первое - это краткое имя системы - мы укажем trade • Каталог шаблонов поставщика - у нас это будет course • И указать путь к выходному файлу. Обработка предлагает нам сохранить манифест сборки релиза с именем package.edf. Расположим его в подкаталоге tools нашего репозитория trade по пути С: \workspace\git\trade\package . edf После задания всех полей нажмем кнопку «Сгенерировать манифест». )епЫтГ№ 1 padcageedf ЕЛ X 33 *•* (1. I' {1.2. {"en","Course"}, {"ru","Course"} — }. {1,2, {"en", ’’Конфигурации ” }, {"ru","Конфигураций"} Ь {Xbase64:} >. {’/", U {1, la81674e9-32<e-4eeS-aeae-799rtab4a48b,"lCv8.cf - оайл «онфигурации'.Т.ееввевМ-ееее-евее-веев-веедаяягюевй."trade", }, _________________________________ __ Puc. 401 - манифест пакета Посмотрим на содержимое этого файла в редакторе Visual Studio Code. Откроем редактор и выберем файл package. edf в каталоге tools. 276 Silver Bulleters, LLC Это -типичный lC-ный скобочный файл, в котором есть несколько интересных для нас полей. Например, это: (Рис. 401) • Включение в состав дистрибутива конфигурации «Конфигурация» • От поставщика «Course» • Версией из метаданных • И каталогом course\trade, куда будет распаковываться готовый дистрибутив конфигурации SOURC1 соктж?...-. ОТ 0 р~|а Добавлен манифест конфигураций Р V changes 1 package.»# и Рис. 402 - добавление коммита Сохраним наш файл в GIT, укажем в коммите «Добавлен манифест конфигурации». (Рис. 402) 13.2. Packman - Запуск из командной строки В репозитории Packman нет подробной документации по использованию этого продукта, однако, у него есть довольно подробная справка. к PS С:\norkspate\git\trade> рае вал Гн?] р Утилита vanessa-packnan выполняет сборку ел а того тиражного дистрибутива ежстеяы 1C: Предприятие в качестве рабочего каталога шагов сборки используется тетфцмй каталог* либо каталог, указанный а переменной VPACKMAN WOSKDIR Возможные команды: help load-storage - Вывод справки по параметрам - Выгрузки версии и» хранилища в рабочую среду load-src - Сборка cf из исходников fflafce-cf eakcdist zipdist clear check - Создание файлов поставки (cf и cfu) - Создание дистрибутива по манифесту HJF - Создание архива для удобного тиражирования очищает рабочий каталог packman ■ Выполнить проверку синтаксиса PS C:\workspace\git\trade> П Рис. 403 - справка по утилите packman Для получения дополнительной информации об инструменте Packman выполним команду: (Рис. 403) packman help Packman представляет собой что-то вроде «конечного автомата» - для формирования конечного дистрибутива в нем необходимо последовательно выполнить несколько шагов. Наш путь будет таким: • Сначала мы возьмем из хранилища конфигурацию определенной версии и загрузим в специальную служебную базу с помощью команды load-storage поставки • После этого make-с f • Из готовых файлов поставки соберем установщик setup. ехе вместе со служебным файлом edf с помощью команды make-dist выполним команду создания файлов с помощью команды 277 Никита Грызлов. Пособие релиз-инженера 1C • И последним шагом заархивируем получившийся у нас установщик в ZIP-архив с помощью команды zip-dist PS C:\workspate\git\trade» packman help load-storage Утилита vanessa-packman выполняет сборку штатного ксражного дистрибутива системы 1C:Предпрмяiне 8 качестве рабочего каталога шагов сборки используется текущий каталог, либо каталог, указаний* в переменной VPACKMANMORKWR load-storage - Выгрузка версии из хранилище в рабочую среду Параметры: «АдресХранилища» - Хранилище конфигурации 1C из которого выполняется сборка -storage-user « Пользователь хранилища 1C -storage-pad - Пароль пользователя хранилища 1C (опционально) -storage-v Версия в хранилище, которую включаем в дистрибутив {опционально) •use toollcd Использовать для чтения хранилища loollCO details - Выходной файл с параметрами катета хранилища (только для toollcd) PS C:\workspace\git\tr3de> |___________ Рис. 404 - справка по команде load-storage Первым шагом мы выгрузим из хранилища конфигурацию и загрузим ее в специальную служебную базу. Получим справку по команде load-storage. Выполним: (Рис. 404) packman help load-storage Как следует из описания, нам необходимо указать: • Один обязательный параметр - адрес хранилища, • А также несколько служебных: о -storage-user — имя пользователя о -storage-pwd - пароль пользователя о -storage-v-версию конфигурации о -use-toollcd - флаг использования утилиты ToollCD для чтения хранилища. Использование этой утилиты позволяет сократить время, необходимое на нахождение версии конфигурации. Также при ее использовании нет нужды задавать пользователя и пароль хранилища PS c:',workspace\git\trade> packmen load storage C:\workspace\storage_Trade\ ИНФОРМАЦИЙ - Загружаю версию во временную базу ИНФОРМАЦИЙ - Обновление конфигурации базы данных Обработка структуры базы данных... Сбор сяумнбной информации... Новый объект: Справочник.Товары Новый объект: Справочник.Склады Новый объект: Докученг.ПриходмалНакладиая объект: РегистрНакопления.ОстаткиТоваров Создана таблица опций планов видов расчетов Создана таблица опций справочников Создана таблица опций планов видов характеристик Создана таблица опций планов счетов Принятие изменений... Новый Обновление конфигурации базы данных успешно завершено PS С: \.wqr its расе VgitAtrarfe» |________________ Рис. 405 - выгрузка из хранилища конфигурации Сформируем строку запуска. Укажем: (Рис. 405) packman load-storage c:\workspace\storage_trade\ -use-toollcd 278 Silver Bulleters, LLC Где: • load-storage - идентификатор команды • Путь к хранилищу - с: \workspace\storage_trade\ • Для ускорения команды укажем флаг -use-toolicd Наша конфигурация небольшая, поэтому у нас эта команда выполнилась довольно быстро. Рис. 406 - служебный каталог .packman В нашей рабочей директории создался служебный каталог .packman, где утилита Packman будет хранить все необходимые ей для работы данные. (Рис. 406) На текущем шаге здесь создана служебная файловая база, в которую загружена конфигурация из хранилища. PS C:\workspace\git\trade> packman help eake-cf Утилита yancssa-peckaan: выполняет сборку агатного тнрммио дистрибутива сметами 1.С.:Предприятие В качестве рабочего каталога шагов ебврк* используется текуЦий каталог, либо каталог, указанны» в тшрвнвннвй ЖШКИЙШ.__И£ЖКМ1 яаке-cf • Создание файлов поставки (cf и cfu) , Параметры: ■' 1й cfo basedir update froe Каталог предцдущик версий для создания CPU (опционально) Перечень версий, через запятую, вжяичайчих в обновление (опционально) RS CrVwerkspaceXgltXtrade» |_______________ _ ________________________________________ ____ Рис. 407-справка по команде make-cf Следующий шаг - создание файлов конфигурации. Получим справку по команде make-cf. Выполним: (Рис. 407) packman help make-cf Эта команда помимо создания готового для загрузки в систему файла конфигурации, умеет создавать файлы cfu, предназначенные для обновления. Если вы будете указывать каталог, где у вас находится предыдущая версия вашей конфигурации и перечень версий, с которых можно выполнять обновление, то Packman также сформирует вам и файлы cfu. Рис. 408 - работа команды packman make-cf 279 Никита Гоызлов. Пособив релиз-инженера 1C В нашем случае просто сформируем файл cf. Для этого выполним команду без параметров: (Рис. 408) Рис. 409 - результат команды packman make-cf В служебном каталоге .packman появился файл levs . cf. (Рис. 409) PS С: \i*OrkspaCeS,git\t-rs4Je> patkean help Bsake-4ist Утилита vanessa packwan выполняет сборку игатиого тиражного дистрибутива системы 1C:Предприятие В качестве рабочего каталога шагов сборки йспдоьзуется текущей каталог, либо каталог, указанный а переменной VPACKJWIWORKDIR make-dist • Создайте дистрибутива пе манифесту EW Параметры:--.. 5 j <*айяМам«фе<ста> • Путь -к манифесту сборки -out - Выходной «зтаяж -setup Собирать дистрибутив вида setup,ехе -files Ик’ИЬАЦ собирать дистрибутив вида 'файлы поставки' < prop files» Файлы с переменными сборки (дополнительные) PS C:\workspace\gAt\trade> |_______ ________ __ ________________ _________ _____________________ Рисунок 409.1 - справка по команде make-dist Следующий шаг - это формирование установочного дистрибутива. Получим справку по команде make- dist. Выполним: packman help make-dist (409.1) В этой команде нам необходимо передать: • Путь к манифесту - package. edf, который мы сделали до этого. • А также есть возможность указать выходной каталог, куда будет сохраняться файл дистрибутива с помощью параметра -out; • И несколько флагов, указывающих, дистрибутив какого вида необходимо собирать: о Флаг-setup о И флаг-files. Мы будем использовать дистрибутив вида setup. ехе. Рис. 410 - результат работы команды make-dist Выполним команду make-dist. Напишем: (Рис. 410) 280 Silver Bulleters, LLC packman make-dist .\tools\package.edf -setup Где: • Укажем путь к манифесту - он у нас лежит в каталоге tools, файл package . edf. • И передадим флаг - setup для формирования дистрибутива вида setup. ехе. ■* пиве * .paCkinan « distr +i25 О □’ IwS.cW setup setupxxe ■* v8r_TempM ► ICvBLog 1CVB.1CO 1Cv8.1CO.dl 1Cv8.1CLcfl iCvsxgrxfl iCvStmp.lCDxfl ICvfttmp Kl.idl IcvBxf v8-metadata.ide » Swodtspaceftoot Puc. 411 - дистрибутив к каталоге В служебном каталоге .packman появилась папка distr, в которой располагаются файлы установщика. (Рис. 411) PS C:\norkspace\git\tra<te> packean help zip-dist Утилита vanessa расквап выполняет сборку чтатиего тиражного дистрибутива системы 1C:Предприятие В качестве рабочего каталога шагов сборки используется текучий каталог, либо каталог, указанный в переменной VPACKMANWOfiKDIR zip-iHst - Создание архива для удобного тиражировании Параметры: -in Путь к каталогу дистрибутива .паже-prefix - Префикс имени архива, например егрЗ.в mdirtfo каталог с файлом v8 metadata,info, генерируемым командой таке dist out • выходной каталог с архивом PS C: \wofkspace\git\trade > |_____________________________________________________ ________ Рис. 412 - справка по команде zip-dist Последний шаг-упаковка этих данных в ZIP-архив. Получим справку по команде zip-dist. (Рис. 412) packman help zip-dist Эта команда может работать и без дополнительных параметров, однако, мы ее несколько поднастроим. • Во-первых, с помощью параметра -name-prefix мы будем указывать префикс имени архива, иначе архив будет с именем distr • А во-вторых, укажем параметр -out для того, чтобы указать Packman, что дистрибутив нужно располагать в отдельном каталоге 281 Никита Грызлов. Пособив релиз-инженера 1C di st im: 1 Рис. 413 - результат работы команды zip-dist Выполним команду: (Рис. 413) packman zip-dist -name-prefix trade -out out Где параметры: • -name-prefix — укажем значение trade. • -out - путь к каталогу, где должен лежать дистрибутив - это каталог out. Рис. 414 - архив дистрибутива Выполним команду. В каталоге out появился файл trade-1. о . о . о . zip. (Рис. 414) Средства работа* го ошвмявп» Главная * * □ № Рабочий его*. ■4- Загрузки Додгяйтьа» * Доквлвжмй джж ’ ► workspace » gd з> Trade i out > trade-I.G.GJLzip ’«г Имя Тип 3 UvS dd □ ««w Фзйл’ЯО' ЯГ s«up.e»« Приле-кенж Сжатый размер >вхь Файл Ж№ 1 Защита ла.. ы £» Нет Пажvz Ли Сжатие Pawep Дата нзм-»«емив 10КБ Het ЖКБ 2% Нет 1960 КБ §3% at? 2С-.19 у Документы Рис. 415 - каталог дистрибутива Если мы отобразим его в проводнике и откроем, то увидим, что в нем располагается каталог distr, а в нем файлы: (Рис. 415) • setup.exe • И служебные файлы 1C 13.3. Сборочная линия - Сборка дистрибутива Реализуем сборку дистрибутива в нашей сборочной линии. Для этого нам необходимо будет решить две задачи: 282 • Первая - перенести шаги из командной строки в Jenkinsfile • А вторая - указать специальный шаг архивирования артефактов Silver Bulleters, LLC } stage( 'Падгвгввкй дненрмбу гйва') { steps { timestamps { } } } } } - • cad(coaciand) { Puc. 416 - стадия «Подготовка дистрибутива» Начнем с переноса из консоли. Откроем Jenkinsfile и добавим новую стадию «Подготовка дистрибутива»: (Рис. 416) • Укажем stage ( ' Подготовка дистрибутива ' ) • Укажем обязательную секцию steps • И обернем наши шаги в timestamps 'Подготовка дистрибутива") { steps { tieestawps { tmd( . kisafi load-storage V’>{env,Stor^gePath}V • use -tw lied j ${ver’~ ±e}“) J } } Puc. 417 - параметризация скрипта Первый шаг- это загрузка конфигурации из хранилища. (Рис. 417) • Напишем шаг cmd и перенесем в него команду из командной строки. • Заменим явное указание пути к хранилищу на использование переменной среды \" $ {env. StoragePath} \ " по аналогии, как мы это делали в Deployka. Для загрузки конкретной версии конфигурации воспользуемся параметром storage-v • и укажем версию конфигурации. Ее мы также вычисляли на шаге Deployka. Она у нас лежит в переменной ${versionValue}. stage{ ‘Подготовка дистрибутива') { steps { timestamps { cad(“p-ackrssn load - storage-V5-:snv. StoragePath} ■ -use-too lice -storage-v ${versionVa)ue>~) cf") " s cmd("packman rfp-dist -out out -name-prefix trade') } } } Puc. 418 - шаг cmd 283 Никита Гоызлов. Пособие релиз-инженера 1C Следующий шаг - make-cf. Ничего сложного - добавляем новый шаг cmd и переносим команду packman make-cf из командной строки. (Рис. 418) Аналогичным образом перенесем оставшиеся команды - добавим шаги make-dist и zip-dist. Steps Samprie Step archiveAftifacts. Заархивировать артефакты Файлы для архивации ouwradetzip Исключения ______ _ - Do not fail build if archiving returns nothing e @ @ [^^Archive artifacts only if build is successful Создать отпечатки всех архивируемых отпечатков Use default excludes < Treat Include and exclude patterns as case sensitive @ archrveArtifacts artifacts out/trade" zip' onfyltSuccassfd true Рис. 419 - параметр архивирования артефактов Для отправки получившегося архива на Jenkins воспользуемся шагом архивирование артефактов. Перейдем в Jenkins, откроем Pipeline Syntax, и выберем шаг «archiveArtifacts». (Рис. 419) • В качестве файлов для архивации укажем следующую маску -out/trade*. zip. Такая маска позволит нам заархивировать все файлы, начинающиеся на trade и имеющие расширение . zip • Нажмем на кнопку «Расширенные» и укажем дополнительно, что нам необходимо сохранять артефакты на Jenkins только если билд был полностью успешным - отметим флаг «Archive artifacts only if build is successful» Нажмем кнопку «Generate Pipeline Script». (Рис.420) stage(‘Подготовка дистрибутива') { steps { timestamps { cmd{"packman ioart-'-torage ' $p.-ny.StoragePath' " -crse-too lied -storags-v ${versiortValue>“) cmd("packman make tf”) tmti(“p-acknrii' язке-dist ./tools,-package.edf -setup”) cntdf’pafkraan zip-dist -out out -аяе-prefix t-ade”) archiveArtifacts artifacts: . f . p', onlyifSuctessful: J } > Puc. 420 - скрипт подготовка дистрибутива Перенесем получившийся шаг в Visual Studio Code. 284 Silver Bulleters, LLC Стадия подготовки дистрибутива полностью написана. В заключение добавим служебный каталог packman в gitignore. У нас изменилось два файла - это . gitignore и сам Jenkinsfile. Зафиксируем изменения. Рис. 421 - фиксация изменений И отправим их во внешний репозиторий (Рис. 421). Рис. 422 - запуск задачи в После выполнения синхронизации перейдем в Jenkins и запустим нашу задачу «trade_pipeline». Дождемся окончания сборки. (Рис. 422) Рис. 423 - отчет о выполнении задания 285 Никита Грызлов. Пособие релиз-инженера 1C После завершения сборки отметим, что у нас появился новый столбец - «Подготовка дистрибутива». (Рис. 423) Build #26 (10.04.2017 18:13:43) Я МВ * Gsssseieeb Changes 1 Добавлен манифест конфигурации (detail) 2 Добавил шаг сборки дистрибутива (detail : Создана пользователем Грызлов. Revi sion (4сSf6634c 171 <fcO133fe23e9fS334334e&c3aab • rafeTemotes/ori^FU master РещавМЖЕВ (Нет еши&ж.) Puc. 424 - артефакт сборки А в нашей задаче появился новый артефакт сборки - trade-l.0.О.о.zip. Отсюда же его можно скачать или передать пользователям. (Рис. 424) 286 Silver Bulleters, LLC Раздел 14. Расширение сборочной линии 14.1. Цикломатическая сложность кода - расчет из командной строки На протяжении десятилетий опытные программисты различных стран разрабатывают метрики, которые помогают оценивать проекты. Одна из таких метрик - это цикломатическая сложность, структурная мера сложности программ. Ее научное описание - это количество линейно-независимых маршрутов через имеющийся программный код. Другими словами, это - максимальное количество тестов для полного покрытия того или иного метода. Рис. 425 - Цикломатическая сложность равная двум Например, откроем модуль документа «ПриходнаяНакладная» (Рис. 425). В данном модуле есть процедура обработки проведения, в которой есть цикл по табличной части «Товары». Цикломатическая сложность этого метода - 2. • Единица дается за само наличие процедуры, которую надо протестировать. • А вторая единица прибавляется за использование цикла. Таким образом, для того, чтобы со 100% уверенностью сказать, что процедура обработки проведения работает без ошибок, нам необходимо написать два теста: • В первом тесте будет пустая табличная часть «Товары», • А во втором - заполненная. Однако данную метрику можно применять не только при тестировании. Чем больше цикломатическая сложность (а стандартно предел цикломатической сложности принимается равным 10), тем труднее понять, как работает этот код. Представьте себе процедуру, целиком состоящую из различных условий и вложенных циклов-для того чтобы пробежать по ней глазами и полностью понять, как она работает, необходимо затратить значительное количество усилий. 287 Никита Грызлов. Пособив релиз-инженера 1C Для борьбы с высокой цикломатической сложностью можно использовать различные инструменты, позволяющие ее подсчитывать и контролировать. Один из таких инструментов подсчета был опубликован в виде внешней обработки на Инфостарте (ссылка https://info5tart.ru/public/166182/). С незначительной модификацией эта обработка была переработана в скрипт для интерпретатора (использование скриптовой версии удобнее применять для автоматизации OneScript cyclo.os запуска подсчета цикломатической сложности на серверах сборок). На данный момент этот скрипт не слишком точен, и единственный способ получения от него информации - это вывод в консоль, однако для демонстрации работы и первичного подсчета он сгодится. Jf*nksrafite cydo.ai X package acrf Ло г. Информа! (и я ( "); Лог.информация.( «Процедуры Парсер.До6авитьПара«етр( ' • ■ Парсер.До6авитьПараиетр("Г, i .г' '); Рисунок 425.1 Файл скрипта - cyclo. os мы положим в каталог tools нашего репозитория. Для понимания способов его запуска просмотрим его текст. В качестве аргументов командной строки скрипт cyclo. os получает два параметра : (Рис.425.1) • Путь к каталогу, где располагается исходный код • И путь к выходному файлу с логами подсчета. PS C:\workspace\git\trade> ©script ./tools/cyclo.os src oat/cyclo, txt ИНФОРМАЦИЯ - Я расчётчик циклоеитической сложности ИНФОРМАЦИЯ Поиск файлов... ИНФОРМАЦИЯ ■ Анализ файла С: \workspace\git\trade\src\cf\Оаситег^\ПриходиаяНакладная\Ех1:\ОЬ]есЛЛот1и1е.Ь!.1... Анализ файла :\»orkspace\git\Trade\src\te3tures\step_def 1п1£1оП5\ПрмхадоезниеТоаара\Яог«\вОрма\©арна. bsl... ИНФОРМАЦИЯ ИНФОРМАЦИЯ - Анализ завершен! ИНФОРМАЦИЯ - Файл C:\workspace\git\trade\src\cf\Docui?ents\npHxoflHaeHaKnaAHaH\Ext\\ObjectModule.bsl cyclo • 2 ИНФОРМАЦИЯ - Файл с;\«orkspace\g»t\trade\src\features\step_definlt1опс\ПрмкодоеаниеТйвара\Рог«\0ор«а\\Фо|)ма.bsl cyclo - 2 ИНФОРМАЦИЯ - Средняя циклону»ячеека« сложность 2 PS С:\worfcspace\git\trade> | ИНФОРМАЦИЙ С Рис. 426 - Пример вывода журнала расчета цикломатической сложности Запустить его довольно просто. Откроем интегрированный терминал и выполним команду: oscript ./tools/cyclo.os src out/cyclo.txt Где: • Первым параметром зададим путь к файлу скрипта - /tools/cyclo. os • Потом передадим каталог исходников - src • И путь к выходному файлу - out/cyclo. txt. Результат работы команды в виде журнала будет показан на экране и сохранен в файле, результата который мы указали как выходной файл . Его удобно делать одним из артефактов проекта. 288 Silver Bulleters, LLC На нашей микроконфигурации данный скрипт уже отработал. Он прошелся по всем файлам с расширением * ,bsl и выполнил анализ цикломатической сложности для всех встреченных процедур и функций. В файле cyclo.txt будет располагаться текст, находящийся у нас сейчас в окне вывода консоли. Согласно текущей реализации скрипта, мы в нем видим (Рис. 426): • Максимальное значение цикломатической сложности процедур для каждого модуля. • А также среднюю цикломатическую сложность по проекту целиком. Если вы захотите получать более подробную информацию, например, цикломатическую сложность каждой процедуры, этот скрипт несложно доработать, поскольку он написан на языке 1C. э source юйтяад ев PT: Добавил ргкмегчнк р ^0 i u Рис. 427 - Помещение утилиты расчета в git репозиторий Сделаем коммит с файлом cyclo.os (Рис. 427). Рис. 428 - Отправка изменений на сервер GIT Синхронизируем изменения (Рис. 428). Таким образом теперь данная утилита доступна всей команде разработки проекта, а также доступна на сервере сборок для запуска по расписанию или для создания отдельного шага сборочной линии. 14.2. Создание задачи расчета цикломатической сложности Выполнение задач подсчета цикломатической сложности и дублирования кода при каждом запуске конфигурации может оказаться довольно ресурсоемким для сервера сборок. Например, подсчет цикломатической сложности ERP2.2 на одном из серверов у нас занимал около 10 часов. Поэтому мы будем реализовывать эти задачи как задачи со свободной конфигурацией, а их запуском будем управлять напрямую из сборочной линии. 289 Никита Грызлов. Пособие релиз-инженера 1C Введите имя Item'a cyclo ж Обязательное попе Создать задачу со свободной конфигурацией ТИИ»Т Это - осноЦюй и наиболее универсальмьжт тип задач в Jenkins Jenkins будет собирать ваш проект комбинируя любую SCM с любой сборочнеиЧмстемой Данный тип проектов макет использоваться для задач отличных от сборки ПО Рис. 429 - Создание задачи со свободной конфигурацией Перейдем в Jenkins и создадим новую задачу (Рис. 429): • Назовем ее «cyclo»; • Укажем тип «Задача со свободной конфигурацией». И нажмем кнопку «ОК». Й Удалять устаревшие сборам Strategy Lop Rotation Сколько дней хранить результаты сборки Если указано, информация о сборках будет храниться это количество днем Сколько последних сборок хранить 19 Если указано будет храниться информация об этом количестве сборок Расширенные.» Ь Это ■ параметризованная сборка ! Приостановить сборки Разрешить параллельный запуск задачи й Ограничить лейблы сборщиков, которые могут исполнять данную задачу Label Expression © © © © bdti Рис. 430 - Настройки свободной задачи • Ограничим выполнение данной задачи только на сборщиках с меткой «bdd». • И включим ротацию логов - будем сохранять только последние 10 сборок (Рис. 430). Примечание: отдельно стоит остановится на том почему выбраны именно такие настройки данной задачи, в частности - «почему хранить стоит последние 10 проверок/сборок проверки цикломатической сложности»? В реальных проектах имеет смысл не статичная запутанность (сложность) кода, а её динамика в сторону ухудшения - поэтому сохранять стоит несколько последних анализов чтобы сравнивать насколько разработчики ухудшают качество своего кода. 10 последних результатов достаточно для такого анализа, особенно если запуск такой задачи происходит с периодичностью о чём рассказано ниже. Вместе с тем - файл результатов будет достаточно большим для больших конфигураций и хранить больше 10 файлов, значит расходовать ресурсы файловой системы впустую. 290 Silver Bulleters, LLC Puc. 431 - Настройка подключения к GIT репозиторию задачи cyclo В секции «Управление исходным кодом» укажем (Рис. 431): • Систему контроля версий «Git»; • Путь к нашему репозиторию - http://10.0.75.1:10Q80/trade/trade; • Параметр авторизации - Cl-Bot Gitlab. Сборка Выполнить команду Windows Команда f chcp 65881 {©script ./tools/cycio.os src cyclo,txt see мы. teaiiaWa? Puc. 432 - Указание параметров консольного запуска задачи cyclo В качестве шагов сборки добавим новый шаг «Выполнить команду Windows» (Рис. 432): • Перенесем сюда команду из командной строки запуска cyclo.os • Так как данная задача будет выполняться в независимом рабочем пространстве, каталога out у нее не будет, поэтому расположим наш файл cyclo, txt прямо в корне. • Для отображения кириллицы в корректном виде, добавим перед запуском oscript шаг chcp 65001 - переключение активной кодовой страницы консоли в UTF-8. Сохраним нашу задачу и выполним ее. 291 Никита Гоызлов. Пособие релиз-инженера 1C С :\ш>гкфрасе\je«kins__sleve\werk3p4sc«\tyclo>chcp -55001 Active code page: 55091 C:\workspace\jenkins-islaye\workspace\cyclo>oscript ,/tools/cyclo.os src cyclo.txt ИНФОРМАЦИЯ - Я расчётчик цикгсжатичсской сложности fc информация - поиск файлов,.. ИНФОРМАЦИЯ - Диализ файла С: \Morfcspace\jenkins_slave\workspace\cyclo\src\cf\0ociMKent5\r^>MXOAHa.nH»KRaAMaR\Ext40bjectHodule.b5l... информация - Диализ файла С; VworkspaceXjenkins^slaveXworkspeceXcycloXsrcXfeeturesVstep^d-ef хп1г1оп5\Прихояовам»»-«То&ара\Рсит«\®о|>мв\Фо|^»а.Ь51.«. ИНФОРМАЦИЯ ИНФОРМАЦИЯ » Диализ эа&ершенI информаций - «ай/ С: \«©rkspace\jeftfeins_stave\wt3«rk&pace4cyclo\src\cf\D©cum«nts\r^HSF©^aftHa«/aAMa«\EKt\4<^>jecW&dale.bsl cyclo - 2 ИНФОРМАЦИЯ - «ай/ C;\wrkspace\jenkins_5Xave\»ork5pace\cycio\src\feature5\3tep_definitionsVnpHxoAoeaHMeTooapa\F©nB\«cip«a\\^3f>«a,b3l cyclo • 2 информаций - Средняя ийклоиатнческая сложность 2 С: WrkspaceXjenfeins^sIaveXworkspaceKcycloexit 5 finished: SUCCESS Дгтийянма WinHoUK Рис. 433 - Пример отображения успешного выполнения задачи cyclo Посмотрим логи и увидим вывод информации расчетчика цикломатической сложности в консоль (Рис. 433). Jenkins •| сус»а | 0 На главную Workspace of cyclo on windows-1 £< статус изменения Сборочная директория удалить все в сборочной О Собрать сейчас 14 В « Просмотр ?ЗЙ 0 «.. Просмотр Q удалить Проект т 01 КВ «с Просмотр Настройки ; 43Kd4i.i думать История сборок тренд <=> § Дее фаиппа aggMMtZiSl Рис. 434 - Сохранение результатов расчета цикломатической сложности Также мы можем посмотреть содержимое файла cyclo.txt из сборочной директории данной задачи (Рис. 434). Для этого перейдем на уровень задачи, откроем гиперссылку «Сборочная директория» и найдем здесь файл cyclo. txt. <- 0 © iocsrthost - о txt ______________ __________ ______ _ ___ ________ Ф j I ; р:ь,эс(«.р p»pT)p;pZpi - р: cw”crctc‘c,ctpepe стрьрьр-р^р’с,ресурсгрстчр* crp..psp^spscrc,pe РГРкРоРЪР PnPF|P;PZPI - PvPsPeCfPe CMP‘«,’:>»PsPI... РГРкР=РМ> P«Pt)p;PZPI - ряР5Р*Р»»еР• C„P‘,rW'- P!' С: \workspace\ jenkins_5laye\>«>rkspace\cyclo\src\cf\Docunents\PwCbPeC_PsPrPSP eCU’,KP*P«P-PiPrPSP’CU\£xt\0t>jec«to4ule.bsl... PZPkPbpm> P»Pt)P;P2PX - PM»SP*P»PeP • Си.Р‘,РКЧ»~Рв C:\«orkspece\jenkin52slev'e\workspace\cyclo\src\*eatures\i«p_definitiens\PvCbPeC.PjPrPsPIP’PSPePliPJP5PIPsCW,e\Fore‘PcpiCbPjP0 SPBPsCWJH.bsl... pzpxpephp ршр»)р:р2р1 PZPkPoPhP PwP»)P;PZPl - Pt^PSP*P»P«P- P-P’PIPpChCtPpPS! PZPxPPW P»Pf)p;PZPX - PSP‘P»P- C:\«orkspace\jenkins_slave\ Worksp#ce\cyclo\s--c\cf\Dccwwfnts\PuCKP*C..PsPrPSP*CUPkP'P«P«P'Pr'PSP*CU'\Ext\\ObjecTHo<)ule.bil cyclo - 2 PZPkPePftP pR/f)P)PZPJ • Рвр*йВ>» C: \wrkspace\jenicins slave\workspace\cyclo\src\featur«5\step_<3efinitionj',PvCbPeC/sPrPsPIP''PSP«PpPyPsPXP,>C1!iP‘\Pors5-.PePsCW’jP,!\\pePsCTM^P*.bsl cyclo PZPkPcPhP P*Pt)P;pZPl - PYCbPpPr-PSClXV e^PcP-'PsPjP’CPiCIPpCfPeP’CO CfP-PsPlPSPiCfC.Cft 2 Puc. 435 - в веб-интерфейсе результат cyclo.os отображается некорректно По нажатию на гиперссылку открывается содержимое этого файла, но, к сожалению, чаще всего, в виде нечитаемых символов. Причина такого отображения данных - использование в файле логов (журналов) кодировки Windows-1251 (Рис. 435). 292 Silver Bulleters, LLC Но в целом, вы легко можете доработать данный скрипт для сохранения файла в логах в кодировке UTF- 8. К тому же, даже такую информацию можно будет перевести к виду нормальной кириллицы, например, в редакторе Visual Studio Code, открыв данный файл с кодировкой winl251. Обращу ваше внимание - с проблемой отображения русских символов из журналов работы вы так или иначе столкнетесь на любом сервере сборок. Например, на сервере сборок Bamboo эта проблема существует с 2012 года и никак не решается производителем (компанией Atlassian). В данном случае важно понимать - сборочные агенты работающие под управлением операционной системы linux сохраняют файлы сразу в кодировке UTF-8, сборочные агенты под управлением системы Windows по умолчанию сохраняют файлы журналов в кодировке winl251, поэтому под Windows сборочные скрипты требуют явной адаптации (доработки). Вместе с этим сам управляющий сервер (master) принимая от агента файл для отображения вам как администратору, ожидает применительно к Jenkins, файл в кодировке UTF-8 и если это не так - вы увидите в Web интерфейсе нечитаемые символы, как показано выше (Рис. 435) 14.3. Сборочная линия - включение расчета цикломатической сложности Теперь добавим вызов нашей задачи в нашу сборочную линию. Рис. 436 - Расширение сборочной линии задачей cyclo Откроем в редакторе Visual Studio Code наш Jenkinsfile : • Первой стадией добавим новый stage ('Статический анализ’); • И добавим обязательную секцию steps (Рис. 436). 293 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 437- Создание шаблона вызова команды cyclo Для формирования команды вызова задачи обратимся к разделу «Pipeline Syntax». Перейдем в нашу задачу «trade_pipeline» и откроем у нее страницу Pipeline Syntax. • Найдем шаг «Build a job»; • В качестве имени задачи укажем задачу «cyclo»; • Снимем флаг «Ожидать завершения задачи» И нажмем кнопку «Generate Pipeline Script» (Рис. 437). stagef '£ s j ’ steps { r ни ачали> { build job: c ; ...c. , wait: ■ ■ ,: j } } Puc. 438 - Копирование сниппета в файл описания сборочной линии Получившийся сниппет перенесем в Visual Studio Code (Рис. 438). 294 Silver Bulleters, LLC Puc. 439 - Редактирование частоты запуска задачи cyclo Р,ля того чтобы уменьшить регулярность запуска данной задачи, воспользуемся данными, которые нам предоставляет Jenkins. Например, мы можем запускать данную задачу только каждую десятую сборку. Информация о номере и имени сборки хранится в переменных среды. Из окна «Pipeline Syntax» внизу мы можем перейти по гиперссылке (Рис. 439) «Global Variables Reference» и для удобства воспользуемся поиском по странице (в Google Chrome это сочетание клавиш Ctrl+F). Рис. 440 - Поиск переменной BUILD_NUMBER для использования в сборке Здесь указан полный список глобальных переменных среды, доступный нам для выполнения в Pipeline. Здесь же мы можем найти переменную среды BUILD_NUMBER (Рис. 440). Это - строковое представление номера текущей сборки. Для запуска расчета на каждую 10 сборку мы можем анализировать последний символ в данной строке, и если он равен нулю, то запускать задачу подсчета цикломатической сложности. 295 Никита Гоызлов. Пособие релиз-инженера 1C stag»(' 1 •1 и «еский анал* з ’) { steps { script {I if (env.build MUMBEH.endswith("e»")) { build job: <■ yt lo', wait: ’ e a } } } Puc. 441 - логика «каждую 10-тую» сборку в задаче cyclo Сделать это довольно просто. Перейдем в Jenkinsfile: • Добавим новый шаг script, так как декларативная сборочная линия не позволит нам написать произвольный код прямо внутри конструкции steps; • И добавим новое условие - ключевое слово if и в круглых скобках обращение к переменной среды env. build_number. Так как это - строка, мы можем воспользоваться встроенной в Java и Groovy функцией «ОканчиваетсяНа» (в английском варианте - endswi th) и указать в качестве ее аргумента «о», то есть функция if (env.BUILD_NUMBER.endsWith("0")) • сравнения будет выглядеть так: Перенесем запуск нашей задачи цикломатической сложности в тело условия (Рис. 441). Такая запись позволит нам вызывать нашу задачу расчета цикломатической сложности только каждую 10-ю сборку. Сохраним наш Jenkinsfile и сделаем коммит. Укажем, что мы добавили запуск задачи по цикломатической сложности. Конечно же, не забываем отправить наши изменения на сервер GitLab. Рис. 442-Запуск сборки для проверки задачи cyclo Сейчас у меня выполнено 28 сборок нашей сборочной линии. Перейдем в Jenkins и попробуем запустить 29-ю сборку нашей задачи «trade_pipeline» (Рис. 442). 296 Silver Bulleters, LLC > git submodule update --init -rrecwsive tools/xUnitforlC [MpelieeJ J // stag® [Pipeline} irithCredeiitiels (HRHmQ f {Fi-J^li-^cJ stage pSfKlIjswJ, { (Ста'-ичеекмй яяаяиз) [Pipeline] script . [Pipeline] { [Pipeline] } № JPip*line} // script [Pipeline] } (Tip*line] stags? [Pipeline} f (в&«о»яи«е твстоаюг© »©nsypa) [PipelineJ tiecetaees (Pipeline} ( [Pipeline} script [Pipeline] { [Pipeline] readFlle i X Puc. 443 - Пропуск шага по условию для задачи cyclo Посмотрим журналы. Первым шагом, как обычно, идет получение исходного кода, а дальше выполнилась наша стадия «Статический анализ», однако запуска задачи «cyclo» ожидаемо не произошло (Рис. 443). Ведь мы явно указали запускать её каждую «десятую» сборку. Рис. 444 - Прерывание сборки, для запуска сборки с задачей cyclo Прервем нашу сборочную линию и соберем задачу еще раз. Следующая сборка будет ЗО-й (Рис. 444). 297 Никита Грызлов. Пособие релиз-инженера 1C > git submodule update --init --recursive teels/sdftiitFerlC {Pipeline1 } (Pipeline] // stage (Pipeline] withCredentlais [Pipeline] stage (Pipeline] { -Дтятичесжмй анализ) [Pipeline] script (Pipeline] { [Pipeline] build (Building cyclo) Scheduling project: cvclo [Pipeline] } (Pipeline] // script [Pipeline] } 0 stage : [Pipeline] stage ( (Обновление тестового контура) [Pipeline] tiersteeps [Pipeline] { [Pipeline] script [Pipeline] { [Pipeline] readfile [Pipeline] [Pipeline] } Puc. 445 - Отображение запуска свободной задачи cyclo Снова откроем логи. Дождемся окончания получения исходного кода и в логах для стадии «Статический анализ» увидим строку о том, что запланирован запуск проекта «cyclo» (Рис. 445). Jenkins > cyclo ф На главную Проект cyclo Ц Статус "Зр Изменения Сборочная директория Собрать сейчас Сбороиная директория удалить проем Недавние изменения настройки История сборок Постоянные ссылки BO 1 find я; I ,f « Ы 1 ’pending—Waiting tor next available executor on ) К Ц • Последняя стабильная сборка №21 19 минут назад ■ • * • Последняя успешная сборка 1*й. 19 тип назад Последняя права лившаяся сборка (#11 215 минут назад Last unsuecesstul build t#b. 20 минут назад Last comoialed fcwiid (#2 i. 19 минут назад 11 04 2017 13 09 Рис. 446 - Ожидание доступного процесса агента для задачи cyclo Если мы перейдем в данную задачу, то увидим, что она готова для запуска и ожидает следующего доступного сборщика на узле «windows-1» (Рис. 446). 298 Silver Bulleters, LLC Такое ожидание произошло потому, что по умолчанию на нашем узле «windows-1» установлен всего один рабочий агент. Рис. 447-Увеличение количества процессов исполнителей на агенте сборки Мы можем увеличить количество параллельно выполняемых задач, установив параметру «Количество процессов-исполнителей» значение, например, 2 (Рис. 447). Jenkins * wlndcws-1 > Nodes 1 Agent windows-1 Вернуться к списку <3^ Статус Q Delete Agenl Подключен через JNLP агента j* настроить =Метки: история сборок bdd £2 статистика использования sltsyns Щ Консоль сценариев Проекты, привязанные к windows-1 Q Лот Нет информации Ц Системная информация Q Отключить Сойалв&сбоеншов ™ 1 part trf !Ojte_BlESime .. ( «з u Рис. 448 Запуск основной сборочной линии и задачи cyclo на 2 процессах исполнителей После сохранения на данном узле параллельно запустилась задача «cyclo» (Рис. 448). 299 Никита Грызлов. Пособив релиз-инженера 1C В реальности задача расчета цикломатической сложности будет отрабатывать довольно долгое время. Хорошей практикой будет ограничить возможность параллельного запуска одной и той же задачи «cyclo». Для аналогичных задач такая практика также применима. Рис. 449 - Отключение флага запуска одновременного выполнения нескольких задач cyclo Перейдем в настройки задачи и убедимся, что у нас не стоит флаг «Разрешить параллельный запуск задачи (Рис. 449). Это означает, что если наша сборочная линия несколько раз запустит задачу «cyclo», то Jenkins будет ждать завершения первого исполнения задачи перед запуском последующей. Таким образом, можно несколько контролировать нагрузку, генерируемую данной задачей на ваш сервер и ваши узлы (агенты) сборки. 14.4. Дублирование кода - расчет из командной строки Одной из больших проблем при разработке программного обеспечения является проблема дублирования кода. • Часто вместо унификации алгоритмов и формирования общих процедур целые куски кода просто копируются из одного места в другое. Исправление ошибок в таком задублированном коде затруднено - необходимо найти и исправить один и тот же код во множестве мест. • Дублирование может порождать и плавающие ошибки, когда незначительно отличающиеся сценарии работы пользователя то приводят к ошибкам, то отрабатывают корректно. Инструментов, рассчитывающих процент дублирования кода для 1C, да еще и представляющих свои результаты в формате, подходящем для сервера сборок, крайне мало. Однако существуют инструменты, позволяющие найти дублирование вне контекста определенного языка. Они могут быть не совсем точными, так как не видят разницы между, например, комментариями и самим кодом, но в целом они позволяют получить общую картину. Что самое важное - они бесплатны и позволяют получить первичный эффект без необходимости покупки специализированного программного обеспечения. 300 Silver Bulleters, LLC Один из таких общих инструментов мы и применим в данном пособии. Этот инструмент написан на языке JavaScript и исполняется с помощью интерпретатора node.js. Для начала, нам необходимо его установить. Gocqle « node.js в» Видео KapiMw Книги Новости НКЯфНЙМ Q, Инструменты Риуяьтятов примеряв 17 4в0 МЖ Л 43 сек.) Node.js https-j/noifejs огд/ * Перевести эту страницу Event-driven I/O server-side JavaScript environment based on V6 Include» APS documentation obwgs-tag. exemrie яй Шкивеwerts Qwmfead • Decs .Start- ■ Nerie.js Feundatto» Вы посещали эту ©грани# «столько раз t5). Дм последнего посещении: 15.ЮД? Рис. 450 поиск платформы Node.JS Откроем браузер и наберем в поиске node.js (Рис. 450). Download for Windows (х64) V6.10.2 LTS V7.9.0 Current Recommended Fo? Most Users Latest Features Other Downloads Change-log 1 API Dots Other Downloads | Changelog API Dots Puc. 451- Загрузка стабильной платформы node.js Перейдем на сайт продукта nodejs.org (Рис. 451). Здесь нам предоставляют возможность выбора либо стабильной версии, либо текущей разработческой. Загрузим стабильную и выполним установку. Рис. 452 - Установщик платформы node.js На приветственной странице нажмем «Далее». (Рис.452) Примем лицензионное соглашение. 301 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 453 - путь установки node.js Путь к установке оставим без изменений (Рис. 453). Рис. 454 - Обязательная установка пакетного менеджера NPM И убедимся в том, что компонент «npm package manager» отмечен для установки (Рис. 454). Он нам понадобится для установки утилиты расчета дублирования кода. Нажмем «Далее» и выполним установку. 302 Silver Bulleters, LLC Puc. 455 - Проверка работоспособности команды npm После окончания установки откроем командную строку и убедимся, что пакетный менеджер npm установлен (Рис. 455). Выполним команду прт. Если вместо вывода справки по инструменту прт вы получили сообщение об ошибке, что данная утилита не обнаружена, необходимо выйти и снова зайти в операционную систему. С ers • est >npm install npm X2HZ -g copy-past e-deter tor wreru hg»l. 5.9: лге-n. js is deprecated! Vou should check out fs-extra (https://github.coOT/jprif.hards. п/node-fs-extra) for any operations you were using wrench for. Thanks for all the usage over the years, npm 7Z' rainiTialch$e.3.0: Please update to rainimatch 3.0.2 or higher to avoid a RegExp DoS issue при Уnode-uuid^l.4.3: use uulo module instead n v:’ .-c’s • :e-.t\AppData--Roawing\npm\.pd > C:\Jscrs\test\AppData\Roaraing\npm\node modules\copy paste detector\bin\cpd C: \users\test\Ap<pData\Roaming\npm Puc. 456 - Установка опредилителя дублирования кода Установка пакетов с помощью пакетного менеджера npm выполняется довольно просто. В командной строке наберем (Рис. 456): npm install -g copy-paste-detector Где: • Вторым параметром указывается флаг необходимости глобальной установки • И после этого следует имя модуля, который необходимо установить. Наш модуль называется -д copy-paste-detector. 303 Никита Гоызлов. Пособие релиз-инженера 1C Выполним команду и дождемся окончания установки. lc: \users \ test>cpd ropy-paste-detector 0.0.2 by Hans-Peter Bunlat Usage: cpd [options] Options S -H -v, -d, -0, -i, -e, -r, f# -t* - -help - -version - -directory - -depth [0} - -include (pattern,pattern, . ,, j - -exclude [pattern,pattern,...] - -report (pmd,json,text] - -file [filename] - -tokens -lines [5] -no fuzz output usage information output the version number directory to check directory depth include pat tern exclude pattern result output save results to a specific -nA minimum number of identical tokens minimum number of identical lines disable variable-fuzzing C:' Рис. 457 - вывод команды cpd случае успешной установки Проверим, что данный модуль корректно установился, выполнив команду cpd (Рис. 457). В справке указано, какие параметры можно передать данной утилите. Попробуем сформировать строку запуска для получения данных о дублировании кода для нашей тестовой конфигурации. C: V Gsers\test>cd c:\workspace\git\tг г: \ workspace\.glt\ fcrade>cpd -d src *i • ,bsl -r pmd -f cpd.xml Рис. 458 - Команда консольноо запука расчета дублирования кода Для начала перейдем в репозиторий trade, выполнив команду: cd c:\workspace\git\trade После того, как мы перешли в наш репозиторий: • Вызовем утилиту cpd; • Укажем ей, где хранятся наши исходники с помощью параметра -d. В качестве значения укажем каталог src; • Для включения анализа только по bsl-файлам укажем в параметре -i маску поиска * . bsl; • В качестве формата выходных данных используем формат pmd. Укажем флаг -г pmd; • И последний параметр - это путь к файлу, куда будут сохраняться результаты. Параметр -f и имя файла, например, cpd.xml. Выполним данную команду (Рис. 458): cpd -d src -i *.bsl -r pmd -f cpd.xml 304 Silver Bulleters, LLC Puc. 459 - Ошибочный поиск парсера PHP Скорее всего, вы получите такую же ошибку, что и у меня на экране (Рис. 459). Дело в том, что эта утилита в рамках подготовки к анализу начинает инициализировать различные парсеры, в том числе и парсеры языка РНР. В коде инициализации этого парсера идет обращение к утилите РНР, и, если она не установлена на машине, то вся инициализация падает с ошибкой. Исправить это можно двумя способами: • Либо установить на локальную машину РНР; • Либо удалить сам парсер. Мы воспользуемся вторым способом, так как анализ языка РНР нам не нужен, и удалим данный парсер. Рис. 460 — поиск места установки cpd Делается это довольно просто - для начала поймем, куда же установилась утилита cpd. Для этого в консоли выполним команду (Рис. 460) where cpd В выводе команды у нас есть путь С: \Users\test\AppData\Roaming\npm. Перейдем в этот каталог и откроем здесь папку node-modules/copy-paste-detector 305 Никита Грызлов. Пособие релиз-инженера 1C Q _ v щру. paste 'detector Поделитесь town. Глав»» « Пелыоам&м » test ■ АррОи» * taming » opm » node^maSStss » copy-piwe-dewetof « ф <- Вад Има Размер Тии * быстрый дастуя ЯР«6очийвм * •> Загрук» * jj Документы Г 8Ц Изображения ,* Пней £ файлами t№ 0 ЬЬ tss. Пкж» t фйаами № SS® node, modules WB П»пи с фМтммя »®8S Оже tфаймм* И{ packmen. Щ Src jl tert tMS Пайка е файявм» йь И .^ртгшупоге 1И Иогоамый файл ... 1 КБ «4 4rwt5,yrol TMS Иежинявфгйя ... 1 Кб tools Mtesam-»de-pbgiih.Kjml ; workspace <& GneBmre . ......... .. . : . ......... .. C/У Этот S# Сеть Домашний группа IMS й<задаывф»йл... 1 Кб W И«ш«йВфаяд 1» зга И gafpfiicjs О indexes 16Й5 файлJeaStripJ 2 Кб 1И файл teaSspI 1 га 0 UCfNCE iHB Файл 2 га ■ч pjsdMpijtMi IS® Ис<о«иы«фвйлТ.. зга < ffiAWIE.wd ws Ис«е$ммйфайл... 2№ Puc. 461 - содержимое каталога установки cpd Здесь находится исходный код данной утилиты (Рис. 461). Для того чтобы удалить парсер РНР, нам необходимо перейти в каталог lib/parser и просто удалить файл php. j s (Рис. 462). parser Главная - 4 Вздееитися Ию ф Быстрый доступ ВИ Рабочий стел ♦ Зируии . Деетыенп» packman , 5ystem32 Бад «. Пользователи » test > АррОм» > Reaming > "pm » node_module * copy-paste-ttetteto» > ft » parse A 1» Таим}» >1 »ЬЖ*в.> JS есвиф 14® файл iwalchpt 1 ffi IS® файл JwaScnpt 2 «6 Л-Т TS® файл tewi5«npt зга * Iwa&ripi t»5 Е |A JavaScript JB Рис. 462 - файл парсера РНР Вернемся в командную строку и снова попробуем выполнить наш анализ. Теперь работа утилиты завершилась без ошибок, и она сообщила о том, что проанализировано два файла, и не было обнаружено случаев дублирования . Дополнительно убедиться в этом мы можем, посмотрев содержимое файла cpd.xml. Выполним команду type и передадим ей аргумент cpd.xml. В выводе мы видим простой xml, корневым элементом которого является узел <pmd-cpd> 14.5. Создание задачи расчета дублирования кода Перенесем нашу задачу на Jenkins. Для анализа файла, получаемого с помощью утилиты cpd, нам нужно установить дополнительный плагин. 306 Silver Bulleters, LLC Перейдем в настройки Jenkins - «Управление плагинами» и на вкладке «Доступные» найдем плагин с названием «DRY Plug-in». Это - аббревиатура от словосочетания «Do Not Repeat Yourself» (не повторяйся). Отметим к установке данный плагин и нажмем кнопку «Установить без перезагрузки» (Рис. 463). Дождемся окончания установки этого плагина и его зависимостей. Установка/обновление плагинов Пад»вдвв*а DRY Ркйип » Cteektog сеяеАНу • Checkhg update center OQtwwcflvfty • Secess 'Лвешнв u Вернуться на главную страчм ™ (вы сможете использовать установленные плагины прямо сейчас) ф Перезапустить Jenkins по окоммашмо установим и отсутствии активный. задач Рис. 464 - флажок автоматического перезапуска Jenkins После установки плагина посмотрим, требует ли какой-то из плагинов перезапуска (это будет отображаться не синим, а желтым кружком), и в случае такого требования укажем галку «Перезапустить Jenkins по окончанию установки и отсутствии активных задач» (Рис. 464). В нашем случае плагин установился без перезагрузки. 307 Никита Гоызлов. Пособие релиз-инженера 1C Перейдем на главную страницу Jenkins и создадим новую задачу (Рис. 465). • Назовем ее « cpd» • И укажем, что это - задача со свободной конфигурацией • Привычным движением включим ротацию логов на последние 10 сборок • Ограничим выполнение нашей задачи на узлах с меткой bdd • Подключим получение исходного кода из нашего GitLab репозитория • В качестве параметров авторизации выберем Cl-Bot Все эти действия мы выполняли множество раз в предыдущих разделах, поэтому их выполнение не должно потребовать дополнительных пояснений. Рис. 466 - вставка команды запуска cpd в задаче Jenkins И перейдем к настройке самой сборки. • Добавим новый шаг сборки «Выполнение команды Windows»; • И перенесем туда получившуюся у нас строку из командной строки (Рис. 466). За публикацию результатов работы утилиты cpd будет отвечать послесборочный шаг «Publish duplicate code analysis results». • Здесь мы укажем файл, в котором хранится результат анализа дублирования кода - это файл cpd.xml. • (Рис.467) Также можно настроить дополнительные параметры. Самым важным параметром в настройке этой задачи на Windows-средах является параметр «Default Encoding». Здесь нам необходимо указать кодировку UTF-8 для того, чтобы информация о наших файлах отображалась корректно. 308 Silver Bulleters, LLC Сохраним нашу задачу. Послесборочные операции Publish duplicate code analysis results Depfesie code results cptf xjnl| Filesei includes setting that specifies the generated raw XML report files such as “/cpdxmt or "isimlan.xml Base* of the (Beset is the wortrspace real If no value is set, then the default *'lcpd «ml is used Be su» not to include any non-resort files Into th® pattern High priority threshold 50 Minimum number of duplicated lines for high priority warnings Itemat priority ttoesbciW . 25 Minimum number of duplicated lines for normal priority warnings Compute new warnings. (based on the last successful ocdd unless another reference build is chosen Ьекж) OetouB Етеезяд trS? DefaultI егкойпде encoding when parsing or showing file Leave ties field empty to tee the default encoring of the platform Пэйпал», шаг nocne оборот - Puc. 467-настройка публикации результатов cpd в послесборочном шаге Выполним ее. Скорее всего, ваша задача завершится с ошибкой, так же, как и у меня. Посмотрим логи сборки и увидим информацию о том, что Jenkins не смог обратиться к утилите cpd - он не нашел ее у себя в переменных среды. Мы установили cpd когда наш Jenkins Slave был запущен. А как мы помним, изменение переменных среды процесс увидит только после своего перезапуска. Для того чтобы Jenkins обновил данные об используемых утилитах, нам необходимо перезапустить наш Slave-агент. Для этого, закроем командный файл start.bat, который отвечает за связь Slave-агента Jenkins с мастером. И запустим его еще раз - перейдем в рабочем каталоге в папку j enkins_slave и выберем start. cmd - «Запуск от имени администратора». После появления сообщения об успешном соединении перезапустим нашу задачу. 309 Никита Грызлов. Пособие релиз-инженера 1C Jenkins » cpd ► На главную 0^ Статус "’ZS* Изменения Й1 Сборочная директория 0 £fitea.gteae ус Сборка - запланирована н^,.„„-------- Рис. 468 - перезапуск задачи сборки Дождемся завершения задачи, после чего, отметим появление нового блока «Duplicate Code». На странице задачи (Рис. 469) Здесь будет отображаться информация об уже имеющемся коде и о новых случаях обнаружения дублирования. Сборка #3(12.04.2017 15:38:02) No c hanges Создана пользователе)/ НУь ита Грызлов Revi si on Ь44175029579Jc1655%d640d22efa8d4c 1366f8 <git • ms/mnotes/cri{p№«mter GfepfcaJ» Cede fl waewtgs frets one analysis • Nb Швее MM J • tew гад» warnings highscore: no warnings since yesterday! Puc. 469 - отчет о дублировании кода на странице сборки Добавим в нашу конфигурацию немного дублирования. Откроем 1C, откроем нашу рабочую базу «Торговля», подключимся к хранилищу и захватим документ «ПриходнаяНакладная». 310 Silver Bulleters, LLC Для примера дублирования скопируем одну из процедур расчетчика цикломатической сложности cyclo.os - «НайтиПредыдущееВхождениеСтроки» и перенесем ее в два места: в модуль объекта и в модуль менеджера документа «ПриходнаяНакладная» (Рис. 470) .-чя ip cydo.t» X i "-г-'чо-. UK* - страна, в г.отежй * символа, с которого начинается (np«wtyiWi вхоидани» подстроки в стр. // число ; НайтиПредыдуяееВхождениеПодетроки( Строка * ВРег(Строка); Подстрока » ВРег(Подетрока); Строка, НачинаТьС « 0) Подстрока, ДлимСтроки » СтрДлинв(Строка); ДлмнзПодстроки - СтрДлина(Подстрока); •н НачинатьС = 0 Т.згда НэчииатьС “ ДлинэСтроки - ДличаПодстроки +1; конецЕсли; Результат - в; .> Я НачинатьС > й И Результат = 0 Цикл Если пайтн(Сред(Строка, начиматьс, длииапедстроки), Подстрока) 1 Результат • МаниматьС; Комевбсяи; НачичатьС - НачинагьС ♦ 1; Уонеццикла; возврат Результат; Лк чар- Рис. 470- копирование/вставка фрагмента кода Сохраним изменения и поместим их в хранилище с комментарием «Добавлен пример дублирования». (Рис. 471) Рис. 471 -помещение изменений в хранилище 311 Никита Грызлов. Пособие релиз-инженера 1C Перейдем в Jenkins. Чтобы не ждать срабатывания триггеров запустим задачу «gitsync» вручную. (Рис. 472) Все ♦ S W Name , Последний успех Последняя неудача Последняя продолжительность е Л -1 cod 4 минуты 3 секунды - 6 минут 6 секунд - S2 41 сехуня cyclo 1 день 2 часа - #3 1 день 2 часа - #1 8 8 секунд gflsyac 13 минут . ад гЗсегунд hello world 14 днем - #17 14 днем -#16 0 56 секунд test pipeline 12 дней - #250 ад 28 секунд tra&.cipsjing 1 день 2 часа - О ад 3 минуты 41 секунд г9 о е к g) 0, Build scheduled Рис. 472 - ручной запуск синхронизации с GIT После окончания работы gitsync наши изменения попадут в репозиторий, а значит, станут доступны для всех утилит, которыми мы пользуемся. Теперь, снова выполним задачу «cpd». Дождемся окончания работы данной задачи и неожиданно получаем упавшую сборку. (Рис. 473) Давайте попробуем разобраться, что же не так. Для начала откроем вывод консоли. В выводе видим обычное выполнение утилиты cpd без каких-либо сообщений об ошибках. Что же могло пойти не так? Вывод на консоль 18:44:02 Started by user Никит» Грмалор 18:44:02 (Envlnject] - Loading node environment variables. 18:44:02 Building remotely on windows-1 (bdd gitsync) in workspace C:\workspace\jenkins_slave\workspace\cpd 18:44:02 > git rev-parse --is-inside-work-tree s timeout-10 18:44:02 Fetching changes from the remote Sit repository 18:44:02 > git config remote.origin.url http: //10.a.75.1:18880/trade/trade 4 timec-ut = 10 18:44:03 Fetching upstream changes from http;//18.0.75■1:186807trade/trade 18:44:03 > git —version « timeout-18 18:44:83 using 6IT_ASKPASS to set credentials Ci-Sot Gitlab 18:44:03 > git fetch --tags --progress http:.'/10.0.7S.l:ieege/tr»de/trad»- trefs/heads/*:refs/remotes/origin/* 18:44:0? > git rev-parse *refs/remotes/origin/master'(co«rait)" » timeout-10 18:44:07 > git rev-parse ’refs/remotes/origin/origin/master-fcowsit}" « timeout-1© 18:44:08 Checking out Revision 7d8bbd04Sd3b2c611b71366242ac96M9f49S889 (refs/remotes/origin/aaster) > git config core.sparseCheckout 4 timeout*!® 18:44:08 > git checkout -f 7d8bbd045d3b2c611b71386242ac96b49f49B889 18:44:08 > git rev-list b441750295794Cl65596dG40d22efa8d4cl36Gf# = timeout-10 18:44:0® (cpd] S c«d 7c call CfMJsers\test\AppOeta\Local\Temp\jenkin8i3223B870492748809e.bat 18:44:08 18:44:09 18:44:09 C:\workspace\jenkins_slave\workspace\cpd>cpd -d src -1 ’.bsl -r pmd -f cpd.xml 18:44:11 copy-paste-detector 0.0.2 by Mans-Peter Bvniat 18:44:13 18:44:14 Build step 'Execute Windows batch command’ marked build as failure 18:44:17 (DRV] Skipping publisher since build result is FAILURE 18:44:17 Finished: FAILURE Puc. 473 - упавшая сборка при наличии дублирования 312 Silver Bulleters, LLC C; \Users\test Jtd Ci vworkspateX'jenkins..slave'wor*spaxeU.pd C: \»rfcspa«\jenkIm_Oev^\w(>rk5-p3Ce\'tpd>e<h<s RRORLEVEU |>^ 4wdrfc§p3C®\j«nklflS_5law®\wef4cspaf e\cpd> Puc. 474 - проверка уровня ERRORLEVEL Дело в том, что утилита cpd в случае обнаружения дублирования кода взводит в консоли флаг ошибки. Убедиться в этом довольно просто. (Рис. 474) • новую командную строку и Откроем перейдем в рабочий каталог данной задачи С:\workspace\jenkins_slave\workspace\cpd. • Проверим текущий уровень ошибки для консоли. Сделать это можно, выполнив команду echo %ERRORLEVEL% В выводе видим о. Теперь попробуем запустить анализ дублирования кода. • Скопируем имеющуюся строку запуска утилиты cpd и выполним ее. Сама утилита отработала без ошибок, консоль чистая. • Снова проверим значение в переменной %errorlevel%. Как видите, теперь тут находится единица. (Рис. 475) С: ',iso-rfcspate\jenkins_slave\i«3rics;’Si;e\cpd>cpd -ti srt -1 *.bsl -г pud -f cpd.xej copy-paste-detector 0.6.2 by Hat»*-Peter Buni&i parsing Tiles 3/3 (106%) {====«=======■===•====) e.gs c: \ workspace\j enkins ^slaveVRorkspaesXcpd >echo Terror LEVEL/e 1 fc C: i workspace \3enfcins_sla¥e'. workspace\cpd Puc. 475- уровень ERRORLEVEL установлен в 1 Jenkins при выполнении каждого шага проверяет значение переменной среды %errorlevel% и, если находит там значение, отличное от нуля, помечает сборку, как проваленную. Обойти такое поведение можно двумя способами: • Во-первых, можно разрешить выполнение послесборочной операции публикации результатов в случае упавшего билда. Однако в общем списке задач задача «cpd» все равно будет отображаться проваленной. • А во-вторых, мы можем переопределить данную переменную в значение о, чтобы Jenkins всегда считал результаты работы утилиты cpd успешными. Для этого мы можем воспользоваться маленькой хитростью. 313 Никита Гоызлов. Пособие релиз-инженера 1C Сборка Выполнить команду Windows Команда cpd -d src -i *.bsl -r pmd -f cpd.xmX || exit e| I Puc. 476- добавление оператора exit Перейдем обратно в настройку задачи и в сборочном шаге «Выполнение команды Windows» допишем вот такую конструкцию: (Рис. 476) ||exit О Такая запись в любом случае завершит выполнение данного файла сценария с кодом ошибки о. Сохраним изменения и соберем проект еще раз. Вывод на консоль 19:28 54 Started by user Никита Гриалов 19:28 54 (£nvInject] - Loading node environment variables. 19:28 S4 Building remotely on windows-! (bdd gitsync) in workspace C:\worksp»ce\jer«kins_slay<\workspace\cpd 19:28 54 > git rev-parse --is-inside-work-tree « tieeout-10 19:28 54 Fetching changes from the remote Git repository 19:28 54 > git config remote.origin.url http://16.6.75,1:10080/trade/trade » timeout»!© 19:28 S5 Fetching upstream changes from 19:28 55 > git --version a ti»eout*10 19:28 55 using GIT_ASKPASS to set credentials Cl-Bot Gitlab 19:28 55 > git fetch --tags --progress ht tp: / /16«3,75.1;18686/1rode/1rode *refs/he«ds/*:refs/rewotes/origin/’ 19:28 56 > git rev-parse “refs/re«otes/origin/fflasTerA{cojn?iit}’' s timeout»16 19:28 56 > git rev-parse "refs/remotes/origin/origin/master*^ commit}" « timeout-10 19:28 56 Checking out Revision 7d8bbd045d3b2c611b7l366242ac96b49f495885 (refs/reectes/origin/masrer) 19:28 56 > git config core.sparsecheckout 4 timeout-10 19:28 56 > git checkout -f 7dSbbd&45d3b2c611b?1366242ac96b49f495889 19:28 56 > git rev-list 7d8bbdO45d3b2c611b71366242ac96b49f495889 # timeout-10 19:28 57 19:28 57 .bsl -r pmd -f cpd.xml || exit в 19:28 57 19:28 S7 ppy-paste-detector 6.0.2 by Hans-Peter Buriat 19:28 57 19.28 58 [DRY] Collecting duplicate code analysis files... 19:28 58 (DRY] Searching for all files in C:\workspace\jenkins_slave\workspace\cpd that match the pattern cpd.xml 19:28 58 (DRY] Parsing 1 file in <:\workspace\jenkins_slave\workspace\cpd 19:28 58 (DRY] Successfully parsed file C:\worfespace\jenk.ins_slave\workspace\cpd\cpd.xml with 2 unique warnings and 0 duplicates. 19:28 58 19:28 58 Puc. 477 - успешное завершение сборки с расчетом дублирования Откроем логи. Как видите, теперь работа утилиты завершилась без ошибок, и наш послесборочный шаг публикации результатов по анализу дублирования кода завершился успешно. (Рис. 477) 314 Silver Bulleters, LLC Вернемся на уровень задачи, где мы можем увидеть появившийся тренд дублирования кода. (Рис. 478) Рис. 478- тренд увеличения дубликатов кода Рис. 479- отчет о дублировании кода Здесь мы можем увидеть новые обнаруженные дублирования. (Рис. 479). Плагин показывает результаты на английском, но базового технического английского достаточно для чтения результатов. 315 Никита Грызлов. Пособие релиз-инженера 1C ObJectModwte.bel - Ofc|®ctM«M6.bsi дяй»«м»е.е*дмвввеиин = виАЦЮлмиичпикрплтнин.нрижад; 99 Деление. Перми. ■ Дата) дямяпше.Скмщ « й«я*я; 10 11 Движение.Товар - ТекСтрок»Тое*н*Ло-еар; Движение.ксмтепм» • текстржажвважлллж'вет*»} «вжиЦик»; 12 13 14 i& квжщД^едим is ■Ml 7/ ?e z; Zl // «Р* RS ~ it ? ми№<>г I---34 lines of duplicate code подстрок в строку Функция Haij Oupttcaied in. 9«жа < ; i Ш&чажзньС « Дж1й^йямф^ ДлннлСтроки » СтрДлим»(Строе*)) ДлйяаПодстрокн « СтрДянмв(Подстрока)» <ейи НачипатиС « о тогда НЫинатьС • Дям«<троки Конец!сян; М Экспорт _ г ЧЖЭ Рис. 480 - отображение дублирования в отчете Например, откроем модуль объекта, где отображается дублирование на 17 строке и данный кусок кода был обнаружен также в модуле менеджера документа «ПриходнаяНакладная». (Рис. 480) 14.6. Сборочная линия - включение расчета дублирования кода Добавим вызов задачи дублирования кода в наш Jenkinsfile. Перейдем в редактор Visual Studio Code, получим последние изменения из GIT-репозитория. Рис. 481 - добавление запуска задачи cpd в сборочную линию 316 Silver Bulleters, LLC Перейдем в Jenkinsfile и добавим в секцию статического анализа новый шаг. Скопируем вызов задачи "cyclo" и добавим аналогичный шаг с вызовом задачи "cpd". (Рис.481) Сохраним изменения, проиндексируем наш Jenkinsfile и отправим изменения в Git-репозиторий. Обязательно выполним синхронизацию с GitLab. Теперь задача подсчета дублирования кода будет выполняться каждый десятый билд, так же, как и задача подсчета цикломатической сложности. 317 Никита Гоызлов. Пособие релиз-инженера 1C Раздел 15. Непрерывная проверка качества кода 15.1. О концепции Continuous inspection При разработке и последующей поддержке систем часто возникает проблема стремительного увеличения технического долга. Технический долг - это работа, которую мы откладываем «на потом». • Это может быть плохо спроектированная архитектура - слабо структурированный или слишком запутанный код. На момент, когда мы его написали, мы понимаем, что это такое, но остается ощущение, что что-то здесь не так: • о Тут что-то надо поправить; о Там в будущем может возникнуть проблема; о А здесь хорошо бы вообще все переписать с нуля. Условно, с точки зрения разработчика, количество технического долга при просмотре некачественного кода можно охарактеризовать, как количество воскликов «Что же здесь происходит» в час. • Очень часто, когда разработчики разбираются в сложном и запутанном коде, они тратят свое время на повторное укладывание в голове происходящего. Тем самым тратятденьги-как просто деньги заказчика, так и в целом, выделенный на проект бюджет. Примерно посчитав, сколько времени тратит разработчик на каждый такой случай, мы можем определить общий объем технического долга в часах и перевести его в деньги, например, умножив на часовую ставку программиста. Зачем управлять техническим долгом? • Поскольку при увеличении технического долга время на разработку новой функциональности увеличивается, то и стоимость поддержки при развитии системы с течением времени тоже будет увеличиваться. И чем больше у вас будет этого технического долга, тем сложнее и дороже вам будет разрабатывать новую функциональность и исправлять ошибки в текущей. • Так как разработчики - люди не идеальные, а бизнес требует, чтобы изменения в продукте происходили быстро и стремительно, то и долг постоянно растет. Очень редко во время обычного цикла разработки можно заметить тренды снижения технического долга - в абсолютном большинстве случаев идет постоянное его увеличение. И если не следить за архитектурой, структурой и кодом приложения, то, в конце концов, это приведет к тому, что это приложение будет невозможно улучшать дальше. Разработчики будут заняты только исправлением очередных найденных ошибок, и, пробираясь сквозь плохой код, будут тратить много времени на понимание, что же здесь происходит. • Общий тренд в разработке программного обеспечения такой - чем раньше мы начинаем отдавать технический долг, тем дешевле нам разрабатывать и поддерживать систему в дальнейшем. Данные постулаты действительны для любого программного продукта, на любой платформе - 1C, С#, Java, PHP и т.д. 318 Silver Bulleters, LLC Категории проблем разработки Большинство проблем, приводящих к увеличению технического долга можно разделить на семь категорий: • Это уже имеющиеся и потенциальные ошибки в программном коде; • Потенциальные бреши в безопасности системы; • Нарушения стандартов разработки (как от материнской компании 1C, так и от принятых в конкретной команде); • Дублирование кода; • Недостаток или отсутствие тестирования - автоматизированного или ручного; • Излишняя сложность и запутанность архитектуры приложения; • И недостаток или излишнее количество комментариев в коде. Для управления этими проблемами с программного продукта собирают различные метрики - показатели, которые в количественной мере могут показать нам, какая область разработки требует дополнительного внимания: • Например, если мы знаем, какая критичная функциональность нашей системы не покрыта тестами, мы можем отправить разработчиков писать автоматические тесты, тем самым увеличить стабильность системы и выявить скрытые ошибки. • Если же у нас слишком много дублирования кода, мы можем ставить задачи на рефакторинг и унификацию алгоритмов. • В целом, по каждому нарушению какого-либо стандарта разработки или превышению порогового значения показателя можно автоматически сформировать замечание - маленькую задачку на исправление. Так что же такое Continuous Inspection? Концепция Continuous Inspection базируется на нескольких ключевых принципах. • Основной ее принцип заключается в том, что качество - это общая задача всей команды разработки. И, хотя в разработке принимает участие большое количество людей - от разработчиков до бизнес-аналитиков и даже заказчика, качество системы зависит непосредственно от самих разработчиков, потому что они производят код, за который и несут ответственность. • Второй ключевой принцип - это актуальность информации. Если мы проверяем нашу систему и получаем о ней какие-то качественные показатели, мы должны их получать постоянно, у нас под рукой всегда была актуальная информация о текущем состоянии нашей кодовой базы. • Данные о качестве (как показатели, так и какие-то списки замечаний), мы должны получать не только в абсолютных значениях, но и в разностных. Чтобы не допускать ухудшения качества нашей системы, мы должны понимать, что же у нас изменилось за неделю, за день или с выхода прошлой версии. • Проверка качества должна быть автоматизированной. В идеале, мы должны исключить какихто конечных людей (внешних аудиторов и самих разработчиков) из операции проверки нарушений стандартов разработки автоматически. и сбора метрик. Эти операции можно проводить 319 Никита Грызлов. Пособие релиз-инженера 1C • И последний ключевой принцип - по всем новым замечаниям, особенно критическим, мы должны знать автора. Если у нас несколько человек в команде, то каждое выявленное замечание по качеству должно относиться на конкретного разработчика. Даже если он уже уволился - это неважно, мы всегда должны понимать, кто привел к конкретной проблеме. Как же следовать этим принципам? • Главное, что нужно сделать - включить анализ качества вашего кода в ваш процесс разработки. Каждое помещение в хранилище, каждый коммит в Git должен активировать запуск проверки качества. • Более того, просмотр и исправление замечаний должны стать вашей ежедневной задачей. Разработали новую функциональность, допустив нарушение всех мыслимых стандартов - получили на почту сотню писем с описанием ошибок. Парадокс, но их исправление прямо сейчас - дешевле, чем когда вы уже выпали из контекста и уж, тем более, дешевле, чем исправление обнаруженного в продуктиве бага. • Каждое замечание привязано к конкретной строке кода, а значит, средствами Git мы можем быстро установить автора замечания. Дело тут не в банальном нахождении «козла отпущения». Если ваши разработчики будут оперативно получать информацию о том, где они сделали некачественно, да еще и с описанием того, как же сделать качественно, то и уровень этих разработчиков будет стремительно расти. А вы, как владелец продукта, получите стабильно работающее решение, которое легко сопровождать и дорабатывать. • У вас должен появиться портал, где бы вы смогли просмотреть все обнаруженные ошибки и собранные показатели - как общие по проекту, так и в разрезе ответственных за исправление. В идеале, на этом портале можно не только просмотреть список замечаний, но и увидеть их сразу в контексте кода, где они были обнаружены. • И последнее - начните контролировать изменения качества вашей системы по отношению к прошлому релизу. У вас на руках оказываются простые количественные показатели: новые блокирующие ошибки, обнаруженная дыра в безопасности, новый неоттестированный код. Как вообще можно выпускать релиз с такими проблемами? Понятное дело, что требования бизнеса и самый главный представитель заказчика всегда будут «прогибать» вас на выпуск новой версии продукта прямо сейчас. Главное, начните принимать решения о выпуске такого релиза осознанно, с цифрами на руках и пониманием потенциальных проблем. 15.2. Инструментарий для проверки качества кода Сейчас можно найти несколько инструментов для проверки кода. Мы рассмотрим 3 продукты, чтобы у вас было полное понимание о функциональности подобного инструментария для портирования включения в вашу сборочную линию. 320 Silver Bulleters, LLC Автоматическая проверка конфигураций ^Автоматизированная проверка конфигураций Ь «^Автоматизированная проверка конфигураций* (АПК) предназначена для автома-изированной проверки конфигураций, разработанных на платформе «1С:Предприитие 8», на соответствие стандартам и иным требованиям технического характера. АПК существенно расширяет платформенную проверку конфигурации и выполняет статический анализ технического качества конфигураций в автоматическом режиме, не требуя их запуска. Техническое качество решений Для разработки технически качественны* решений на платформе «1C:Предприятие 8» необходимо придерживаться заработанных стандартов и рекомендаций ««Системы стандартов и методик разработки конфигураций для платформы 1С:Предприятме 8>-. Эти стандарты предполагают соблюдение правил разработки конфигураций на платформе «1С:Предприятие 8», в частности, принципов построения архитектуры конфигурации, ее запуска и работы, правил написания кода и правил орфографии в текстах конфигурации. Регулярное выполнение проверок и исправление найденных ошибок а процессе разработки прикладных решений способствует значительному повышении) качества работ, однако выполнение проверок даже небольших конфигураций на постоянной основе вручную бывает проблематично. Основные возможности АПК выполняет проверку технического качества конфигураций в автоматическом режиме, производя следующие работы: Разовая проверка конфигурации на соответствие стандартам разработки Разовая автоматическая проверка конфигураций на соответствие актуальным стандартам разработки конфигураций на платформе «ЮПредприятие 8» (выявление ошибок проверки конфигурации) для получения общего представления о качестве конкретной версии прикладного решение (например, при сертификации на получение статуса «ЮСовместимо»). Рис. 482 - страница типового решения «1С:АПК» Один из них поставляется фирмой 1C. Это - ^Автоматизированная проверка конфигураций. (Рис. 482) Ее описание можно найти на официальном сайте 1C http://v8.lc.ru/acc/. Данная конфигурация позволяет запускать анализ качества решений и формировать отчетность с обнаруженными ошибками. Есть возможность запуска: • Как разовой проверки; • Так и регулярной на основании расписания. Использовать данную конфигурацию можно бесплатно при наличии действующей подписки ИТС или при наличии статуса партнера 1C. Применение: На момент выпуска в печать данного пособия компания 1C выпустила очередной релиз своего продукта Enterprise Development Tools с функцией консольного запуска проверки качества кодирования, однако данный инструмент пока находится в ранней стадии развития и его доработка еще предстоит. Ссылка на скачивание релиза с бета версией этой функциональности http://v8.lc.ru/overview/release EDT 18/, практика использования данного инструмента в сборочной линии только начинает отлаживаться. Если вы читаете это пособие - проверьте актуальную версию EDT, возможно вам стоит включить запуск анализа в свою сборочную линию. Авторы автоматизированной проверки конфигурации в перспективе добавят вызов данной консольной утилиты в свой инструмент, однако планы и даты конкретной реализации неизвестны. 321 Никита Грызлов. Пособие релиз-инженера 1C Статический анализатор кода 1C (Инфостарт) Статический анализатор кода для встроенного языка 1C Опубликовал Александр хромое (honomer) з раздел программирование - Инструментарий *ямдят « '«сам»** •о-е«пглха»е> < 3) ®c-,"T-ei «ягхвефутвя* =•-■ меже1 «ьяЛвЯ Инструмент статического анализа модулей встроенного языка 1C Назначение инструмента Программа предназначена для статического анализа модулей встроенного языка 1C (файлов *.bsl). Зачем это нужно? Применение статического анализа при разработке позволяет сократить количество ошибок, выявляемых на этапе работы и сократить время, затрачиваемое на отладку за счет выявления этих ошибок на этапе разработки. Рис. 483 - страница «Статического анализатора» на infostart.ru Часть инструментов можно найти на Инфостарте. Например, публикация «Статический анализатор кода для встроенного языка 1C». (Рис. 483) У этого инструмента есть возможность: • Интерактивного запуска, когда интересующий нас модуль можно вставить в текстовое окно; • И запуска из командной строки, где можно передать на анализ один или несколько файлов. Список обнаруживаемых нарушений представлен в Readme в разделе «Распознаваемые ошибки». Ссылка https://infostart.ru/public/527258/ 322 Silver Bulleters, LLC Платформа SonarQube Puc. 484 - окно сервера SonarQube Третий рассматриваемый инструмент - это платформа SonarQube, а точнее, использование этой платформы в связке с плагином поддержки 1C. (Рис. 484) Плагин поддержки 1С-это платный инструмент, разработанный компанией «Серебряная Пуля». Однако в рамках данного пособия я рассмотрю возможности платформы как таковой, так как платформа SonarQube обеспечивает единообразное управление качеством кода продуктов вне зависимости от языка программирования, хотя примеры будут указаны именно для 1C языка. Для начала я бы хотел уточнить что в 1C платформе существуют 4 разных диалекта (языка). • Язык программирования 1C (BSL) - для написания модулей и алгоритмов • Язык запросов 1C (SDBL) - для написания алгоритмов выборки данных • Язык описания метаданных 1C (MDO) - для описания модели данных конфигурации, используется в новом продукте 1C:EDT http://v8.lc.ru/overview/release EDT 18/ • Язык описания требований к функциональности 1C (Gherkin) - используется в продукте Vanessa ADD (Vanessa Behavior) Последний диалект языка Gherkin доступен для анализа посредством бесплатного плагина https://github.com/racodond/sonar-gherkin-plugin - этот факт позволяет релиз инженеру обеспечить управление качеством не только кода прикладного решения 1C, но и управление качеством описываемых требований к системе. Сама платформа SonarQube - это комплект приложений: • Сервер хранения результатов анализа - SonarQube Server • Утилита инкрементального анализа каждого изменения на Git сервере - SonarQube Runner • Утилита автоматического комментирования кода на Git сервере - SonarQube GitLab Bot • Утилита онлайн проверки в среде разработчика - SonarQube Linter Использование данной платформы позволяет получать общую информацию об анализируемом продукте, а также собирать и просматривать список различных показателей, в том числе: (Рис. 485) 323 Никита Грызлов. Пособие релиз-инженера 1C • Обнаруженные ошибки; • Уязвимости; • Нарушения стандартов разработки; • Данные о покрытии; • Дублирование кода; • И различные показатели сложности. Также здесь есть возможность просмотреть список имеющихся замечаний с большим количеством фильтров. (Рис. 486) 324 Silver Bulleters, LLC И каждое замечание можно увидеть в контексте разрабатываемого кода. (Рис. 487) Рис. 487 - привязка замечания к исходному коду Советую подключить данный инструмент к своей сборочной линии, чтобы как минимум обеспечить непрерывную проверку качества требований на языке Gherkin. 15.3. Установка sonar-scanner локально В платформе SonarQube анализ выполняется в два этапа. • Первая часть анализа выполняется с помощью утилиты sonar-scanner. Условно, на клиентской стороне (на вашем компьютере или на специально выделенном сервере) запускается утилита sonar-scanner и анализирует исходный код конфигурации, собирает по нему метрики и формирует замечания. • После этого данные анализа упаковываются в архив и отправляются на сервер. На сервере рассчитываются дополнительные показатели и происходит сохранение показателей и замечаний в базу данных. На сайт с документацией по платформе SonarQube можно перейти: (Рис. 488) • Либо из подвала портала, кликнув на гиперссылку «Documentation»; • Либо перейдя в браузере по адресу https://docs.sonarqube.org/. 325 Никита Грызлов. Пособие релиз-инженера 1C Heme / SonarQuhe Rartorm ' SonarGube Platform Created by Abb Cnmptjai. lias! в»а*»зяя J»o OS. 2O1J The SonarQube® platform is an open source quality management platform. dedicated to continuously analyzing ana measuitng the technical quality of source code from project portfolio down to the method level ana tracking the introduction of new Bugs vulnerabilities, and code smells in the teak Репей If you wsh to extend the SonarQube platform with open source plugins have a look at our plugins forge Puc. 488 - сайт платформы SonarQube Здесь нас интересует раздел «Анализ исходного кода» -лч SonarQube Documentation I Documentation / Analyzing Source Сове Analyzing Source Code ft Created by Anonymous fas? $к»3йе<1 by Ann Camebefi on Ш' 28 2017 Table of Contents • Scope of Analysis Types o? Files and Data • Unrecognized ffes |« BW!il»3.&ag]yss ' ' • scdixjiubtf ccmuser? • For More Information Once the SonarQube platform has been instated you're ready- to install an analyzer ano begin creating projects A project is created in the platform automatically on its first analysis However it you need to set some configuration on your project before ns first analysis you have (he option of provisioning it Puc. 489 - документация по запуску анализа Здесь нам предлагается выбрать один из возможных вариантов запуска sonar-scanner - для кода 1C и Gherkin нам подходит «SonarQube Scanner».(Рис.489) Откроем скачанный архив и извлечем его в нашу рабочую директорию. Дождемся окончания распаковки. Перейдем в распакованный каталог, в каталог bin, откроем здесь командную строку и вызовем команду: sonar-scanner То, что вы сейчас видите в консоли ошибку — это не страшно. (Рис.490) Самое главное, что sonarscanner начал свою работу и попытался подключиться к серверу. Если на вашей машине уже работал allure 326 (а значит установлена JDK), то других ошибок возникнуть не должно. Silver Bulleters, LLC C:\wor4space\sonar-st«nner-3.e.l,733-wlndows\binssofiai--sca(iner c: lfiWfcspace\sohaj‘-staasar-3.0. l„733-wi«dotts\Mn\„., INFO: Scanner configuration file: C:\norkspace\son3r-scafiner-3.e.l.733-winttas5\blnK,,\tonf\scnar-scanner.properties IMFO: Project root configuration file: NONE INFO: SonarQube Scanner 3.0.1.733 INTO: lava l.a.8_lZl Oracle Corporation (64-bit} INTO: Windows 10 10.0 аяй64 . INFO: User cache: C:\lfsers\test\.sonar\cache n ERROR: SonarQube Server [http://localhost:9000] cats not be reached INFO: ............. .................... ............. ............ ....................... -----........................... -........................... - INFO: EXECUTION ttllfJM INFO; ---......... ............................. -----—............... ........... ................... ............ .............. ................. INFO: Total time: 6.S27S INFO; Final Memory: 4К/123И WtQR: Error during Ssnar-tjube Scanner execution Puc. 490 - вызов sonar-scanner в командной строке Скопируем путь к данному каталогу, откроем «Свойства компьютера» - «Дополнительные параметры системы» - «Переменные среды». Выберем переменную path и добавим туда новую строку. После этого запуск утилиты sonar-scanner должен быть доступен из любого места. Проверим это. Откроем новую командную строку и попробуем выполнить sonar-scanner. Если данная утилита начала выполняться, значит, данное действие выполнилось успешно. Если вы получили ошибку о том, что данная утилита не найдена, необходимо выйти из системы и зайти в нее заново. 15.4. Настройка свойств проекта для SonarQube Вернемся на страницу «Анализ с помощью SonarQube Scanner» и перейдем в раздел «Использование». (Рис. 491) Use Create a configuration tee to me root directory of me protect sonar-proper, properees . sonar-proj«e.prop*ra»s » east be unique in a given SonarQube instance sonar.projecttey-ey:project tr this is ths лая» and version displayed in the SonarQube UI. was «inflatory prior ta SonarQube 6.1, sonar.projectHane»Ky project sonar.projectversion-l.e » Path is relative to the sonar-project.properties file. Replace "V by "/" on Windows, r Since SonarQube 4.2, this property is optional If sonar.modules is set. a If not set, SonarQube starts looking for source code from the directory containing : a the sonar-project.properties file. sonar. sources*. ♦ Eneoding of the source code. Default is default system encoding esonar.sourt«Encpd4Rg*0TF-8 Sun the following command from fife project base directory to launch the analysts sonar-scanner Project Samples To heip you get started. simple protect samples are avalta&le tor most languages on gBnit). They can tee browsed or oowataaded. You'll And them fUed under prqjeeisEaftguages. Puc. 491 327 Никита Грызлов. Пособие релиз-инженера 1C В документации сказано, что нам необходимо в корневой директории нашего проекта создать файл sonar-project.properties. Перейдем в редактор Visual Studio Code и в корне нашего проекта создадим новый файл sonarpro j ect.properties. Вставим в данный файл пример из документации и модифицируем его под наши нужды: • Во-первых, в поле sonar .projectKey необходимо будет указать ключ, который вам предоставит один из преподавателей. Мы в нашем примере будем использовать ключ trade. • В качестве имени проекта sonar. pro j ectName укажем название нашей конфигурации - trade. • Параметр «Версия проекта» на данном этапе удалим. Мы сможем его вычислить на основании файла конфигурации. • В качестве пути к исходному коду sonar. sources один каталог: • Для того чтобы анализатор sonar-scanner о Каталог .'/features. корректно распознавал кодировку файлов, раскомментируем свойство sonar. sourceEncoding - все наши файлы сохранены в кодировке UTF-8. Файл настроек проекта готов. Сохраним его. 15.5. Пробный запуск sonar-scanner Теперь, когда мы получили готовый конфигурационный файл, мы можем попробовать запустить утилиту sonar-scanner локально. Для этого нам понадобится указать два дополнительных параметра запуска: • Во-первых, нам нужно будет указать путь к серверу, на котором мы будем производить анализ. • Во-вторых, нам понадобятся данные авторизации. Путь к серверу SonarQube по умолчанию - это http://localhost:9QOO/. Его установка описана на сайте SonarQube - docs.sonarqube.org, для поддержки анализа файлов функциональности необходимо скачать плагин с сайта github https://github.com/racodond/sonar-gherkin-plugin/releases и положить в папку расширений сервера как указано в документации. Любой язык - PHP, C# и, разумеется, 1C (BSL) т.д., подключается к платформе именно через систему расширений плагинов. Для выполнения анализа откроем новую командную строку, перейдем в каталог нашего репозитория и укажем команду sonar-scanner. Настройки проекта сохранены в файле sonar-project .properties. Однако для запуска нам дополнительно необходимо указать путь к серверу и данные авторизации. Дополнительные параметры sonar-scanner указываются с помощью параметра -D, после которого без пробелов указываются ключ свойства, «равно» и значение. • Для указания адреса сервера служит ключ http://localhost:9000 -Dsonar.host.url=http://localhost:9000 328 sonar .host .url, в качестве значения Silver Bulleters, LLC • Для указания аутентификации служит ключ sonar. login. -Dsonar. 1од1п=ПолученныйТокенАвторизации, в нашем случае ключ не используется в связи с локальной установкой SonarQube, на картинках отображен запуск с ключом в случае использования собственного защищенного сервера анализа Выполним команду: sonar-scanner -Dsonar.host.url=https://sonar.silverbulleters.org -Dsonar.1од1п=ПолученныйТокенАвторизации Puc. 492 - результат успешного запуска sonar-scanner Первый запуск может занять длительное время. После выполнения анализа мы можем перейти в браузере по ссылке с нашим проектом и увидеть данные анализа. Q Trade й 14 а^кглв 2ОГ» у. ВТб Verwon лз'рв’бяйгз Замечания а О Режиме К Тип дате создания 1 duplicated btettis of Ж Оми&ка О '.миое* О 6 Уязвижэсть » £ ’ . 2&Т-.Г. 1/2£М»мемт?й S Перез«ируотшТ НавМйЛоие» ) Ммхоеое Прскснлмвжтяроая» I Здявнгоад* «о Тг pin*? » ’-естественный «од В Решение веггйм Ложно 23 - Исправлено й Неактуально « *' ф В«ЖНО# */ О * 2йй» угждаЗ (фйймямвнк 2дманазда» £у Т» *• гооЬ'с.уОсьаз ООрьезвдпь ОЬзф О Дата О Права/кОтес Dw* ... removed. I 1 duplicated fe имачктвеннвй* кед • О Важное» О С £ .-oaGiyiiav » 2£>М'Л усилий Проком«ен-'.-оавагв « описание к жслорной переменной «од* © Кетнамит*.'»»** » ОСтгл»’ £ 'л&#у*’ Юммпуеевий ' Слишком дмсмнав строжа, Количество символов Ш используйте перенос строжи {Максимально» длина строки 120) * © Нц->чаните.'ьное» О Сбрито- £ ■•Л-габгупа»» усилий ПваьяАп^нгъьыгв •8а>я.яаа«» Sj> Тт- % ре?*? * Зднанама» !-9 Гд Т* ♦ жсввиш* 3 дне ййзлд » !. КМ Sj, Т* 4 ст сопвегтвп » D иотмвг О « га? Слишком длинная строка к о симвожиз 121 используйте перенос строки (Максимальная аяи«а строки 120) О СМ>*.-г- £ 4гс» •>,?&» » етпет успяиД Про*О***мя»?*р««#?|» 1а»«.«азм» Ш2 % Т* 4 аел сопзтям» ел •» Рис. 493 - результаты анализа на сервере SonarQube Из интересного: (Рис. 493) Во-первых, так как наша конфигурация хранится в Git, Sonar автоматически подставил ответственного в обнаруженных замечаниях. 329 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 494 - показатель цикломатической сложности Платформа SonarQube сама проанализировала цикломатическую и когнитивную сложность наших модулей. (Рис. 494) Й ЙТнюе 14 Покз»т№ Й Коа Активность 13:1$ Уегеюояв* радАй Ааши*истрирС8»«ие» Уоияи!» для Досякжякж Зфоекя Сопрежзждяемости А в Дублирования 10.8% Дубяирутвщиеся Участки 3 Дублирующиеся Строки 68 Дублирующиеся Файлы 3 Строки Рис. 495 - процент дублирования кода А также обнаружила имеющиеся дублирования. (Рис. 495) Получим информацию по показателю «Дублирующиеся участки». В списке указаны все файлы, в которых обнаружены дублирования. 330 Silver Bulleters, LLC Если перейти по ссылке с именем файла то можно увидеть сам дублирующийся код(Рис. 496) Аналогичную информацию можно получить и для показателя цикломатической сложности. Анализ больших конфигураций довольно ресурсоемкий. Для него требуется большой объем доступной оперативной памяти. Однако по умолчанию java-процесс ограничен использованием 256Мб оперативной памяти. Для предоставления дополнительных мощностей sonar-scanner, мы можем воспользоваться специальной переменной среды sonar_scanner_opts. Вернемся в командную строку и установим дополнительное разрешение для памяти: в переменную среды sonar scanner_opts • Это делается с помощью команды set; • После нее следует имя переменной среды sonar_scanner_opts; • И через «равно» указывается значение - для увеличения объема доступной памяти служит параметр -Хтпх и указывается конкретное значение. Например, 512т. Выполним данную команду: Set SONAR_SCANNER_OPTS=-Xmx 512m И снова попробуем запустить анализ нашего кода. 331 Никита Грызлов. Пособие релиз-инженера 1C t:'iworkspacetgit' trade?sonar s. .iraer -Osonar.iiosl -https: ■ /sonar.. ilverbulleters.org S27«tebM»2I«<S01 /6в«Ш C:\worXspac»', sonar-scanner 3.0.1.73/ uindous/bin),. w • Scanner configuration : ШГО Project root configuration file: c:\^prl?5p-3ce\git\trade\sonar-prpje€t .properties OTO SonarQube Scanner 3.0.1.733 '«f' 3ava S.8.8JI21 Oracle Corporal ion (64-bit) wo Hindoos 18 10.6 amdOA OTO SONAR SCANNER 0РГ5=-Х%х512я IMFG fear cache: C : \Use-r_i л*ь’.. • . SOnar'UoCf-г ITiFO Load global settings WO Load global settings (done) I tisie~58eas if .• Server id: 14b52a0dbc49e2f ОТ J User cache: t:\Users4test\.sonar\cache W j Load plugins index от Load plugins index (done) I time-'/Ws SonarQybe server 6.3.G от , Default locale j "ruJSU**., sowrce code "Ui*-3W PLOT Process project properties OTO Load project repositories wo toad prefect repositories /clone) | OTG fcxecute project buildersExecute project builders (done) 1 OTO toad Quality profiles wo toad duality profiles (done) 1 tlisr-u/Bs wo Load active rules Osonar, login 4eW82dbafftt690M sonar• sc.-- ■ Рис. 497-легирование дополнительных опций Как вы видите, теперь sonar_scanner_opts в логах появилась информация о значении переменной среды и java-процесс сможет использовать больше доступной оперативной памяти. (Рис. 497) 15.6. Конфигурирование Jenkins-установка sonar-scanner Для работы sonar-scanner на Jenkins нам необходимо установить дополнительный плагин и произвести настройки. Перейдем в Jenkins. «Настройки»-«Управление плагинами». На вкладке «Доступные» найдем плагин «SonarQube Scanner for Jenkins». (Рис. 498) Отметим его к установке и нажмем кнопку «Установить без перезагрузки». Внизу страницы отметим флаг «Перезапустить Jenkins по окончанию установки» и дождемся перезапуска Jenkins. 332 Silver Bulleters, LLC SonarQube servers Environment variables i J Enable injection of SonarQube server configuration as build environment v enables IT ch«o»*<J job >-3-p-=*!’«??»tor» w« О» atbw to ejost » SonofQwbo butfcf SonarQube installations Name Server URL o©nfgur»t«n »* ♦n»*on<T»onl MdtMt SonarQube https //sonar silvertruSetera wg Default ts hti©:.' oceMaat&OOS Serv er version 5 3 or higher T S-onfo-raton fe«s гвзе-d on the SanarQuea server »rsoh. Server authentication token ..........I..................... ........ SonarQu®® aathefltaeeten »«#-n Mandatory *nei enonywous ecoes» s (tea&art SonarOube account login SvwQvb* aeeouhi vted » ре*в'«г. алаум van anon, wnen anonytrou» >&ве» « ttaeCriM Ho longer umO »-pce SonarQube 5 3 SonarQube account password SonarQube account u»ea to oertonn ana^rK Mandator? when епопуямы* осям* « з-teee-a Ho longer uted uro® SenarQuW 9 3 Расширенные,.. Puc. 499 - настройка авторизации Jenkins на сервере Sonar После перезапуска Jenkins выполним необходимые настройки. Перейдем в секцию «Настройки» и откроем «Конфигурирование системы». (Рис. 499) В настройках системы перейдем к разделу «SonarQube servers» и добавим новый сервер SonarQube. • Укажем его имя - например, SonarQube • И сетевой путь - http://locaIhost:9000. • Версия сервера 5.3 и выше. • Ив качестве параметров аутентификации вставим сгенерированный токен. Сохраним настройки. 333 Никита Гоызлов. Пособие релиз-инженера 1C Вторая часть настроек - это настройка самой утилиты sonar-scanner. Перейдем в «Настройки Jenkins» и откроем раздел «Global Tool Configuration». (Рис. 500) SonarQube Scanner SonarQube Scanner SonarQube Scanner установок Name | sonars C onner 0 Required install automaticaiiy © Install from Maven Central Версия SonarQube Scanner 3 0 1 733 » Удатмпъ yciemjeu|M Добавки, установщик ’ УПелеть SMMfOuOc Scanner Добавить SonarQube Scanner СПИОО» SonH^Qub» S^CifW' узТЖМОИМ * «KWM Puc. 500 - настройка глобального инструмента для sonar-scanner Перейдем к секции «SonarQube Scanner» и нажмем «Добавить SonarQube Scanner». • В качестве имени укажем «sonar-scanner»; • Отметим флаг «Установить автоматически»; • С установщиком из Maven Central. Сохраним изменения. Наш Jenkins готов к запуску. 334 Silver Bulleters, LLC 15.7. Сборочная линия - Непрерывная проверка качества кода Подготовительная часть закончена, перейдем к настройке Jenkinsfile. Рис. 501 - фрагмент сборочной линии с вызовом шага tool Откроем редактор Visual Studio Code и выберем Jenkinsfile. Плагин «SonarQube Scanner» не предоставляет готового шага для запуска анализа. Однако мы можем получить путь к утилите sonarscanner аналогично тому, как мы это делали для утилиты allure. (Рис. 501) • Для начала объявим новую переменную scannerHome def scannerHome • Внутри секции script стадии «Статический анализ» добавим ее заполнение - для вычисления пути к sonar-scanner будем использовать уже знакомый нам шаг tool. В качестве имени получаемой утилиты укажем значение sonar-scanner -то значение, которое мы задавали для утилиты на странице scannerHome = tool «Global Tool Configuration». В результате у нас получится: ' sonar-scanner' 335 Никита Грызлов. Пособие релиз-инженера 1C Рис. 502 - вызов специального шага withSonarQubeEnv Для добавления в контекст сборочной линии данных о сервере SonarQube, который мы настраивали на странице системных настроек, мы можем воспользоваться шагом withSonarQubeEnv. (Рис. 502) • Укажем шаг withSonarQubeEnv после секции script -в качестве параметра ему передается название настройки SonarQube: withSonarQubeEnv('SonarQube') • Внутри данного блока будут доступны переменные среды, которые сможет считывать sonarscanner. Для его запуска укажем шаг cmd, в параметрах которого будет путь к запускаемой утилите. Этот путь мы построим с помощью обращения к переменной ${scannerHome}, как ${scannerHome} \bin\sonar-scanner. В результате, получим шаг: cmd('${scannerHome}\bin\sonar-scanner' ) В настройках проекта в файле sonar-project .properties мы не указывали версию проекта. Из-за этого, если мы запустим анализ в его текущем виде, на сервер не будут переданы данные о версии. Сама версия конфигурации хранится в файле Configuration.xml и мы можем прочитать данные из него аналогично тому, как мы это делали для файла версии хранилища. pipeline { agent { label ’Ьай’ Рис. 503 - объявление переменных Для начала объявим две новые переменные (Рис. 503). 336 • configurationText • И configurationVersion. Silver Bulleters, LLC Slag»{ «течек лий steps { ) { script { .! {env.evltD_NUMBFR.endsHith( *<,“)) { build job: ’eyrie*, wait: false build job: \:\Г, wait: ’ ■ } sCaneerHeee - tool 'мяш srenrser’ Puc. 504 - копирование ранее примененной методики чтения файла VERSION Для вычисления версии конфигурации скопируем код, который мы писали для файла version, вставим его внутрь блока script для секции «Статический анализ» и отредактируем: (Рис. 504) • Изменим наименование переменных на configurationText и conf igurationVersion. • Поменяем путь к файлу на Configuration.xml • И поменяем регулярное выражение. Данные о версии конфигурации хранятся в файле Configuration.xml в тегах <Version>, где заглавной является только первая буква. • Не забудем поменять переменную versionText на configurationText в месте вычисления значения configurationVersion. 337 Никита Грызлов. Пособие релиз-инженера 1C Теперь в переменной configurationVersion у нас есть версия конфигурации, а значит, мы можем передать ее sonar-scanner. Stage(' CiatHMi < гий аии,;»./ ’} steps { { script { if (env,BURDJJUMBEB,en(RWith( • )) { build jeb: ‘cyclo', wait; build job: 'fyd’j wait: } scannerMsee - tool "sonar sc«svt?r‘ conf igurat ionText = read File encoding: file: ' . nf conf igurationVersion ‘ s: rsi (configurationlext — у :• -n • ' 1 wi th5onarQub<?Fnv( ' -rgir - ' ) { ced(’$ { s ; а пче гнояге: / bin/:: n a r scanпег • Psarar. p boj ec tve fs ion-S f corgigurati c nVers ign1 “) I } 1 Puc. 505 - передача параметров в сканнер Для этого в шаг вызова sonar-scanner добавим установку версии проекта: (Рис. 505) • Параметр -D; • Ключ настройки sonar.projectVersion; • И значение - получение переменной $ (conf igurationVersion}. Формирование Jenkinsfile завершено. Сохраним файл, зафиксируем наши изменения в Git. Укажем, что мы добавили настройку для SonarQube. (Рис. 506) Перейдем в Jenkins и выполним задачу «trade_pipeline». Проследим за ходом выполнения. • В секции статического анализа видим шаг установки утилиты sonar-scanner в рабочий каталог j enkins_slave. 338 • В шаге запуска sonar-scanner видим наш параметр sonar.projectVersion. И указание версии - 1.о.о.0. • Далее следует сам лог выполнения анализа SonarQube. Silver Bulleters, LLC Дождемся окончания выполнения задачи. (Wpelbe] (Pipeline i (РфеНпе] кф* [Pipeline] ( topping httj^J/ге^Ьттет*ог^^^я2/ог^/.тежГ^МГсе/.1шааг/с11/»О^Г.“Асапгшгг,с11/5,.й, 1^131/gs^ar-scanner -сЩД,. 1Л ?33>.rh> to - - i1 ■ > - ' i -■■ к ' ' ’-.^Г I1T -?i x (Pipeline] readfile (Pipeline] } [Pipeline] // script (Pipeline] й!г@р Injecting SonarQube environment .-ariafeles using the configuration: SonarQube [Pipeline] { J Pipe 2 i м ] 1«a&is r[Hp?M«ej feet [trasie_pipelin«| Running batch script C: v^>rksp«ce\ jenkins_bIaveVpa3rksp*ce\trade_piprlln«>chep ®S©@1 Active code pag«: 0S»1 €:4H»rkspace\Je^ldm№$lave\work5pace\trade_pipeXi«e>C: Work;space\ jenkins^slaveXtwlsXhudsofi^plugins. scMier. SonarR«f»fMsrJnstall«tim\Aone r«s ca л ne r / b in/smar-scanner -Dsonar.projectVersion«i.e,g.© C: \wprkspe<e\$eftHfts~H«ve\teol5\huds«bpiugxn5 .»»ar.s^erfenner3n5.*:»lXetion\ sonar-sc аппегЧШЛ. - Puc. 506 - выполнение сканирования в логах Jenkins Рис. 507 - новый раздел SonarQube в панели навигации После окончания сборочной линии вернемся в настройку задачи «trade_pipeliпе» и можем заметить, что у нас появилась гиперссылка «SonarQube». (Рис. 507) 339 Никита Гоызлов. Пособие релиз-инженера 1C Рис. 508 - результат проверки версии на сервере SonarQube Если мы перейдем по ней, то окажемся на сайте https://localhost:9000 с информацией о нашем проекте и увидим, что для проекта была добавлена версия 1.0.0.0. (Рис. 508) Подобным образом вы можете встроить статический анализ кода в вашу сборочную линию для любого языка. В частности, платформа SonarQube поддерживает более 30 языков. Плагины для большей части из них бесплатны и разрабатываются самой компанией SonarSource. Примечание: обратите внимание на способ извлечения версии конфигурации из файла метаданных Configuration.xml - подобный подход может и должен использоваться в других задачах сборки, тестирования и развертывания где необходимо обеспечить логику работы с версиями конфигураций 1C устанавливаемой в конфигураторе 1C. 340 Silver Bulleters, LLC Раздел 16. Заключение Описание настройки процесса непрерывной интеграции завершено. В рамках этой книги вы приобрели навыки: • Подготовки инфраструктуры с помощью средств виртуализации; • Построения полноценной сборочной линии продукта: о От статического анализа кода; о И выполнения дымовых и поведенческих тестов; о До формирования готового дистрибутива о И автоматического развертывания вашего программного продукта. Процесс CI-CD непрерывен и многогранен - впереди вам еще предстоит решить множество интересных задач и преодолеть возникающие трудности. Главное: • Не оставляйте этот контур только для себя; • Распространяйте знания о нем среди вашей команды; • Заводите их на сервер сборок; • Подключайте рассылку писем; • Вместе решайте проблемы; • И постоянно думайте о том, как же еще можно улучшить вашу сборочную линию. Полученные знания помогут вам решить различные проблемы стабильности вашего решения. Благодаря автоматизации процесса проверки и быстрому регулярному получению информации об обнаруженных проблемах вы сможете значительно увеличить скорость разработки и сократить затраты на исправление ошибок. От лица всей команды «Серебряная пуля» желаем вам успехов в этом нелегком и интересном деле! 341 Никита Гоызлов. Пособие релиз-инженера 1C Раздел 17. Приложения для самообразования В процесс изучения данной книги вам предлагается выполнить несколько проверочных работ. 17.1. Блок теории - вопросы для самопроверки Для вас явно указаны сразу правильные ответы. (Выделены жирным шрифтом) Ваше несогласие с этими ответами, скорее всего, означает, что вы недостаточно подробно ознакомились с первыми разделами данного пособия. Понятийный аппарат проверка понимания ключевых терминов и восприятия текста 1. В чем принцип непрерывности интеграции? • В регулярной проверке работоспособности модулей (правильный ответ) • В постоянной проверке алгоритмов интеграции • В постоянной интеграции 2. Требования к процессу непрерывной интеграции: • Исходный код в системе контроля версий (правильный ответ) • Все действия выполняются автоматически (правильный ответ) • Выделенный сервер проведения автоматизированной сборки (правильный ответ) • "Ночная сборка" 3. Какой шаг НЕ входит в минимальный процесс непрерывной интеграции? • Получение исходного кода • Сборка проекта • Выполнение тестов • Создание авто-инструкций (правильный ответ) • Развертывание на демонстрационном контуре • Рассылка отчетов о результатах 4. Результатом непрерывной поставки является? • Конфигурация 1C • Внешняя обработка 1C • Дистрибутив конфигурации 1C • Дистрибутив решения на 1C (правильный ответ) 5. CI-CD это 342 • Сервер сборок • Автоматическое тестирование • Процесс автоматизированного тестирования и развертывания Silver Bulleters, LLC • Процесс автоматизированного тестирования, развертывания и дистрибуции приложения (правильный ответ) 1 Script и его приложения базовые знания по необходимому инструментарию релиз-инженера 1. Пакет IScript это? • Библиотека для подключения в свои скрипты (правильный ответ) • Приложение для интерпретатора IScript (правильный ответ) • Командный файл для запуска из консоли 2. Какой командой можно обновить все пакеты • opm install • орт update • орт update -all (правильный ответ) • opm install орт 3. Иерархическая выгрузка в файлы появилась в версии платформы 1C? • Редакция 8.3.3 • Редакция 8.3.7 (правильный ответ) • Редакция 8.3.10 4. RAS и RAC это? • Утилиты администрирования 1C • Сервер и клиент администрирования кластера 1C серверов как отдельные утилиты поставки платформы 1C предприятие (правильный ответ) • Другое 5. Для развертывания применяется пакет? • vanessa-runner • deployka (правильный ответ) • packman • gitsync 6. Для автоматизации сборки применяется пакет? • vanessa-runner (правильный ответ) • deployka • packman • gitsync 7. Для создания дистрибутива применяется пакет? • packman (правильный ответ) • deployka 343 Никита Грызлов. Пособие релиз-инженера 1C • gitsync Docker - система контейнеров Для выполнения теста - необходимо вызывать определённые команды docker и проверить настройки собственного контура, для прохождения теста достаточно развернуть docker и скопировать команду 1. что выведет команда "docker run ubuntu bash echo l" ? • cannot execute binary file (правильный ответ) • echo not found 2. что выведет команда "docker run ubuntu sh -c "echo l" "? • cannot execute binary file • 1 (правильный ответ) • echo not found 3. что выведет команда "docker run, my_hello_world echo l" ? 344 • привет мир • 1 (правильный ответ) • cannot execute binary file Silver Bulleters, LLC 17.2. Домашние задания для реализации в процессе чтения Конфигурация для выполнения домашних заданий доступна под адресам • Google Drive - https://qoo.pl/bwpVpb • Yandex Disk - https://yadi.sk/d/BqNilvof3UpeEm В случае недоступности или проблем доступа, пожалуйста, опишите проблемы на форуме https://xdd.silverbulleters.org/ Список домашних заданий • Сделайте так, чтобы ваш GitLab отправил вам письмо с просьбой изменить пароль от вашей учетной записи. • Установите плагин для архивирования https://wiki.ienkins-ci.org/display/JENKINS/thinBackup о Сделайте настройку архивирования в папку вашей конфигурации Jenkins, при помощи закладки localhost:8080/thinBackup/ • Скачайте демонстрационную конфигурацию и файл описания функциональности на языке Gherkin, добейтесь работы gitsync с вашей инсталляцией gitlab и Jenkins. • Добейтесь обновление тестовой базы из хранилища при помощи Jenkinsf ile • Создайте отчет по feature-файлу, приложенному к демо-конфигурации с помощью плагинов для Jenkins - cucumber и pickles, используйте для этого функциональность VBParams . j son • Сделайте дистрибутив «Setup. ехе» для демонстрационной конфигурации с помощью packman средствами Jenkinsf ile напрямую из исходников « . /зге» • Добавьте в сборочную линии команду синтаксической проверки конфигурации 1C при помощи vanessa-runner syntax-check • Добавьте на свой Jenkins расширение Jenkins-Gitlab-Plugin (скачивается посредством центра обновлений Jenkins). Для отображения статуса сборки и с помощью команды updateGitlabCommitStatus (name: , state :) добейтесь отображения сборочной линии для коммита Gitlab. Пример результата на рисунке ниже. ' Pipeline if 7 trigRarecs 8 rTtinutet ад о by itt- Administrate? © 8 tabs iara in 0 seconds Рдаагтм? Jobs § « >n s ceoan-t Дмадоаое тсчппсьвлчис 06(*аз<гепие зесгоэый чочтуэ Г СЛ'О'ОЗеД Я.(СТО.*6>ПИ '.Т «П Геаьеоча нозесенив gw S2E359 Сгзтичесчий ачзпиэ 345