Описание задачи
ОписаниеЗадачи — центральная модель библиотеки. Создаётся только через фабрику:
Задача = Фабрика.Новая();Под-объекты (образ, кэш, артефакты, сервисы и т.д.) создаются лениво при первом обращении — отдельной инициализации не требуется.
Базовые поля
| Поле | Тип | Ключ YAML | Описание |
|---|---|---|---|
Наименование | Строка | имя джобы | Имя джобы в пайплайне |
Стадия | Строка | stage | Стадия выполнения |
Скрипты | Массив | script | Команды — добавляйте через Скрипты.Добавить("...") |
Когда | Строка | when | Условие запуска. Сахар: СобытияПайплайна.ПриУспехе(), .РучнойЗапуск(), .ПриНеудаче(), .Всегда() |
ТегиРаннера | Массив | tags | Теги раннера |
Таймаут | Строка | timeout | Например "2h", "30m" |
Прерываемый | Булево | interruptible | Отмена при новом пуше |
РазрешитьПадение | Булево | allow_failure | Не валить пайплайн при падении |
СтартоватьСразу | Булево | needs: [] | Немедленный старт, игнорируя стадии. Взаимоисключающее с Нуждается |
ГруппаРесурсов | Строка | resource_group | Сериализация запусков (deploy-джобы не должны бежать параллельно) |
НаследуетДефолты | Булево | inherit: default | По умолчанию Истина. Ложь отключает применение глобальных before_script/after_script (default-секции) к джобе |
НаследуетПеременные | Булево | inherit: variables | По умолчанию Истина. Ложь отключает применение глобальных variables к джобе |
Пример
Задача.Наименование = "deploy-prod";
Задача.Стадия = "deploy";
Задача.Таймаут = "2h";
Задача.Прерываемый = Истина;
Задача.ГруппаРесурсов = "production";
Задача.Скрипты.Добавить("make deploy");Наследование (inherit)
По умолчанию GitLab применяет ко всем джобам default-секцию (глобальные before_script/after_script) и корневые variables. Чтобы изолировать джобу, отключите нужные виды наследования — генератор выведет в джобу ключ inherit:
Задача.НаследуетДефолты = Ложь; // inherit: { default: false } — без глобальных before/after script
Задача.НаследуетПеременные = Ложь; // inherit: { variables: false } — без глобальных variablesЕсли оба флага включены (по умолчанию), ключ inherit не выводится вовсе.
Нуждается (needs)
Массив имён джоб, от которых зависит запуск (DAG). Валидируется при генерации: ссылка на несуществующую джобу роняет генерацию с перечнем доступных.
Задача.Нуждается.Добавить("build");
Задача.Нуждается.Добавить("test");Зависимости (dependencies)
Какие артефакты тащить из предыдущих стадий. Валидации нет (это отдельный механизм GitLab).
Задача.Зависимости.Добавить("build");Образ (image)
Задача.Образ.Имя = "docker:latest";
Задача.Образ.УказатьПолитику("always"); // с валидацией
// или сахар:
Задача.Образ.Всегда();
Задача.Образ.Никогда();
Задача.Образ.ЕслиОтсутствует();
Задача.Образ.Принудительно(); // pull, GitLab/раннер >= 15.1
Задача.Образ.ДобавитьКомандуЭнтрипоинт("/bin/sh");Сервисы (services)
Массив сервис-контейнеров, фабрика НовыйСервис():
База = Задача.НовыйСервис();
База.Имя = "postgres:14";
База.Алиас = "db";
База.ДобавитьПеременную("POSTGRES_PASSWORD", "secret");Кэш (cache)
Задача.Кэш.ДобавитьПуть("vendor/");
Задача.Кэш.КлючПоФайлам.Добавить("packagedef");Артефакты (artifacts)
Задача.Артефакты.ДобавитьПуть("dist/");
Задача.Артефакты.ДобавитьИсключение("dist/*.tmp");
Задача.Артефакты.ВремяХранения = "1 week";Отчёты (reports)
Виды отчётов — через модуль ВидыОтчетов с валидацией:
Задача.Артефакты.ДобавитьОтчет(ВидыОтчетов.Юнит(), "junit.xml");
Задача.Артефакты.ДобавитьОтчет(ВидыОтчетов.САСТ(), "gl-sast-report.json");
Задача.Артефакты.ДобавитьОтчетПокрытия(ВидыОтчетов.Кобертура(), "coverage.xml");Допустимые виды: Юнит, САСТ, ДАСТ, Дотенв, СканированиеЗависимостей, ПоискСекретов, КачествоКода, СканированиеКонтейнеров, САРИФ, ЦиклонДХ, Терраформ и другие — полный список в модуле ВидыОтчетов.os.
Повтор (retry)
Задача.Повтор.Повторы = 2;
Задача.Повтор.ДобавитьУсловие(УсловияПовтора.СбойСкрипта());
Задача.Повтор.ДобавитьУсловие(УсловияПовтора.СбойРаннера());
Задача.Повтор.ДобавитьКодВыхода(42);Условия валидируются против набора GitLab (22 значения, см. УсловияПовтора.os). При нескольких условиях выводится массив, при одном — строка. Дубли сворачиваются.
Параллельность (parallel)
// Число копий
Задача.Параллельность.Количество = 5;
// Матрица: декартово произведение в одном ряду
Ряд = Новый Соответствие();
Ряд.Вставить("OS", ОС);
Ряд.Вставить("VERSION", Версии);
Задача.Параллельность.ДобавитьРяд(Ряд);
// Или независимые ряды
Задача.Параллельность.ДобавитьРядМатрицы("OS", ОС);Число и матрица взаимоисключающие — одновременное задание роняет генерацию.
Окружение (environment)
Деплой.Окружение.Имя = "production";
Деплой.Окружение.УРЛ = "https://prod.example.com";
Деплой.Окружение.ПриОстановке = "stop-prod";
Деплой.Окружение.АвтоОстановка = "1 week";
// Стоп-джоба:
СтопДжоба.Окружение.Действие = ДействияОкружения.Остановка();Валидации: недопустимое действие, пустое имя при заполненных остальных, ПриОстановке на несуществующую джобу.
Релиз (release)
Задача.Релиз.Тег = "$CI_COMMIT_TAG";
Задача.Релиз.Описание = "Что нового";
Задача.Релиз.Имя = "Версия 1.2.3";
Задача.Релиз.ДобавитьВеху("Milestone 1");
Задача.Релиз.ДобавитьСсылку("Установщик", "https://example.com/setup.exe");Тег и описание обязательны — без них генерация падает с именем задачи.
GitLab Pages
// Джоба с именем "pages", стадия deploy
Страницы.Наименование = "pages";
Страницы.Стадия = "deploy";
Страницы.Страницы.Публиковать("dist");publish автоматически добавляется в artifacts:paths (GitLab 17.10+). Валидации: pages без артефактов и не в стадии deploy роняют генерацию.
Правила (rules)
Правила управляют условиями запуска джобы. Каждое правило — структура из НовыйПравило(), добавляется в Задача.Правила. Внутри правила ключи выводятся в порядке: if → when → changes (+compare_to) → exists → variables → allow_failure.
Базовое правило
Изменения = Новый Массив();
Изменения.Добавить("src/**.os");
Задача.ДобавитьПравило("$CI_PIPELINE_SOURCE == \"merge_request_event\"", "always", Изменения);exists — запуск по наличию файлов
Сахар ДобавитьПравилоЕслиСуществует(Путь, Условие = ""):
Задача.ДобавитьПравилоЕслиСуществует("Dockerfile");
// или с условием:
Задача.ДобавитьПравилоЕслиСуществует("Dockerfile", "$CI_COMMIT_BRANCH == \"main\"");Расширенный вариант (project/ref) — через НовыйПравило(); тогда exists выводится объектом с paths:
Правило = Задача.НовыйПравило();
Правило.Существует.Добавить("**/*.os");
Правило.СуществуетВПроекте = "group/project"; // опционально
Правило.СуществуетПоРефу = "main"; // опционально
Задача.Правила.Добавить(Правило);variables правила
Переменные, применяемые к джобе при срабатывании правила:
ПеременныеПравила = Новый Соответствие();
ПеременныеПравила.Вставить("BUILD_MODE", "fast");
Задача.ДобавитьПравилоСПеременными("$CI_COMMIT_BRANCH == \"main\"", ПеременныеПравила);allow_failure в правиле
Сахар ДобавитьПравилоПаденияДопустимо(КодыВыхода = Неопределено):
Задача.ДобавитьПравилоПаденияДопустимо(); // allow_failure: true
Коды = Новый Массив();
Коды.Добавить(1);
Задача.ДобавитьПравилоПаденияДопустимо(Коды); // allow_failure: {exit_codes: [1]}Явный запрет — Правило.РазрешитьПадение = Ложь даёт allow_failure: false.
compare_to для changes
Правило = Задача.НовыйПравило();
Правило.Изменения.Добавить("**/*.os");
Правило.СравнитьС = "main";Комбинированное правило
Правило = Задача.НовыйПравило();
Правило.Условие = "$CI_COMMIT_BRANCH == \"main\"";
Правило.Существует.Добавить("deploy.sh");
Правило.Переменные.Вставить("DEPLOY_MODE", "auto");
Правило.РазрешитьПадение = Истина;
Задача.Правила.Добавить(Правило);Валидации
Генерация падает с исключением, если:
- exists задан через project/ref без путей;
КодыВыходаПадениязаполнены, ноРазрешитьПадение <> Истина.
Переменные джобы
Задача.ДобавитьПеременную("BUILD_TYPE", "release");