Wie werden Ressourcen von Drittanbietern in einer Build-Pipeline zwischengespeichert?


8

EIN erfordert häufig den Zugriff auf Ressourcen von Drittanbietern, abgesehen vom Quellcode der Artefakte, die erstellt werden sollen. Jede dieser Ressourcen von Drittanbietern führt einen Risikofaktor in Builds ein, zum Beispiel:

  • Verteilungsrepositorys sind vorübergehend nicht verfügbar, daher schlägt die Installation von Verteilungspaketen vorübergehend fehl.

  • Distributions-Repositorys sind permanent nicht verfügbar, genauso und schlechter als zuvor.

  • Einige NPM-Pakete für freie Software existieren nicht mehr, weil der Autor diese Rücknahme zurückgefordert hat.

  • Einige Quelldateien oder binäre Ad-hoc-Pakete für Tools von Drittanbietern sind nicht mehr verfügbar.

Diese Liste könnte ad libitum erweitert werden, und obwohl es viel unterhaltsamer ist, die verschiedenen Gründe zu untersuchen, die dazu führen, dass Ressourcen von Drittanbietern verschwinden, hat dies für uns zunächst eine katastrophale Konsequenz: Die Build-Pipeline ist kaputt.

Was ist der beste Weg, um die beiden folgenden Fälle beim Erstellen von Docker- Bildern abzudecken :

  1. Zwischenspeichern von Dateien, die mit einem Curl oder Wget heruntergeladen wurden .
  2. Zwischenspeichern von Debian-Paketen.

Es gibt mehrere plausible Strategien, die hier berücksichtigt werden können. Verwenden Sie beispielsweise einen Proxy und konfigurieren Sie das Build-System so, dass alle seine Anforderungen über diesen Proxy weitergeleitet werden. Eine zweite, billige Möglichkeit wäre, Curl- Aufrufe zu verpacken , um die Ergebnisse in einem lokalen Cache zu speichern.

(In dieser Frage würde ich die Aufteilung des Caches auf mehrere Einheiten der Build-Pipeline als eine Frage von untergeordneter Bedeutung betrachten.)

Antworten:


6

Ich bin mit Docker nicht besonders vertraut, aber es klingt sehr nach Problemen, die beim Erstellen einer normalen .NET-Anwendung oder Java-App auftreten, wenn ihre externen Abhängigkeiten (DLL oder JAR) gespeichert werden müssen.

Um dies zu lösen, mag ich Artefakte sehr gern. Zwei der beliebtesten sind Sonatype des Nexus und JFrog der Artifactory . Beide bieten eine kostenlose Open Source-Version an und beide haben die Möglichkeit, ein benutzerdefiniertes Paket zu speichern oder es als Rohdepot zu verwenden. Es gibt noch andere Möglichkeiten. Ich habe diese beiden nur aufgelistet, weil ich bereits mit ihnen gearbeitet habe und weiß, dass sie das tun, was Sie brauchen. Als Bonus können Sie sie möglicherweise auch verwenden, um das Docker-Image direkt zu verwalten.

Es gibt auch andere erwähnenswerte, Sie können eine Vergleichstabelle für sie finden, Sie erhalten einen besseren Überblick über ihre Fähigkeiten. (danke an Karl Harnagy für den Link)

Beachten Sie, dass für einige dieser Optionen möglicherweise die eine oder andere kostenpflichtige Version erforderlich ist, also YMMV.

Einige kontinuierliche Integrationssysteme unterstützen auch das Konzept von Artefakten (aus Erfahrung von Jenkins und Team-City, andere jedoch auch), mit denen Sie ähnliche Ergebnisse direkt erzielen können.

Wenn dies nicht für Sie der Fall ist, können Sie sich mit anderen Technologien befassen oder Ihre eigenen entwickeln. Ich persönlich nutze gerne alles, was ich bereits habe. Dies reduziert den Wartungsaufwand auf lange Sicht und erleichtert das Übergeben des Geldes, wenn es an der Zeit ist, anderswo nach neuen Herausforderungen zu suchen.

Hoffe das hilft


1
+1 für JFrog Artifactory. Wenn wir in einem stark regulierten Umfeld arbeiten, müssen wir uns in unseren Builds nicht auf externe Ressourcen verlassen, um auch in 5 Jahren einen 100% reproduzierbaren Build zu erhalten. Also zwischenspeichern wir alles in Artifactory - Docker-Basis-Images, npm- und nuget-Pakete, Installationsprogramme von Drittanbietern usw.
yossiz74

Das Schöne daran ist auch, dass zwischengespeicherte Artefakte Entwicklern im Allgemeinen über Maven, Nuget, Npm usw. direkt auf ihrem System zur Verfügung gestellt werden können. Eine benutzerdefinierte Caching-Lösung würde etwas mehr Arbeit erfordern, um erledigt zu werden.
Newtopian

1
Schauen Sie sich Proget Sie können auch eine Pause nach unten aller Universal Package Krippen finden hier .
Karl Harnagy

Vielen Dank, zuletzt habe ich überprüft, ob ProGet so ziemlich auf das .NET-Universum beschränkt war (vor einiger Zeit). Ich sehe jetzt, dass sie jetzt ein fähiges Artefakt sind, das den beiden genannten gleichwertig ist. Vielen Dank !
Newtopian

1

Es sieht so aus, als ob es bei Ihrer Suche weniger um Caching als um Spiegelung geht. Da Ihre Anforderungen permanent nicht verfügbare Pakete behandeln müssen, müssen Sie die Pakete selbst in einem dauerhafteren als einem Cache speichern. In der Vergangenheit haben wir Pakete in dauerhaften, Cloud-basierten Geschäften wie S3 gespeichert. Es hindert Sie jedoch nichts daran, einen benutzerdefinierten Dateispeicher auf dem Build-Server einzurichten.

Genauer gesagt ist es wahrscheinlich am einfachsten, einen Proxy-Dienst einzurichten, der nach einer Ressource in Ihrem Dateispeicher (S3) sucht und das Paket zurückgibt, wenn es gefunden wird. Andernfalls würde es nur die Ressource vom Upstream anfordern, Ihren Dateispeicher füllen und das Paket zurückgeben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.