Среда за разработка и CI
Старая се да автоматизирам всички задачи на проекта и да използвам един и същ набор от решения за локална разработка и CI. Не само това, което се отнася до test/build/deploy, но и всички останали повтарящи се задачи, като инициализация на средата на разработчика, подготовка на данни, генериране на документация и така нататък. Това дава независимост от текущата реализация на CI, липса на дублиране на функции, постоянен dogfooding от разработчиците и стимулира екипите самостоятелно да управляват и развиват CI на своя продукт. Такова решение има и очевидна обратна страна — трябва да се задоволят изискванията и за двата свята в рамките на едно решение. Най-често от това страдат скоростта на изграждане, четливостта на резултатите и простотата.
Основни изисквания:
- Изолация: Стартиране на всички инструменти в Docker контейнери
- Скриптиране: Поддръжка на съвременни езици (TS/Go/Py) вместо чист bash/YAML
- Open Source: Без обвързване със SaaS, възможност за форк
- Езикова агностичност: Една рамка независимо от стека на проекта
- Seamless CI: Стартиране на едни и същи скриптове локално и в CI
- Кешируемост: BuildKit кеш, remote-cache, Depot?, паралелизъм
- Сигурност: rootless-user, secrets-mounts
- Мултиплатформеност: arm64/amd64, macOS + Linux (OrbStack/WSL-2)
- Нисък праг на влизане: минимум концепции и необходими команди
Периодично се връщам към тази тема и този път попаднах на Dagger.io. И той отговаря на по-голямата част от изискванията в списъка.
| Изискване | Доколко е подходящ Dagger |
|---|---|
| Изолация | ✅ Всички етапи се изпълняват в контейнери чрез BuildKit |
| Нисък праг на влизане | ⚠️ CLI е прост, но са нужни нови абстракции (Graph, функции) |
| Скриптиране (TS/Go/Py) | ✅ Поддръжка на Go, Python, TypeScript SDK |
| Open Source | ✅ Двигателят и SDK са с MIT лиценз, могат да бъдат форкнати |
| Езикова агностичност | ✅ Контейнеризираният подход не зависи от стека на приложението |
| Seamless CI | ✅ Един и същ код работи локално и в повечето CI (Docker-in-Docker или sibling) |
| Кешируемост | ✅ BuildKit кеш и автоматично кеширане на функции; ⚠️ Remote-cache изисква Dagger Cloud |
| Сигурност | ⚠️ Има rootless-mode и secrets-mounts, но сканирането на изображения ще трябва да се включи ръчно |
| Мултиплатформеност | ✅ Работи на macOS (arm64/amd64) и Linux; Windows все още е в бета |
Плюсове
- Единен код за CI и локална разработка — «no more push & pray».
- Програмируемост: пълноценните езици вместо YAML позволяват условия, цикли, функции за многократна употреба.
- Кеширане и паралелизъм от кутията благодарение на BuildKit.
- Модулност: Daggerverse и собствените модули улесняват повторното използване на пайплайни.
- Добро DX: интерактивно изпълнение с
dagger run, вградено трасиране.
Минуси
- Крива на обучение: трябва да се разбере моделът на графа и принципите на BuildKit.
- Млад проект: API все още може да се променя, по-малко примери, отколкото при GitHub Actions.
- Зависимост от Docker: няма да стартира без контейнерен демон (OrbStack/Colima/WSL-2).
- Windows: официалната поддръжка е в бета стадий.
Подводни камъни и препоръки
- Remote Cache = Dagger Cloud. За пълноценен отдалечен кеш е нужен SaaS акаунт; offline режимът поддържа само локален кеш.
- Secrets. Нужна е отделна логика за предаване на тайни (env/secrets API), в противен случай те могат случайно да попаднат в логовете.
- Производителност на macOS ARM. BuildKit в контейнер може да работи по-бавно поради x86 емулация, внимавайте с multi-arch.
- Доставка на артефакти. Самият Dagger не пушва в регистри/сториджи — трябва изрично да опишете стъпките или да включите модули.
- Дебъгване. При грешки понякога помага
dagger sessionс включен--debug, иначе стекът от извиквания не е очевиден.
В крайна сметка Dagger покрива добре повечето от моите изисквания и изглежда перспективен като единен инструмент за дев-енв и CI. Критичните рискове са младостта на екосистемата и зависимостта от Dagger Cloud за отдалечен кеш. Ако екипът е готов да инвестира време в усвояване на нови концепции и го устройва текущото ниво на стабилност, Dagger може да стане основа на бъдещата инфраструктура.