Как Gitlab-CI и OneScript могут отсортировать массив (Часть 2)

12.12.21

Разработка - DevOps и автоматизация разработки

Продолжение сквозного примера настройки Gitlab-CI - вывод результатов теста, условия запуска и таймауты.

Часть 1

Часть 2 (вы здесь)

 

В прошлой части мы написали сборку нашего приложения, но приложение без тестов — плохое приложение. Давайте же их напишем! Но сначала я вам скажу, что закидывать все изменения в main – плохая идея. Обычно есть промежуточная ветка release, а иногда и develop, от которых создают уже ветки для решения конкретных задач: feature/001, feature/002. Давайте же создадим ветку с тестами. Сделать это можно в VS Code. Нажимаем внизу на имя ветки "main", в открывшемся наверху списке выбираем "+ Create new branch…" и вводим ее имя "feature/001_add-tests", а затем жмем Enter.

 

 

После этого внизу имя текущей ветки должно измениться с "main" на "feature/001_add-tests". Теперь создадим в корне репозитория папку tests, а в ней файл Сортировка.os следующего содержания:

#Использовать asserts
#Использовать "../src"

Функция ПолучитьСписокТестов(ЮнитТестирование) Экспорт
    
    ВсеТесты = Новый Массив;

    ВсеТесты.Добавить("Тест_СортировкаМассива5");
    // ВсеТесты.Добавить("Тест_СортировкаМассива50");
    
    Возврат ВсеТесты;
КонецФункции

Процедура Тест_СортировкаМассива5() Экспорт
    ТестируемыйМассив = ПолучитьМассивДляТеста(5);
    РезультатСортировки = Сортировка.Отсортировать(ТестируемыйМассив);
    Ожидаем.Что(РезультатСортировки[2]).МеньшеИлиРавно(РезультатСортировки[4]);
КонецПроцедуры

Процедура Тест_СортировкаМассива50() Экспорт
    ТестируемыйМассив = ПолучитьМассивДляТеста(50);
    РезультатСортировки = Сортировка.Отсортировать(ТестируемыйМассив);
    Ожидаем.Что(РезультатСортировки[20]).МеньшеИлиРавно(РезультатСортировки[40]);
КонецПроцедуры

Функция ПолучитьМассивДляТеста(Размер)
    Результат = Новый Массив;
    ГСЧ = Новый ГенераторСлучайныхЧисел(42);
    Пока Результат.Количество() < Размер Цикл
        Результат.Добавить(ГСЧ.СлучайноеЧисло(0, 100));
    КонецЦикла;
    Возврат Результат;
КонецФункции

Да, это то, о чем вы подумали — Unit-тесты для OneScript. Мы добавили два теста, но подключили пока только первый с массивом на 5 элементов. Осталось только подключить его к скрипту, который запускает CI. Для этого изменим текст файла ./ci/scripts/test.os на:

СоздатьКаталог("./report");
ЗапуститьПриложение("1testrunner -runall ./tests xddReportPath ./report", , Истина);

Сообщить("Я протестировался!");

Здесь мы создаем папку для отчета о тестировании, а затем запускаем все тесты в папке ./tests. И чтобы результаты попали в Gitlab, надо изменить Job test в .gitlab-ci.yml на:

