Przejdź do głównej zawartości

Automatyzacja Pipeline z AI

CI twojego monorepo uruchamia każde zadanie przy każdym pushu. Jednolinijkowa edycja README wyzwala 38-minutowy build wszystkich sześciu serwisów, zadanie testowe staje się czerwone w 30% przypadków na tych samych trzech niestabilnych specach, a piątkowe wdrożenie na Cloudflare Workers wprowadziło regresję, której nikt nie wyłapał, dopóki nie zaczęły spływać zgłoszenia od supportu. Nie potrzebujesz „samonaprawiających się pipeline napędzanych przez AI” — potrzebujesz, żeby build uruchamiał tylko to, co się zmieniło, niestabilne testy były poddane kwarantannie, a wdrożenie samo się wycofywało, gdy wskaźniki błędów skaczą w górę.

Ten artykuł pokazuje konkretny workflow, dzięki któremu agent AI napisze te zmiany w pipeline za ciebie — we wszystkich trzech narzędziach, wraz z prawdziwym kodem YAML GitHub Actions, który produkują.

  • Zadanie wykrywania zmian dorny/paths-filter, które pomija nietknięte serwisy (i prompt, który je generuje)
  • Workflow triage niestabilnych testów: podajesz agentowi nieudane uruchomienie, dostajesz listę kwarantanny i politykę ponawiania prób
  • Progresywne wdrożenie na Cloudflare Workers z wrangler versions + stopniowym rolloutem i automatycznym rollbackiem
  • Gotowe do skopiowania prompty dla każdego z nich, dostrojone pod Cursor, Claude Code i Codex
  • Tryby awarii, które dają o sobie znać, gdy pozwolisz agentowi edytować CI, oraz jak z nich wyjść

Pojedyncza zmiana w CI o największej dźwigni w monorepo to przestać budować wszystko. dorny/paths-filter czyta diff i ustawia wyjścia per-ścieżka, na których bramkujesz zadania. Poproś agenta, żeby napisał filtr pod twój rzeczywisty układ katalogów, a nie pod szablon.

Agent powinien wyprodukować coś takiego — prawdziwe, uruchamialne zadanie, a nie jego opis:

