Агент-инженер по репозиторию · Модуль 6 · Урок 6.5

Чекпойнт v5: CI, деплой и эталонный репозиторий

Зачем (какую проблему чиним)

Финал: агент-сервис должен сам жить под CI и деплоиться предсказуемо. И главное — собрать всё, что мы строили по версиям, в один работающий эталон. Этот урок замыкает курс на собираемый снимок версии v5.

Решение и альтернативы

Решение: CI прогоняет go build ./..., go test ./... (детерминисто, на моке модели — версия v4) и линт как гейт мерджа самого агента; задеплоенный сервис читает конфиг (control plane: реестр промптов с версиями, allowlist, лимиты) из репозитория. Финальный снимок — отдельный Go-модуль examples/repo-agent, который собирается и тестируется независимо от сайта и по умолчанию работает в dry-run (без реальных вызовов модели/forge). Тегируем v5.

Альтернативы: деплой без CI-гейта — регрессия инвариантов (никогда main, нет auto-merge) уедет в прод; конфиг в окружении вразнобой — невоспроизводимость. CI-гейт + конфиг-как-код — стандартный безопасный финал.

DIFF

Добавляем CI-воркфлоу (build/test/lint как гейт) и финальную сборку; ссылка на эталонный репозиторий.

⚠ Безопасность

CI-гейт агента включает тесты инвариантов безопасности из версии v4 (никогда main, нет auto-merge, гейт перед MR, отказ на красном): регрессия любого из них роняет сборку и не попадает в прод. Dry-run по умолчанию в эталоне означает, что любопытствующий не запустит реальные записи/MR случайно — для боевого режима нужны явные флаги и токены.

Проверка

CI зелёный: go build ./..., go test ./..., линт. Эталон: cd examples/repo-agent && go build ./... && go test ./... — зелёно; go run . --help показывает режимы, по умолчанию dry-run. Затем git tag v5 — прод-готовый агент-сервис. Пройдите по чек-листу безопасности курса (все инварианты на месте).

Глубже

CI/CD, A/B, деплой, конкурентность — курс «Продакшн-разработка», Модуль 6 (гл. 13–14). Capstone проф-курса (Модуль 7) собирает агентную платформу шире — этот курс был его прикладным хребтом.

.github/workflows/ci.yml: build/test/lint как гейт мерджа агента (новый файл, фрагмент)
+name: ci
+on: [push, pull_request]
+jobs:
+  check:
+    runs-on: ubuntu-latest
+    steps:
+      - uses: actions/checkout@v4
+      - uses: actions/setup-go@v5
+        with: { go-version: stable }
+      # Тесты детерминисты (мок модели, версия v4): без ключа и без сети.
+      - run: go build ./...
+      - run: go test ./...          # включает тесты ИНВАРИАНТОВ безопасности
+      - run: golangci-lint run
Эталонный репозиторий версии v5: собрать, протестировать, запустить (dry-run)
cd examples/repo-agent
go build ./...
go test ./...        # детерминисто, на моке модели; покрывает инварианты
go run . --help      # режимы; по умолчанию dry-run (без реальных вызовов)

Anti-patterns

Грабли финала
ГрабляПочему плохоКак правильно
Деплой агента без CI-гейтаРегрессия инвариантов (никогда main, нет auto-merge) уезжает в прод незаметноCI-гейт: build/test/lint + тесты инвариантов безопасности как условие мерджа
Боевой режим по умолчанию в эталонеСлучайный запуск делает реальные записи/MRDry-run по умолчанию; боевой режим — за явными флагами и токенами
Конфиг вразнобой по окружениямНевоспроизводимость поведения; нечего откатыватьКонфиг-как-код (control plane): промпты с версиями, allowlist, лимиты в репозитории

Практическое задание (RA-v5)

  • Добавить CI (build/test/lint), включающий тесты инвариантов безопасности как гейт мерджа агента.
  • Свести конфиг в control plane (промпты с версиями, allowlist, лимиты); dry-run по умолчанию.
  • Зафиксировать финал: git commit -m "v5: CI, deploy, production-ready" и git tag v5. Сверить чек-лист безопасности курса. Эталон — в examples/repo-agent.

Проверка знаний

Почему в CI-гейт агента обязательно включать тесты инвариантов безопасности (никогда main, нет auto-merge, гейт перед MR)?

  • A Для красивого бейджа
  • B Чтобы регрессия любого инварианта роняла сборку и не попадала в прод — безопасность держится не на дисциплине, а на автоматической проверке
  • C Чтобы тесты шли дольше
  • D Это требование GitHub Actions

Почему эталонный репозиторий версии v5 по умолчанию работает в dry-run?

  • A Dry-run быстрее компилируется
  • B Чтобы случайный запуск не делал реальных записей/коммитов/MR; боевой режим включается явными флагами и токенами (least privilege на уровне запуска)
  • C Dry-run отключает тесты
  • D Так требует Go