Warum GOPROXY wichtig ist und was man wählen sollte

Hinweis: Dieser Blog wurde aktualisiert, um der Produkteinstellung von JFrog GoCenterzu Rechnung zu tragen.

Ab Go 1.13 sind Go-Module der Standard-Paketmanager in Golang, der automatisch bei der Installation zusammen mit einer Standard-GOPROXY aktiviert wird.

Aber welche Art von Konfiguration sollten Sie wählen angesichts dieser GOPROXY sowie Ihrer eigenen Go-Modulpakete, die Sie vor öffentlicher Einsichtnahme schützen müssen? Wie können Sie verhindern, dass Ihre öffentlichen und privaten Golang-Ressourcen zu einem verschlungenen Knoten werden?

Lassen Sie uns einen Blick darauf werfen, wozu eine GOPROXY dient und welche Möglichkeiten Sie haben, um ein schnelles, zuverlässiges und sicheres System einzurichten..

Was ist eine GOPROXY?

Eine GOPROXY kontrolliert die Quelle Ihrer Go-Modul-Downloads und kann dazu beitragen, dass Builds deterministisch und sicher sind.

Bei der Entwicklung in Golang vor der GOPROXY-Ära wurden Modul-Abhängigkeiten direkt von ihren Quellcode-Repositories in VCS-Systemen wie GitHub, Bitbucket, Bazaar, Mercurial oder SVN heruntergeladen. Abhängigkeiten von Dritten werden in der Regel aus öffentlichen Quellcode-Repositories heruntergeladen. Private Abhängigkeiten müssen sich bei dem VCS-System authentifizieren, in dem sie gespeichert sind, um die Quelldateien des Moduls herunterzuladen.

Obwohl der oben beschriebene Workflow weit verbreitet war, fehlten ihm dennoch die beiden grundlegenden Anforderungen an einen deterministischen und sicheren Build- und Entwicklungsprozess: Unveränderlichkeit und Verfügbarkeit. Module können vom Autor gelöscht oder Versionen bearbeitet werden. Obwohl diese Szenarien als schlechte Praxis angesehen werden, kommen sie häufig vor.

Eine GOPROXY verwenden

Das Setzen einer GOPROXY für Ihre Golang-Entwicklungs- oder CI-Umgebung leitet Go-Modul-Download-Anfragen an ein Cache-Repository um.

Die Verwendung einer GOPROXY für Modulabhängigkeiten hilft, die geforderte Unveränderlichkeit durchzusetzen. Durch die Rückgabe des Moduls aus dem Cache von GOPROXY wird immer der gleiche Code für eine angeforderte Version bereitgestellt, auch wenn das Modul in jüngerer Zeit im VCS-Repository unzulässigerweise verändert wurde.

Der Cache des GOPROXY trägt auch zur ständigen Verfügbarkeit des Moduls bei, selbst wenn das Original im VCS-Repository zerstört wird.

Es gibt verschiedene Möglichkeiten, GOPROXY zu verwenden, je nachdem, welche Quelle für die Abhängigkeiten von Go-Modulen Sie erwarten.

Öffentliche GOPROXY

Eine öffentliche GOPROXY ist ein zentrales Repository, das Golang-Entwicklern auf der ganzen Welt zur Verfügung steht. Es hostet Open Source-Go-Module, die von Dritten in öffentlich zugänglichen VCS-Projekt-Repositories zur Verfügung gestellt wurden. Die meisten, wie zum Beispiel proxy.golang.org werden der Golang-Entwicklergemeinde kostenlos zur Verfügung gestellt.

Um eine öffentliche GOPROXY zu verwenden, setzen Sie die Golang-Umgebungsvariable auf deren URL:

$ export GOPROXY=https://proxy.golang.org

Die obige Einstellung leitet alle Anfragen zum Herunterladen von Modulen an das Go-Modul-Repository um, das vom Golang-Team gepflegt wird. Downloads von einer öffentlichen GOPROXY können viel schneller sein als direkt aus dem VCS, indem einer Modul-Archivdatei heruntergeladen wird.

Neben der Durchführung von Downloads kann eine öffentliche GOPROXY den GoLang-Entwicklern auch detailliertere Informationen über die darin enthaltenen Module liefern. Die Benutzeroberfläche unter pkg.go.dev ermöglicht Ihnen die Suche nach Modulen und bietet einige grundlegende Statistiken.

Private Go-Module

