Przejdź do głównej zawartości

Ciągła dostawa z pomocą AI

Ciągła dostawa z agentami AI utrzymuje każdą zmianę na tyle małą, by automatyczne kontrole mogły ją udowodnić: jedno zadanie agenta to jeden commit, każdy pull request mieści się w limicie rozmiaru pilnowanym przez CI, a o tym, czy zmiana trafia na produkcję, decyduje pipeline. Agenci zwiększają wolumen zmian, więc rozmiar partii staje się dźwignią, która chroni stabilność.

Spędziłeś cztery godziny, budując funkcjonalność w jednej sesji agenta. Diff ma 1200 linii w 18 plikach, a pierwszy komentarz recenzenta brzmi: „Możesz to podzielić?”. Nie możesz, bo migracja, API i UI są splątane w tych samych commitach. Pull request czeka dwa dni, a gdy nocny build robi się czerwony, najszybszą poprawką agenta jest usunięcie padającego testu.

Ta strona jest dla deweloperów, którzy prowadzą sesje agentów, i dla tech leadów, którzy ustalają zasady merge’owania w zespole. Opisuje samą dyscyplinę dostawy. Sąsiednie strony wchodzą głębiej w dowody, które musi nieść pull request, code review bez czytania każdej linii i bezpieczne wypuszczanie zmian.

Dlaczego małe partie są ważniejsze, gdy kod piszą agenci?

Dział zatytułowany „Dlaczego małe partie są ważniejsze, gdy kod piszą agenci?”

Agenci sprawiają, że duży diff tanio się produkuje i drogo weryfikuje. Trzy niezależne pomiary wskazują ten sam kierunek:

  • DORA, raport 2025 (Google Cloud, 2025-09-23): „we observe a positive relationship between AI adoption on both software delivery throughput and product performance” oraz „AI adoption does continue to have a negative relationship with software delivery stability”. Raport nazywa mechanizm: „Without robust control systems, like strong automated testing, mature version control practices, and fast feedback loops, an increase in change volume leads to instability”.
  • DORA AI Capabilities Model (Google Cloud, Nathen Harvey i Allison Park, 2025-12-10): praca w małych partiach to jedna z siedmiu zdolności, bo „AI can easily generate massive blocks of code, which are hard to review and test”.
  • DX (Justin Reock, 2026-06-17): mediana rozmiaru pull requesta „nearly doubled, growing from 44 lines to 72 lines per pull request between July 2025 and June 2026”, w raporcie opartym na danych z ponad 400 firm.

Telemetria dostawcy Faros AI (kwiecień 2026, 22 000 deweloperów) pokazuje ten sam kompromis w jednym raporcie: przepustowość zadań na dewelopera wzrosła o 33,7%, rozmiar pull requestów o 51%, a liczba błędów na pull request o 28,7%. Wniosek dla dostawy: rozmiar partii to ustawienie, które kontrolujesz, i musi go pilnować pipeline, bo agent tego nie zrobi.

  • Regułę „commit na zadanie” w CLAUDE.md, AGENTS.md albo w regule Cursora, dzięki której każda sesja zostawia historię nadającą się do przeglądu.
  • Deterministyczny check w GitHub Actions, który odrzuca pull request ponad limit rozmiaru, bez agenta i bez sekretów w jobie.
  • Prompty do podziału zbyt dużego diffu na stos pull requestów, do notatek wydania z zakresu commitów i do triage’u czerwonego buildu bez osłabiania testów.
  • Bramki, które pozwalają wypuścić zmianę na podstawie dowodów zamiast czytania linijka po linijce, oraz miary pokazujące, że dyscyplina działa.

Jak zmienia się ciągła dostawa, gdy kod pisze agent?

Dział zatytułowany „Jak zmienia się ciągła dostawa, gdy kod pisze agent?”

Praktyki są te same co zawsze. Zmienia się to, kto je łamie, i która bramka to wyłapuje.

PraktykaCo robi agent bez regułyBramka, która ją utrzymuje
Małe partiePracuje do końca całej funkcjonalności i commituje razReguła „commit na zadanie” i check rozmiaru pull requesta w CI
Krótko żyjące gałęzieBuduje na gałęzi godzinami, a main ucieka do przoduJedna lista zadań na gałąź, merge tego samego dnia
Każdy commit gotowy do wydaniaZostawia niedokończoną pracę między commitamiTesty, typy i lint przed każdym commitem
Deploy to nie wydanieWypuszcza nowe zachowanie od razu do wszystkichFlagi funkcji i canary (progressive delivery)
Szybka informacja zwrotnaTraktuje czerwony build jak problem do ukryciaPrompt do triage’u, który zabrania pomijania i luzowania testów
Identyfikowalne wydaniaPisze w wiadomości commita „update files”Conventional Commits w pliku reguł, notatki wydania z zakresu commitów

Commituj po każdym zadaniu agenta, a nie po całej funkcjonalności

Dział zatytułowany „Commituj po każdym zadaniu agenta, a nie po całej funkcjonalności”

