Tagging basatu in cuntenutu in u werf builder: perchè è cumu funziona?

Tagging basatu in cuntenutu in u werf builder: perchè è cumu funziona?

werf hè a nostra utilità GitOps CLI open source per custruisce è furnisce applicazioni à Kubernetes. IN liberazione v1.1 una nova funzione hè statu introduttu in u cullettore di l'imaghjini: tagging images per cuntenutu o Tagging basatu in cuntenutu. Finu à avà, u schema di tagging tipicu in werf implicava l'etichettatura di l'imaghjini di Docker da Git tag, Git branch o Git commit. Ma tutti sti schemi anu disadvantages chì sò cumpletamente risolti da a nova strategia di tagging. I dettagli nantu à questu è perchè hè cusì bonu sò sottu u cut.

Sviluppà un inseme di microservizi da un repository Git

Una situazione spessu accade quandu una applicazione hè divisa in parechji servizii più o menu indipendenti. E versioni di sti servizii ponu esse indipindenti: unu o più servizii ponu esse liberati à tempu, mentre chì u restu deve cuntinuà à travaglià senza cambiamenti. Ma da u puntu di vista di l'almacenamiento di codice è a gestione di u prughjettu, hè più convenientu di mantene tali servizii d'applicazione in un solu repository.

Ci sò situazioni chì i servizii sò veramente indipendenti è micca assuciati cù una sola applicazione. In questu casu, seranu situati in prughjetti separati è a so liberazione serà realizatu per mezu di prucessi CI / CD separati in ognuna di i prughjetti.

In ogni casu, in a realità, i sviluppatori spessu dividenu una sola applicazione in parechji microservizi, ma a creazione di un repository è un prughjettu separatu per ognunu ... hè un overkill chjaru. Hè sta situazione chì serà discutitu in più: parechji microservizii sò situati in un repositoriu di prughjettu unicu è e versioni si facenu per un solu prucessu in CI / CD.

Tagging by Git branch è Git tag

Diciamu chì a strategia di tagging più cumuna hè aduprata - tag-o-ramu. Per i rami di Git, l'imaghjini sò marcati cù u nome di u ramu, per un ramu à u tempu ci hè solu una maghjina publicata cù u nome di quella ramu. Per i tags Git, l'imaghjini sò marcati secondu u nome tag.

Quandu una nova tag Git hè creata, per esempiu, quandu una nova versione hè liberata, una nova tag Docker serà creata per tutte l'imaghjini di u prughjettu in u Registru Docker:

  • myregistry.org/myproject/frontend:v1.1.10
  • myregistry.org/myproject/myservice1:v1.1.10
  • myregistry.org/myproject/myservice2:v1.1.10
  • myregistry.org/myproject/myservice3:v1.1.10
  • myregistry.org/myproject/myservice4:v1.1.10
  • myregistry.org/myproject/myservice5:v1.1.10
  • myregistry.org/myproject/database:v1.1.10

Questi novi nomi d'imaghjini sò passati per mudelli Helm à a cunfigurazione Kubernetes. Quandu principia a implementazione cù u cumandamentu werf deploy campu hè esse aghjurnatu image in Kubernetes manifesti di risorsa è riavvia i risorse currispundenti per via di u nome di l'imaghjini cambiatu.

prublemu: in u casu quandu, in fattu, u cuntenutu di l'imaghjini ùn anu micca cambiatu da u rollout precedente (tag Git), ma solu u so tag Docker, questu succede extra riavvia sta applicazione è, per quessa, un pocu di downtime hè pussibule. Ancu s'ellu ùn ci era micca un veru mutivu per fà stu riavviu.

In u risultatu, cù u schema di tagging attuale, hè necessariu di recintà parechji repositori Git separati è u prublema hè di urganizà u rollout di questi parechji repositori. In generale, un tali schema risulta esse sovraccaricatu è cumplessu. Hè megliu cumminà parechji servizii in un solu repository è creà tag Docker in modu chì ùn ci hè micca riavvii innecessarii.

Tagging by Git commit

werf hà ancu una strategia di tagging assuciata cù Git commits.

Git-commit hè un identificatore per u cuntenutu di un repository Git è dipende da a storia di edizzioni di i fugliali in u repository Git, cusì pare logicu di usà per tagging images in u Docker Registry.

Tuttavia, l'etichettatura per Git commit hà i stessi svantaghji chì l'etichettatura per rami Git o tags Git:

  • Puderia esse creatu un commit vacanti chì ùn cambia micca i schedari, ma l'etichetta Docker di l'imaghjini serà cambiata.
  • Puderia esse creata una cummissione di fusione chì ùn cambia micca i schedari, ma l'etichetta Docker di l'imaghjini serà cambiata.
  • Puderia esse fattu un impegnu chì cambia quelli fugliali in Git chì ùn sò micca impurtati in l'imaghjini, è l'etichetta Docker di l'imaghjina serà cambiata di novu.

Tagging Git branch name ùn riflette micca a versione di l'imaghjini

Ci hè un altru prublema assuciatu cù a strategia di tagging per i rami Git.

L'etichettatura per u nome di u ramu funziona sempre chì i commits nantu à quella ramu sò cullati in sequenza in ordine cronologicu.

Se in u schema attuale, l'utilizatore principia à ricustruisce un vechju commit assuciatu cù un certu ramu, allora werf riscriverà l'imaghjini utilizendu l'etichetta Docker currispundente cù una versione di novu custruita di l'imaghjini per u vechju commit. E implementazioni chì utilizanu sta tag da avà corre u risicu di tirà una versione sfarente di l'imaghjini quandu si riavvia i pods, per via di quale a nostra applicazione perderà a cunnessione cù u sistema CI è diventerà desincronizatu.

