Типы исполнения шагов
Каждый листовой шаг пайплайна декларирует type:, который выбирает способ исполнения его cmd:.
Содержание
Заголовок раздела «Содержание»type: shell
Заголовок раздела «type: shell»Выполняет shell-команду через sh -c. Полная семантика shell действует: подстановка переменных окружения, globbing, пайпы, перенаправления, операторы &&/|| — всё работает как ожидается.
- name: chmod-scripts type: shell cmd: chmod +x scripts/deploy.shcmd: shell (билтин) vs type: shell (шаг)
Заголовок раздела «cmd: shell (билтин) vs type: shell (шаг)»Билтин shell (cmd: shell) отличается от типа исполнения шага (type: shell). Оба исполняют shell-команды, но с разными гарантиями переносимости:
Тип шага type: shell — использует настроенный для проекта shell (через config.ShellBin) для максимальной гибкости. Если проект задал кастомный shell-бинарь (например, zsh вместо sh), тела шагов используют этот shell.
- name: run-with-project-shell type: shell cmd: some-zsh-specific-feature-hereБилтин cmd: shell — использует жёстко заданный POSIX-переносимый sh -c для максимальной предсказуемости. Применяется в двух контекстах:
- Как тело шага (реже):
- name: check-docker-login type: builtin cmd: shell with: cmd: docker info | grep -q ghcr.io timeout: 10s- Как пред-/постусловие (часто в deploy и validate):
- name: copy-configs type: builtin cmd: service_configs_copy # ... when: type: shell cmd: "test -f templates/config.default"
check: type: builtin cmd: shell with: cmd: "test -f services/main/configs/app.conf"Оба применения гарантируют, что условия вычисляются переносимо в разных CI-системах, рантаймах контейнеров и пользовательских shell-ах, независимо от настройки config.ShellBin в проекте. Полную документацию по билтину cmd: shell см. в validate.yml.
Рабочий каталог. И тело шага type: shell, и билтин cmd: shell выполняются с рабочим каталогом, установленным в корень проекта — ту же базу используют условия when: и билтин file_exists. Поэтому относительный путь в теле шага указывает на тот же файл, что и относительный путь в check:, который его охраняет, независимо от подкаталога, из которого вызван dwe.
Таймаут. Билтин cmd: shell принимает опциональный timeout: (по умолчанию 10s). timeout: "0" означает без ограничения, как и в соглашении о собственном timeout: шага — именно это позволяет выведенному check: auto сохранить неограниченную позицию when:, который он инвертирует. Отрицательная длительность ("-5s") отклоняется — ровно как и timeout: уровня шага; 0 — единственное написание «без ограничения». У тел шагов type: shell собственного встроенного таймаута нет; ограничивайте их полем timeout: уровня шага.
type: dwe
Заголовок раздела «type: dwe»Вызывает подкоманду CLI DWE. Путь к бинарю разрешается автоматически.
- name: up type: dwe cmd: "docker up"
- name: info type: dwe cmd: "info"
- name: render-ide type: dwe cmd: "render ide main"type: command
Заголовок раздела «type: command»Диспатчит декларативную команду по ID из реестра команд (workspace/commands/).
- name: composer-install type: command cmd: services.main.composer-install
- name: db-create type: command cmd: services.main.db.create with: database: laravel_testtype: builtin
Заголовок раздела «type: builtin»Выполняет внутреннюю Go-функцию движка. Билтины работают in-process и имеют доступ ко всему конфигу. Тот же реестр доступен из декларативных команд через type: builtin в commands/ — пайплайны и команды используют общий набор билтинов.
- name: create-dirs type: builtin cmd: service_dirs_ensure with: service: main mode: skip
- name: success-msg type: builtin cmd: message with: level: success text: "Deploy completed"Полный реестр и справочник параметров см. в Доступные билтины.
Билтины-предикаты как тело шага (семантика утверждения)
Заголовок раздела «Билтины-предикаты как тело шага (семантика утверждения)»Большинство билтинов — действия (они что-то делают). Некоторые — предикаты, отвечающие на вопрос «да/нет» о состоянии мира (file_exists, executable_in_path, tcp_reachable, http_check, containers_running, env_keys_present, config_keys_present и билтин shell). Предикат может использоваться как тело шага, где ведёт себя как утверждение:
- Проверка проходит → шаг успешен.
- Проверка не проходит → шаг проваливается с собственным сообщением предиката, останавливая пайплайн.
- name: assert-seed-present type: builtin cmd: file_exists with: path: .dwe/seed.sqlШаги-утверждения всегда перезапускаются — гейт деплоя «уже актуально» и per-step пропуск по action-hash никогда не пропускают шаг-предикат (та же обработка, что и у шагов check:), потому что у утверждения нет осмысленного кешированного результата. Гейт when: по-прежнему применяется: шаг-предикат, чей when: вычисляется в false, пропускается без утверждения.
Полный список и обоснование см. в преамбуле про предикаты как тело в справочнике билтинов.