werf 1.1 release: miglioramenti à u custruttore oghje è piani per u futuru

werf 1.1 release: miglioramenti à u custruttore oghje è piani per u futuru

werf hè a nostra utilità GitOps CLI open source per custruisce è furnisce applicazioni à Kubernetes. Cum'è prumessu, liberazione di a versione v1.0 hà marcatu u principiu di l'aghjunzione di novi funziunalità à u werf è a rivisione di approcci tradiziunali. Avà avemu piacè di presentà a versione v1.1, chì hè un grande passu in u sviluppu è una fundazione per u futuru cullezzione werf. A versione hè attualmente dispunibule in canale 1.1 ea.

A basa di a liberazione hè a nova architettura di almacenamiento di scena è ottimisazione di u travagliu di i dui cullettori (per Stapel è Dockerfile). A nova architettura di almacenamentu apre a pussibilità di implementà assemblei distribuiti da parechji ospiti è assemblei paralleli nantu à u stessu host.

L'ottimisazione di u travagliu include l'eliminazione di i calculi innecessarii in a tappa di u calculu di a firma di u palcuscenicu è u cambiamentu di i meccanismi per u calculu di i schedarii di cuntrollu in più efficaci. Questa ottimisazione riduce u tempu mediu di custruzzione di prughjettu cù werf. E custruzzioni idle, quandu tutte e tappe esistenu in a cache stages-magazzinu, sò avà veramente veloci. In a maiò parte di i casi, riavvia a custruzione durarà menu di 1 secondu! Questu hè ancu applicà à e prucedure per verificà e tappe in u prucessu di u travagliu di e squadre. werf deploy и werf run.

Ancu in questa versione, una strategia per taggà l'imaghjini per u cuntenutu apparsu - Tagging basatu in cuntenutu, chì hè avà attivatu per automaticamente è l'unicu cunsigliatu.

Fighjemu un sguardu più vicinu à l'innuvazioni chjave in werf v1.1, è à u stessu tempu vi dicu di i piani per u futuru.

Cosa hè cambiatu in werf v1.1?

Novu formatu di nome di scena è algoritmu per selezziunà e tappe da a cache

