Правила валидации и типичные подводные камни
Загрузчик применяет правила ниже и сообщает виновный файл + поле при сбое. Список подводных камней собирает ошибки, которые чаще всего кусают в реальных проектах.
Содержание
Заголовок раздела «Содержание»Правила валидации (шпаргалка)
Заголовок раздела «Правила валидации (шпаргалка)»typeобязателен и должен быть одним из задокументированных значений.type: shellтребует ровно одного изcmd/argv;service_*требует ровно одного изcmd/argvплюсservice.type: scriptтребует блокscript:в простой форме (path) или фазовой форме (run+ опциональныеplan/cleanup).type: workflowтребует непустойsteps:и запрещает поля, специфичные для типов (cmd,argv,service,script,workdirи т. д.).type: builtinтребуетcmd:(имя builtin) и отвергает поля, специфичные для других типов (argv,script:,steps:,service,compose_args,workdir/workdir_from,user,mode,runner:).- У каждого шага workflow ровно одно из
command/confirm/parallel;with/continue_on_errorдопустимы только на command-шагах (и на контейнере блокаparallel— см. Параллельные подшаги). - Имена env-переменных должны быть уникальны по
params.*.env,context.*.env,files.*.envи блокуenv:. - File ID должны соответствовать
^[a-zA-Z_][a-zA-Z0-9_]*$. - Файловые спецификации отвергают конфликтующие поля (например,
mkdirвнеwrite,path+candidates,match/sortбезglob). workdir_fromдопустим только дляservice_exec/service_run/daemon.compose_argsдопустим только дляservice_exec/service_run/daemon.modeнаservice_runдолжен быть пустым илиrun.notify: trueотвергается наtype: daemon(ошибка).notify: trueна прямом подшаге внутри блокаparallel:создаёт info-диагностику; runtime его подавляет.- Блок
args:требует ссылки${args}вcmd:илиargv:. Без неё блок инертен (егоprefix/defaultникогда не применятся), поэтому он отвергается на загрузке, а не игнорируется молча. - В
argv:${args}должен быть целым элементом.--filter=${args}отвергается: аргументы вставляются отдельными элементами, и встроенный токен никто не переразбивает. argv_append_fromдопустим только дляshell/service_exec/service_run, требуетargv:и отвергается вместе сcmd:— дописывание вычисленных значений к shell-строке вклеило бы их в текст программы. Он отвергается дляtype: daemon(пустой вывод означает «пропуск», что для демона читается как молчаливый отказ его запустить) и для любого другого типа (нет вектора аргументов, к которому можно дописывать).argv_append_fromне должен ссылаться на${args}. Сквозные аргументы передаются позиционными параметрами и намеренно не видны выражению; ссылайтесь на них изargv:. См. Вычисляемые аргументы.
Типичные подводные камни
Заголовок раздела «Типичные подводные камни»- Не шеллите в
./bin/dwe— используйтеtype: dweили$DWE_BIN(в скриптах). Любая из этих форм подхватывает запущенный бинарник, даже когда путь сборки меняется. - Не помещайте секреты в
argv— используйтеenv:, чтобы значения внедрялись через окружение контейнера, а не через командную строку. - Не переиспользуйте env-имена между источниками — объявление
MYSQL_PWDодновременно вparams.x.envиenv:— ошибка во время загрузки. - Не пишите в путь без
mkdir: true— режим write не создаёт родителей сам по себе. - Не ожидайте
${...}внутриparams.*.default_from/context.*.from— это обычные точечные пути, не шаблонизированные. - Не запускайте приватную команду напрямую — ссылайтесь на неё из workflow или пайплайна, либо временно переключите
private: falseдля отладки.