Wie können Sie freigegebene Binärdateien unter Versionskontrolle halten?

14

Wie können Sie freigegebene Binärdateien unter Versionskontrolle halten? Auf diese Weise können Sie nachverfolgen, welche Inhalte zwischen den einzelnen Releases geändert werden. Ich meine, die freigegebenen Binärdateien vom Quell-Repository zu trennen. Die freigegebenen Binärdateien werden entweder aus der Continuous Integration-Software erstellt oder manuell kompiliert.

linquize
quelle
Was meinst du mit "nachverfolgen, was sich geändert hat"? Welche Attribute der Release-Binärdateien verfolgen Sie (oder möchten Sie es sein)? Es scheint nur seltsam, also bin ich neugierig.
Jeremy Heiler
zB zwischen v1.0.0 und v1.0.1, nur ABC.exe geändert wird , während die Abhängigkeit DEF.dll bleibt unverändert
linquize
1
Wie bestimmen Sie dies anhand der Binärdateien?
Jeremy Heiler
diff alte und neue version der gleichen datei
linquize

Antworten:

21

Zwei Optionen:

a) Tu es nicht. Stellen Sie einfach sicher, dass Sie reproduzierbare deterministische Builds haben, dh, dass das Erstellen derselben Versionsverwaltungsversion mit derselben Konfiguration immer genau dieselbe Binärdatei erzeugt.

b) Legen Sie irgendwo ein Verzeichnis als maßgebliche Quelle für veröffentlichte Builds fest. Stellen Sie sicher, dass das Hochladen der Binärdateien Teil des Bereitstellungs- / Versandverfahrens ist und dass das Verzeichnis für veröffentlichte Builds in Ihrem Sicherungsplan enthalten ist. Sie benötigen hier keine Versionskontrolle. Builds sind einmal schreibbar. Wenn Sie etwas ändern müssen, erstellen Sie einen neuen Build.

In beiden Fällen gehören Binärdateien und andere Build-Ausgaben aus zahlreichen Gründen nicht zur Quellcodeverwaltung.

tdammers
quelle
7
a) ist natürlich oft nicht möglich blogs.msdn.com/b/ericlippert/archive/2012/05/31/…
jk.
@jk: schöner link. Ich vermute, dass der Quellcode und alle Eingabedateien für die Build-Phase vollständig der Quellcodeverwaltung unterliegen (und die richtige Compiler-Version installiert ist) ). Es ist fallabhängig, wie wichtig es ist, Stück für Stück reproduzierbare Binärdateien zu haben.
Doc Brown
10

Verwenden Sie ein Artefakt-Repository für Binärdateien, kein Versionskontrollsystem. Eine bestimmte Version einer freigegebenen Binärdatei sollte sich im Laufe der Zeit nicht ändern. Daher ist eine Versionskontrolle nicht sinnvoll, da sich die Datei (en) nicht ändern würden.

Siehe beispielsweise Maven-Repositorys als Repository zum Archivieren / Veröffentlichen / Anbieten von Releases und anderen Binärdateien (z. B. Dokumentation).

mhaller
quelle
Auch eine bestimmte Version einer freigegebenen Quelldatei sollte sich im Laufe der Zeit nicht ändern. SCM ist ein guter Ort, um die mitgelieferte Binärdatei zu speichern. Sie müssen sie nur neben den Quelldateien speichern, die zum Erstellen verwendet wurden.
gbjbaanb
2
gbjbaanb, SCM steht für "Source Control Management". Das sollte jedem einen Hinweis darauf geben, dass diese Systeme nicht zum Speichern von Binärdateien, sondern von Quellen ausgelegt sind. Wenn Sie weiterhin Binärdateien speichern möchten, fahren Sie fort. Ich werde nicht.
mhaller
4
SCM steht für "Software Control Management", aber netter Versuch. "Quellcode" besteht oft nicht nur aus Textdateien, sondern auch aus Bildern, Dokumenten, Diagrammen usw.
gbjbaanb
Normalerweise "Software Configuration Management". Ich habe noch nie von "Software Control Management" gehört.
James McLeod
7

