
Ămnet om ett mono-förvar har diskuterats mer Ă€n en gĂ„ng och orsakar som regel mycket aktiva kontroverser. Genom att skapa som ett verktyg med öppen kĂ€llkod designat för att förbĂ€ttra processen att bygga applikationskod frĂ„n Git till Docker-bilder (och sedan leverera dem till Kubernetes), tĂ€nker vi inte sĂ„ mycket pĂ„ vilket val som Ă€r bĂ€st. För oss Ă€r det primĂ€rt att tillhandahĂ„lla allt som behövs för anhĂ€ngare av olika Ă„sikter (om detta inte strider mot sunt förnuft förstĂ„s).
werfs senaste mono-repo-stöd Àr ett bra exempel pÄ detta. Men först, lÄt oss ta reda pÄ hur detta stöd i allmÀnhet Àr relaterat till att anvÀnda werf och vad Docker Registry har att göra med det ...
frÄgor
LÄt oss förestÀlla oss en sÄdan situation. Företaget har mÄnga utvecklingsteam som arbetar med sjÀlvstÀndiga projekt. De flesta applikationer körs pÄ Kubernetes och Àr dÀrför containeriserade. För att lagra behÄllare, bilder behöver du ett register (register). Som ett sÄdant register anvÀnder företaget Docker Hub med ett enda konto COMPANY. I likhet med de flesta kÀllkodslagringssystem, Docker Hub tillÄter inte kapslad lagringshierarki, Till exempel COMPANY/PROJECT/IMAGE. I sÄ fall... hur kan du lagra icke-monolitiska applikationer i registret med denna begrÀnsning utan att skapa ett separat konto för varje projekt?

Kanske Àr den beskrivna situationen bekant för nÄgon, men lÄt oss övervÀga frÄgan om att organisera applikationslagring i allmÀnhet, d.v.s. utan hÀnvisning till ovanstÄende exempel och Docker Hub.
Lösningar
Om ansökan monolitisk, kommer i en bild, dÄ finns det inga frÄgor och vi sparar helt enkelt bilderna i projektets containerregister.
NÀr en applikation presenteras som flera komponenter, mikrotjÀnster, dÄ krÀvs ett visst tillvÀgagÄngssÀtt. Om exemplet med en typisk webbapplikation som bestÄr av tvÄ bilder: frontend О backend - de möjliga alternativen Àr:
- Lagra bilder i separata kapslade arkiv:

- Lagra allt i ett arkiv och övervÀg bildnamnet i taggen, till exempel enligt följande:

NB: Det finns faktiskt ett annat alternativ med att spara i olika arkiv, PROJECT-frontend О PROJECT-backend, men vi kommer inte att övervÀga det pÄ grund av komplexiteten i support, organisation och distribution av rÀttigheter mellan anvÀndare.
werf stöd
Inledningsvis begrÀnsade werf sig till kapslade arkiv - lyckligtvis stöder de flesta register denna funktion. FrÄn version , lagt till arbete med register dÀr kapsling stöds inte, och Docker Hub Àr en av dem. FrÄn den tidpunkten har anvÀndaren ett val av hur applikationsbilderna ska lagras.
Implementering tillgÀnglig under option --images-repo-mode=multirepo|monorepo (standard multirepo, dvs. lagring i kapslade arkiv). Det definierar mönster som bilder lagras i registret. Det rÀcker att vÀlja önskat lÀge nÀr du anvÀnder de grundlÀggande kommandona, och allt annat kommer att förbli oförÀndrat.
Eftersom de flesta werf-alternativ kan stÀllas in Miljövariabler, i CI/CD-system Àr lagringslÀget vanligtvis lÀtt att stÀlla in globalt för hela projektet. Till exempel, i fallet med GitLab lÀgg bara till en miljövariabel i projektinstÀllningarna: InstÀllningar -> CI / CD -> Variabler: WERF_IMAGES_REPO_MODE: multirepo|monorepo.
Om vi ââpratar om att publicera bilder och rulla ut applikationer (du kan lĂ€sa om dessa processer i detalj i relevanta dokumentationsartiklar: Đž ), dĂ„ bestĂ€mmer lĂ€get enbart mallen som du kan arbeta med bilden med.
DjÀvulen Àr i detaljerna
Skillnaden och den största svÄrigheten nÀr du lÀgger till en ny lagringsmetod Àr att rengöra registret (för rensningsfunktioner som stöds av werf, se ).
Vid rengöring tar werf hÀnsyn till bilderna som anvÀnds i Kubernetes-kluster, sÄvÀl som policyer som konfigurerats av anvÀndaren. Policyer baseras pÄ indelningen av taggar i strategier. Strategier som stöds för nÀrvarande:
- 3 strategier lÀnkade av Git-primitiver som tagg, gren och commit;
- 1 strategi för godtyckliga anpassade taggar.
Vi sparar information om taggstrategin nÀr vi publicerar bilden i den slutliga bildens etiketter. SjÀlva innebörden Àr den sk metatagg - KrÀvs för att tillÀmpa vissa av policyerna. Till exempel, nÀr du tar bort en gren eller tagg frÄn ett Git-förrÄd Àr det logiskt att ta bort relaterade oanvÀnd bilder frÄn registret, som omfattas av en del av vÄra policyer.
NÀr det sparas i ett arkiv (monorepo), i bildtaggen, förutom metataggen, kan bildens namn ocksÄ lagras: PROJECT:frontend-META-TAG. För att separera dem introducerade vi inte nÄgon specifik separator, utan lade helt enkelt det nödvÀndiga vÀrdet till etiketten pÄ den slutliga bilden vid publicering.
NB: Om du Àr intresserad av att titta pÄ allt som beskrivs i werf-kÀllkoden, kan utgÄngspunkten vara .
I den hÀr artikeln kommer vi inte att Àgna mer uppmÀrksamhet Ät problemen och motiveringen av vÄrt tillvÀgagÄngssÀtt: om taggningsstrategier, lagring av data i etiketter och publiceringsprocessen som helhet - allt detta beskrivs i detalj i en fÀrsk rapport av Dmitry Stolyarov: "".
För att sammanfatta
Bristen pÄ stöd för ohnestade register var inte en blockerande faktor för oss eller de werf-anvÀndare som vi kÀnner till - trots allt kan du alltid skapa ett separat bildregister (eller byta till ett villkorat Container Registry i Google Cloud) ... Men, att ta bort en sÄdan begrÀnsning verkade logiskt för att verktyget skulle vara bekvÀmare för det bredare DevOps-communityt. Genom att implementera det stod vi inför den största svÄrigheten att omarbeta mekanismen för rensning av behÄllarregistret. Nu nÀr allt Àr klart Àr det skönt att inse att det har blivit lÀttare för nÄgon, och vi (som huvudutvecklarna av projektet) kommer inte att ha nÄgra mÀrkbara svÄrigheter att ytterligare stödja denna funktion.
Stanna hos oss sÄ kommer vi snart att berÀtta om andra innovationer inom !
PS
LÀs Àven pÄ vÄr blogg:
- «";
- «".
KĂ€lla: will.com