Nova regula di generazione di nomi di scena. Avà ogni scena di custruzzione genera un nome di scena unicu, chì hè custituitu di 2 parti: una firma (cum'è era in v1.0) più un identificatore temporale unicu.

Per esempiu, u nome di l'imaghjini di u palcuscenicu tutale puderia vede cusì:

werf-stages-storage/myproject:d2c5ad3d2c9fcd9e57b50edd9cb26c32d156165eb355318cebc3412b-1582656767835

... o in generale:

werf-stages-storage/PROJECT:SIGNATURE-TIMESTAMP_MILLISEC

Eccu:

  • SIGNATURE hè una signatura di scena, chì rapprisenta l'identificatore di u cuntenutu di u stadiu è dipende da a storia di l'edizioni in Git chì hà purtatu à stu cuntenutu;
  • TIMESTAMP_MILLISEC hè un identificatore di maghjina unicu garantitu chì hè generatu à u mumentu chì una nova maghjina hè custruitu.

L'algoritmu per selezziunà e tappe da u cache hè basatu annantu à verificà a relazione di Git commits:

  1. Werf calcula a firma di una certa tappa.
  2. В stages-magazzinu Ci ponu esse parechje tappe per una firma data. Werf sceglie tutte e tappe chì currispondenu à a firma.
  3. Se a tappa attuale hè ligata à Git (git-archive, tappa persunalizata cù patch Git: install, beforeSetup, setup; o git-latest-patch), allora werf selezziunà solu quelli tappe chì sò assuciati cù un commit chì hè un antenatu di l'attuale commit (per quale a custruzione hè chjamata).
  4. Da i tappe adattati rimanenti, unu hè sceltu - u più anticu da a data di creazione.

Un stage per diverse rami Git pò avè a stessa firma. Ma werf impedirà chì a cache assuciata à e diverse rami sia aduprata trà sti rami, ancu s'è e signature currispondenu.

→ Documentazione.

Novu algoritmu per creà è salvà tappe in u almacenamiento di scena

Se, quandu selezziunate e tappe da u cache, werf ùn trova micca un stadiu adattatu, allora u prucessu di assemblea una nova tappa hè iniziatu.

Nota chì parechji prucessi (nantu à unu o più ospiti) ponu cumincià à custruisce a listessa tappa à circa u stessu tempu. Werf usa un algoritmu di bloccu ottimistu stages-magazzinu à u mumentu di salvà l'imaghjini appena raccolti in stages-magazzinu. Questu modu, quandu a nova custruzzione di u stadiu hè pronta, werf blocks stages-magazzinu è salva una maghjina appena cullata quì solu se una maghjina adatta ùn esiste più (per firma è altri parametri - vede u novu algoritmu per selezziunà tappe da u cache).

Una maghjina appena assemblata hè garantita per avè un identificatore unicu da TIMESTAMP_MILLISEC (vede u novu formatu di nome di scena). In casu in stages-magazzinu una maghjina adattata serà truvata, werf scartarà l'imaghjini appena cumpilati è aduprà l'imaghjini da a cache.

In altri palori: u primu prucessu per finisce a custruzzione di l'imaghjini (u più veloce) uttene u dirittu di almacenà in tappe-almacenamiento (è dopu hè questa sola imaghjina chì serà utilizata per tutte e custruzzioni). Un prucessu di custruzione lentu ùn impedirà mai un prucessu più veloce da salvà i risultati di custruzzione di a fase attuale è passà à a custruzzione successiva.

→ Documentazione.

Prestazione migliorata di u Dockerfile builder

À u mumentu, u pipeline di tappe per una maghjina custruitu da un Dockerfile hè custituitu da una tappa - dockerfile. Quandu u calculu di a firma, u checksum di i schedari hè calculatu context, chì serà utilizatu durante l'assemblea. Prima di sta migliione, werf hà passatu ricursivamente per tutti i schedari è hà ottenutu un checksum summing u cuntestu è u modu di ogni schedariu. Partendu da a v1.1, werf pò aduprà checksums calculati almacenati in un repository Git.

L'algoritmu hè basatu nantu git ls-tree. L'algoritmu piglia in contu i registri in .dockerignore è traversa l'arburu di l'archiviu recursivamente solu quandu hè necessariu. Cusì, avemu decoupled da a lettura di u sistema di fugliale, è a dependenza di l'algoritmu nantu à a dimensione. context ùn hè micca significativu.

L'algoritmu verifica ancu i schedari micca tracciati è, se ne necessariu, li piglia in contu in u checksum.

Prestazione mejorata quandu importate i schedari

E versioni di werf v1.1 utilizanu un servitore rsync quandu importazione di fugliali da artefatti è imagine. In precedenza, l'importazione hè stata fatta in dui passi cù un muntatu di repertoriu da u sistema host.

A prestazione di l'importazione in macOS ùn hè più limitata da i volumi di Docker, è l'impurtazioni cumplete in u listessu tempu chì Linux è Windows.

Tagging basatu in cuntenutu

Werf v1.1 supporta l'etichettatura chjamata per u cuntenutu di l'imaghjini - Tagging basatu in cuntenutu. I tags di l'imaghjini Docker resultanti dipendenu da u cuntenutu di quelli imagine.

Quandu eseguisce u cumandamentu werf publish --tags-by-stages-signature o werf ci-env --tagging-strategy=stages-signature imaghjini publicati di u cusì chjamatu firma di scena imagine. Ogni maghjina hè marcata cù a so propria firma di e tappe di sta maghjina, chì hè calculata secondu e listessi regule cum'è a firma regulare di ogni tappa separatamente, ma hè un identificatore generale di l'imaghjini.

A firma di e tappe di l'imaghjini dipende da:

  1. u cuntenutu di sta imagine;
  2. storie di i cambiamenti Git chì anu purtatu à stu cuntenutu.

Un repository Git hà sempre cumminciamenti dummy chì ùn cambianu micca u cuntenutu di i schedarii di l'imaghjini. Per esempiu, cumminciate cù solu cumenti o cumminci commits, o cummette chì cambianu quelli fugliali in Git chì ùn saranu micca impurtati in l'imaghjini.

Quandu s'utilice l'etichettatura basatu in cuntenutu, i prublemi di riavvii innecessarii di l'applicazioni in Kubernetes per via di cambiamenti in u nome di l'imaghjini sò risolti, ancu s'è u cuntenutu di l'imaghjini ùn anu micca cambiatu. Per via, questu hè unu di i mutivi chì impediscenu l'almacenamiento di parechji microservizi di una applicazione in un unicu repository Git.

Inoltre, l'etichettatura basata nantu à u cuntenutu hè un metudu di tagging più affidabile chì l'etichettatura nantu à e rami Git, perchè u cuntenutu di l'imaghjini resultanti ùn dipende micca di l'ordine in quale i pipelines sò eseguiti in u sistema CI per assemblee multiple commits di u stessu ramu.

impurtanti: à partesi da avà tappe-firma Is l'unica strategia di tagging consigliata. Serà utilizatu per automaticamente in u cumandimu werf ci-env (à menu chì ùn specificate esplicitamente un schema di tagging differente).

→ Documentazione. Una publicazione separata serà ancu dedicata à sta funzione. AGGIORNATA (3 d'aprile): Articulu cù dettagli publicatu.

Livelli di logging

L'utilizatore hà avà l'uppurtunità di cuntrullà a pruduzzioni, stabilisce u livellu di logging è travaglià cù l'infurmazioni di debugging. Opzioni aghjuntu --log-quiet, --log-verbose, --log-debug.

Per automaticamente, l'output cuntene l'infurmazione minima:

werf 1.1 release: miglioramenti à u custruttore oghje è piani per u futuru

Quandu si usa l'output verbose (--log-verbose) pudete vede cumu funziona werf:

werf 1.1 release: miglioramenti à u custruttore oghje è piani per u futuru

Output detallatu (--log-debug), in più di l'infurmazioni di debugging werf, cuntene ancu logs di biblioteche usate. Per esempiu, pudete vede cumu si trova l'interazzione cù u Docker Registru, è ancu registrà i lochi induve una quantità significativa di tempu hè passatu:

werf 1.1 release: miglioramenti à u custruttore oghje è piani per u futuru

Piani futuri

Attenzione! L'opzioni descritte quì sottu sò marcate v1.1 diventeranu dispunibule in questa versione, assai di elli in un futuru vicinu. L'aghjurnamenti venenu via l'aghjurnamenti automatici quandu si usa multiwerf. Queste caratteristiche ùn affettanu micca a parte stabile di e funzioni v1.1; u so aspettu ùn hà micca bisognu di intervenzione manuale di l'utilizatori in cunfigurazioni esistenti.

Supportu cumpletu per diverse implementazioni di u Registru Docker (NOVA)

  • Versione: v1.1
  • Date: marzu
  • alba

L'obiettivu hè chì l'utilizatore utilizeghja una implementazione persunalizata senza restrizioni quandu usa werf.

Attualmente, avemu identificatu u seguitu inseme di suluzioni per i quali andemu à guarantisci un sustegnu tutale:

  • Default (biblioteca/registru)*,
  • AWS ECR
  • Azure*,
  • Docker Hub
  • GCR*,
  • Pacchetti GitHub
  • Registru GitLab *,
  • portu*,
  • Quay.

E soluzioni chì sò attualmente supportate da werf sò marcate cù un asteriscu. Per altri ci hè sustegnu, ma cù limitazioni.

Dui prublemi principali ponu esse identificati:

  • Alcune soluzioni ùn supportanu micca a rimozione di tag cù l'API Docker Registry, impediscendu à l'utilizatori di utilizà a pulizia automatica di werf. Questu hè veru per i pacchetti AWS ECR, Docker Hub è GitHub.
  • Certi suluzioni ùn supportanu micca i cosiddetti repositori nidificati (Docker Hub, GitHub Packages è Quay) o facenu, ma l'utilizatore deve creà manualmente utilizendu l'UI o l'API (AWS ECR).

Avemu da risolve questi è altri prublemi cù l'API nativu di e suluzione. Stu compitu include ancu copre u ciclu sanu di u funziunamentu di werf cù teste per ognunu di elli.

Custruzzione di l'imagine distribuita (↑)

  • Versione: v1.2 v1.1 (a priorità per implementà sta funzione hè stata aumentata)
  • Date : marzu-aprile marzu
  • alba

À u mumentu, werf v1.0 è v1.1 ponu esse aduprati solu in un host dedicatu per l'operazioni di custruisce è publicà l'imaghjini è implementà l'applicazione à Kubernetes.

Per apre e pussibilità di u travagliu distribuitu di werf, quandu a custruzzione è l'implementazione di l'applicazioni in Kubernetes sò lanciate nantu à parechji òspiti arbitrarii è questi òspiti ùn salvanu micca u so statu trà e custruzzioni (runners tempuranee), werf hè necessariu di implementà a capacità di utilizà. u Docker Registry cum'è una tenda di scena.

Nanzu, quandu u prughjettu werf era sempre chjamatu dapp, hà avutu una tale opportunità. Tuttavia, avemu scontru una quantità di prublemi chì deve esse cunsideratu quandu implementate sta funziunalità in werf.

Vita. Questa funzione ùn hà micca bisognu di u cullettore per travaglià in i pod Kubernetes, perchè Per fà questu, avete bisognu di caccià a dependenza di u servitore Docker locale (in u pod Kubernetes ùn ci hè micca accessu à u servitore Docker lucale, perchè u prucessu stessu hè in esecuzione in un containeru, è werf ùn hè micca è ùn sustene micca. travaglià cù u servitore Docker nantu à a reta). U supportu per l'esecuzione di Kubernetes serà implementatu separatamente.

Supportu ufficiale per GitHub Actions (NOVA)

  • Versione: v1.1
  • Date: marzu
  • alba

Include documentazione werf (sezioni rifirimentu и avvià), è ancu l'Azione GitHub ufficiale per travaglià cù werf.

Inoltre, permetterà à werf di travaglià nantu à i corridori effimeri.

A meccanica di l'interazzione di l'utilizatori cù u sistema CI serà basatu annantu à l'etichette nantu à e richieste di pull per inizià certe azzioni per custruisce / roll out l'applicazione.

Sviluppu lucale è implementazione di applicazioni cù werf (↓)

  • Versione: v1.1
  • Date : ghjennaghju-ferraghju aprile
  • alba

U scopu principale hè di ottene una sola cunfigurazione unificata per implementà l'applicazioni in u locu è in a produzzione, senza azzioni cumplessi, fora di a scatula.

werf hè ancu necessariu d'avè un modu operativu in quale serà cunvenutu per edità u codice di l'applicazione è riceve immediatamente feedback da l'applicazione in esecuzione per debugging.

Novu algoritmu di pulizia (NOVA)

  • Versione: v1.1
  • Date: April
  • alba

In a versione attuale di werf v1.1 in a prucedura cleanup Ùn ci hè nisuna pruvisione per a pulizia di l'imaghjini per u schema di tagging basatu in cuntenutu - queste imagine s'accumuleranu.

Inoltre, a versione attuale di werf (v1.0 è v1.1) usa diverse pulitiche di pulizia per l'imaghjini publicati sottu schemi di tagging: Git branch, Git tag o Git commit.

Un novu algoritmu per a pulizia di l'imaghjini basatu annantu à a storia di cummissioni in Git, unificatu per tutti i schemi di tagging, hè statu inventatu:

  • Mantene micca più di l'imaghjini N1 assuciati cù l'impegni più recenti N2 per ogni git HEAD (rami è tag).
  • Guardà micca più di l'imaghjini di scena N1 assuciati cù l'impegni più recenti N2 per ogni git HEAD (rami è tag).
  • Almacenà tutte l'imaghjini chì sò aduprate in qualsiasi risorse di cluster Kubernetes (tutti i cuntesti kube di u schedariu di cunfigurazione è i spazii di nomi sò scannati; pudete limità stu cumpurtamentu cù opzioni speciale).
  • Almacene tutte l'imaghjini chì sò aduprate in i manifesti di cunfigurazione di risorse salvate in e versioni Helm.
  • Una maghjina pò esse sguassata s'ellu ùn hè micca assuciatu cù alcun HEAD da git (per esempiu, perchè u HEAD currispundente stessu hè statu sguassatu) è ùn hè micca utilizatu in alcunu manifesti in u cluster Kubernetes è in Helm releases.

Custruzzione di l'imaghjini in parallelu (↓)

  • Versione: v1.1
  • Date: ghjennaghju-ferraghju aprile*

A versione attuale di werf raccoglie l'imaghjini è l'artefatti descritti in werf.yaml, in sequenza. Hè necessariu di parallelizà u prucessu di assemblea tappe indipindenti di l'imaghjini è l'artefatti, è ancu di furnisce una pruduzzioni còmuda è informativa.

* Nota: a scadenza hè stata cambiata per via di una priorità aumentata per l'implementazione di l'assemblea distribuita, chì aghjunghje più capacità di scala horizontale, è ancu l'usu di werf cù GitHub Actions. L'assemblea parallela hè u prossimu passu di ottimisazione, chì furnisce scalabilità verticale quandu assemble un prughjettu.

Transizione à Helm 3 (↓)

  • Versione: v1.2
  • Date : ferraghju-marzu di maghju*

Include migrazione à una nova basa di codice Helmu 3 è una manera pruvata è còmuda di migrà installazioni esistenti.

* Nota: u passaghju à Helm 3 ùn aghjunghje micca caratteristiche significative à werf, perchè tutte e funzioni chjave di Helm 3 (3-way-merge è senza tiller) sò digià implementate in werf. Inoltre, werf hà funziunalità supplementarii in più di quelli indicati. Tuttavia, sta transizione resta in i nostri piani è serà implementata.

Jsonnet per a descrizzione di a cunfigurazione di Kubernetes (↓)

  • Versione: v1.2
  • Date : ghjennaghju-ferraghju aprile-maghju

Werf supporterà e descrizioni di cunfigurazione per Kubernetes in formatu Jsonnet. À u listessu tempu, werf ferma cumpatibile cù Helm è ci sarà una scelta di furmatu di descrizzione.

U mutivu hè chì i mudelli Go, sicondu parechje persone, anu una alta barriera d'ingressu, è a capiscibilità di u codice di sti mudelli soffre ancu.

A pussibilità di intruduce altri sistemi di descrizzione di cunfigurazione Kubernetes (per esempiu, Kustomize) hè ancu cunsideratu.

U travagliu in Kubernetes (↓)

  • Versione: v1.2
  • Dati : aprile-maghju maghju-ghjugnu

Scopu: Assicuratevi chì l'imaghjini sò custruiti è l'applicazione hè furnita cù runners in Kubernetes. Quelli. Nuvelle imagine ponu esse custruite, publicate, pulite è implementate direttamente da i pod Kubernetes.

Per implementà sta capacità, prima deve esse capace di custruisce imàgini distribuite (vede u puntu sopra).

Hè ancu bisognu di supportu per u modu operativu di u custruttore senza un servitore Docker (vale à dì, cum'è Kaniko-cum'è custruisce o custruisce in u spaziu d'utilizatore).

Werf sustenerà a custruzione nantu à Kubernetes micca solu cù Dockerfile, ma ancu cù u so Stapel builder cù ricustruzioni incrementali è Ansible.

Un passu versu u sviluppu apertu

Amu a nostra cumunità (GitHub, n'ambasciata) è vulemu più è più persone per aiutà à fà u werf megliu, capiscenu a direzzione chì andemu, è participà à u sviluppu.

Piuttostu pocu hè statu decisu di cambià à Prughjetti di prughjettu di GitHub per revelà u prucessu di travagliu di a nostra squadra. Avà pudete vede i piani immediati, è ancu u travagliu attuale in i seguenti spazii:

Moltu travagliu hè statu fattu cù prublemi:

  • Eliminati quelli irrilevanti.
  • Quelli esistenti sò purtati à un furmatu unicu, cù un numeru abbastanza di ditagli è dettagli.
  • Novi prublemi cù idee è suggerimenti sò stati aghjuntu.

Cumu attivà a versione v1.1

A versione hè attualmente dispunibule in canale 1.1 ea (in i canali Stadda и solidu di roccia i rilasci appariranu cum'è stabilizazione accade, però ea stessu hè digià abbastanza stabile per l'usu, perchè passava per i canali alfa и raghji). Attivatu via multiwerf in u modu seguenti:

source $(multiwerf use 1.1 ea)
werf COMMAND ...

cunchiusioni

A nova architettura di almacenamentu di u stadiu è l'ottimisazioni di custruttore per i custruttori Stapel è Dockerfile apre a pussibilità di implementà custruzzioni distribuite è parallele in werf. Queste caratteristiche appariranu prestu in a listessa versione v1.1 è diventeranu automaticamente dispunibuli attraversu u mecanismu d'aghjurnamentu automaticu (per l'utilizatori multiwerf).

In questa versione, una strategia di tagging basata nantu à u cuntenutu di l'imagine hè stata aghjunta - Tagging basatu in cuntenutu, chì hè diventata a strategia predeterminata. U logu di cumandamentu principale hè statu ancu riformulatu: werf build, werf publish, werf deploy, werf dismiss, werf cleanup.

U prossimu passu significativu hè di aghjunghje assemblei distribuiti. E custruzzioni distribuite sò diventate una priorità più altu ch'è e custruzzioni parallele da a v1.0 perchè aghjunghjenu più valore à werf: scala verticale di custruttori è supportu per i costruttori effimeri in diversi sistemi CI / CD, è ancu a capacità di fà un supportu ufficiale per l'Azzioni GitHub. . Dunque, i termini di implementazione per l'assemblee parallele sò stati spostati. Tuttavia, avemu travagliatu per implementà e duie pussibulità u più prestu pussibule.

Segui a nutizia ! È ùn vi scurdate di visità noi à GitHubper creà un prublema, truvate 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