In der Regel werden in GoLang-Projekten sowohl Open Source- als auch private Modulabhängigkeiten verwendet. Einige Nutzer verwenden die Umgebungsvariable GOPRIVATE, um eine Liste von Pfaden anzugeben, die GOPROXY und GOSUMDB umgehen und private Module direkt von diesen VCS-Repositories herunterladen müssen. Sie können zum Beispiel proxy.golang.org verwenden, um alle Open Source Module abzurufen, aber nur private Module von den Servern Ihres Unternehmens anzufordern.

Um dieses öffentliche GOPROXY zusammen mit privaten Modulen zu verwenden, setzen Sie die Golang-Umgebungsvariablen die folgt:

$ export GOPROXY=https://proxy.golang.org,direct
$ export GOPRIVATE=*.internal.mycompany.com

Diese Verwendung von GOPRIVATE stellt auch sicher, dass Ihre Verwendung dieser privaten Module nicht durch Anfragen an einen öffentlichen GOPROXY- und Checksum-Datenbankserver in einem offenen Netzwerk "geleakt" wird. Eine weitere Alternative ist die Verwendung der GONOSUMDB-Variable, die Verweise auf private Go-Module enthält. Diese Konfiguration ermöglicht es dem Go-Client zwar, sowohl öffentliche als auch private Modulabhängigkeiten aufzulösen, erzwingt aber keine Unveränderlichkeit oder Verfügbarkeitsanforderungen für private Module.

Privat GOPROXY

Eine private GOPROXY ist eine, die Sie installieren, um sowohl öffentliche als auch private Go-Module in Ihrer eigenen Infrastruktur zu speichern.

Öffentliche Module werden lokal zwischengespeichert, indem eine öffentliche GOPROXY in einem binären Repository-Manager wie JFrog Artifactory als Proxy verwendet wird. Private Module werden ebenfalls in einem Repository aus ihren VCS-Repository zwischengespeichert. Auf diese Weise kann die Unveränderlichkeit und Verfügbarkeit sowohl für öffentliche als auch für private Go-Module gewährleistet werden.

In Artifactory wird eine Kombination aus einem Remote-Repository für proxy.golang.org, einem Remote-Go-Modul-Repository, das auf private GitHub-Repositories (für private Module) verweist und einem lokalen Go-Modul-Repository zu einem einzigen virtuellen Repository kombiniert werden, auf das als eine Einheit zugegriffen werden kann.

So legen Sie Ihre GOPROXY für ein virtuelles Repository in Artifactory namens "go" fest:

$ export GOPROXY="https://:@my.artifactory.server/artifactory/api/go/go
$ export GONOSUMDB="github.com/mycompany/*,github.com/mypersonal/*"

Da die Module in Ihren privaten VCS-Repositories keine Einträge in der öffentlichen Checksum-Datenbank unter sum.golang.orghaben, müssen sie vom Go-Client von dieser Prüfung ausgeschlossen werden. Durch Setzen von GONOSUMDB auf Ihre privaten VCS-Repositories wird dies erreicht und verhindert, dass Ihre go get -Befehle für diese privaten Module nicht aufgrund von Prüfsummenfehlern fehlschlagen.

In dieser Konfiguration ist sichergestellt, dass keine Verweise auf private Module "geleakt" sind, während gleichzeitig die Unveränderlichkeit und Verfügbarkeit sowohl der öffentlichen als auch der privaten Module erzwungen wird.

Knoten durchtrennen

Wie Sie sehen, bietet die Verwendung eines privaten GOPROXY die größte Gewissheit, Zuverlässigkeit und Sicherheit.

Sie können auch die Auflösung von Modulabhängigkeiten durch die Netzwerknähe Ihrer privaten GOPROXY zu Ihren Build-Tools beschleunigen. JFrog Artifactory kann dort installiert werden, wo Sie es am meisten brauchen: lokal oder in der Cloud, oder als SaaS-Abonnement bei allen drei großen Public Cloud-Anbietern.

Diese Vorteile sind außerdem nicht nur auf die Go-Entwicklung beschränkt. Die meisten Technologieunternehmen verwenden mehr als eine Sprache und mehrere Paketmanager. Wenn beispielsweise Code in Golang geschrieben wird, dann könnte npm für die Benutzeroberfläche verwendet werden, Docker könnte für die Verteilung von Bits verwendet werden und Helm könnte für die Bereitstellung von Anwendungen auf K8s verwendet werden.

Durch die Unterstützung von über 27 Pakettypen kann Artifactory einen deterministischen, stabilen und sicheren Softwareentwicklungsprozess für alle Anwendungen fördern. Holen Sie sich eine kostenlose Testversion und entdecken Sie, wie Artifactory Ihre Befehlszeilen lenken kann und Ihrer Software größtmögliche Freiheit schenkt.