Среда за разработка и 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: официалната поддръжка е в бета стадий.

Подводни камъни и препоръки

  1. Remote Cache = Dagger Cloud. За пълноценен отдалечен кеш е нужен SaaS акаунт; offline режимът поддържа само локален кеш.
  2. Secrets. Нужна е отделна логика за предаване на тайни (env/secrets API), в противен случай те могат случайно да попаднат в логовете.
  3. Производителност на macOS ARM. BuildKit в контейнер може да работи по-бавно поради x86 емулация, внимавайте с multi-arch.
  4. Доставка на артефакти. Самият Dagger не пушва в регистри/сториджи — трябва изрично да опишете стъпките или да включите модули.
  5. Дебъгване. При грешки понякога помага dagger session с включен --debug, иначе стекът от извиквания не е очевиден.

В крайна сметка Dagger покрива добре повечето от моите изисквания и изглежда перспективен като единен инструмент за дев-енв и CI. Критичните рискове са младостта на екосистемата и зависимостта от Dagger Cloud за отдалечен кеш. Ако екипът е готов да инвестира време в усвояване на нови концепции и го устройва текущото ниво на стабилност, Dagger може да стане основа на бъдещата инфраструктура.