
â unser Open-Source GitOps CLI-Tool zum Erstellen und Bereitstellen von Anwendungen in Kubernetes. Wie versprochen, den Beginn der EinfĂŒhrung neuer Funktionen in werf und einer Ăberarbeitung gewohnter AnsĂ€tze. Jetzt freuen wir uns, die Version v1.1 vorzustellen, die einen bedeutenden Schritt in der Entwicklung darstellt und die Grundlage fĂŒr die Zukunft bildet. Compiler werf. Die Version ist derzeit im .
verfĂŒgbar. Die Grundlage dieser Veröffentlichung ist eine neue Architektur fĂŒr die Stages-Speicherung und eine Optimierung der Funktionsweise beider Compiler (fĂŒr Stapel und Dockerfile). Die neue Architektur der Speicherung eröffnet Möglichkeiten fĂŒr verteilte Builds von mehreren Hosts und parallele Builds auf einem Host.
Die Optimierung umfasst die Eliminierung unnötiger Berechnungen wĂ€hrend der Berechnung der Stages-Signaturen und die Umstellung auf effizientere Mechanismen zur Berechnung von PrĂŒfziffern fĂŒr Dateien. Diese Optimierung verringert die durchschnittliche Build-Zeit von Projekten mit werf. Und Leerlauf-Bauten, bei denen alle Stufen im Cache vorhanden sind, stages-storage, jetzt wirklich schnell. In den meisten FĂ€llen wird der Wiederaufbau schneller als in 1 Sekunde abgeschlossen sein! Dies gilt auch fĂŒr die ĂberprĂŒfungsverfahren der Phasen wĂ€hrend der Teamarbeit. werf deploy und werf run.
In diesem Release wurde zudem eine Strategie zur inhaltsbasierten Tagging von Images eingefĂŒhrt â inhaltsbasiertes Tagging, die jetzt standardmĂ€Ăig aktiviert ist und die einzige empfohlene Methode darstellt.
Lassen Sie uns die wichtigsten Neuerungen in werf v1.1 im Detail betrachten und zugleich ĂŒber zukĂŒnftige PlĂ€ne sprechen.
Was hat sich in werf v1.1 geÀndert?
Ein neues Format zur Benennung von Phasen und ein Algorithmus zur Auswahl von Phasen aus dem Cache
Neue Regel zur Generierung des Phasennamens. Jetzt wird fĂŒr jede Phasenbuild ein eindeutiger Phasename generiert, der aus zwei Teilen besteht: einer Signatur (wie in v1.0) plus einer einzigartigen Zeitidentifikation.
Zum Beispiel könnte der vollstÀndige Name des Phasenimages so aussehen:
werf-stages-storage/myproject:d2c5ad3d2c9fcd9e57b50edd9cb26c32d156165eb355318cebc3412b-1582656767835
⊠oder allgemein wie folgt:
werf-stages-storage/PROJEKT:SIGNATUR-ZEITSTEMPEL_MILLISEC
Hier:
-
SIGNATURâ dies ist die Signatur der Phase, die den Inhaltsidentifikator der Phase darstellt und von der Geschichte der Bearbeitungen in Git abhĂ€ngt, die zu diesem Inhalt fĂŒhrten; -
ZEITSTEMPEL_MILLISECâ ist eine garantiert eindeutige Identifikation eines Images, die beim Erstellen eines neuen Images generiert wird.
Der Algorithmus zur Auswahl der Stufen aus dem Cache basiert auf der ĂberprĂŒfung der Zugehörigkeit von Git-Commits:
- Werf berechnet die Signatur einer bestimmten Stufe.
- In stages-storage Es können mehrere Stufen mit dieser Signatur existieren. Werf wÀhlt alle passenden Stufen mit dieser Signatur aus.
- Wenn die aktuelle Stufe mit Git verbunden ist (git-archive, benutzerdefinierte Stufe mit Git-Patches:
installieren,beforeSetup,setup; oder git-latest-patch), wĂ€hlt werf nur die Stufen aus, die mit dem Commit verbunden sind, der der VorgĂ€nger des aktuellen Commits ist (fĂŒr den der Build aufgerufen wird). - Aus den verbleibenden passenden Stufen wird eine ausgewĂ€hlt â die Ă€lteste nach Erstellungsdatum.
Eine Stufe kann fĂŒr verschiedene Git-Branches die gleiche Signatur haben. Aber werf verhindert die Verwendung von Cache, das mit verschiedenen Branches verbunden ist, zwischen diesen Branches, selbst wenn die Signaturen ĂŒbereinstimmen.
.
Neuer Algorithmus zur Erstellung und Speicherung von Stufen im Stufenspeicher
Wenn wÀhrend der Auswahl der Stufen aus dem Cache werf keine passende Stufe findet, wird der Prozess zum Erstellen einer neuen Stufe initiiert.
Beachten Sie, dass mehrere Prozesse (auf einem oder mehreren Hosts) zur gleichen Zeit mit dem Zusammenstellen der gleichen Phase beginnen können. Werf nutzt einen Algorithmus zur optimistischen Sperrung. stages-storage zum Zeitpunkt der Speicherung des neu erstellten Images in stages-storage. Somit sperrt Werf, wenn die neue Phase bereit ist, stages-storage und speichert das neu erstellte Image nur, wenn dort noch kein passendes Image vorhanden ist. (basierend auf Signature und anderen Parametern â siehe den neuen Algorithmus zur Auswahl von Phasen aus dem Cache).
Das neu erstellte Image wird garantiert eine eindeutige Kennung haben nach ZEITSTEMPEL_MILLISEC (siehe das neue Format zur Benennung der Phasen).Falls in stages-storage ein passendes Image gefunden wird, verwirft Werf das neu erstellte Image und verwendet das Image aus dem Cache.
Anders gesagt: Der erste Prozess, der das Image fertigstellt (der schnellste), erhĂ€lt das Recht, es im stages-storage zu speichern (und genau dieses einzige Image wird fĂŒr alle Builds verwendet). Ein langsamerer Build-Prozess wird niemals einen schnelleren Prozess daran hindern, die Ergebnisse des aktuellen Builds zu speichern und mit dem nĂ€chsten Build fortzufahren.
.
Die Leistung des Dockerfile-Builders wurde verbessert.
Derzeit besteht die Pipeline-Stufen fĂŒr das aus Dockerfile erstellte Image aus einer einzigen Stufe â dockerfile. Bei der Berechnung der Signatur wird die PrĂŒfziffer der Dateien berĂŒcksichtigt, context, die beim Bauen verwendet werden. Vor dieser Verbesserung hat werf rekursiv alle Dateien durchlaufen und die PrĂŒfziffer ermittelt, indem er den Kontext und die Modi jeder Datei summierte. Ab Version v1.1 kann werf die berechneten PrĂŒfziffern nutzen, die im Git-Repository gespeichert sind.
Der Algorithmus basiert auf . Der Algorithmus berĂŒcksichtigt die EintrĂ€ge in .dockerignore und durchsucht das Dateibaum nur bei Bedarf rekursiv. Dadurch haben wir uns von der Dateisystemauslesung getrennt, und die AbhĂ€ngigkeit des Algorithmus von der GröĂe context spielt keine wesentliche Rolle.
Der Algorithmus ĂŒberprĂŒft auch untracked Dateien und berĂŒcksichtigt sie bei Bedarf in der PrĂŒfziffer.
Die Leistung beim Importieren von Dateien wurde verbessert.
In den Versionen von werf v1.1 kommt ein rsync-Server zum Einsatz beim Zuvor wurde der Import in zwei Schritten unter Verwendung der Montageverzeichnisse aus dem Hosts-System durchgefĂŒhrt.
Die Importleistung in macOS ist nicht mehr auf Docker-Volumes beschrÀnkt, und die Importe erfolgen jetzt in der gleichen Zeit wie unter Linux und Windows.
Inhaltsbasiertes Tagging
Werf v1.1 unterstĂŒtzt das sogenannte Tagging nach Inhaltsbasis des Images â inhaltsbasiertes Tagging. Die Tags der resultierenden Docker-Images hĂ€ngen vom Inhalt dieser Images ab.
Beim AusfĂŒhren des Befehls werf publish --tags-by-stages-signature oder werf ci-env --tagging-strategy=stages-signature die veröffentlichten Images werden mit dem sogenannten Stadien-Signatur des Images. Jedes Image wird mit seiner eigenen Stadien-Signatur dieses Images getaggt, die nach denselben Regeln berechnet wird wie die regulĂ€re Signatur jeder einzelnen Phase, aber als aggregierender Identifier des Images dient.
Die Stadien-Signatur eines Images hÀngt ab von:
- dem Inhalt dieses Images;
- der Geschichte der Ănderungen in Git, die zu diesem Inhalt gefĂŒhrt haben.
Im Git-Repository gibt es immer leere Commits, die den Inhalt der Image-Dateien nicht Àndern. Zum Beispiel Commits nur mit Kommentaren oder Merge-Commits, oder Commits, die die Dateien in Git Àndern, die nicht in das Image importiert werden.
Durch die Verwendung von content-basiertem Tagging können Probleme mit ĂŒberflĂŒssigen Neustarts der Anwendungspods in Kubernetes aufgrund von NamensĂ€nderungen des Images gelöst werden, selbst wenn sich der Inhalt des Images nicht geĂ€ndert hat. Dies ist ĂŒbrigens einer der GrĂŒnde, die es erschweren, mehrere Mikroschnittstellen einer Anwendung in einem einzigen Git-Repository zu speichern.
AuĂerdem ist content-basiertes Tagging eine zuverlĂ€ssigere Methode zur Kennzeichnung als das Tagging ĂŒber Git-Zweige, da der Inhalt der resultierenden Images nicht von der AusfĂŒhrungsreihenfolge der Pipelines im CI-System zur Erstellung mehrerer Commits desselben Zweigs abhĂ€ngt.
Wichtig: ab jetzt stages-signature â ist die einzig empfohlene Tagging-Strategie. Diese wird standardmĂ€Ăig im Befehl werf ci-env verwendet (es sei denn, es wird ausdrĂŒcklich ein anderes Tagging-Schema angegeben).
. Eine separate Veröffentlichung wird dieser Funktion gewidmet sein. AKTUALISIERT (3. April): Artikel mit Details .
Loglevel
Benutzer haben die Möglichkeit, die Ausgabe zu steuern, den Loglevel zu setzen und mit Debug-Informationen zu arbeiten. Optionen wurden hinzugefĂŒgt: --log-quiet, --log-verbose, --log-debug.
StandardmĂ€Ăig enthĂ€lt die Ausgabe minimale Informationen:

