Vse novice

Tovarna

Predpomnilnik slojev za gradnjo slik in kanarček, ki je ujel njegovo prvo izdajo

· Toolkit · 2 min branja

Števili 91 in 33: sekunde za gradnjo Probove slike API na veji main, najprej brez predpomnilnika, nato ob ponovnem zagonu s sloji iz predpomnilnika v registru.

Skupni izvajalniki (runnerji) v GitLabu vsako opravilo začnejo s praznim Dockerjem. Gradnja slike z gradnikom za CI/CD je zato ob vsakem zagonu znova obnovila pakete NuGet in od začetka prevedla API, tudi kadar se ni spremenila nobena datoteka zaledja.

Predpomnilnik je v registru

Gradnik za CI/CD 1.4.0, ki smo ga izdali 20. oktobra 2026, komponenti image-build doda vhodni parameter cache z dvema vrednostma: privzeto none in registry. Z vrednostjo registry gradnja teče z orodjem buildx na gonilniku docker-container in sloje bere iz <image>:buildcache v registru vsebniških slik projekta. Nazaj jih zapiše samo privzeta veja. Gradnja v zahtevi za združitev predpomnilnik prebere, v register pa ne potisne ničesar, zato ne more zamenjati slojev, na katere se zanaša main. Produkt, ki parametra ne nastavi, ne opazi nobene spremembe.

Predpomnilnik od datoteke Dockerfile zahteva eno stvar: obnovljeni paketi morajo ostati v sloju slike. Imenik, priklopljen z RUN --mount=type=cache, se v register nikoli ne izvozi, zato bi naslednji korak ostal brez paketov, kadar bi sloj z obnovo prišel iz predpomnilnika. Probe, produkt, ki ga vzdržujemo zato, da vsako izdajo gradnika prevzame prvi, je iz tega razloga opustil priklope predpomnilnika za NuGet.

Ujeta na pravem izvajalniku

Različica 1.4.0 je prestala teste na delovni postaji, Probova prva gradnja pa se je pet minut po izdaji končala z napako. Opravila gradnika se z Dockerjem povezujejo prek TLS, docker buildx create pa nastavitev TLS iz okolja ne sprejme. Noben drug produkt je še ni pripel. Različica 1.4.1, izdana 14 minut po različici 1.4.0, graditelja ustvari v kontekstu Dockerja, narejenem iz istih nastavitev.

Do takrat je cevovod gradnika komponento image-build le vključil in preveril, da jo GitLab sprejme, njenega skripta pa ni nikoli zagnal. Novo opravilo delivery:image-build-test ta skript zažene na Dockerju s TLS, kakršnega imajo opravila produktov, in z registrom, zagnanim v istem Dockerju. Preveri, ali privzeta veja predpomnilnik zapiše, ali ga nov graditelj prebere, ali ga druga veja prebere in v register ne potisne ničesar ter ali gradnja brez predpomnilnika še deluje. S predlogo različice 1.4.0 se 7 od 10 preverjanj konča z napako.

Prva gradnja slike API na Probovi veji main je trajala 91 sekund in zapisala predpomnilnik. Ponovni zagon iste potrditve, najugodnejši primer, je trajal 33 sekund, koraka dotnet restore in dotnet publish pa sta prišla iz predpomnilnika v registru. V Probovi datoteki Dockerfile je sloj z obnovo odvisen samo od datotek projektov in nastavitev gradnje, zato bi ga potrditev, ki spremeni samo kodo, morala uporabiti znova.

Kdor želi predpomnilnik uporabiti, pripne različico 1.4.1, nastavi cache: registry na slikah s počasno obnovo, oznako slike buildcache izvzame iz pravila za čiščenje registra in iz datoteke Dockerfile najprej odstrani priklope predpomnilnika za pakete.