Pourquoi un GOPROXY est-il important et lequel choisir ?

Remarque : ce blog a été mis à jour pour illustrer la mise hors service de JFrog GoCenter.

À partir de la version 1.13 de Go, les modules Go sont le gestionnaire de paquets standard dans Golang, activé automatiquement à l’installation avec un GOPROXY par défaut. 

Mais avec ce GOPROXY ainsi que vos propres paquets de modules Go que vous devez conserver à l’abri des regards, quel type de configuration devez-vous choisir ? Comment éviter que vos ressources Golang publiques et privées ne deviennent un nœud enchevêtré ?

Voyons à quoi sert un GOPROXY et comment le configurer pour obtenir un système rapide, fiable et sûr.

Qu’est-ce qu’un GOPROXY ?

Un GOPROXY contrôle la source de vos téléchargements de modules Go et peut aider à garantir des builds reproductibles et sécurisés.

Pour développer en Golang avant l’ère GOPROXY, les dépendances des modules étaient téléchargées directement depuis leurs dépôts source dans des systèmes VCS tels que GitHub, Bitbucket, Bazaar, Mercurial ou SVN. Les dépendances externes sont généralement téléchargées à partir de dépôts sources publics. Les dépendances privées doivent s’authentifier auprès du système VCS où elles sont stockées pour télécharger les fichiers sources du module.

Bien que le workflow ci-dessus ait été largement utilisé, il ne répondait pas aux deux exigences fondamentales d’un processus de build et de développement déterministe et sécurisé : immuabilité et disponibilité. Les modules peuvent être effacés par l’auteur ou les versions peuvent être modifiées. Bien que ces scénarios soient considérés comme de mauvaises pratiques, ils se produisent fréquemment. 

Utilisation d’un GOPROXY 

Le fait de configurer un GOPROXY pour votre environnement de développement ou de CI Golang redirige les requêtes de téléchargement de modules Go vers un dépôt en cache.

L’utilisation d’un GOPROXY pour les dépendances des modules contribue à mettre en œuvre l’exigence d’immuabilité. En renvoyant le module à partir du cache du GOPROXY, il fournit toujours le même code pour une version demandée, même si le module a été modifié de manière inappropriée plus récemment dans le dépôt VCS.

Le cache du GOPROXY permet également de s’assurer que le module est toujours disponible, même si l’original se trouvant dans le dépôt VCS est détruit.  

Il existe différentes façons d’utiliser GOPROXY, en fonction de la source des dépendances des modules Go que vous prévoyez d’utiliser.

GOPROXY public

Un GOPROXY public est un dépôt centralisé disponible pour les développeurs Golang à travers le monde. Il héberge des modules Go open source qui ont été mis à disposition par des tiers dans des dépôts de projets VCS accessibles au public. La plupart, comme proxy.golang.org sont fournis gratuitement à la communauté des développeurs Golang.

Pour utiliser un GOPROXY public, il suffit de configurer la variable d’environnement Golang avec son URL :

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

Le paramètre ci-dessus redirige toutes les demandes de téléchargement de module vers le dépôt de modules Go géré par l’équipe Golang. Les téléchargements à partir d’un GOPROXY public peuvent être beaucoup plus rapides que ceux effectués directement à partir du VCS, en téléchargeant un fichier d’archive de module.

En plus de faciliter les téléchargements, un GOPROXY public peut également fournir aux développeurs GoLang des informations plus détaillées sur les modules qu’il contient. L’interface utilisateur de pkg.go.dev permet de rechercher des modules et fournit quelques statistiques de base.

Modules Go Privés

En général, les projets GoLang utilisent à la fois des dépendances de modules open source et privés. Certains utilisateurs utilisent la variable d’environnement GOPRIVATE pour spécifier une liste de chemins qui doivent contourner GOPROXY et GOSUMDB et télécharger des modules privés directement depuis ces dépôts VCS. Par exemple, on peut utiliser proxy.golang.org pour récupérer tous les modules open source mais demander que les modules privés proviennent uniquement des serveurs de votre entreprise.

Pour utiliser ce GOPROXY public avec des modules privés, il faut définir les variables d’environnement Golang :

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

Cette utilisation de GOPRIVATE garantit également que l’utilisation de ces modules privés n’est pas « divulguée » par le biais de requêtes adressées à un serveur public GOPROXY et de base de données de checksums sur un réseau ouvert. Une autre alternative consiste à utiliser la variable GONOSUMDB qui inclut des références à des modules Go privés. Bien que cette configuration permette au client Go de résoudre les dépendances des modules publics et privés, elle n’applique pas les exigences d’immuabilité ou de disponibilité pour les modules privés.

GOPROXY Privé

Un GOPROXY privé permet de stocker des modules Go publics et privés sur votre propre infrastructure.

Les modules publics sont mis en cache localement par l’intermédiaire d’un GOPROXY public dans un gestionnaire de dépôts de binaires comme JFrog Artifactory. Les modules privés sont également mis en cache dans un dépôt à partir de leurs dépôts VCS. De cette façon, l’immuabilité et la disponibilité peuvent être garanties pour les modules Go publics et privés. 

Dans Artifactory, une combinaison d’un dépôt distant pour proxy.golang.org, un dépôt de module Go distant qui pointe vers des dépôts GitHub privés (pour les modules privés) et un dépôt de module Go local peuvent être combinés en un seul dépôt virtuel, auquel on accède comme une seule entité.

Pour définir votre GOPROXY pour un dépôt virtuel nommé « go » dans Artifactory :

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

Puisque les modules de vos dépôts VCS privés n’auront pas d’entrées dans la base de données publique des checksums à l’adresse sum.golang.org, ils doivent être exclus de cette vérification par le client go. Vous pouvez y parvenir en définissant GONOSUMDB dans vos dépôts VCS privés, ce qui empêcher évitera que vos commandes go get pour ces modules privés n’échouent en raison d’une non-concordance des checksums.

Dans cette configuration, vous vous assurez qu’aucune de vos références aux modules privés n’est « divulguée », tout en appliquant l’immuabilité et la disponibilité des modules publics et privés.

Couper les Nœuds

Comme vous pouvez le constater, l’utilisation d’un GOPROXY privé offre davantage de certitude, de fiabilité et de sécurité. 

La proximité réseau de votre GOPROXY privé avec vos outils de build peut également accélérer la résolution des dépendances des modules. JFrog Artifactory peut être installé là où vous en avez le plus besoin : sur site ou dans le cloud, ou en tant qu’abonnement SaaS sur les trois principaux fournisseurs de cloud public.

Ces avantages ne se limitent pas non plus à la communauté des développeurs Go. La plupart des entreprises technologiques utilisent plus d’un langage et plusieurs gestionnaires de packages. Par exemple, si le code est écrit en Golang, npm peut être utilisé pour l’interface utilisateur, Docker peut être utilisé pour distribuer des bits et Helm peut être utilisé pour déployer des applications sur K8s. 

Avec la prise en charge de plus de 27 types de packages, Artifactory peut favoriser un processus de développement logiciel déterministe, stable et sécurisé pour toutes les applications. Nous vous proposons de faire un essai gratuit et de découvrir comment Artifactory peut vous permettre de vous orienter et d’assurer la libre circulation de vos logiciels.