Geben Sie sie einfach ein. Das ist kein Problem, es sei denn, Sie verwenden git (das die Binärdateien nicht gut zusammenführt, sodass Sie sie selbst verwalten müssen) oder Sie schreiben sie zu oft fest (schreiben Sie nur, wenn es ist) versandbereit, nicht jedes Mal, wenn Sie es bauen).

Die meisten Delta-Binärdateien von SCMs waren recht gut. Wir haben eine 2-MB-Ressourcen-DLL in unseren SVN eingefügt, die jedes Mal ein Delta von einigen KB aufweist.

Ich höre viele Argumente, dass SCMs als Quelle und nicht als Binärdateien dienen, aber dies ist eindeutig falsch, wenn man bedenkt, dass die meiste Software aus Bildern besteht, auch wenn es sich nur um Symboldateien handelt. Sie sind Binärdateien, aber sie sind Teil der Quelle. Setzen Sie sie ein und seien Sie nicht so dogmatisch. Ich habe auch gehört, dass Sie die Binärdatei bei Bedarf einfach neu erstellen können. Dies ist häufig der Fall, kann jedoch für ältere Systeme, die nicht mehr aktiv unterstützt werden, eine enorme Zeitverschwendung darstellen. Wenn Sie ein System mit nur älteren Service Packs oder Patches neu erstellen müssen, um dem System zu entsprechen, das vor 3 Jahren zum Erstellen einer Binärdatei verwendet wurde, sind Sie froh, dass Sie die Binärdatei damals zu Ihrem SCM hinzugefügt haben.

Sie müssen sich nur darum kümmern, Ihrem SCM Builds hinzuzufügen, wenn Sie dies automatisch als Teil des Build-Server-Prozesses tun. Tun Sie dies nicht. Sie füllen Ihr SCM mit Builds, die für Sie keinen Nutzen haben. Fügen Sie sie stattdessen erst hinzu, wenn Sie freigegeben werden. Auf diese Weise wissen Sie genau, was Ihr Kunde hat, und Sie können alle von Kunden gemeldeten Probleme mit den von ihm verwendeten Binärdateien und nicht mit den von Ihnen neu erstellten Binärdateien (z. B. mit den neuesten Updates für den Compiler oder das Betriebssystem) reproduzieren.

gbjbaanb
quelle
1
@ MarnenLaibow-Koser du hast offensichtlich nicht lange in der Branche gearbeitet. Build-Umgebungen ändern sich im Laufe der Zeit. Während Sie also eine alte Umgebung neu erstellen können, müssen Sie möglicherweise Tage damit verbringen, die Umgebung mit den richtigen alten Tools und SDKs neu zu erstellen. Was ich hoffe, Sie haben versioniert ....
gbjbaanb
1
Ich stelle mir vor, Sie könnten eine alte VC6-Binärdatei, die auf einem XP-Computer kompiliert wurde, mit einem alten SDK erstellen, das Microsoft nicht mehr für freigegeben hält. Wenn jemand nach dieser Binärdatei fragt, ist es einfach, sie vom selben Ort zu holen, an dem alles andere gespeichert ist. Die Kosten für die Verwaltung sind im Vergleich zu den Kosten für den Wiederaufbau enorm und die Kosten für die Aufbewahrung zusammen mit der Quelle sind unbedeutend. Ich war dort (mit einer VB6-App, die mit einem Steuerelement eines Drittanbieters erstellt wurde, als der Kunde einen Fehler meldete - es war viel einfacher, die Binärdatei zu erhalten und auszuführen, als sie neu zu erstellen, was sich als unmöglich herausstellte)
gbjbaanb
1
@gjbaanb Ich gebe auch zu, dass Sie sich auf andere Weise in einer anderen Situation befinden als ich: Alle meine externen Abhängigkeiten sind OSS. Sie können also nicht aufhören, nur weil einige Unternehmen es nicht mehr für angebracht halten, sie freizugeben.
Marnen Laibow-Koser
1
Mein Punkt ist, dass SCMs alles speichern können, es besteht also keine Notwendigkeit, dies nicht zu tun die binäre Speicherung getrennt von seiner Quelle. Es ist bequem und einfach und garantiert, dass Sie wissen, was Jahre später passiert. Das hat keinen Nachteil. Jedes Release selbst ist nur mit einem bestimmten Source-Commit synchronisiert. Ich sehe das Problem nicht, außer dass einige Leute denken, dass SCM nur Quelltext bedeutet. Nein, verwenden Sie es, um fast alles zu speichern (manchmal auch, um Tools oder Bibliotheken zu erstellen, wenn sie nicht riesig sind), das Leben wird viel einfacher.
gbjbaanb
1
@gjbaanb Und mein Punkt ist, dass du falsch liegst. :) Sicher, VCSs können alles speichern, aber sie sind nicht für das Speichern von Dateien geeignet, die nur für ein Commit gültig sind (Sie möchten schließlich nicht, dass Ihr R500 in das Repo bei R550 eingebaut wird; es wird nur verwirrend sein). . Das grundlegende Problem beim Speichern von Build-Artefakten im Repo besteht nicht darin, dass sie binär sind , sondern dass sie abgeleitete Daten sind und nicht mehr mit ihrer Quelle im selben Repo synchronisiert werden. Die gleichen Argumente, die ich verwende, gelten auch für generierte Textdateien.
Marnen Laibow-Koser
5

