Про управление качеством кода - Управление техническим долгом - Концепция Continuous Inspection и Управление качеством кода.
Использование сонара - Управляй качеством кода 1С с помощью SonarQube
Установка и настройка инфраструктуры
Установить SonarQube и плагины
Установить и настроить SonarScanner для дженкинса
Установить oscript и библиотеки
Создать репозиторий для дженкинсфайла
Указать параметры запуска конвейера
- Собирает ошибки с 3х анализаторов: АПК, EDT и BSL-LS и отправляет в Сонар.
- Используется единый дженкинсфайл для всех проектов. Если нужно улучшить конвейер - делается это в одном месте.
- Работает по выгрузке ГитКонвертора. А ГитКонвертор выгружает проект в формате EDT.
- Вырезает из списка ошибок все объекты на замке. Если конфигурация на поддержке и поменять только один модуль - будут показаны ошибки только по этому модулю.
- Переопределяет параметры ошибок. Можно понизить/повысить важность ошибок. И даже полностью пропустить.
- Параметры переопределения могут быть как едиными - лежать в репозитории рядом с дженкинсфайлом. Так и частными для каждого проекта.
- Можно вывести покрытие кода.
Разработчик помещает свои изменения доработки в хранилище. Через некоторое время получает уведомление о завершении проверок. Заходит в SonarQube и видит список замечаний по своему коду.
В это время внутри:
- ГитКонвертор получает все новые изменения и коммитит их в репозиторий.
- Вручную, по расписанию или по событию стартует конвейер. Первым шагом он получает и актуализирует дженкинсфайл.
- Инициализирует все нужные переменные, заполняет пустые параметры значениями по умолчанию и готовит каталоги. Выполняет оповещение о старте конвейера.
- Получает репозиторий с кодом в подкаталог “repo”.
- Выполняется выгрузка ошибок из АПК, EDT и BSL-LS в джсон-файлы.
- Джсон-файлы обрабатываются оскриптом - вырезаются файлы на поддержке, переопределяются данные ошибок.
- Если указана папка с файлами замеров, то они конвертируются в файл покрытия.
- По исходникам получается текущая версия конфигурации. Переопределяется джава. Собираются параметры для работы СонарСканера и запускается.
- После отработки сканера конвейер ставится на паузу и ждет ответа от сервера сонара. По ответу можно сломать сборку, если порог не пройден или просто сообщить статус проверки оповещением.
Установить ГитКонвертор
https://github.com/1C-Company/GitConverter
Он нужен для конвертации хранилища в гит-репозиторий. Когда SonarQube работает по гит-репозиторию - появляется информация о разработчике, который внес ошибку.
ГитКонвертор можно установить на тот же сервер, где будут располагаться и другие инструменты. Плюсы от совместного размещения - экономия на количестве серверов, все в одном месте, переиспользование инструментов. Из минусов - возможные конфликты за ресурсы, уменьшение надежности.
Установить SonarQube и плагины
Про установку хорошо написано в статье Управляй качеством кода 1С с помощью SonarQube
Сканер ставить не надо. Будет использоваться плагин дженкинса.
Комьюнити плагин для сонара доступен теперь и в маркете сонара.
Установить 1С:EDT
Если ГитКонвертор установлен на этом же сервере, то едт уже был установлен ранее. Второй раз можно не ставить.
Установить Дженкинс
Про установку хорошо написано в статье Переводим рутину ручного тестирования 1C на рельсы Jenkins-а и ADD. Именно из-за этой статьи я решил сделать единый дженкинсфайл для проверки качества кода. И в ней же узнал как это сделать.
Слейв ноду нужно обязательно настроить. АПК отказывается корректно работать, если дженкинс запущен как сервис.
Установить и настроить SonarScanner для дженкинса
“SonarScanner for Jenkins” - https://docs.sonarqube.org/latest/analysis/scan/sonarscanner-for-jenkins/
Нужно не забыть про настройку вебхуков. В официальной документации про это есть, но мне помогла вот эта статья.
В конфигурации системы:
В конфигурации глобальных инструментов:
Имя сервера “Sonar” и имя сканера “SonarQube Scanner” используются в дженкинсфайле, поэтому их лучше не менять. Или поменять и в дженкинсфайле.
Создать каталог инструментов
На сервере создать папку “C:/Sonar/”. Не обязательно именно этот путь, но далее буду оперировать именно им.
Скачать последний релиз обработки с https://github.com/otymko/acc-export/releases. Положить по адресу "C:/Sonar/bin/acc-export.epf".
Скачать последний релиз BSL-LS c https://github.com/1c-syntax/bsl-language-server/releases.
Положить по адресу "C:/Sonar/bin/bsl-language-server.jar".
Скачать 11 JDK https://jdk.java.net/archive/. Положить по адресу “C:/Sonar/jdk”. Полный путь к java выглядит вот так "C:/Sonar/jdk/bin/java.exe". Прописывать в переменные среды не надо, а то будет конфликт с 8ой джавой для едт.
Установить oscript и библиотеки
choco install onescript-cli
Скачать и распаковать архив из приложенных файлов и запустить install.bat. Будут установлены приложения vanessa-runner, perf-measurements-to-cover, stebi и библиотека v8metadata-reader.
Все приложения доступны на гитхабе.
https://github.com/Stepa86/stebi
https://github.com/Stepa86/v8metadata-reader
https://github.com/Stepa86/perf-measurements-to-cover
Установить и настроить АПК
https://releases.1c.ru/project/ACC
Установить нужно в каталог “C:/Sonar/ACC” и создать пользователя “Admin” без пароля.
Создать репозиторий для дженкинсфайла
Форкнуть или скопировать репозиторий https://github.com/Stepa86/jenkins-pipeline-1C-to-sonar. Донастроить под себя при необходимости. Адрес репозитория с дженкинсфайлом понадобится позднее.
Настроить оповещения
В моем дженкинсфайле используется плагин “RocketChat Notifier” для отправки оповещений в рокет.чат. Если вы не используете в работе рокет.чат, то нужно самостоятельно найти и скачать подходящий вам плагин и заменить в дженкинсфайле строки “rocketSend” на вызов своего плагина.
Настроить ГитКонвертор
Настроить и запустить конвертацию хранилища по инструкции от ГитКонвертора.
Для работы скрипта по вырезанию файлов на поддержке нужна информация о поддержке. Поэтому в настройках нужно снять флаг “Удалять конфигурации поставщиков”.
После снятия флага начнет выгружаться информация о поддержке и cf-файлы конфигураций, cf-файлы нужно добавить в “.gitignore”.
Значения в зеленых полях потребуются в дальнейшем.
Обязательно каталог выгрузки в репозиторий должен быть на латинице. Если там кириллица - Дженкинс очень непредсказуемо себя ведет.
Настроить АПК
Запуск проверки АПК ищет конфигурацию по наименованию и использует ее.
Создать новую конфигурацию.
В наименование указать “Каталог выгрузки в репозитории” из ГитКонвертора.
В “Путь к источнику проверки” указать “Адрес хранилища”. Заполнить пользователя и его пароль для доступа к хранилища.
Важно, чтобы пользователи хранилища для ГитКонвертора и АПК были разными. Их никто не должен больше использовать. Иначе это приведет к конфликтам получения изменений из хранилища.
Дальше нужно настроить список проверяемых требований (выбрать все, например) и исключений, проверить подключение к базе после записи и закрыть АПК.
Стоит запустить полную проверку вручную из АПК, чтобы убедится в работоспособности.
Создание первого конвейера
Перейти в веб-интерфейс Дженкинса. По умолчанию это http://localhost:8080
Слева сверху “Создать Item”.
Имя Item'а - произвольное. Лишь бы было понятно что это. Лучше латиницей и без пробелов.
Тыкнуть на Pipline и нажать Ок внизу.
Откроется конфигурация джоба.
Перейти к разделу Pipline.
В Definition выбрать Pipline script from SCM.
В SCM - Git.
Repository URL - адрес репозитория с дженкинсфайлом. В моем случае это https://github.com/Stepa86/jenkins-pipeline-1C-to-sonar.git
В Credentials добавить/выбрать параметры доступа к этому репозиторию.
Стоит сразу создать Credentials для доступа к репозиторию с исходниками конфигурации и скопировать его ID. Он понадобится чуть позднее.
В Script Path - путь к дженкинсфайлу в репозитории. В моем случае это “Sonar/Jenkinsfile”.
Сохранить. И в окне джоба слева нажать на “Собрать сейчас”.
Если все настроено верно, то отработает первый шаг - получение дженкинсфайла, а потом сразу все упадет.
Указать параметры запуска конвейера
Обновить страницу джоба. Слева сверху кнопка “Собрать сейчас” превратится в “Собрать с параметрами”. Нажать на нее. Откроется окно ввода параметров.
PROJECT_NAME - ключ проекта. Именно под этим именем будет создан проект в сонаре. Именно по нему выполняется поиск конфигурации в АПК. Сюда вписываем наименование конфигурации АПК. Она же - “Каталог выгрузки в репозитории”.
git_repo_url - адрес репозитория git из ГитКонвертора.
git_repo_branch - имя ветки в репозитории.
sonar_catalog - каталог инструментов C:/Sonar/
PROPERTIES_CATALOG - каталог в проекте с переопределенными настройками.
ACC_check - Запуск проверки АПК перед выгрузкой ошибок.
ACC_recreateProject - Пересоздание конфигурации в АПК. Сбрасывает кэш проверки. АПК работает дольше, но все данные переполучаются заново. Актуально, когда ошибка исправлена, а АПК этого исправления “не увидела” из-за кэша.
STEBI_SETTINGS - путь к джсон файлу с переопределением ошибок. Может быть как общим из репозитория с дженкинсфайлом, так и частным для проекта.
jenkinsAgent - имя ноды на которой нужно запускать проверку. Критично к регистру.
EDT_VERSION - версия едт, которую нужно использовать.
perf_catalog - каталог с файлами замера производительности .pff. По ним создается файл с данными покрытия.
git_credentials_Id - ID Credentials для доступа к репозиторию.
rocket_channel - имя канала для отправки оповещений.
После указания всех параметров - Собрать.
Если упало на каком-то шаге. По логам определить и устранить проблему и еще раз нажать на “Собрать с параметрами”.
Если проверка АПК отработала и в конфигурации больше ничего не менялось, то для отладки и ускорения процесса можно перезапускать конвейер со снятой галкой ACC_check.
Из джобы можно перейти в проект сонара и посмотреть, что ошибки загружены.
Создание второго конвейера
Аналогично созданию конвейера нужно нажать на Создать Item, ввести имя, тыкнуть в Pipeline и внизу ввести имя существующего для копирования из него настроек.
В открывшемся окне джобы нужно поменять параметры на требуемые и запустить.
Расчет покрытия тестами
Адекватного способа рассчитать покрытие тестами в 1С на данный момент нет. Я костылю так:
Разворачиваю тестовую базу загрузкой из хранилища.
Захожу в конфигуратор. Из него запускаю менеджер тестирования под отладкой.
В менеджере тестирования подключаю тест-клиента под отладкой.
В конфигураторе включаю замеры.
Запускаю выполнение тестов.
Когда все тесты завершились, сохраняю все замеры в спец. папку, предварительно ее очистив. Эту спец. папку указываю в параметрах конвейера.
UPD
Все приложения из архива доступны на гитхабе.
https://github.com/Stepa86/stebi
https://github.com/Stepa86/v8metadata-reader
https://github.com/Stepa86/perf-measurements-to-cover