Bei Verwendung der detaillierten Ausgabe (--log-verbose) kann nachvollzogen werden, wie werf funktioniert:

Die detaillierte Ausgabe (--log-debug), neben den Debug-Informationen von werf, enthÀlt auch die Protokolle der verwendeten Bibliotheken. Zum Beispiel kann man sehen, wie die Interaktion mit dem Docker Registry erfolgt, sowie die Stellen festhalten, an denen erhebliche Zeit verbraucht wird:

ZukĂŒnftige PlĂ€ne
Achtung! Die nachfolgend beschriebenen Funktionen mit dem Hinweis v1.1 werden bereits in dieser Version verfĂŒgbar sein, viele von ihnen in naher Zukunft. Updates werden durch Auto-Updates . Diese Funktionen betreffen nicht den stabilen Teil der Funktionen v1.1, ihr Auftreten erfordert keine manuelle Eingreifung des Benutzers in bestehende Konfigurationen.
Komplette UnterstĂŒtzung verschiedener Implementierungen von Docker Registry (NEU)
- Version: v1.1
- Zeitplan: MĂ€rz
Ziel â der Benutzer soll eine beliebige Implementierung ohne EinschrĂ€nkungen bei der Verwendung von werf nutzen können.
Derzeit haben wir den folgenden Satz von Lösungen ausgewĂ€hlt, fĂŒr die wir vollstĂ€ndige UnterstĂŒtzung garantieren möchten:
- Default (library/registry)*,
- AWS ECR,
- Azure*,
- Docker Hub,
- GCR*,
- GitHub Packages,
- GitLab Registry*,
- Harbor*,
- Quay.
Mit einem Sternchen gekennzeichnet sind Lösungen, die derzeit vollstĂ€ndig von werf unterstĂŒtzt werden. FĂŒr die anderen besteht zwar UnterstĂŒtzung, jedoch mit EinschrĂ€nkungen.
Es gibt zwei Hauptprobleme:
- Einige Lösungen unterstĂŒtzen das Entfernen von Tags ĂŒber die Docker Registry API nicht, was es den Nutzern nicht ermöglicht, die in werf implementierte automatische Bereinigung zu nutzen. Dies trifft auf AWS ECR, Docker Hub und GitHub Packages zu.
- Einige Lösungen unterstĂŒtzen so genannte Nested Repositories (Docker Hub, GitHub Packages und Quay) nicht oder unterstĂŒtzen sie nur, wenn der Nutzer diese manuell ĂŒber die BenutzeroberflĂ€che oder API (AWS ECR) erstellt.
Diese und weitere Probleme beabsichtigen wir, mit den nativen APIs der Lösungen zu beheben. Diese Aufgabe umfasst auch das Testen des vollstĂ€ndigen Arbeitszyklus von werf fĂŒr jede Lösung.
Verteilte Bildbau (â)
- Version: v1.2 v1.1 (die PrioritĂ€t fĂŒr die Umsetzung dieser FunktionalitĂ€t wurde erhöht)
- Zeitrahmen: MĂ€rz-April MĂ€rz
Derzeit kann werf v1.0 und v1.1 nur auf einem dedizierten Host fĂŒr Build-, Veröffentlichungs- und Anwendungs-Deployment-Betrieb in Kubernetes verwendet werden.
Um die Möglichkeiten des verteilten Arbeitens mit werf zu eröffnen, wenn der Aufbau und das Deployment von Anwendungen in Kubernetes auf mehreren beliebigen Hosts startet und diese Hosts ihren Zustand zwischen den Builds nicht speichern (temporĂ€re Runner), benötigt werf die Implementierung der Nutzung eines Docker Registrys als Speicher fĂŒr Stufen.
FrĂŒher, als das Projekt werf noch dapp hieĂ, gab es diese Möglichkeit. Wir sind jedoch auf verschiedene Probleme gestoĂen, die bei der Umsetzung dieser Funktion in werf berĂŒcksichtigt werden mĂŒssen.
Hinweis. Diese Möglichkeit sieht nicht vor, dass der Builder innerhalb von Kubernetes-Pods arbeitet, da dafĂŒr die AbhĂ€ngigkeit vom lokalen Docker-Server beseitigt werden muss (innerhalb des Kubernetes-Pods gibt es keinen Zugriff auf den lokalen Docker-Server, da der Prozess selbst in einem Container lĂ€uft und werf keine Netzwerkverbindungen zum Docker-Server unterstĂŒtzt und dies auch nicht tun wird). Die UnterstĂŒtzung fĂŒr die Arbeit in Kubernetes wird separat implementiert.
Offizielle UnterstĂŒtzung fĂŒr GitHub Actions (NEU)
- Version: v1.1
- Zeitplan: MĂ€rz
Umfasst die werf-Dokumentation (Abschnitte Referenz und guide), sowie die offizielle GitHub Action zur Zusammenarbeit mit werf.
DarĂŒber hinaus ermöglicht es, dass werf auf flĂŒchtigen Runnern arbeitet.
Die Interaktion des Benutzers mit dem CI-System basiert auf der Vergabe von Labels an Pull-Requests, um bestimmte Aktionen beim Builden/Deployment der Anwendung zu initiieren.
Lokale Entwicklung und Deployment von Anwendungen mit werf (â)
- Version: v1.1
- Zeitraum: Januar-Februar April
Das Hauptziel ist es, eine einheitliche, standardisierte Konfiguration fĂŒr das Deployment von Anwendungen sowohl lokal als auch in der Produktion zu erreichen, ohne komplizierte Aktionen, direkt 'out of the box'.
Von werf wird auch ein Arbeitsmodus gefordert, in dem es bequem ist, den Anwendungscode zu bearbeiten und sofortige RĂŒckmeldungen von der laufenden Anwendung fĂŒr das Debugging zu erhalten.
Neuer Bereinigungsalgorithmus (NEU)
- Version: v1.1
- Zeitraum: April
In der aktuellen Version von werf v1.1 gibt es im Verfahren cleanup keine Bereinigung von Images fĂŒr das content-basierte Tagging â diese Images werden sich ansammeln.
In der aktuellen Version von werf (v1.0 und v1.1) werden zudem unterschiedliche Bereinigungspolitiken fĂŒr Images verwendet, die nach Tagging-Schemata veröffentlicht wurden: Git-Branch, Git-Tag oder Git-Commit.
Ein neuer einheitlicher Bereinigungsalgorithmus fĂŒr alle Tagging-Schemata wurde basierend auf der Historie der Git-Commits entwickelt:
- Speichern Sie maximal N1 Images, die mit den letzten N2 Commits fĂŒr jedes git HEAD (Branches und Tags) verbunden sind.
- Speichern Sie maximal N1 Stufen-Images, die mit den letzten N2 Commits fĂŒr jedes git HEAD (Branches und Tags) verbunden sind.
- Speichern Sie alle Images, die in irgendeiner Ressource des Kubernetes-Clusters verwendet werden (alle kube-Kontexte der Konfigurationsdatei und Namespaces werden durchsucht; dieses Verhalten kann mit speziellen Optionen eingeschrÀnkt werden).
- Speichern Sie alle Images, die in den Konfigurationsmanifesten von Ressourcen gespeichert sind, die in Helm-Releases gespeichert wurden.
- Ein Image kann gelöscht werden, wenn es mit keinem HEAD aus git verbunden ist (z.B. weil das entsprechende HEAD selbst gelöscht wurde) und in keinem Manifest im Kubernetes-Cluster und in den Helm-Releases verwendet wird.
Paralleles Bauen von Images (â)
- Version: v1.1
- ZeitrÀume: Januar-Februar April*
Die aktuelle Version von werf baut die in werf.yaml, beschriebenen Images und Artefakte sequentiell. Es ist notwendig, den Bauprozess der unabhÀngigen Stufen von Images und Artefakten zu parallelisieren und einen ansprechenden sowie informativen Output zu gewÀhrleisten.
* Hinweis: Der Zeitraum wurde aufgrund der erhöhten PrioritĂ€t der Implementierung von verteilten Builds verschoben, die mehr Möglichkeiten fĂŒr horizontale Skalierung sowie die Verwendung von werf mit GitHub Actions bieten. Paralleles Bauen ist der nĂ€chste Schritt der Optimierung, der vertikale Skalierbarkeit beim Bauen eines einzelnen Projekts bietet.
Ăbergang zu Helm 3 (â)
- Version: v1.2
- Zeitraum: Februar - MĂ€rz Mai*
Umfasst den Ăbergang zu einer neuen Codebasis und eine erprobte, benutzerfreundliche Möglichkeit zur Migration bestehender Installationen.
* Hinweis: Der Wechsel zu Helm 3 wird keine wesentlichen neuen Möglichkeiten in werf hinzufĂŒgen, da alle SchlĂŒsselmerkmale von Helm 3 (3-Wege-Merge und kein Tiller) bereits in werf implementiert sind. DarĂŒber hinaus hat werf neben den genannten. Dennoch bleibt dieser Ăbergang in unseren PlĂ€nen und wird durchgefĂŒhrt.
Jsonnet zur Beschreibung der Kubernetes-Konfiguration (â)
- Version: v1.2
- Zeitraum: Januar - Februar April - Mai
Werf wird die Beschreibung der Konfiguration fĂŒr Kubernetes im Jsonnet-Format unterstĂŒtzen. Gleichzeitig bleibt werf mit Helm kompatibel und es wird die Möglichkeit geben, das Format der Beschreibung auszuwĂ€hlen.
Ein Grund dafĂŒr ist, dass viele Menschen der Meinung sind, dass die Templates der Programmiersprache Go eine hohe EinstiegshĂŒrde aufweisen und die VerstĂ€ndlichkeit des Codes dieser Templates ebenfalls leidet.
Es wird auch die Möglichkeit in Betracht gezogen, weitere Konfigurationsbeschreibungs-Systeme fĂŒr Kubernetes zu implementieren (zum Beispiel Kustomize).
Arbeiten innerhalb von Kubernetes (â)
- Version: v1.2
- Zeitrahmen: April-Mai, Mai-Juni
Ziel: Bereitstellung von Build-Images und Bereitstellung von Anwendungen unter Verwendung von Runnern in Kubernetes. Das heiĂt, der Bau neuer Images, deren Veröffentlichung, Reinigung und Deployment kann direkt aus den Pods von Kubernetes erfolgen.
Um diese Möglichkeit zu realisieren, wird zunÀchst die Möglichkeit einer verteilten Image-Bereitstellung benötigt. (siehe Punkt oben).
AuĂerdem ist die UnterstĂŒtzung eines Modus erforderlich, der den Builder ohne Docker-Server betreibt (d.h. Ă€hnlich wie Kaniko oder Build im Userspace).
Werf wird die Build-Option in Kubernetes nicht nur mit Dockerfile, sondern auch mit seinem Builder Stapel unterstĂŒtzen, der inkrementelle Neu-Distributionen und Ansible umfasst.
Ein Schritt in Richtung Open Source Entwicklung
Wir schÀtzen unsere Community (, ) und möchten, dass immer mehr Menschen daran mitwirken, werf besser zu machen, verstehen, in welche Richtung wir gehen, und an der Entwicklung teilnehmen.
Vor kurzem wurde beschlossen, auf um den Arbeitsablauf unseres Teams zu öffnen. Aktuell können Sie die nÀchsten PlÀne sowie die laufenden Arbeiten in den folgenden Bereichen einsehen:
- ;
- ;
- ;
- .
Es wurde viel Arbeit mit Issues geleistet:
- Nicht mehr relevante wurden entfernt.
- Vorhandene wurden in ein einheitliches Format mit ausreichenden Details und Informationen gebracht.
- Neue Issues mit Ideen und VorschlĂ€gen wurden hinzugefĂŒgt.
Wie Sie die Version v1.1 aktivieren
Die Version ist derzeit verfĂŒgbar in (in den KanĂ€len "stable" und rock-solid die Releases werden mit der Stabilisierung erscheinen, jedoch "ea" ist sie bereits stabil genug fĂŒr den Einsatz, da sie durch die KanĂ€le gegangen ist Alpha-Zustand und Beta). Aktivierung auf folgende Weise:
source $(multiwerf use 1.1 ea)
werf COMMAND ...Fazit
Die neue Architektur des Staging-Speichers und die Optimierung des Builders fĂŒr Stapel und Dockerfile-Builder eröffnen Möglichkeiten fĂŒr verteilte und parallele Builds in werf. Diese Möglichkeiten werden bald in demselben Release v1.1 verfĂŒgbar sein und automatisch ĂŒber das Auto-Update-System zugĂ€nglich gemacht werden (fĂŒr Benutzer von ).
In diesem Release wurde eine Tagging-Strategie basierend auf dem Inhalt der Images hinzugefĂŒgt â inhaltsbasiertes Tagging, â die zur Standardstrategie geworden ist. Auch das Log der Hauptbefehle wurde ĂŒberarbeitet: werf build, werf publish, werf deploy, werf dismiss, werf cleanup.
Der nĂ€chste wesentliche Schritt wird die EinfĂŒhrung verteilter Builds sein. Seit Version 1.0 haben sich verteilte Builds zu einer priorisierten Aufgabe entwickelt, die mehr Wert fĂŒr werf bietet: vertikale Skalierung von Builds und UnterstĂŒtzung fĂŒr flĂŒchtige Builds in verschiedenen CI/CD-Systemen, sowie die Möglichkeit, offizielle UnterstĂŒtzung fĂŒr GitHub Actions zu implementieren. Daher wurden die ZeitplĂ€ne fĂŒr die Umsetzung paralleler Builds verschoben. Wir arbeiten jedoch daran, beide FunktionalitĂ€ten so schnell wie möglich bereitzustellen.
Bleiben Sie auf dem Laufenden! Vergessen Sie nicht, auch bei uns vorbeizuschauen , um ein Issue zu erstellen, ein bereits vorhandenes zu finden und einen Pluspunkt zu setzen, einen PR zu erstellen oder einfach den Fortschritt des Projekts zu beobachten.
P.S.
Lesen Sie auch in unserem Blog:
- «»
- «»;
- Notizen zu den Neuerungen in werf:
- «»;
- «»;
- «»;
- «».
Quelle: habr.com
