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