test:
  stage: test
  script: oscript ./ci/scripts/test.os
  artifacts:
    paths:
      - ./report/*.xml
    expire_in: 1 week
    reports:
      junit: ./report/*.xml

Что делает artifacts, мы уже знаем по прошлой статье — сохраняет файлы, соответствующие маске, чтобы потом можно было их использовать. Тут добавлена секция reports – она позволяет сказать gitlab-у, что у нас есть еще и отчеты в формате jUnit и мы хотим увидеть их в Pipeline. Более подробно можно посмотреть в разделе Testing на официальном сайте Gitlab: https://docs.gitlab.com/ee/ci/unit_test_reports.html . Здесь доступны описания форматов файлов с результатами, например, для Code Quality – результатов статического анализа кода, также можно передавать метрики или покрытие кода тестами. Но давайте запустим наш тест. Закоммитим изменения и не забудем сделать push.

 

 

После переходим в список Pipelines и видим, что тест запустился. Откроем же сам Pipeline (клик на колонку Pipeline ID), чтобы увидеть результаты:

 

 

И видим, что в Pipeline появилась вкладка Tests, где мы можем посмотреть результаты с детализацией по конкретным тестам:

 

 

Теперь вернемся в IDE и в файле ./tests/Сортировка.os раскомментируем строку "ВсеТесты.Добавить("Тест_СортировкаМассива50");" Зафиксируем и отправим изменения в удаленный репозиторий. После чего снова откроем список Pipelines в Gitlab. Нам надо подождать завершения тестов:

 

 

Но я сразу скажу, что завершения теста можете не ждать: он будет выполняться 1 час, после чего завершится по таймауту. Если тест у вас завершился успешно за пару секунд, вам явно стоит бежать казино и ставить все на зеро. Но откуда у нас этот таймаут? Да еще и Job build не выполнился из-за того, что в тестах были ошибки. Хорошо бы это исправить.

 

 

Начнем с таймаута. В правой панели можно увидеть Timeout: 1h (from project) – это стандартный таймаут для любой работы проекта. Указать его можно в настройках. Переходим в Settings → CI/CD → разворачиваем "General pipelines" и прокручиваем до секции Timeout – там указан стандартный 1 час:

 

 

Но это таймаут "по умолчанию" и обычно его менять не надо. Нам же надо переопределить его для конкретной работы. Откроем в VS Code .gitlab-ci.yml и допишем в работу test "timeout: 3 hours". Так же здесь добавим поле "allow_failure: true" и тогда при ошибке в Job test пайплайн будет продолжать выполняться, а Job будет отображаться в Pipeline желтым с восклицательным знаком, а не красным с крестом. В результате мы получаем Job вида:

 

 

И все же изменим тесты, чтобы сортировать не 50, а 10 значений — есть "небольшое" подозрение, что наш алгоритм сортировки может иметь некоторые недостатки в определенных условиях:

 

 

Теперь опять делаем "Stage all changes" → "Commit" → "Push". Переходим в Gitlab и открываем последний Pipeline и Job test в нем, чтобы убедиться, что таймаут теперь 3 часа:

 

 

Итак, мы готовы влить эти изменения в основную ветку. Обычно для этого необходимо сделать merge request, ведь ветку main блокируют, чтобы джун случайно не запушил туда нерабочий код. Переходим в "Merge requests" и видим, что Gitlab сам предлагает создать его на последнюю ветку. Жмем "Create merge request":

 

 

В открывшемся окне скролим вниз. Там ставим флаг "Squash commits when merge request is accepted", чтобы в основной ветке был только один коммит, а не россыпь промежуточных с неработающим кодом. После нажимаем синюю кнопку "Create merge request". В открывшимся окне нажимаем кнопку "Merge":

 

 

Если мы перейдем в список Pipelines после этого, то увидим, что у нас запустилась сборка после мержа:

 

 

Обычно нам не нужно, чтобы pipeline запускался на каждый push. Давайте создадим новую ветку, назовем ее "feature/002_rules" и опишем в ней условия запуска. Перед созданием в VS Code новой ветки не забудьте перед этим переключиться на ветку main и получить изменения. Кликните внизу на "feature/001_add-tests" и выбрав в выпавшем списке main:

 

 

После этого на вкладке "Source control" делаем Pull. А как создать новую ветку, было описано в начале данной статьи.

 

 

Далее создаем новую ветку как было описано в начале статьи. Итак, мы готовы прописать условия запуска для конкретных работ. Если посмотреть в документацию по Gitlab-CI, то можно найти два способа для задания этих условий. Первый опирается на использование секций only и except и его описание начинается с:

 

 

Последуем этому совету и посмотрим что же такое rules. В документации данный способ представляет собой массив условий каждому из которых соответствует способ выполнения. Итак в нашем случае предположим, что мы не хотим запускать тесты на ветке main, а в остальных случаях только если хеш коммита содержит d, ведь это счастливое число. Хотя в остальных было бы хорошо иметь возможность запустить его при необходимости вручную. Как это написать? Давайте перепишем работу test следующим образом:

test:
  stage: test
  rules:
    - if: '$CI_COMMIT_BRANCH == "main"'
      when: never
    - if: '$CI_COMMIT_SHORT_SHA =~ /[d]/'
      when: on_success
    - if: '$CI_COMMIT_BRANCH != "main"'
      when: manual
  script: oscript ./ci/scripts/test.os
  timeout: 3 hours
  allow_failure: true
  artifacts:
    paths:
      - ./report/*.xml
    expire_in: 1 week
    reports:
      junit: ./report/*.xml

В появившейся секции rules мы описываем напротив if условие, а далее напротив when как должна быть запущена работа. Причем в if мы используем предопределенные переменные CI: CI_COMMIT_BRANCH – ветка на которой был запущен pipeline и CI_COMMIT_SHORT_SHA — первые 8 цифр хеша коммита. Таких переменных много, ознакомится с ними можно в документации Gitlab-CI: https://docs.gitlab.com/ee/ci/variables/predefined_variables.html. Причем доступны они не только в условиях, но и при выполнении сприптов как переменные окружения. В секции when мы можем указать следующие значения:

on_success (default): запускается, если работы предыдущего stage выполнены или для них указано allow_failure: true

manual: для запуска надо будет вручную нажать кнопку run у работы

always: всегда

on_failure: если в предыдущих stage были ошибки

delayed: с указанной задержкой (прописывается в .gitlab-ci.yml)

never: никогда

Давайте же закоммитим эти изменения и отправим в удаленный репозиторий. Чтобы посмотреть как влияет разное значение SHA добавим/удалим пробел в любом файле и отправим коммиты:

 

 

Как мы видим, если в хеше коммита нет буквы d для запуска работы надо нажать на кнопку run:

 

 

Теперь давайте сделаем merge request и вольем feature ветку в main. Как и было прописано тесты на main при этом не запустились. Но так же мы увидим, что у нас появился pipeline на merge request (как мы его не заметили раньше?!):

 

 

Merge request – тоже событие CI. Если мы посмотрим переменные CI, то можно найти CI_PIPELINE_SOURCE – источник события. С помощью этого параметра мы можем определить когда pipeline запущен:

  • push – когда отправляем что-то в удаленный репозиторий в том числе и при завершении merge request

  • api – с использованием API Gitlab (https://docs.gitlab.com/ee/api/pipelines.html)

  • merge_request_event — при создании request и при изменении вливаемой ветки

  • schedule — запущенный по расписанию

 

 

Давайте тогда создадим новую ветку (feature/003-mr) и перепишем условия работы на $CI_PIPELINE_SOURCE == "merge_request_event" || $CI_COMMIT_BRANCH == "main" — дадим возможность смотреть результаты тестов тем, кто проводит ревью и после влития в main. Так же добавим условие в build:

build:
  stage: build
  rules:
    - if: $CI_COMMIT_BRANCH == "main"
  script: oscript ./ci/scripts/build.os
  artifacts:
    paths:
      - ./possum.exe
    expire_in: 1 week

И отправим в удаленный репозиторий. Если перейдем в список pipelines, то мы увидим, что никакой pipeline не сгенерировался — не было ни одной работы, которая подходит под условие. А теперь создадим merge request:

 

 

Как мы можем убедиться, теперь ревьювер может видеть результаты теста. Причем если мы отправим еще один коммит по открытому merge request, то pipeline запустится еще раз. Можем убедиться в этом, закоммитив какие-нибудь изменения:

 

 

Теперь вмержим merge request и убедимся, что еще раз запустились тесты, а после прошла сборка. В итоге мы теперь можем проверять тесты по каждому merge request – очень удобно.

Конец второй части. Состояние репозитория на момент окончания статьи можно посмотреть по команде:

git clone https://gitlab.com/ffSaschaGff/possum_app.git .
git checkout e408f587ef5db20fa41d8625e500258c20ec4eea

 

Вступайте в нашу телеграмм-группу Инфостарт

devops ci/cd gitlab gitlab-ci

Вы можете заказать платную адаптацию этой статьи под ваши задачи на «Бирже заказов».

  • 0% комиссии — оплата напрямую исполнителю;
  • Исполнители любого масштаба — от отдельных специалистов до команд под проект;
  • Прямой обмен контактами между заказчиком и исполнителем;
  • Безопасная сделка — при необходимости;
  • Рейтинги, кейсы и прозрачная система откликов.

См. также

Инструментарий разработчика Нейросети DevOps и автоматизация разработки Тестирование QA Разработчик 1С 8.3 Бесплатно (free)

Открытый набор правил и скриптов на GitHub для ИИ-агента (агента искусственного интеллекта: Claude Code, Codex и других). Агент сам снимает опись машины, предлагает путь проверки кода: плагин Unica или BSL Language Server со справкой платформы. С вашего «да» ставит недостающее, затем выгружает внешнюю обработку, заводит git и доводит её до зелёного теста YAxUnit. Оба пути проверены с нуля свежим агентом на копии демобазы «Управление торговлей» 11.5, платформа 8.3.27. Новая часть: для задач по данным базы агент выгружает конфигурацию в XML, строит карту объектов и пишет запросы только по именам, найденным в выгрузке. Внутри гайд «Unica на Windows» с известными ошибками и проверенными обходами.

10.11.2026    508    Iliaelagin    0    

1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.3 1С 8.5 Бесплатно (free)

В прошлой статье у ERP оставалось 89 отказов загрузки, у ЗУП — 19. Теперь обе конфигурации совпали с эталонами, а собранные файлы прошли круг через платформу. Развертка выделена в открытый репозиторий cf-unwrapper: библиотека на Rust и консольная утилита. Показываю результаты, объясняю границы «100%» и приглашаю к проверкам и развитию проекта.

02.11.2026    333    oyti    1    

1

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Разработчик 1С:Предприятие 8 Россия Бесплатно (free)

Практическое руководство для команд, которые хотят уйти с хранилища конфигурации на git, не переходя на новую среду разработки. Подойдёт разработчикам и тимлидам, которые настраивают командную разработку на типовых и собственных конфигурациях.

02.11.2026    680    vanya_gonchar    2    

6

Файловый обмен (TXT, XML, DBF), FTP DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Системный администратор Разработчик 1С 8.5 Бесплатно (free)

В прошлой статье я выгрузил Бухгалтерию в XML байт в байт и спросил, на чем проверить дальше. Вы ответили: ERP, старые релизы, зарплата. Прогнал пять конфигураций, от клиента ЭДО до ERP на 120 тысяч файлов. Рассказываю, что сломалось после Бухгалтерии, почему эталону платформы нельзя верить на слово, как выгрузить одну конфигурацию в формат трех версий платформы - и почему cf-конвертер становится отдельным продуктом, Разверткой.

02.11.2026    446    oyti    2    

3

Инструментарий разработчика DevOps и автоматизация разработки Разработчик 1С 8.3 Абонемент ($m)

Как отличить срочное исправление от обычного вечернего коммита? Проверила расчёт показателей поставок по отчёту хранилища 1С и истории двух открытых проектов. На стенде счётчики совпали со сценарием, а в выборке открытого проекта правило «те же объекты» ошиблось во всех шести случаях. Показываю границы такого замера и отличие от метрик DORA. Прилагаются инструмент и материалы опыта.

1 стартмани

29.10.2026    396    Ninel_S    0    

0

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Файловый обмен (TXT, XML, DBF), FTP Системный администратор Разработчик 1С 8.5 Бесплатно (free)

Выгрузка типовой Бухгалтерии в XML через базу занимает больше четырёх минут. Я написал движок, который читает файл конфигурации напрямую и выгружает его за 35 секунд, совпадая с выгрузкой платформы байт в байт во всех 90 385 файлах. Загрузка обратно тоже работает: круг через платформу совпадает полностью. Рассказываю, как ускоряли, как проверяем и что при загрузке XML теряет сама платформа. А в конце спрашиваю, нужно ли это кому-то, кроме меня, и на какой конфигурации проверить следующей.

27.10.2026    1012    oyti    20    

16

DevOps и автоматизация разработки Групповая разработка (Git, хранилище) Разработчик 1С 8.3 Абонемент ($m)

Хук pre-commit проверяет полный снимок индекса Git в отдельной базе 1С. На «Нано-УТ» и платформе 8.3.27 повторила 12 попыток коммита: восемь прошли, четыре остановлены. Чистый коммит занял 31,8 с. Вызов несуществующего метода общего модуля хук останавливает только с ключом -ExtendedModulesCheck. В архиве версия 2, тесты, инструкция и журналы.

1 стартмани

26.10.2026    411    Ninel_S    2    

-1

Нейросети DevOps и автоматизация разработки Разработчик 1С 8.3 Абонемент ($m)

Я дала агенту Claude Code задачу словами: добавить в учебную конфигурацию документ «Внутреннее потребление товаров», который списывает товар по средней стоимости и не даёт уйти в минус. Три запуска с нуля, каждый принят проверкой на платформе 1С: 1 мин 49 с, 2 мин 33 с и 2 мин 56 с. Показываю, что агент поменял, где ошибался и почему на типовой УТ так быстро не будет.

1 стартмани

26.10.2026    739    Ninel_S    0    

-1
Комментарии
Подписаться на ответы Инфостарт бот Сортировка: Древо развёрнутое
Свернуть все
1. user1430978 22.12.21 17:40 Сейчас в теме
Подскажите, пожалуйста, как можно отлаживать (не синтаксический контроль, который есть в гитлабе) раздел scripts файла пайплайна, если в нем используется непонятный язык bash или что-то другое, с учетом того что в выражениях скрипта используются переменные $***, они передаются в некие строковые функции и присваиваются новым переменным ? Есть какой-то онлайн отладчик?
2. SaschaG 200 22.12.21 17:53 Сейчас в теме
(1) хороший вопрос. С отладкой есть некоторые сложности. Я не нашел простой способ для этого, но на текущем месте работы в секции scripts у нас только вызовы скриптов вида "oscript _____.os" в них же переменные CI доступны как переменные среды. Поэтому можно просто установить используемые переменные у себя локально и отладить этот самый скрипт (особенно легко отловить все используемые переменные среды, если вы их получаете через функцию-обертку, которая может их при необходимости логировать)
3. user1430978 22.12.21 19:55 Сейчас в теме
(2) Спасибо, но мне бы применимо не к 1с сфере.
4. SaschaG 200 22.12.21 20:44 Сейчас в теме
(3) ну так же - логику помещаете в вызываемой одной строкой скрипт, переменные логируете через обертку и эмулируете у себя
Для отправки сообщения требуется регистрация/авторизация