Sjekkpunkt 1 · lokalt, så første deploy

Lab 1: Bygg pipelinen

Koble sammen delene fra GitHub-issue til pull request i Pipeline.cs, og test lokalt med dry-run. Før lunsj setter du secrets og kjører første deploy fra GitHub Actions. Du får ferdige komponenter og en oppskrift, men skriver selv rekkefølgen.

MålEn pipeline som er deployet til Azure.
ArbeidsstedDitt eget repo, pwsh lokalt og GitHub Actions.
Ferdig nårRunStages bygger grønt, dry-run er ren og første deploy er grønn.

Før du begynner

Ha dette klart før du begynner:

Bruk pwshKommandoene er skrevet for pwsh. Står du i zsh eller bash på Mac eller Linux, skriver du pwsh først. Mangler du den på Mac: brew install --cask powershell. Copy-Item, $Variabel = ... og curl.exe virker bare i pwsh. dotnet, git og gh virker overalt.

Agenten endrer ikke sitt eget repo. Den vil senere klone øvingsrepoet, lage en branch der og åpne pull requesten fra Azure. I Lab 1 skal ingen lokal kjøring reservere issue, skrive kommentarer, pushe til Oslo Live eller opprette PR.

Lag agentrepoet

Last ned og pakk ut starter-kitet, eller bruk lenken:

Invoke-WebRequest https://novanet.github.io/workshop.oslo-live/mini-nils.zip -OutFile mini-nils.zip
Expand-Archive mini-nils.zip -DestinationPath .
Set-Location mini-nils
git init -b main
git add -A
git commit -m "Start fra delene til Mini-Nils"
gh repo create mini-kari --private --source . --push

Bytt kari med navnet ditt. Pushen starter deploy-workflowen, men den hopper over med en notis fordi AGENT_NAME ikke er satt ennå. Det er som det skal.

Fyll inn miljøet

Copy-Item .env.example .env
AGENT_NAME=kari
GH_TOKEN=ghp_...

Tokenet trenger bare public_repo. Feilen addComment eller replaceActorsForAssignable i Lab 2 betyr ofte at du ikke har godtatt collaborator-invitasjonen til øvingsrepoet. Du trenger ikke ANTHROPIC_API_KEY lokalt; dry-run kaller ikke Claude.

Sjekk verktøyene

dotnet --version
gh --version
python --version
dotnet build

Bruk devcontainer eller Codespaces hvis noe mangler. Claude Code trengs ikke lokalt; det ligger i worker-imaget i Azure.

Sjekk oppsettet først

Sjekk at issuen er tilgjengelig uten å klone repoet, bruke modellkall eller skrive noe til GitHub.

dotnet run --project src/Worker -- --issue 1 --repo novanet/workshop.oslo-live --dry-run

--dry-run leser issue-status og stopper før reservasjon, clone, issue-kommentar, Claude Code, commit og PR. Direkte issue-kjøring uten --dry-run er blokkert i starter-kitet. Først når agenten er deployet og webhooken leverer en kømelding, kan den reservere issue, kommentere og opprette PR. Dry-run krever ikke ANTHROPIC_API_KEY og kan bare brukes med --issue og --repo, ikke kømodus.

Ingen nøkkel lokaltDu skal ikke kjøpe API-kreditt selv. Kurset har én felles Anthropic-nøkkel som du legger inn som repository secret på slutten av labben. Claude.ai-abonnementet gir ikke API-kreditt.

Start med skjelettet

Scriptet legger inn en skjelettfil med den ytterste Run-metoden og hjelpeklassene du trenger. RunStages er din oppgave.

python setup-lab1.py
dotnet build

Det som stod der fra før lagres i .kurs/Pipeline.forsok.cs. Ikke åpne sjekkpunktet ennå; det er den ferdige løsningen som skal brukes hvis du faller av. Dry-run håndteres i Run før RunStages, så du trenger ikke tenke på den i oppskriften under.

Slik gjør du det i RunStages

Ta ett steg om gangen. Kjør dotnet build etter hvert steg. Oppskriften beskriver hva som skal skje, men ikke C#-løsningen. RunStages i skjelettet har én TODO per steg, inkludert 4b, og en TODO 0 om å fjerne plassholderen. TODO-en sier hva, steget under sier hvordan.

1

Issue-status · før modellen

Kontroller at issuen er åpen

Hvis skipReservation er satt, logger du at kontrollen hoppes over. Ellers kaller du Reservation.IsBusy(task, AgentName). Får du en grunn tilbake, kommenterer du den og returnerer 0; ellers kaller du Reservation.Claim(task). Tildelingen er synlig, ikke eksklusiv: flere deltakere kan jobbe parallelt, og første mergete PR vinner.

2

Arbeidsområde

Klon repoet og lag branch

Kall Repository.Clone(task.Repo, workspace), lag task.BranchName med CreateBranch, logg repo.Path og kommenter StartMarker(task). Modellen skal aldri jobbe direkte på main.

3

Kontekst

Bygg systemprompt og kontekst

Kall InstallSkills(), ReadMemory() og BuildSystemPrompt(memory). Start previousOutput som en tom streng. Regler, konvensjoner og hukommelse skal være lesbar input.

