Sesja: Budowanie agentów DevOps + Coding — 2026-03-04
Kontekst
Pierwsza poważna sesja konfiguracji systemu agentów dla laba (gitlab.para.net). Zbudowaliśmy flow tworzenia projektów od zera — od kodu do działającego pipeline CI/CD.
Co zrobiliśmy
1. Konfiguracja środowisk
- Lab =
gitlab.para.net— prywatny GitLab, groupplatform - Gitea =
git.cynarski.pl— publiczny Forgejo - MCP serwer
gitlabpoprawiony: zła nazwa env var (GITLAB_TOKEN→GITLAB_PERSONAL_ACCESS_TOKEN), zły URL (GITLAB_URL→GITLAB_API_URL), self-signed cert (GITLAB_ALLOW_INSECURE_TLS=true)
2. Standardy kodowania (CODING_STANDARDS.md)
Zapisano obowiązkowe zasady dla wszystkich agentów:
- Clean Architecture — domain/application/infrastructure/interfaces, zależności tylko do środka
- Test-Driven Development — Red → Green → Refactor, testy przed implementacją
- Taskfile — ustandaryzowane taski:
install,build,test,lint,run - CI/CD — projekty na labie nie definiują własnych jobów, includują centralny pipeline
3. Skill DevOps (skills/devops/SKILL.md)
Skill dla agentów CI/CD — jak podłączyć projekt do centralnego pipeline platform/arch/cicd/pipeline, jak czytać .llm/ z kontekstem, jak dodawać nowe szablony technologiczne.
4. Projekt testowy platform/gin-test
Stworzony przez dwa równoległe agenty:
- coding-agent — Go + Gin, clean architecture, TDD,
GET /hello - devops-agent — golang pipeline template,
.gitlab-ci.yml
Flow agentów
Owil (orchestrator)
├── Tworzy repo + issues w GitLab
├── Spawns coding-agent (issues #2, #3, #4)
│ └── scaffold + TDD + Taskfile → push do git
└── Spawns devops-agent (issues #1, #5)
└── pipeline template + .gitlab-ci.yml → push do centralnego repo
Następnie:
Owil (tester)
├── Pipeline failuje → analiza logów → issue → fix → retry
└── Powtarza aż wszystkie joby zielone
Problemy i wnioski
Problem 1: Alpine vs Debian
Objaw: declare: not found i syntax error: unexpected redirection
Przyczyna: Centralny logger (common/helpers/logger.sh.yml) używa bash-specific składni (declare -i, <<<). Obraz golang:1.23-alpine ma /bin/sh (ash), nie bash.
Fix: Zmiana BUILDER_IMAGE na golang:1.23 (Debian ma bash).
Wniosek: ⚠️ Zawsze Debian, nigdy Alpine w środowiskach które korzystają ze wspólnych skryptów bash.
Problem 2: go test -race wymaga CGO
Objaw: go: -race requires cgo; enable cgo by setting CGO_ENABLED=1
Przyczyna: Taskfile miał go test -v -race ./..., ale pipeline ustawia CGO_ENABLED=0 (statyczne binarki).
Fix: Usunięcie flagi -race z Taskfile.
Wniosek: Flagi testów muszą być spójne z configuacją CI.
Problem 3: critical "Nie zaimplementowano" — niewidoczny błąd stanu ⭐
To jest najciekawszy problem tej sesji.
Centralny pipeline ma domyślne skrypty dla jobów — każdy niezaimplementowany skrypt zawierał:
critical "Nie zaimplementowano"Początkowo funkcja critical() tylko wyświetlała czerwony baner — bez exit 1. Pipeline przechodził przez unit-test, build etc. (te były zaimplementowane), a joby jak prepare, coverage-report etc. technicznie “kończyły się” ale bez błędu — mimo że nic nie robiły.
W trakcie sesji Aleksander zmienił critical() żeby wywoływała exit 1. Nagle wszystkie nieimplementowane skrypty zaczęły failować — w tym prepare, który jest pierwszym jobem i blokuje cały pipeline.
To obnażyło ukryty dług: pipeline “działał” tylko dlatego że błędna implementacja nie była sygnalizowana jako błąd. Dopiero właściwy kontrakt (exit 1 w critical) ujawnił stan rzeczywisty.
Fix: Implementacja wszystkich 7 skryptów (prepare, coverage-report, package, publish-snapshot, publish-release, release-notes, sonarqube).
Wniosek: Placeholder’y w krytycznej infrastrukturze powinny od razu failować — “fail fast” jest lepsze niż ciche przejście. Szkoda że nie było tego od początku, bo 4 pipeline przeszły “na zielono” mimo że nie robiły połowy roboty.
Problem 4: Tester z timeout
Spawned tester-agent miał za mało czasu (runTimeoutSeconds: 300) na całe flow (analiza + fix + retry pipeline). Przy kolejnych sesjach zwiększyć do 600s.
Architektura po sesji
gitlab.para.net
└── platform/
├── arch/cicd/pipeline ← centralny pipeline (szablony technologiczne)
│ ├── technology/golang/main.yml ← Go/Debian obraz
│ ├── common/scripts/*.sh.yml ← zaimplementowane
│ └── .llm/ ← kontekst dla agentów
└── gin-test ← przykładowy projekt Go/Gin
├── internal/ (clean arch)
├── Taskfile.yml
└── .gitlab-ci.yml ← include centralnego pipeline
git.cynarski.pl
├── Orwil/personality ← konfiguracja Owila (SOUL, AGENTS, skills)
├── Orwil/vault ← ten plik :)
└── paramah/gitlab-contribution ← eksport statystyk GitLab do Excel
Tags
#devops #gitlab #golang #ci-cd #agenci #clean-architecture #tdd #wnioski
