Короткий ответ По умолчанию джобы выполняются по порядку стадий (`build` → `test` → `deploy`), ожидая завершения всей предыдущей стадии; `needs` позволяет явно указать зависимость от конкретной джобы (а не от всей стадии), благодаря чему джоба может начаться раньше, не дожидаясь остальных джоб своей логической стадии. Как это работает подробнее без `needs` GitLab CI выполняет джобы стадии `test` только после того, как завершатся все джобы стадии `build`, и так далее по порядку `stages`. Указав `needs: [unit_tests]` у джобы деплоя, можно разрешить ей стартовать сразу после конкретной джобы, даже если другие джобы той же стадии (например, `lint`) ещё выполняются — это называется DAG (direct acyclic graph) pipeline. Пример кода Что использовать на практике На практике. `needs` ускоряет длинные пайплайны за счёт параллелизации независимых веток работы, но требует аккуратности — если забыть указать зависимость от нужного артефакта, джоба может запуститься раньше, чем он будет готов. Пример. Ожидаемое поведение: `d