Inoltre, cù spine successive in un ramu cù un cortu periudu di tempu trà elli, u vechju commit pò esse cumpilatu più tardi da u novu: a vechja versione di l'imaghjini soprascriverà a nova cù l'etiqueta Git branch. Tali prublemi ponu esse risolti da un sistema CI / CD (per esempiu, in GitLab CI u pipeline di l'ultimi hè lanciatu per una seria di cummissioni). Tuttavia, micca tutti i sistemi supportanu questu è ci deve esse un modu più affidabile per prevene un prublema cusì fundamentale.

Chì ghjè l'etichettatura basatu in cuntenutu?

Allora, ciò chì hè u tagging basatu in cuntenutu - tagging images by content.

Per creà tags Docker, ùn sò micca Git primitives (Git branch, Git tag...) chì sò utilizati, ma un checksum assuciatu cù:

  • cuntenutu di l'imagine. U tag ID di l'imaghjini riflette u so cuntenutu. Quandu custruisce una nova versione, questu identificatore ùn cambia micca se i schedarii in l'imaghjini ùn anu micca cambiatu;
  • a storia di a creazione di sta maghjina in Git. L'imaghjini assuciati cù e diverse rami di Git è a storia di custruzzione differente via werf averà diverse tag ID.

Un tali tag identificatore hè u cusì chjamatu signature stage image.

Ogni imagine hè custituita da una serie di tappe: from, before-install, git-archive, install, imports-after-install, before-setup... git-latest-patch ecc. Ogni tappa hà un identificatore chì riflette u so cuntenutu - firma di scena (firma di scena).

L'imaghjini finali, custituitu da sti tappe, hè marcatu cù a chjamata signatura di u settore di sti tappe - firma di tappe, - chì hè generale per tutte e tappe di l'imaghjini.

Per ogni imagine da a cunfigurazione werf.yaml in u casu generale, ci sarà a so propria firma è, per quessa, una tag Docker.

A signatura di scena risolve tutti questi prublemi:

  • Resistente à i commits Git vacanti.
  • Resistant to Git commits that change files that are not relevant to the image.
  • Ùn porta micca à u prublema di rivisione a versione attuale di l'imaghjini quandu si riavvia e custruzzioni per i vechji Git commits di una filiera.

Questa hè avà a strategia di tagging cunsigliata è hè a predeterminata in werf per tutti i sistemi CI.

Cumu attivà è aduprà in werf

U cumandimu hà avà una opzione currispundente werf publish: --tag-by-stages-signature=true|false

In un sistema CI, a strategia di tagging hè specificatu da u cumandimu werf ci-env. Nanzu, u paràmetru era definitu per questu werf ci-env --tagging-strategy=tag-or-branch. Avà, se specifichi werf ci-env --tagging-strategy=stages-signature o ùn specificate micca sta opzione, werf utilizerà a strategia di tagging per difettu stages-signature. squadra werf ci-env stabiliscerà automaticamente i bandieri necessarii per u cumandamentu werf build-and-publish (o werf publish), per quessa, nisuna opzione supplementaria deve esse specificata per questi cumandamenti.

Per esempiu, u cumandamentu:

werf publish --stages-storage :local --images-repo registry.hello.com/web/core/system --tag-by-stages-signature

...puderà creà e seguenti imagine:

  • registry.hello.com/web/core/system/backend:4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d
  • registry.hello.com/web/core/system/frontend:f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6

4ef339f84ca22247f01fb335bb19f46c4434014d8daa3d5d6f0e386d hè una firma di e tappe di l'imaghjini backende f44206457e0a4c8a54655543f749799d10a9fe945896dab1c16996c6 - firma di tappe di l'imaghjini frontend.

Quandu si usanu funzioni speciali werf_container_image и werf_container_env Ùn ci hè bisognu di cambià nunda in i mudelli Helm: sti funzioni generaranu automaticamente i nomi di l'imaghjini curretti.

Esempiu di cunfigurazione in un sistema CI:

type multiwerf && source <(multiwerf use 1.1 beta)
type werf && source <(werf ci-env gitlab)
werf build-and-publish|deploy

Più infurmazione nantu à a cunfigurazione hè dispunibule in a documentazione:

Tuttu

  • Opzione nova werf publish --tag-by-stages-signature=true|false.
  • Novu valore d'opzione werf ci-env --tagging-strategy=stages-signature|tag-or-branch (se ùn hè micca specificatu, u predefinitu serà stages-signature).
  • Se avete prima utilizatu l'opzioni di tagging per i commits Git (WERF_TAG_GIT_COMMIT o opzione werf publish --tag-git-commit COMMIT), allora assicuratevi di passà à a strategia di tagging tappe-firma.
  • Hè megliu cambià immediatamente novi prughjetti à u novu schema di tagging.
  • Quandu si trasferisce à werf 1.1, hè cunsigliatu di cambià i vechji prughjetti à u novu schema di tagging, ma u vechju. tag-o-ramu hè sempre supportatu.

Tagging basatu in cuntenutu risolve tutti i prublemi trattati in l'articulu:

  • Resistenza di u nome di tag Docker à l'impegni Git vacanti.
  • A resilienza di u nome di tag Docker à Git commits chì cambianu i fugliali irrilevanti per l'imaghjini.
  • Ùn porta micca à u prublema di rivisione a versione attuale di l'imaghjini quandu si riavvia e custruzzioni per i vechji commits Git per i rami Git.

Aduprate! È ùn vi scurdate di visità noi à GitHubper creà un prublema o truvà un esistenti, aghjunghje un plus, creanu un PR o simpricimenti fighjate u sviluppu di u prugettu.

PS

Leghjite puru nant'à u nostru blog:

Source: www.habr.com

Add a comment