Nawyk, który umożliwia całą resztę, to jedno ukończone zadanie, jeden commit. Jeśli planujesz z łańcuchem artefaktów, każde zadanie z plan.md daje jeden commit, a trzy do pięciu zadań składa się na jeden pull request. Reguła musi mieszkać w pliku instrukcji agenta, bo prompt, o którym zapomnisz, nie jest regułą.

  1. Dodaj regułę commitów do pliku instrukcji, który czyta twoje narzędzie (gdzie, pokazują zakładki poniżej).
  2. Zaczynaj każdą sesję od jednego zadania z planu, nie od całej funkcjonalności.
  3. Gdy kontrole zadania przechodzą, pozwól agentowi zrobić commit i dopiero wtedy zacznij następne zadanie.
  4. Otwieraj pull request, gdy gotowe są zadania jednego kawałka do przeglądu, a nie całej funkcjonalności.

Wpisz regułę do CLAUDE.md w katalogu głównym repozytorium. Od v2.1.277 na kanale wydań latest Claude Code czyta też AGENTS.md, gdy nie ma CLAUDE.md, więc zespół, który dzieli jeden plik z Codexem, może trzymać regułę tam.

## Commits
- Commit after each completed task from plan.md, never after several.
- Before committing, run `npm run typecheck`, `npm run lint` and the tests for the files you changed. Do not commit on a failure.
- Stage only the files that belong to the task. Never stage .env files or generated build output.
- Use Conventional Commits: `type(scope): summary`, one logical change per commit. If the summary needs "and", it is two commits.

Reguła w pliku instrukcji zawodzi po cichu, gdy agent ją zignoruje. Check w CI nie zawodzi. Poniższy workflow liczy zmienione linie względem gałęzi bazowej, pomija lockfile’e i snapshoty testów i kończy się błędem, gdy suma przekroczy limit. Nie uruchamia agenta i nie czyta żadnego sekretu, więc jest bezpieczny dla pull requestów z dowolnej gałęzi.

.github/workflows/pr-size-budget.yml
name: PR size budget
on:
pull_request:
types: [opened, synchronize, reopened, labeled, unlabeled]
permissions:
contents: read
jobs:
size:
runs-on: ubuntu-latest
if: ${{ !contains(github.event.pull_request.labels.*.name, 'size-exception') }}
steps:
- uses: actions/checkout@v7
with:
fetch-depth: 0
persist-credentials: false
- name: Fail when the diff exceeds the budget
env:
BASE_REF: ${{ github.base_ref }}
BUDGET: '400'
run: |
set -o pipefail # a failed git diff must fail the check, not count as 0 lines
changed=$(git diff --numstat "origin/${BASE_REF}...HEAD" -- . \
':(exclude)*.lock' ':(exclude)package-lock.json' ':(exclude)*__snapshots__*' \
| awk '$1 != "-" { total += $1 + $2 } END { print total + 0 }')
echo "Changed lines (without lockfiles and snapshots): ${changed} of ${BUDGET}"
if [ "${changed}" -gt "${BUDGET}" ]; then
echo "::error::This pull request changes ${changed} lines. Split it into stacked pull requests, or add the size-exception label and explain why in the description."
exit 1
fi

Limit 400 linii to punkt wyjścia, a nie próg wynikający z badań. Ustal go na podstawie własnej historii: weź medianę rozmiaru pull requestów zmerge’owanych przez zespół w ostatnim kwartale i zacznij nieco powyżej niej. Etykieta size-exception to furtka dla generowanych migracji i masowych zmian nazw; odpowiada za nią tech lead, a każde jej użycie widać w pull requeście.

Dwa ograniczenia decydują, czy to uczciwa bramka. Przy wyzwalaczu pull_request GitHub uruchamia plik workflow z merge refa pull requesta, więc gałąź może w tym samym diffie podnieść BUDGET albo usunąć check; dodaj /.github/ do CODEOWNERS i wymagaj w ochronie gałęzi recenzji code ownera, żeby zmiana workflow potrzebowała akceptacji tech leada. Poza tym job pominięty przez etykietę liczy się dla wymaganego checku jako zaliczony, a etykietę może dodać każdy z dostępem triage, także autor pull requesta. GitHub nie ma uprawnień do pojedynczych etykiet, więc etykieta to widoczny wyjątek, a nie kontrola: o tym, czy zostaje, decyduje code owner, który recenzuje pull request.

Podziel zbyt duży diff agenta na stos pull requestów

Dział zatytułowany „Podziel zbyt duży diff agenta na stos pull requestów”

Gdy sesja już wyprodukowała gałąź na 1200 linii, nie proś recenzenta, żeby to przełknął. Niech agent potnie ją na warstwy, z których każda sama przechodzi kontrole. Prompt jest ten sam we wszystkich trzech narzędziach; różni się tylko miejsce uruchomienia. Żeby podział odbył się w osobnym checkoucie, w Codexie zacznij sesję z --worktree, w Claude Code z claude --worktree <nazwa> (-w), a w Cursorze użyj git worktree (agenci w izolowanych worktree).

Niech o wydaniu zmiany decyduje pipeline, a nie czytelnik

Dział zatytułowany „Niech o wydaniu zmiany decyduje pipeline, a nie czytelnik”

Małe partie sprawiają, że każdą zmianę da się sprawdzić. Bramki sprawiają, że sprawdzenie jest automatyczne. Zmiana jest gotowa do merge’a, gdy spełnione są cztery warunki, a żaden z nich nie wymaga, by człowiek przeczytał każdą linię:

  1. Deterministyczne kontrole przechodzą: sprawdzanie typów, lint i zestaw testów, w tym nowe testy, które padają na starym kodzie.
  2. Wyrocznia jest nietknięta albo zmiana jest uzasadniona: żadnego usuniętego, pominiętego ani poluzowanego testu bez podanego powodu (ochrona wyroczni).
  3. Agent recenzujący nie znalazł problemu blokującego, uruchomiony na diffie ze spisanymi kryteriami przeglądu.
  4. Pakiet dowodów jest kompletny: link do specyfikacji, wyniki akceptacji, klasa ryzyka i plan wdrożenia, sprawdzane przez CI (pakiet dowodów).

Człowiek zatwierdza zgodnie z klasą ryzyka zadeklarowaną w pakiecie. Zmiany niskiego ryzyka wchodzą po zielonych bramkach; zmiany wysokiego ryzyka (uwierzytelnianie, płatności, migracje, publiczne API) trafiają do wskazanego właściciela, który czyta dowody i oflagowane gorące punkty. Kto czyta co, określa sześciostopniowy triage PR-ów agenta.

Przed pushem uruchom w sesji /code-review, żeby lokalnie przejrzeć gałąź. Dla głębszego przebiegu w chmurze claude ultrareview uruchamia z powłoki wieloagentowy przegląd bieżącej gałęzi i wypisuje znaleziska; na planach Pro i Max po kilku darmowych uruchomieniach płacisz za każde kolejne. Zespoły na planach Team i Enterprise mogą włączyć zarządzane Code Review (research preview) na GitHubie, które czyta plik REVIEW.md w katalogu głównym repozytorium z instrukcjami tylko dla przeglądu. Konfigurację opisuje strona automatyczne przeglądy kodu z Claude Code.

Jeśli chcesz uruchamiać agenta jako job CI na każdym pull requeście, użyj utwardzonej konfiguracji ze strony agenci headless w CI. Job agenta, który pobiera kod kontrybutora, mając klucz API w środowisku, może uruchomić hooki i serwery MCP tego kontrybutora z twoim sekretem, więc skopiuj flagi z tamtej strony zamiast pisać job od zera.

Ciągła dostawa oznacza, że main zawsze nadaje się do wdrożenia, a nie że każdy merge trafia do każdego użytkownika. Nowe zachowanie ze zmiany agenta schowaj za flagą funkcji, wdróż je „po ciemku” i najpierw pokaż małej części ruchu. Zmiana, która po merge’u okaże się błędna, kosztuje wtedy przełączenie flagi, a nie revert pod presją. Budżet zasięgu awarii dla każdej klasy ryzyka, analizę canary i automatyczny rollback opisuje strona progressive delivery dla zmian pisanych przez agentów.

Historia „commit na zadanie” w formacie Conventional Commits sprawia, że notatki wydania kosztują niewiele. Daj agentowi zakres i format zamiast polecenia „podsumuj wydanie”.

Zrób triage czerwonego buildu bez osłabiania testów

Dział zatytułowany „Zrób triage czerwonego buildu bez osłabiania testów”

Agent dobrze sprawdza się jako pierwsza linia przy padniętym pipeline’ie, pod warunkiem że prompt wyklucza skróty. Zostawiony sam sobie, najszybciej dojdzie do zielonego checka, pomijając test, dodając ponowienia albo luzując asercję.

Mierz przepływ, a nie aktywność agenta. Śledź te miary w każdym sprincie, na danych z hostingu Gita i narzędzia do wdrożeń, a nie z deklaracji zespołu:

MiaraCo pokazujePożądany kierunek
Mediana zmienionych linii na zmerge’owany pull requestCzy partie pozostają małeBez zmian lub w dół
Odsetek pull requestów z etykietą size-exceptionCzy limit jest prawdziwyNiski, każdy z uzasadnieniem
Czas realizacji zmiany (lead time) od pierwszego commita do produkcjiCzy małe partie rzeczywiście płynąW dół
Odsetek nieudanych zmian (change failure rate)Czy tempo odbywa się kosztem stabilnościBez zmian lub w dół
Czas przywrócenia po nieudanym wdrożeniu (failed deployment recovery time)Czy flagi i rollback działająW dół

Trzy ostatnie to miary dostawy DORA; strona DORA, SPACE, DX Core 4 i pomiar AI definiuje je precyzyjnie i pokazuje, jak je zbierać. Tech lead odpowiada za limit i co sprint przegląda listę wyjątków. Jeśli lead time spada, a change failure rate rośnie, bramki są za słabe na ten wolumen zmian, czyli dokładnie wzorzec opisany w raporcie DORA.

Co się psuje w ciągłej dostawie z AI i jak z tego wyjść

Dział zatytułowany „Co się psuje w ciągłej dostawie z AI i jak z tego wyjść”