Was sind Best Practices für die Docking-Tag-Versionierung?

11

Ich habe kürzlich unsere CI-Server angeschlossen, um Docker-Images nach Git-Commit zu erstellen.

Wir haben ungefähr 8 verschiedene Container, die gebaut werden, jeder mit seiner eigenen Sprache / seinen eigenen Frameworks. Einige sind Knoten und haben eine package.json, andere sind Python-Dienste, die keine semantischen Versionsinformationen enthalten.

Bei meiner Frage geht es nicht darum, wie Tags erstellt werden, sondern darum, die Werte für das Tag zu erstellen.

Wie kann sichergestellt werden, dass jedes Tag eine eindeutige semantische Versionsnummer für die spezifischen Bilder hat? Wer sollte die Autorität beim Verfolgen / Inkrementieren einer Build-Version sein?

Jack Murphy
quelle
Was ist Ihr aktueller Ansatz zum Erstellen der Tags?
030
Es ist zu hören, was Sie fragen. Sie sagen "semantische Versionsnummer", die vom Menschen zugewiesen werden muss (unsere AIs sind noch nicht weit genug fortgeschritten, um über die Semantik eines Commits zu entscheiden ...). Aber dann fragen Sie nach "Inkrementieren einer Build-Version". Was interessiert Sie dann eigentlich? Haben Sie welche, um sicherzustellen, dass das Zeug nur "inkrementiert" (wie eine SCN / System-Änderungsnummer oder was auch immer)? Oder interessieren Sie sich für den semantischen Inhalt der Versionsnummer (dh ob sie inkompatible Änderungen aufweist)?
AnoE

Antworten:

6

Ich würde Sie zu meiner Post- Coupling-Docker-Registrierung und Quellcodeverwaltung weiterleiten, wo dmaze von den offiziellen forums.docker.com geantwortet hat . Das Festschreiben von Hash- und Zweignamen oder Tags reicht aus.

Verwenden Sie in Ihrer Docker-Datei ein LABEL, um die Quelle des Builds aufzuzeichnen. Dazu gehören wahrscheinlich der Commit-Hash aus der verteilten Quellcodeverwaltung (git, Mercurial), der Zweigstellenname, falls relevant, etwaige Release-Tags, falls vorhanden, und möglicherweise Details wie der Zeitstempel des letzten Commits. Docker-Verlauf und Docker-Inspektion sollten diese anzeigen können.

Wenn Sie Ihre Bilder per Docker pushen, pushen Sie sie mindestens zweimal, mit dem Commit-Hash und dem Zweignamen als Teil der Version (quay.io/mycorp/imagename:123abc7, quay.io/mycorp/imagename:dmaze-test) ). Wenn Release-Tags verfügbar sind, sollte das CI-System auch Bilder mit diesen Tags pushen.

Wir verwenden derzeit eine Kombination aus Filialname / Commit-Hash. Für uns scheint das genug zu sein. Zeitstempel, während sie nützlich sind IMO fügen nur Unordnung hinzu, da sie nichts liefern, was der Commit-Hash nicht tut.

Ich stimme 030 in Bezug auf:

Wer sollte die Autorität beim Verfolgen / Inkrementieren einer Build-Version sein?

Es liegt zu 100% in der Verantwortung des CI, solche Dinge aufrechtzuerhalten und die Kommunikation zwischen anderen Teams zu gewährleisten.

Scott
quelle
1

Wie kann sichergestellt werden, dass jedes Tag eine eindeutige semantische Versionsnummer für die spezifischen Bilder hat?

Man könnte ein Tag erstellen, das aus mehreren Elementen besteht, z. B. einer Kombination aus Zeitstempel, Git-Commit-Hash und semantischer Version. Letzteres muss manuell eingestellt werden, während die ersten beiden automatisiert werden könnten. Ein solches Tag könnte wie folgt aussehen:

20171015141729-58617f500f7efe236c7ba6a1dfdf37a478b4c878-0.1.4

Dieses Tag enthält das Erstellungsdatum, das Commit und die semantische Version. Wenn ein Docker-Image in der Produktion ausgeführt wird und ein Fehler gefunden wird, kennt man die Version des Produkts, den Code, der sich darin befindet, und wann das Image erstellt wurde und unter welchen Umständen.

Wer sollte die Autorität beim Verfolgen / Inkrementieren einer Build-Version sein?

Meiner Meinung nach sollte dies in der Verantwortung des CI liegen, da dies Prozesse automatisieren kann und die Erstellung von Tags automatisiert werden kann. Ein solches Tool ist das richtige Tool für den Job.

030
quelle
1

Ich nehme an, dass Sie eines der DevOps-Tools für CI / CD wie Jenkins verwenden. Ich schlage den folgenden Ansatz vor:

Wenn Sie so etwas wie Jenkins-

  • Sie können Ihren Job so konfigurieren, dass Sie die Jenkins-Umgebungsvariable "BUILD_ID" verwenden können, die die Build-ID des Jobs abruft, wenn er ausgelöst wird, um ihn Ihrem Image zu kennzeichnen. Auf diese Weise können Sie Ihre Docker-Images versionieren. Bitte überprüfen Sie das folgende Beispiel.

Ex:- sudo docker build -t <image_name>:<BUILD_ID>

Wenn Sie also einen tagähnlichen Mechanismus für Ihr SCM haben, können Sie das Tag in der jeweiligen Build-ID entweder in jobbasierten Builds oder in config.xml der Build-ID in JENKINS HOME_FOLDER überprüfen.

Tezi
quelle