Ich behalte Release-Binärdateien nicht unter Versionskontrolle. Stattdessen veröffentliche ich sie an einem genau definierten Ort, damit andere Tools sie inspizieren und verwenden können. Ich arbeite viel in Java, was bedeutet, dass ich Jars in lokalen Maven-Repositories veröffentliche. Ich verwende diese Tools jedoch nicht, um zu verfolgen, was sich pro Release geändert hat. Immerhin handelt es sich um Binärdateien, und es gibt außer der Anzahl der Dateien nicht wirklich viel zu verfolgen.

Um Änderungen zwischen Releases nachzuverfolgen, habe ich Releases in meinem Versionskontrollsystem mit der Versionsnummer des Releases gekennzeichnet. Aber das ist wirklich nur, um die Quelldateien zu verfolgen, nicht die Binärdateien. Die Binärdateien sind Artefakte des Builds und müssen nicht der Versionskontrolle unterliegen.

Jeremy Heiler
quelle
1

Die beste Lösung besteht darin, Ihr CI-System ausschließlich für alle organisatorisch wichtigen Builds (Releases, Release-Kandidaten usw.) zu verwenden.

Dadurch werden die freigegebenen Binärdateien systematisch an den Repository-Inhalt gebunden, ohne dass die Binärdateien tatsächlich im Repository gespeichert werden müssen.

Wenn Sie beispielsweise SVN verwenden, verwenden Sie das Zweigstellenschema. Führen Sie die gesamte tägliche Entwicklung in / trunk durch und erstellen Sie ein / -Tag für jedes Release, sobald es fertig ist.

Konfigurieren Sie Ihr CI-System so, dass es sowohl aus Tags als auch aus Trunk erstellt und die Ausgabe in ein Netzwerkverzeichnis schreibt, dessen Struktur die Struktur der obersten Ebene des Repositorys widerspiegelt:

  • / builds / trunk / [rev] [date] [build_id] /
  • / builds / tags / release_0_1_3beta4 / [rev] [date] [build_id] /

Das Build-System muss das behandeln Verzeichnis / builds / trunk / wie einen Ringpuffer behandeln und die letzten n Builds speichern. Alte Builds müssen dabei gelöscht werden.

Das Verzeichnis / builds / tags / ist dagegen ein permanenter Speicher. Die Build-Artefakte selbst werden in Verzeichnissen gespeichert, deren Namen nach folgendem Schema generiert werden:

  • [rev] [date] [build_id]

Dabei ist [rev] die SVN-Revisions-ID, [date] das Datum im Format JJJJMMTT und [build_id] ein dreistelliger eindeutiger Zähler, der vom ersten Build an inkrementiert wird und jedes Build-Verzeichnis eindeutig macht.

Der oben beschriebene Prozess bietet Ihnen die folgenden Vorteile:

  1. Build-Artefakte sind systematisch an die Quelle gebunden, von der sie generiert wurden, sodass Sie die Quelle für ein bestimmtes Build-Artefakt sehr einfach finden können (und umgekehrt).

  2. Dies ist die Basis für die weitere Release-Automatisierung. Zum Beispiel automatische Generierung von Freigabedokumenten etc ...

William Payne
quelle