Меня зовут Павел Олейников, я представляю команду Инфостарта, и в этом мастер-классе я и мои коллеги Светлана Попова, Виталий Подымников и Валерий Пронин расскажем вам о том, как можно применять практики DevOps при разработке в 1С – какие для этого есть инструменты в принципе, что из этого мы используем в своей работе, и как именно мы эти инструменты применяем.
Мастер-класс будет разбит на четыре части:
-
Я расскажу про процессы DevOps, инструменты, используемые для каждого из них, и про работу с Git;
-
Виталий расскажет про проверку качества кода;
-
Светлана расскажет про тестирование;
-
а Валерий с учетом того, что мы показали, сделает скрипт для Jenkins, который будет собирать проект, тестировать его и выдавать в результате – либо релиз в виде cf-файла, либо рассылку в почту об ошибках.
Процессы DevOps
Эмиль Карапетян в своем докладе рассказал, что такое DevOps и как его использовать в команде разработчиков. А мы более подробно рассмотрим его процессы.
-
Coding – это написание кода, управление версиями, качество кода;
-
Building – сборка;
-
Testing – тестирование приложения;
-
Packaging – сборка релиза;
-
Releasing – управление обновлением рабочей базы;
-
Configuring – управление инфраструктурой;
-
И Monitoring – это контроль того, как все это работает с точки зрения железа и с точки зрения отзывов от пользователей (сбор обратной связи).
Coding. В процессе написания кода нам могут понадобиться следующие инструменты:
-
конфигуратор 1С и хранилище 1С в качестве системы управления версиями;
-
мы можем вести разработку в EDT и хранить исходники в локальном хранилище Git, используя GitLab при совместной работе с кодом;
-
для проверки качества кода мы можем использовать SonarQube с плагином BSL, а при непосредственной работе в EDT – плагин BSL, который написал Александр Капралов;
-
так как мы разрабатываем в EDT, мы можем редактировать код, используя обычный блокнот или редактор VS Code (это удобно, если вносить небольшие изменения именно в код, а не в формы). Вообще VS Code + Git очень удобно использовать даже в качестве обычной записной книжки, чтобы писать доклад и всегда иметь возможность просмотреть историю изменений – тогда и Dropbox не нужен.
-
OneScript – кроссплатформенная реализация виртуальной машины, которая позволяет писать на языке 1С скрипты по автоматизации различных действий и запускать их из консоли. Создатель OneScript – Андрей Овсянкин.
-
И Jenkins – чтобы все это автоматизировать. Потому что, можно запускать эти процессы вручную, можно написать для этого батники, а можно использовать Jenkins и построить сборочную линию, которая будет все это запускать по очереди.
Building. Второй процесс – сборка. Здесь тоже используется:
-
Jenkins – чтобы запускать скрипты автоматически;
-
OneScript – чтобы команды в скриптах были на знакомом языке;
-
а 1С и EDT здесь нужны, потому что команды OneScript для сборки конфигураций, которые дальше будут тестироваться, запускают или тот же конфигуратор 1С в пакетном режиме, или утилиту ring от EDT.
Testing. Для тестирования приложений можно использовать:
-
«Сценарное тестирование» от фирмы «1С» либо связку СППР и Vanessa Automation. Светлана Попова в своем докладе более подробно расскажет, какие плюсы и минусы от этих вариантов мы увидели.
-
Jenkins – чтобы все это запускалось автоматически;
-
OneScript – чтобы скрипты по запуску инструментов тестирования были на знакомом языке;
-
и Allure – для красивого представления отчетов.
Packaging, Releasing – при автоматизированной сборке релиза и обновлении рабочей базы у нас используется все то же самое, что было на процессе Building – это Jenkins, 1С, EDT, OneScript.
Процессы Configuring и Monitoring я объединил, потому что у нас в Инфостарте инфраструктурой занимаются внешние подрядчики, и все инструменты, показанные на слайде, пока находятся не у нас – мы отсюда используем только BPM, это наша внутренняя система для учета задач, заявок.
Методология DevOps
DevOps – это не только автоматизация работы, это также регламенты, инструкции, способы работы.
Получается, что даже набор правил, регламентов, внутренних инструкций для разработчиков в вашей компании – это тоже DevOps, потому что DevOps не говорит про автоматизацию, он говорит про то, что процессы должны быть.
И мы все этим занимаемся. Мы все пишем код, договариваемся, кто, как его будет писать. Мы можем использовать правила из стандартов разработки фирмы «1С», можем придумывать для своих команд свои правила. Но если мы соблюдаем правила, это значит, мы уже в принципе проводим какой-то анализ кода. То же самое с тестированием – если вы хотя бы запускаете отчет и видите, что он что-то выдает, вы делаете маленькое, но тестирование.
Я к тому, что мы все всегда занимаемся DevOps, он у нас есть. Одни процессы могут быть не сильно развиты, другие отработаны лучше, но в каком-то виде он все равно есть. И то, что мы называем DevOps – это:
-
В первую очередь завязано на регламентацию процессов – чтобы эти процессы были не просто придуманы, а еще и где-то зафиксированы, и все их понимали.
-
И второе – чтобы эти процессы были автоматизированы и запускались сами. Чтобы программист писал код и не думал о том, как обновлять базу. Он пишет код, а всем остальным занимаются другие инженеры.
Варианты использования практик DevOps
Давайте посмотрим, какие сборочные линии из этих инструментов можно сделать.
Первый вариант – разработка в конфигураторе через хранилище
Это самый простой вариант для старта, когда:
-
программисты работают так, как они привыкли – они пишут код в конфигураторе 1С и отправляют в хранилище то, что написали;
-
дальше мы автоматизировано выгружаем исходники из хранилища 1С в Git с помощью GitSync – при выгрузке в хранилище у нас каждое помещение в хранилище будет отдельным коммитом, и в принципе можно будет отследить, кто, что туда положил;
-
потом по выгруженным исходникам запускаем проверку качества с помощью SonarQube;
-
после проверки качества проводится тестирование;
-
и в случае, если все хорошо, мы можем из файлов, которые находятся в Git, подготовить cf и дальше релизить его на рабочую базу (либо в базу для демонстрации и уже оттуда обновлять – здесь все зависит от того, у кого какие процессы).
Второй вариант – разработка в EDT через Git
Мы попробовали перевести разработку некоторых наших решений в EDT – это удобная платформа, интересная, со своими нюансами. Если привыкнуть к тому, что она еще сырая (там еще не все работает корректно), то почти идеально. Иногда бывают ошибки, но есть очень много плюсов, которые мне лично понравились.
-
В этом случае разработчики пишут код непосредственно в EDT;
-
EDT сразу связано с Git, сам проект в EDT – это набор файлов, который уже находится в локальном репозитории.
-
Непосредственно в процессе написания кода в EDT мы проверяем его качество с помощью BSL-плагина от Александра Капралова – чтобы сам программист посмотрел, что он там написал.
-
А когда разработчики выгружают свои изменения конфигурации в общую ветку develop, у нас отдельно запускается проверка качества с помощью SonarQube. Эта проверка показывает ситуацию в целом – кто сколько допустил ошибок, насколько дублируется код у разных разработчиков – потому что такое тоже может быть.
-
Дальше – тестирование.
-
И последний этап – подготовка релиза, когда по результатам тестирования мы понимаем, что этот слепок можно отправить в master. Отдельной ветки релиза у нас нет, есть только ветка master, из которой мы при добавлении коммита собираем cf-ник. То есть шаг сборки релиза у нас есть, но мы считаем, что хранить его в Git в виде отдельной ветки не обязательно.
Как можно использовать сам Git?
-
Можно использовать вариант, когда у нас есть одна ветка master и каждый разработчик создает под себя отдельную ветку, в которой что-то меняет, тестирует, а потом заливает в master.
-
Можно все ветки разработчиков выгружать в ветку develop, где будет проходить тестирование, а ветку master вести отдельно, и выгружать туда только протестированнные изменения – такой вариант используется у нас.
-
А можно обратиться к опыту разработчиков, которые создали методику GitFlow. В ней есть две обязательные ветки:
-
master – это рабочая система;
-
develop (основная ветка, с которой ведется работа);
-
под каждую задачу создаются отдельные ветки, в которых ведется разработка;
-
после того как содержимое ветки develop протестировали, данные отправляются в ветку release, а оттуда уже в master;
-
если вдруг возникает необходимость внести быстрые изменения, появляется ветка maintenance, в которую вносятся изменения, и они сразу же мержатся и в master, и в develop, а из develop во все ветки задач. Это нужно для того, чтобы ветки разработчиков у нас всегда были более продвинутыми (пусть даже не всегда протестированными и рабочими), чем master, и чтобы никакие изменения не потерялись.
-
Практика работы с Git
Давайте перейдем к практике, посмотрим, что такое Git.
Git – это система, которая позволяет контролировать, как изменяются файлы, поэтому использование Git для конфигураций 1С стало возможным после того, как платформа 1С научилась выгружать исходники конфигураций в виде файлов. Это позволило вести версионный контроль изменений кода, не заглядывая в хранилище 1С.
Для установки Git на Windows нужно скачать установщик с сайта https://git-scm.com/downloads. Установка очень простая – все можно оставить по умолчанию.
Чтобы создать хранилище Git, мне привычнее использовать консоль, потому что, как оказалось, во многих приложениях для работы с Git перевод некоторых команд на русский язык сбивает с толку – мне проще писать команды в консоли просто на английском.
После того, как вы поставите Git на Windows, у вас в контекстном меню появится возможность открыть для этого каталога консоль (Git Bash Here).
Открываем консоль и создаем репозиторий командой
git init
При этом в открытом каталоге сразу создалась папка .git, в которой будет храниться вся информация об истории и настройках этого репозитория.
Мы здесь просто создадим текстовый файл и добавим его в индекс командой
git add .
В индексе Git хранит информацию о том, что именно он будет сохранять в дальнейшем.
Git сохраняет изменения не в любой момент, когда мы что-то изменяем в репозитории – для сохранения нужно «закоммитить» изменения.
Текущий коммит в Git я сохраняю командой
git commit –m "Создание файла"
В этот момент сохраняется слепок состояния файла.
Если мы сделаем команду:
git log
То у нас появится информация о коммитах – что Павел с email po@infostart.ru 18 сентября 2019 года сделал такой-то коммит.
Если мы сейчас добавим какой-то текст в файл, который лежит в Git, то, когда я спрошу: «Что случилось с этой папкой» по команде:
git status
Git подсказывает, что файл был изменен.
Опять добавляем изменения в индекс:
git add .
И делаем еще один коммит.
git commit –m "Строка 1"
Для перехода между ветками или коммитами есть команда checkout, с помощью которой мы можем создать ветку test:
git checkout –b test
Git нам из текущего состояния создал ветку test и сразу перешел на нее.
Давайте внесем изменения в файл – добавим еще одну строку.
А теперь посмотрим, как эти изменения отразятся в Git – занесем изменения в индекс и сделаем еще один коммит.
Сейчас наш текстовый документ, который находится в ветке test, содержит две строки. На самом деле Git в своей папке хранит и предыдущий файл, который был в ветке master.
Чтобы его получить, мы просто переходим в ветку master:
git checkout master
Обратите внимание, у нас в файле осталась только первая строка.
То есть Git для каждого измененного проиндексированного файла в момент коммита сохраняет слепок состояния, а в своей базе хранит состояния на момент коммитов.
Работа с Git в EDT
Когда мы разрабатываем в EDT, то у нас конфигурация – это набор файлов, с которыми точно так же можно работать в Git, просто этих файлов будет больше – масштаб будет другой.
Давайте запустим EDT и посмотрим, как в нем можно работать с Git.
В EDT мы ведем разработку конфигурации «Конференция». Это та самая программа, в которой вас регистрировали при входе на мероприятие.
Как видите, проект в EDT – это просто набор файлов.
Мы можем открыть этот каталог в текстовом редакторе и просто внести сюда какие-то изменения прямо в модули.
Например, находясь в среде VS Code, изменим модуль справочника «Призы» – добавим в него комментарий.
Вернемся в EDT и видим, что она тоже отследила, что мы изменили модуль справочника «Призы» изменения, и у нас в модуле объекта появился комментарий.
При переключении между ветками EDT динамически подхватывается состояние проекта. Например, создадим новую ветку командой:
git checkout –b 2009
И в новой ветке поменяем конфигурацию – удалим с формы списка справочника «Участники» какие-нибудь элементы.
И даже если мы зафиксируем изменения командой:
git add .
git commit –m "Форма участника"
А потом вернемся на нашу основную ветку:
git checkout ch1609
И мы видим, что форма вернулась. То есть мы можем ошибиться в одной ветке, но вернуться обратно, как будто ничего не было. А про ту ветку просто забываем, как про страшный сон.
В следующих частях продолжим рассказывать:
-
про написание сборочной линии для проекта на Jenkins и в зависимости от результата – создания cf-файла релиза или отправки сообщения об ошибках на email.
*************
Данная статья написана по итогам доклада (видео), прочитанного на конференции Infostart Event 2019 Inception.