Агент-инженер по репозиторию · Модуль 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) собирает агентную платформу шире — этот курс был его прикладным хребтом.
+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 runcd examples/repo-agent
go build ./...
go test ./... # детерминисто, на моке модели; покрывает инварианты
go run . --help # режимы; по умолчанию dry-run (без реальных вызовов)Anti-patterns
| Грабля | Почему плохо | Как правильно |
|---|---|---|
| Деплой агента без CI-гейта | Регрессия инвариантов (никогда main, нет auto-merge) уезжает в прод незаметно | CI-гейт: build/test/lint + тесты инвариантов безопасности как условие мерджа |
| Боевой режим по умолчанию в эталоне | Случайный запуск делает реальные записи/MR | Dry-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)?
Верный ответ: B
B. Инварианты безопасности легко сломать незаметным рефакторингом. Тесты на них в CI-гейте превращают «мы стараемся не писать в main» в «сборка падает, если кто-то это сломал» — безопасность становится свойством системы, а не намерением.
Почему эталонный репозиторий версии v5 по умолчанию работает в dry-run?
Верный ответ: B
B. Безопасный дефолт: эталон демонстрирует архитектуру и проходит тесты без побочных эффектов. Реальные действия (запись, push, MR) требуют осознанного включения боевого режима с токенами — это распространяет принцип наименьших привилегий на сам способ запуска.