4

Modellsteg

Kjør config.Stages

For hvert steg velger du stage.Model eller config.Model, bygger prompt med BuildPrompt, kaller ClaudeRunner.Run, legger resultatet i runs og logger LogUsage. Starter-kitet har fire steg i agent/stages.json: research med claude-opus-5-5, plan-review med claude-haiku-4-5, implement og self-review med claude-sonnet-5. Etter de fire stegene kommer levering, som er kode og ikke modell. Ved feil kommenterer du, bruker EndMarker og returnerer 1.

4b

Plan-gate · før implement

Stopp hvis planen ikke er godkjent

Rett etter plan-review sjekker du svaret. Starter det ikke med PLAN GODKJENT, kommenterer du svaret med Fence, forbruk og EndMarker, kaller Remember og returnerer 1. Implement skal aldri starte på en plan som ikke er godkjent.

5

Endring · ingen tom PR

Sjekk at det finnes en endring

Kall repo.HasChanges(). Ved tom diff kommenterer du siste svar, husker utfallet med Remember, legger ved forbruk og returnerer 0.

6

Verifisering

Kjør bygg og test

Kall Verify(repo.Path). Når verifiseringen feiler og StopOnVerifyFailure er sann, kommenterer du verifyLog, husker utfallet og returnerer 2 uten PR. Standard er false, og da går du videre og leverer PR som utkast.

7

Leveranse

Lever endringen

Kall CommitAndPush, bygg PR-teksten med PrBody og kall CreatePullRequest. Bruk utkast når verifiseringen er rød. Kommenter PR-adressen, skriv sammendrag og husk utfallet. Agenten merger aldri selv; PR-en går til review, og et menneske merger.

Bygg og kjør dry-run

dotnet build
dotnet run --project src/Worker -- --issue 1 --repo novanet/workshop.oslo-live --dry-run

Dry-run bekrefter at issue og token er tilgjengelige, men skriver ikke assignee, kommentar, branch, commit eller PR. Den første virkelige kjøringen skal komme fra Azure etter at webhooken er koblet til.

Commit og push koden din når bygget er grønt. Det er dette som blir deployet.

git add -A
git commit -m "Implementer RunStages"
git push

Før lunsj: secrets og første deploy

Deployen skriver ingenting til issues i Oslo Live. Den lager bare dine ressurser i Azure. Grensen mellom lokal kjøring og sky holder fortsatt.

1

Repository secrets

Legg inn secrets

Kurslederen gir deg ANTHROPIC_API_KEY, WEBHOOK_SECRET og AZURE_CREDENTIALS. GH_TOKEN er tokenet du laget selv. Kjør fra mappen til agentrepoet. gh ber deg lime inn verdien, så den havner ikke i terminalhistorikken.

gh secret set GH_TOKEN
gh secret set ANTHROPIC_API_KEY
gh secret set WEBHOOK_SECRET

AZURE_CREDENTIALS er JSON over flere linjer. Lim den inn i nettleseren: Settings → Secrets and variables → Actions → New repository secret. Den gir Contributor på den delte ressursgruppen rg-agentic-workshop. Bruk den bare i GitHub Actions, aldri lokalt, og ikke del den videre.

2

Repository variable

Sett agentnavnet

gh variable set AGENT_NAME --body kari
gh secret list
gh variable list

Bruk samme navn som i .env. Listene skal vise fire secrets og AGENT_NAME. Ingen andre trengs.

3

Deploy

Kjør workflowen

Åpne Actions → Build and deploy Mini-Nils → Run workflow. Workflowen logger inn med AZURE_CREDENTIALS, oppretter ressursene dine, bygger bildene i kursets felles ACR og deployer. Første gang tar det rundt 10 minutter.

Du skal ikke logge inn i Azure, kjøre docker login eller kjøre deploy-skriptet lokalt.

4

Actions Summary

Si fra til kurslederen

Åpne den ferdige kjøringen og velg Summary. Der står Receiver URL, Issue label (kari) og Worker job. Når Receiver URL vises, sier du fra til kurslederen. Kurslederen kobler webhooks fortløpende fra ca. 11:30 og resten i lunsjen.

Er webhooken din koblet før du går til lunsj, merker du en issue med én gang (se Lab 2, steg 2). Da jobber agenten mens du spiser, og Lab 2 starter med en PR å lese i stedet for å vente.

Sjekkpunkt 1Din egen implementasjon av RunStages bygger grønt, dry-run er ren, og første deploy fra Actions er grønn med Receiver URL i Summary.

Hvis du trenger hjelp

Forsøket ditt blir tatt vare på før den ferdige løsningen kopieres inn:

./sjekkpunkt.ps1 lab1
dotnet build

Virker ikke skriptet, kjør python setup-lab1.py --checkpoint. Du kan se forskjellen slik:

code --diff .kurs\Pipeline.forsok.cs src\Worker\Pipeline.cs
RedningsnettLes den ferdige pipelinen etterpå og finn ut hvilket steg du manglet. Commit, push og kjør deployen før lunsj uansett.

Hvis du blir tidlig ferdig

Dokumenter hva som ble bedre, hva som ble dårligere og hvilken måling som viser forskjellen.