Для тестирования веток предлагается использовать событие merge-request pipelines (старое название - detached pipelines). Под тестированием будем понимать запуск любых тестов: АПК, Vanessa Automation, Unit тесты результатом отработки которых должно быть полное отсутствие ошибок и файл с результатами теста в формате jUnit, именно под него заточена логика CI/CD Gitlab. Логика запуска может основываться на именах и шаблонах имён веток. Например, каждый раз когда сливаем запрос в ветку dev/* можно запускать тест АПК на проверку качества кода, а сам запрос на слияние настроить на автоматическое слияние, если detached pipelines завершено без ошибок. Каждый раз, когда в Gitlab создаётся запрос на слияние, например, мы создали запрос на слияние ветки BF/00-00000180 в ветку develop от последней фиксации (commit) указателя ветки стартует detached pipeline:


Для того, чтобы определённые задания каких либо этапов запускали тесты при создании запросов на слияние в условия задания необходимо добавить следующее, такие условия должны быть для всех заданий, включаемых в тестирование:
only:
refs:
# для отвязанных сборочных линий всегда вместо ветки служебное значение: merge_requests
- merge_requests
variables:
# такое задание будет включаться только тогда, когда ветка в которую был оформлен запрос
# на слияние в ветку develop
- $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
# имя самой ветки. которая сливается, если нужно хранится в другой переменной:
# $CI_MERGE_REQUEST_SOURCE_BRANCH_NAME, и в нашем примере её значение будет 'BF/00-00000180'
Несколько слов хочется сказать о самом использовании конфигурации АПК для тестирования качества кода. Основная проблема АПК - она однопоточная, кроме этого она использует сервис проверки конфигурации средствами конфигуратора. И это ещё одно из узких мест в проверке АПК, длительность этой проверки типовой конфигурации УХ длится не много не мало чуть более часа. Были случаи, когда алгоритмы АПК уже все проверили, и происходило ожидание тестов [расширенной] платформенной проверки. И это только одно тестирование, а конфигурацию для тестирования нужно тоже собрать, накатить на тестовую ИБ на это тоже уйдёт не менее 35 минут. Суть тестирования в АПК всегда сводится к одному - первый раз вы тестируете все подряд и всё это помещается в исключения. Длится это не много ни мало 12 часов. Это на топовом процессоре i Core7 4,3 ГГц с SSD NVRAM и "вагоном" памяти. После этого вы повторно тестируете ИБ, которая обязательно должна быть обновлена через CFU (вот где оно нам опять потребовалась!) и в этот раз будут тестироваться только изменения, однако типовая конфигурация работает так, что первым делом, она начинает выгружать все файлы из только собранной ИБ снова в XML. О ужас. И на это тратится опять же минут эдак 30-40, и это при условии, что мы только что из этих файлов конфигурацию собирали. Чтобы не тратить ещё полчаса мы АПК немного подкрутили:
Кому интересно - ссылки на загрузку CFU АПК есть. (как из неё получить полноценную конфигурацию читай ниже). Мы заставили смотреть АПК в определённый каталог, куда подкладывали уже готовые для анализа файлы выгрузки конфигурации 1С (на самом деле это только что сконвертированные из Git, из формата EDT файлы, но АПК их принимает за только что выгруженные из конфигурации). В итоге, нам удалось минимизировать время сборки и тестирования до 105 - 120 минут, это при условии, что количество изменённых ОМД по отношению к предыдущему варианту не большое: пару справочников, их формы, документ. Поскольку тестирование АПК мы реализовывали пилотное, включили все проверки, за исключением некоторых, сразу отключили правила проверки локализации, так как конфигурация системы была только для русскоязычных пользователей. Количество ошибок орфографии, которые делают разработчики, как выяснилось просто безумное множество: в макетах, в тексте модулей, в формах, в наименованиях реквизитов. В итоге, для снижения времени тестирования мы полностью отключили орфографию, и оставили только стандартные проверки без проверок по локализации:

Если по честному, код после исполнения требований АПК становится чище, процедуры поделены по штатным областям, нет лишнего, и выглядит более читаемым, но критичных с точки зрения оптимизаций и полезных проверок в нём мало. Из полезного можно отметить следующие:
- Разыменование составных полей в запросах. Важно для оптимального исполнения запросов.
- Использование конструкции ОБЪЕДИНИТЬ в запросе, однако оно срабатывает всегда, даже тогда, когда не нужно. Оптимальное исполнение запросов.
- Конструкция "Попытка...Исключение...КонецПопытки" не содержит кода в исключении. Снижение рисков получения трудно расследуемого сообщения "В данной транзакции уже происходили ошибки".
- Нарушена схема работы с транзакциями: для вызова "НачатьТранзакцию()" отсутствует парный вызов "ОтменитьТранзакцию()". Корректная работа с транзакциями, то же что и предыдущее
- Нарушена схема работы с транзакциями: между "Исключение" и "ОтменитьТранзакцию()" есть исполняемый код. Корректная работа с транзакциями.
- Нарушена схема работы с транзакциями: не найден оператор "Попытка" после вызова "НачатьТранзакцию()"
- Запрос в цикле. Оптимальное исполнение кода, однако это уже имеет делать проверка, встроенная в EDT, и делает это на лету.
- Отсутствие стандартных областей в коде модуля, как следствие отсутствие областей ПИ, СПИ и СПФ. Исполнение этого требования и двух ниже позволяет снизить риски при обновлениях системы новыми релизами от поставщика, гарантируя хоть немного наличие используемых функций на тех же местах, где они и были.
- Некорректные вызовы библиотечных функций. Вызов из секции СПИ и СПФ функций и процедур чужой библиотеки.
- Вызовы устаревших функций библиотек.
Немного вспомним методику, как проверяет в АПК код команда ERP - они ставят исходную конфигурацию на чистое тестирование и помещают всё в исключения (если УХ -12 часов, то наверное ERP все 20), как ответили на мой вопрос на вебинаре - "мы не торопимся" на выходе, когда функционал протестирован отправляют в тестирование АПК повторно, здесь, видимо, проводится сканирование только изменённых объектов, и, в итоге, получается некий пул замечаний.
В проектной деятельности всё по другому, у нас нет 12 и более часов для первичного тестирования, к примеру ветки исправления ошибки. На исправление критичных ошибок отводится, как правило не более одного рабочего дня, т.е. если выкинуть время подтверждения ошибки консультантами, то разработчику остаётся максимум 4 часа на исправление критичной ошибки. Поэтому мы тестировали так:
- Первоначальное тестирование в АПК производилось только исходной ветки версии (dev/*), при этом всё что нашлось помещалось в исключения.
- Ветки технических проектов стартовали от dev/*, подавляющее чиcло исправлений ошибок: 99% стартовали оттуда же и сливались в итоге в ветку версии.
- АПК, проверяя фиксацию из запроса на слияние ветки технического проекта, допустим это ветка TP/00-00000255, когда видит новые или изменённые объекты, например, созданный справочник или новую процедуру в модуле существующего справочника, которую он ранее не проверял - этих объектов точно нет в исключениях. АПК добавляет в своей структуре метаданных новые объекты и фиксирует замечания по ним если они выявлены.
- Здесь важно, если критичные замечания, которые нужно исправлять, быстренько зарегистрировать их из АПК в СППР. Это можно сделать только в ручную. Автоматически регистрировать ошибки из АПК в СППР я так и не рискнула. АПК - тот ещё спамер и ошибки в СППР просто в мгновения ока вырастут в астрономическом числе... Из найденных ошибок, несмотря что ранее проверялось и попало уже в исключения некоторые появлялись повторно, почему это происходит - предмет отдельной беседы.
- В другой ветке, допустим это исправление какой-то ошибки BF/00-00001024, изменений из ветки TP/00-00000255 нет, и после обновления тестируемой конфигурации все несуществующие объекты АПК посчитает, что их просто удалили, и так же удалит замечания, связанные с ними. Но у нас то в СППР, по ветке TP/00-00000255 всё что нужно уже зарегистрировано, поэтому пусть удаляет. А новое, что появилось в ветке BF/00-00001024 будет проверено и зафиксировано. Важно то, что ошибки добавленные в исключения более живучи, и даже если будет удалён связанный с исключением объект, в исключении он остаётся (надо отметить не все исключения так работают, несколько важных правил, включая (Недопустимый вызов служебной процедуры или функции другой подсистемы (277), Недопустимый вызов служебного программного интерфейса (278)) будут как птица феникс появляться каждый раз, так как для них анализируется целиком изменённый модуль), и если, к примеру снова проверить ветку TP/00-00000255 (для этого достаточно что то поместить в ветку: так как запрос на слияние уже есть, новый detached pipe запустится автоматом). Большая часть требований, которую вы добавили в исключения в прошлый раз уже не появится при новой проверке.
- Таким образом, когда все зарегистрированные АПК ошибки будут исправлены в ветке, после очередной фиксации АПК отметит, что выявленные проблемы устранены, либо не выявит их, если до этого он тестировал другую ветку. Запрос на слияние, если его маркировали как "Merge when pipeline succeeds"
будет удовлетворён (слит).
Немного статистики проверки конфигурации УХ в процессе разработки:

1С:Предприятие не умеет программно выставлять коды ошибок. отличные от 0, поэтому, чтобы "уронить" тестирование, если ошибки были, нужно полученный файл с замечаниями в формате XML проверить на наличие ключевой фразы:
find /C "Проверка АПК не выявила ошибок" %FOLDER_APK_SETTINGS%\junit.apk.xml
Если ошибок не было, строка выполнится с exit code 0 и тестирование таким образом будет отмечено как успешное (сигнал для менеджера запросов на слияние CI/CD удовлетворить (принять) запрос на слияние), в противном случае выполнение будет неуспешным.
При успешной проверке АПК в jUnit будет только один успешный кейс. При не успешной все кейсы будут неуспешными - ровно столько, сколько проблем будет найдено.
Важный момент, файл в формате jUnit, который умеет генерировать АПК, который в качестве отчёта может использовать CD/CI не хранится в CI/CD вечно. Длительность его хранения ограничена общими правилами длительности хранения артефактов сборки, и если срок хранения прошёл - (по умолчанию 1 месяц) то отчет будет удалён.
Настройку длительности хранения артефактов конкретного задания можно изменить, указав в секции artifacts модификатор expire_in, например:
artifacts:
# Сколько хранить артефакты
expire_in: 2 week
# Попытка сохранения артифактов будет предпринята в любом случае, удачно или задание отработало или нет.
# нам так и нужно, значение по умолчанию on_success
when: always
# Указываем какие артифакты нужно сохранить
# К относительному пути добавляется каталог клонированного проекта из git
paths:
- logs\.cfu_make.txt
- logs\.build_log.txt
- tempdb\update.cf*
# А вот артифакты из секции reports будут использоваться как отчёт.
# Скачать такие артефакты штатными методами не получится. Если они нужны
# ещё где-то, то их нужно добавить и в секции paths: см. выше и в секции reports:
reports:
junit:
- jUnit/*.xml
Так отображаются тесты АПК в CI/CD Gitlab внутри сборочной линии:

и внутри запроса на слияние:

щёлкнув по гиперссылке, можно посмотреть детали каждого теста... В этом примере найденных ошибок было более 36 тыс, это накопилось за 4 месяца в версии, на базе релиза 3.1.1.15, с момента как перестали исправлять ошибки АПК, так как использование АПК в проекте было пилотным. Нужно отметить, что ни с одним участком кода, которые проверяли в АПК и делали при этом code review, не было проблем при обновлении на следующий релиз поставщика с пропуском 14 изменений в третей цифре релиза УХ 3.1.1.15 --> 3.1.15.4. Возможно это и совпадение, но я склонен думать, что нет.
Пример сборочной линии с использованием АПК для линий в запроса на слияние. Тексты скриптов на CMD.
Во вложениях есть CFU конфигурации, с изменениями описанными выше, меня немного поругали, когда я выложила полную CF (была доступна вплоть до 09.04.2023) и вежливо попросили CF убрать. Я человек законопослушный, поэтому специально сделала CFU. Если у вас есть права на скачивание АПК с https://releases.1c.ru/version_files?nick=ACC&ver=1.2.5.37 то вы сможете установить новую пустую конфигурацию 1.2.5.37, применить к установленной скачанный CFU. Используйте обычный режим обновления конфигурации и укажите в качестве обновления это CFU. Ни в коем случае не обновляйте этой CFU сразу вашу рабочую базу, так как при этом конфигурация поставщика 1.2.5.37 будет подменена, и следующие обновления от АПК лягут неверно. Далее сохраните полученную конфигурацию в файл и сравнением объединением из этой конфигурации сможете перенести наработки к себе в рабочую базу. Как вариант, можете накатить CFU сразу куда хотите (если релиз поставщика в ней будет 1.2.5.37) потом просто заместите релиз поставщика в вашей базе.
В целом же, рекомендую взглянуть на последний релиз АПК, 1.2.7.22(39) в нём заявлена новая функциональность:
- Для разнообразия вариантов источника проверки конфигурации реализована проверка конфигураций в формате проекта EDT (Enterprise Development Tools).
Возможно, моя доработка уже более не актуальна, если коллеги из ИЖТИСИ научились корректно выявлять различия от предыдущей проверки и будут проверяться только изменения. У меня влёт не получилось настроить, возникли какие то проблемы с запуском конвертации.
В отличие от АПК Vanessa Automation в файле jUnit хранит как успешно выполненные тесты так и неуспешные:

Так же можно посмотреть детали упавшего теста:

Пример сборочной линии с запусками тестирования Vanessa Automation
Сами тесты рекомендуется хранить рядом с проектом EDT в соседней папке: