Bilko support repo split — plan (2026-08-23)
MC #900161 — Plan: izdvajanje bilko.cloud support surface u novi AzDO repo
CEO nalog: "kao sto smo izvukli image, container treba src code i pipeline izvuci — dva projekta main/support." Ovo je PLAN, ne implementacija. Čeka CEO odobrenje prije bilo kakvog reza u kodu ili pipeline-u.
1. Cilj
Nezavisan support lifecycle: deploy supporta ne čeka main CI, main incident ne blokira support fix. Čišća RBAC/blast-radius granica — support je admin-only povrsina, danas dijeli sliku i deploy rizik s main-om. Krajnji rezultat: support.bilko.cloud servira se iz vlastitog repoa/pipeline-a/slike, main repo ostaje netaknut.
2. Stanje danas (izvor: scout-pipeline.md, scout-code.md)
- Support nema vlastiti build/scan: jaše na main-ovom
build_demo_webjobu (azure-pipelines.yml:2166-2195), istaapps/web/Dockerfile, isti tagbilko-web:demo-$(SHORT_SHA), isti ACRbilkodemo.azurecr.io. - Deploy je jedini support-specifičan korak: 2.
az containerapp update(2309-2320) nabilko-web-support-demo, postavljaBILKO_APP_SURFACE=supportkao runtime env var (nije build ARG — ista slika, dva poda). - Verify: 3 curl provjere (2376-2408):
/admin→307,/dashboard→404,/invoices→404 na support.bilko.cloud. - Kod: 8 support-only fajlova pod
app/(admin)/admin/*, 12 dijeljenih auth fajlova (8 lib + 4 stranice), 6 backend endpointa pod/admin/*namespace-om, 30 testova uapp-surface-900075.test.ts. Ukupno ~35-40 fajlova za novi repo (scout-code.md summary tabela). - Support postoji SAMO na demo tier-u — nula footprint u CI_Gates/Build/Deploy_Stage/E2E_UAT/Write_UAT.
3. Odluka za CEO #1 — isti AzDO projekat (novi repo) vs novi AzDO projekat
Kelsey (pipeline scout) preporučuje: novi REPO u postojećem Bilko projektu, ne novi projekat.
- Agent pool (bilko-selfhosted, 1 org-wide CI slot) je org-level resurs — dijeli se identično bez obzira na odluku.
- Service connection
azure-bilkoi variable groupbilko-kv-demo(Key Vault-linked) su project-scoped po defaultu. Novi projekat = ponovno kreiranje/grant SP permisija i dupliranje variable grupa. Novi repo u istom projektu nasljeđuje sve to plus postojećiPromote_Demoenvironment approval gate, bez dodatnog AzDO admin posla. Pitanje za CEO-a: kad kažeš "dva projekta", misliš li na RBAC/board izolaciju (support tim ne vidi main backlog/work items) ili na tehničku separaciju build/deploy lanaca? Ako je prvo — novi projekat ima smisla uprkos trošku re-provisioninga. Ako je drugo (isporuka/rizik razdvojeni) — repo u istom projektu postiže isti tehnički cilj bez ponovnog AzDO admin rada. Moja preporuka: repo u istom projektu, osim ako je RBAC izolacija eksplicitan zahtjev — tehnički cilj (nezavisan lifecycle) se postiže repoom i pipeline-om, ne granicom projekta.
4. Odluka za CEO #2 — dijeljeni auth kod (12 fajlova) i API klijent
Dvije opcije: (a) git subtree pull pinovan na main-ov SHA, ponovna sinhronizacija ručnim korakom; (b) zajednički npm paket (interni registry/workspace), verzionisan i publikovan. Kelsey upozorava: "pin, ne copy-paste, protiv tihog drifta" — čisti copy-paste bez pina je isti obrazac koji je već izazvao tihi drift na drugim mjestima (RS mali preduzetnik, HR kontni plan — vidi memoriju). Moja preporuka za mali tim (1 čovjek + AI agenti održava oba repoa): git subtree, pinovan na eksplicitan main SHA, dokumentovan ručni resync postupak. Zajednički paket je arhitektonski čišći dugoročno, ali dodaje publish pipeline + registry — novi CI surface koji troši isti org-wide slot i nije opravdan za 12 fajlova koji se rijetko mijenjaju (MSAL/auth integracija je stabilna, ne sedmični churn). Eksplicitan SHA pin čini drift vidljivim i revizibilnim umjesto nevidljivim.
5. Faze
F1 — novi repo + pipeline skeleton + fork slike + paralelni test pod (main repo se NE dira)
- Kreirati novi AzDO repo (
bilko-web-support) u Bilko projektu (per odluka #1). - Skeleton
azure-pipelines.yml: stageBuild_Scan— vlastiti Dockerfile, build+pushbilko-web-support:$(SHORT_SHA)u isti ACR. - Registrovati/ponovo iskoristiti
SC_AZUREservice connection, ACR push pristup, variable group (slimanabilko-kv-demopodskupina). - Vlastiti Trivy image scan (HIGH,CRITICAL) — danas se "vozi" na main-ovom skenu iste slike, ta pokrivenost nestaje čim se slika forkuje ako se ne duplira.
- Stage
Deploy_Support_Demo: deploy na NOVI test ACA pod (bilko-web-support-demo-v2) — postojećibilko-web-support-demoostaje netaknut. - Stage
Verify: 3 PI2-ekvivalentne provjere protiv v2-ovog direktnog ACA FQDN-a (ne custom domain). - Potvrda: main repo
azure-pipelines.ymldiff = 0 linija. Trajanje: 6-10h agentskog rada (pipeline skeleton, AzDO wiring, paralelni pod, verify). Izlazni kriterij: v2 pod ispravno odgovara na 3 provjere na direktnom FQDN-u, scan prolazi, main pipeline netaknut.
F2 (tek poslije CEO odobrenja) — src ekstrakcija + testovi + cutover
- Ekstrakcija 8 support-only fajlova (
app/(admin)/admin/*). - Ekstrakcija/subtree-pin dijeljenog auth sloja (12 fajlova) na izabran main SHA (odluka #2).
- Ekstrakcija core mehanizma:
app-surface.ts,middleware.ts. - Migracija
lib/api.tsadmin metoda (6 endpointa: listOrgs, getOrg, patchOrg, listOrgUsers, impersonate, endImpersonation). - Migracija/adaptacija
app-surface-900075.test.ts(30 testova) u CI novog repoa; odlučiti da li ostaje i u main repou (boundary logika za/ostaje relevantna glavnoj aplikaciji do F3). - Ožičenje env varijabli (7
NEXT_PUBLIC_*+BILKO_APP_SURFACE=supportkao ACA runtime env, ne build ARG). - Cutover: repoint custom-domain binding
support.bilko.cloud→ v2 target (isti managed-cert obrazac kao MC #105793) — DNS se ne dira, samo ingress binding target. - Soak prozor na starom podu (ostaje živ, ne briše se) — rollback = repoint binding nazad, bez rebuilda.
Trajanje: 14-20h agentskog rada (najveći komad: paritet testova + potvrda da
platformAdminJWT i dalje radi kroz novi build). Izlazni kriterij: support.bilko.cloud servira novi pod, 3 PI2 provjere + 30 testova zeleni na novom repou, soak prozor (preporuka 48-72h) prošao bez incidenta, stari pod i dalje živ.
F3 (tek poslije F2 soak-a) — čišćenje main repoa
- Ukloniti support deploy/verify blokove iz
azure-pipelines.yml(2309-2320, 2376-2408). - Ugasiti stari
bilko-web-support-demopod. - Ukloniti support-only kod iz
apps/web(app/(admin)/*,BILKO_APP_SURFACEgating) nakon potvrde da main više ne referencira. - Odlučiti sudbinu
app-surface-900075.test.tsu main CI (zadržati ako main i dalje ima admin-adjacent putanje koje test pokriva). - Ažurirati BookStack runbook stranice koje referenciraju support deploy u main pipeline-u.
Trajanje: 3-5h.
Izlazni kriterij: main
azure-pipelines.ymlima nula support-specifičnih koraka, CI runtime main-a nepromijenjen.
6. Rizici i rollback
- Entra redirectUri:
NEXT_PUBLIC_ENTRA_REDIRECT_URInije postavljen ni danas — obje površine koriste bare-origin fallback; support.bilko.cloud mora ostati u allowlisti, guard mora dozvoliti auth povratne putanje (memorija: surface guard mora dozvoliti auth redirect). Provjeriti na v2 test podu PRIJE cutovera. - Image drift vs main API kontrakt: nakon forka slike, support repo mora pinovati API kontrakt (docs/backend/API-REFERENCE.md ili OpenAPI artefakt) na main-API SHA — ne ručno kopirati, inače tihi drift.
- 1 CI slot je org-wide bez obzira na odluku #1; novi pipeline NE smije otimati slot main-u — isti trigger obrazac kao main (branch-scoped, ne svaki commit/PR).
- Trivy scan pokrivenost nestaje čim se slika forkuje ako F1 korak 4 nije tvrd izlazni kriterij, ne "nice to have".
- Rollback mreža postoji SAMO dok stari pod živi — ako se F3 (brisanje starog poda + čišćenje main pipeline-a) izvede prije nego soak prozor iz F2 prođe, nema mreže za povratak.
7. Šta se ne dira
azure-pipelines.ymlu main repou (nula izmjena do F2 koraka 7 / F3).- Service connections, ACR, variable group
bilko-kv-demo, DNS zapis za support.bilko.cloud (mijenja se samo ingress binding target u F2 koraku 7, ne sam DNS zapis). - Izvorni kod u
apps/webmonorepou ostaje nepromijenjen do F2/F3 ekstrakcije.
8. Procjena
| Faza | Sati agentskog rada | Šta CEO mora obezbijediti |
|---|---|---|
| F1 | 6-10h | Odluka #1 i #2 prije starta; ako odluka #1 = novi projekat, treba org-admin za kreiranje projekta (agent nema tu permisiju) |
| F2 | 14-20h | Odobrenje plana (ovaj dokument) prije starta; ako odluka #1 = novi projekat, ponovni grant SP/service connection permisija |
| F3 | 3-5h | Odobrenje da je soak prozor (48-72h) prošao |
| Ukupno: ~23-35h agentskog rada kroz sve tri faze, plus jedan ili dva administrativna CEO koraka (odluke #1/#2, eventualno AzDO project-create permisija ako se bira novi projekat). |
AFTER — F1 isporučen 2026-08-24 (MC #900162)
Repo Bilko-Support kreiran ručno (CEO, 24.08.) nakon PAT 401 blokade od 23.08. F1 koraci 2-7 isporučeni i nezavisno verifikovani:
- Pipeline skeleton na origin/main (commit a4e0662): trigger samo main, pr none, bez schedules, Build_Scan gated-off do F2, Trivy uvijek on, Deploy_Support_Demo + Verify protiv v2.
- Fork slike:
az acr import→bilko-web-support:demo-1d58cbb6, digest bajt-identičan izvoru (sha256:f1002bd2...0178f). - Trivy (FORGE): 0 HIGH/CRITICAL, exit 0.
- Novi test pod
bilko-web-support-demo-v2Running, samo direktni ACA FQDN; verify 3/3 (/admin→307, /dashboard→404, /invoices→404). - Main repo i stari pod netaknuti (git status baseline + lastModifiedAt identičan; customDomains nepromijenjen).
- Peer-verify (writer≠verifier): verifier-900162, Verdict PASS/VERIFIED — /Users/makinja/system/evidence/900162/peer-verify-transcript-20260824.md
- Builder evidence: /Users/makinja/system/evidence/900162/resume-report-20260824.md
Otvoreno za F2: registracija AzDO pipeline definition objekta (yml dormantan do tada); repo-id diskrepanca (c50cad02 vs c170e706) zapisana.
No comments to display
No comments to display