.github/workflows/ci.yml
name: CI
on:
pull_request:
push:
branches: [main]
jobs:
changes:
runs-on: ubuntu-latest
outputs:
api: ${{ steps.filter.outputs.api }}
web: ${{ steps.filter.outputs.web }}
steps:
- uses: actions/checkout@v5
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
api:
- 'services/api/**'
- 'packages/shared/**'
web:
- 'services/web/**'
- 'packages/shared/**'
test-api:
needs: changes
if: ${{ needs.changes.outputs.api == 'true' }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5
- run: npm ci && npm run test --workspace=services/api

Zwróć uwagę, że packages/shared/** pojawia się pod oboma filtrami: zmiana w kodzie współdzielonym poprawnie przebudowuje obu konsumentów. To mapowanie zależności krzyżowych jest dokładnie tym, co chcesz, żeby agent wywnioskował z twojego repo, zamiast utrzymywać je ręcznie.

Interakcja różni się w zależności od narzędzia. Cursor edytuje YAML w miejscu, w edytorze; Claude Code działa headless w terminalu i potrafi zweryfikować wynik za pomocą gh; Codex uruchamia ten sam prompt jako nieinteraktywne zadanie exec albo jako zadanie Cloud wywodzące się ze zgłoszenia na GitHubie.

W trybie Agent otwórz repo i wskaż mu rzeczywisty układ. Cursor czyta workspaces z package.json oraz drzewo services/, a następnie zapisuje .github/workflows/ci.yml jako diff w miejscu, który przeglądasz przed zaakceptowaniem:

Add a changes job using dorny/paths-filter@v3 to .github/workflows/ci.yml. Derive one filter per package in my workspaces array, and make every filter also match packages/shared/**. Gate each existing test job behind its matching needs.changes.outputs.* value. Use actions/checkout@v5.

Użyj checkpointu przed zaakceptowaniem, żeby móc cofnąć całą edycję jednym kliknięciem, jeśli bramkowanie okaże się błędne.

Niestabilne testy nie potrzebują „analizatora stabilności” napędzanego przez AI — potrzebują kogoś, kto przejrzy ostatnie N uruchomień, znajdzie speki zawodzące niedeterministycznie, podda je kwarantannie i otworzy zgłoszenie. Tym „kimś” może być agent, bo potrafi czytać logi nieudanego uruchomienia bezpośrednio przez serwer GitHub MCP.

Serwer GitHub MCP to zdalny endpoint Streamable HTTP. Zainstaluj go raz — konfiguracja jest identyczna we wszystkich trzech narzędziach, bo MCP to wspólny standard:

Okno terminala
claude mcp add --transport http github https://api.githubcopilot.com/mcp/

Po podłączeniu agent może pobrać logi nieudanego zadania, zamiast żebyś kopiował-wklejał je ręcznie. Sedno tkwi w różnicy „przed/po”: bez serwera MCP wklejasz zrzut logu; z nim mówisz „ostatnie uruchomienie CI na tym PR”, a agent sam pobiera adnotacje, nazwy zawodzących speków i otaczający output.

W trybie Agent z włączonym serwerem GitHub MCP odwołaj się do nieudanego uruchomienia i pozwól Cursorowi pobrać logi, a następnie zaproponować diff kwarantanny dla twojej konfiguracji testów:

The last CI run on this branch failed. Pull the failing job’s logs via the GitHub MCP server, list the specs that fail intermittently (passing on retry), and mark them with test.skip plus a // FLAKY: <run-url> comment. Open a checklist of what you skipped.

Binarne wdrożenie albo w pełni się udaje, albo w pełni zawodzi. Progresywne wdrożenie wysyła nową wersję do wycinka ruchu, obserwuje wskaźniki błędów i automatycznie wycofuje zmiany, jeśli te skaczą w górę. Na Cloudflare Workers jest to wbudowane w wrangler versions — nie wymaga service mesh.

Każ agentowi napisać zadanie wdrożeniowe, które wysyła nową wersję, kieruje do niej 10% ruchu i bramkuje pełny rollout na health checku:

# .github/workflows/deploy.yml (excerpt)
- name: Upload new version
run: npx wrangler versions upload --json > version.json
- name: Canary 10% of traffic
run: |
VID=$(jq -r '.id' version.json)
npx wrangler versions deploy "$VID@10%" "${PREV}@90%" --yes
- name: Health gate
run: ./scripts/check-error-rate.sh # exits non-zero if 5xx rate > threshold
- name: Promote to 100%
if: success()
run: npx wrangler versions deploy "$(jq -r .id version.json)@100%" --yes
- name: Rollback on failure
if: failure()
run: npx wrangler rollback --message "Auto-rollback: health gate failed"

Write .github/workflows/deploy.yml for a Cloudflare Worker. Use wrangler versions upload, then wrangler versions deploy to send 10% of traffic to the new version, run scripts/check-error-rate.sh as a gate, promote to 100% on success, and wrangler rollback on failure. Pin actions/checkout@v5.

Przy edycjach CI sterowanych przez agenta rozumowanie obejmujące wiele plików liczy się bardziej niż czysta szybkość — agent musi odczytać układ twojego workspace, wywnioskować zależności i wyprodukować poprawny YAML za jednym razem. Gdy budżet ma mniejsze znaczenie niż skuteczność za pierwszym razem, użyj Claude Fable 5 (/model fable w Claude Code lub selektorem modeli w Cursorze) — to najbardziej zaawansowany model Anthropic, który znakomicie radzi sobie właśnie z tego typu pracą obejmującą wiele plików. Gdy budżet ma znaczenie, wybieraj Claude Opus 4.8 do wykrywania zmian i progresywnego wdrożenia, a do tańszego, bardziej mechanicznego triage niestabilnych testów — Claude Sonnet 4.6. Porównanie cen i pełną hierarchię możliwości znajdziesz w porównaniu modeli. Codex domyślnie działa na GPT-5.5 w CLI, IDE i Cloud; użyj gpt-5.2-codex, gdy uwierzytelnisz CLI kluczem API (jak robi to powyższa akcja GitHub).

CI to jedno miejsce, gdzie pewna siebie, ale błędna edycja agenta kosztuje cię zepsuty main. Tryby awarii są specyficzne.

Jeśli workflow wygenerowany przez agenta nie parsuje się, nie proś agenta, żeby „naprawił YAML” na ślepo — wklej z powrotem dokładny błąd z gh workflow view lub z Actions. Przypięcie każdej akcji do wersji major (@v5, @v3) także zapobiega klasycznej awarii typu „wczoraj działało”, gdy zmienny tag wprowadza zmianę łamiącą kompatybilność.