Već imaš posao builda koji pravi wheel i privatni repozitorijum koji bi trebalo da ga primi. Greška je pustiti drugi posao da ponovo napravi build sa grane i nazvati rezultat istim izdanjem. Prenesi fajl koji je testiran, nazovi ga po digestu i sačuvaj kredencijal za otpremanje na unutrašnjoj strani. Vodič ispod prati jedan artefakt od javnog CI runnera do internog objavljivača.

Gradi tamo gde izvorni kod već živi

Pokreni build u poslu koji već ima izvorni kod, alatni lanac i skup testova. Ništa kod privatnog repozitorijuma ne zahteva da taj posao do njega dopre. Instaliraj build frontend u okruženje koje projekat već koristi, pa proizvedi oba formata distribucije ako projekat isporučuje oba.

python -m build --sdist --wheel --outdir dist
python -m twine check dist/*

Drži izlazni direktorijum malim i za jednokratnu upotrebu. Jedino što vredi preneti dalje jesu fajlovi koje će sledeći posao objaviti, plus njihovi heševi. Sve ostalo, uključujući virtuelna okruženja i keševe, može se ponovo napraviti iz zabeležene revizije izvora. Vitak artefakt je i lakše pregledati, jer je svaki fajl u njemu fajl koji neko može pregledati.

Zabeleži šta ih je proizvelo: ime paketa i verziju iz imena fajlova, reviziju izvora i pokretanje workflow-a koje ih je napravilo. Sam niz verzije ne identifikuje fajl, jer ista verzija može biti napravljena dvaput iz različitih commit-ova. Upiši reviziju pored imena fajlova u opisu artefakta i tretiraj taj zapis kao deo primopredaje.

Prenosi bajtove, ne uputstva za ponovni build

Drugi build je drugi proizvod. Vremenske oznake, uključene zavisnosti i verzije alata mogu promeniti bajtove, pa ponovni build traži sopstvene dokaze iz testova i sopstveni pregled. Umesto toga promoviši pregledane fajlove.

Otpremi fajlove distribucije u skladište artefakata koje pruža tvoja CI platforma i daj internom poslu referencu na taj konkretni artefakt, a ne ime grane.

sha256sum dist/*.whl dist/*.tar.gz
# keep the digests beside the run id in the artifact description

Ako tvoja platforma podržava potpisano poreklo, traži od nje da overi artefakt, a kasnije proveri očekivani repozitorijum, workflow i reviziju izvora. GitHub dokumentacija o atestacijama opisuje tvrdnje tog oblika. Važeći potpis je dokaz o poreklu, a ne skeniranje ranjivosti i ne odluka o autorizaciji.

Proveri unutra pre otpremanja

Interni posao počinje proverom da je fajl koji je primio upravo fajl koji je odobren. Uporedi digestove sa zapisom iz build posla, a ne sa vrednošću preračunatom iz onoga što je stiglo.

sha256sum -c digests.txt
python -m twine check dist/*

Zatim pročitaj metapodatke. Ime paketa, verzija i deklarisane zavisnosti treba da se poklope sa pregledom koji si odobrio. Wheel čije ime izgleda ispravno ali čija su prikvačivanja zavisnosti promenjena je drugi paket sa istom etiketom. Ako su se metapodaci pomerili, tretiraj artefakt kao neodobren i otkrij koji ga je build proizveo.

Ako se digestovi ne poklapaju, zaustavi se. Ne otpremaj i ne popravljaj fajl ponovnim buildom na licu mesta; to briše dokaz da se nešto promenilo na putu. Nesklad znači da su skladište artefakata, korak preuzimanja ili zapis pogrešni, i svako od toga zaslužuje objašnjenje pre nego što izdanje bude objavljeno.

Obradi odgovor o duplikatu verzije

Privatni repozitorijumi obično odbijaju da prepišu postojeću verziju, i to odbijanje je odlika. Kada otpremanje ne uspe jer verzija postoji, pregledaj zapis repozitorijuma za tu verziju i uporedi fajlove koje drži sa digestovima koje si nameravao da objaviš.

Postojeća verzija može da znači da je ranije otpremanje uspelo i da se odgovor izgubio, ili da je neko objavio drugačiji sadržaj pod istim brojem.

Ne briši verziju i ne izmišljaj novi broj da bi zaobišao grešku. Odluči sa vlasnikom izdanja da li je uskladišteni sadržaj prihvatljiv, pa zabeleži ishod. Ako se sadržaj razlikuje, imaš problem sa verzionisanjem, a ne problem sa pipeline-om.

Drži kredencijal za otpremanje na jednoj strani

Samo internom objavljivaču trebaju kredencijali repozitorijuma, i to samo dok traje otpremanje. Ograniči token na ciljni repozitorijum i na operacije otpremanja, drži ga u skladištu tajni internog sistema i ostavi ga potpuno izvan build posla. Ako build posao može da objavljuje, onda svako ko može da promeni build može i da objavljuje.

Ograniči i to koji interni workflow-i smeju da pokrenu objavljivača. Ručni okidač sa obaveznim odobrenjem je razuman podrazumevani izbor za izdanja; push na bilo koju granu nije.

Završeno izdanje treba da ostavi tri stvari: fajlove distribucije, njihove digestove sa revizijom izvora i zapis repozitorijuma koji pokazuje istu verziju.

Povezani članci