Загрузил serglandcepelev

Пособие релиз-инженера 1С: разработка по промышленным стандартам

НИКИТА ГРЫЗЛОВ
ПЕРВАЯ МЕТОДИЧКА ОТ
«СЕРЕБРЯНОЙ ПУЛИ»
ИНЖЕНЕРА 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
Похожие документы