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, group platform
  • Gitea = git.cynarski.pl — publiczny Forgejo
  • MCP serwer gitlab poprawiony: zła nazwa env var (GITLAB_TOKENGITLAB_PERSONAL_ACCESS_TOKEN), zły URL (GITLAB_URLGITLAB_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