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:
Et klassisk GitHub-token med bare public_repo og kort utløp, og godtatt collaborator-invitasjon til novanet/workshop.oslo-live. Lab 1 bruker det bare i lesende dry-run; i Lab 2 skriver Azure-workeren med det. Fine-grained funker ikke for collaborators utenfor Novanet-orgen.
Et agentnavn, for eksempel kari: 3–12 tegn, små bokstaver, tall og bindestrek, og det må starte med en bokstav.
En fersk kopi av mini-nils.zip, pakket ut i mappen der du skal jobbe.
pwsh 7, .NET 10 SDK, Git, gh og Python 3. Devcontainer eller Codespace er fallback.
Mot slutten av labben gir kurslederen deg AZURE_CREDENTIALS, ANTHROPIC_API_KEY og WEBHOOK_SECRET. Du trenger ingen Anthropic-nøkkel lokalt.
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:
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.
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.
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: