Dépendances Git privées
Utilisez une clé de déploiement SSH réservée à la compilation lorsque votre application dépend de code provenant d’un dépôt Git privé. Ce guide utilise un module Go privé sur Bitbucket, mais le même processus build.ssh fonctionne avec GitHub et GitLab.
Si une compilation s’arrête avec une erreur de ce type, la dépendance est privée, mais aucun identifiant utilisable sans interaction n’est disponible pour la compilation :
fatal: could not read Username for 'https://bitbucket.org': terminal prompts disabled
Ne mettez pas de mot de passe, de jeton d'accès ou de clé privée dans adios.yaml, go.mod, ni dans l’URL du dépôt. Ajoutez la clé publique de déploiement au dépôt, stockez sa partie privée dans Adios et référencez le nom du secret dans le manifeste.
1. Créer une clé de déploiement dédiée
Générez une nouvelle clé pour les compilations plutôt que d’importer votre clé SSH personnelle :
ssh-keygen -t ed25519 \
-C "adios-build" \
-f ~/.ssh/adios-build \
-N ""
Cela crée deux fichiers :
~/.ssh/adios-build.pubest la clé publique. Ajoutez-la chez votre fournisseur Git.~/.ssh/adios-buildest la clé privée. Stockez-la dans Adios et ne la commitez jamais.
La clé n’a pas de phrase secrète interactive, car une compilation automatisée ne peut pas répondre à une invite de saisie. Réservez-la à cet usage, en lecture seule, et limitez-la aux dépôts de code source nécessaires à la compilation.
2. Autoriser la clé publique à accéder au dépôt
Affichez la clé publique :
cat ~/.ssh/adios-build.pub
Ajoutez la ligne complète comme clé d’accès au dépôt ou clé de déploiement en lecture seule :
- Bitbucket: ajoutez-la aux clés d’accès du dépôt privé.
- GitHub: ajoutez-la comme clé de déploiement en lecture seule.
- GitLab: ajoutez-la comme clé de déploiement sans accès en écriture.
Pour plusieurs dépôts privés, autorisez la clé partout où un accès en lecture est nécessaire, ou utilisez un compte machine pris en charge par le fournisseur avec les droits les plus restreints possibles. Ne collez jamais le fichier de clé privée chez le fournisseur Git.
3. Stocker la clé privée dans Adios
Assurez-vous que la CLI utilise l’équipe propriétaire de l’application, puis importez le fichier de clé privée :
adios teams switch <team-id>
adios secrets set BITBUCKET_DEPLOY_KEY \
--from-file ~/.ssh/adios-build
Vous pouvez aussi cibler explicitement une équipe :
adios secrets set BITBUCKET_DEPLOY_KEY \
--from-file ~/.ssh/adios-build \
--team <team-id>
Vérifiez que le nom du secret existe sans révéler sa valeur :
adios secrets list
BITBUCKET_DEPLOY_KEY n'est qu'un exemple de nom. Vous pouvez choisir un autre nom, mais le nom après secret:// dans adios.yaml doit correspondre exactement à ce nom.
4. Configurer adios.yaml
Pour un module Go privé hébergé dans un espace de travail Bitbucket :
build:
ssh:
- default=secret://BITBUCKET_DEPLOY_KEY
env:
GOPRIVATE: "bitbucket.org/your-workspace/*"
build_cmd: |-
set -e
go build -o app ./cmd/api
build.ssh rend la clé accessible uniquement pendant la compilation. Adios récupère le secret dans le worker et supprime le fichier temporaire de clé privée à la fin de la compilation. Pour les compilations natives build_cmd, le worker prépare aussi SSH pour les hôtes Git pris en charge. La clé n’est ajoutée ni à l’environnement ni au système de fichiers de l’application en cours d’exécution. Les compilations Docker doivent utiliser le montage SSH comme indiqué ci-dessous.
GOPRIVATE indique à Go quels chemins de modules doivent contourner le proxy public et la base de données des sommes de contrôle. Utilisez le chemin d’importation du module, et non le nom d’affichage du dépôt :
| Hôte Git | Exemple de motif Go |
|---|---|
| Bitbucket | bitbucket.org/my-workspace/* |
| GitHub | github.com/my-organization/* |
| GitLab | gitlab.com/my-group/* |
Il n’est pas nécessaire de modifier une importation de module HTTPS existante pour y inclure un nom d’utilisateur ou un identifiant secret. Pour les hôtes pris en charge, le worker de compilation Adios utilise SSH, tandis que le dépôt conserve son chemin d’importation canonique habituel.
5. Déployer et vérifier
Exécutez à nouveau le déploiement :
adios up
Le téléchargement réussi d’une dépendance confirme que les deux parties de la clé fonctionnent ensemble : le manifeste a trouvé la clé privée dans la bonne équipe Adios et le fournisseur Git a accepté sa clé publique pour le dépôt demandé.
Après la première compilation réussie, supprimez des machines partagées les copies temporaires de clés dont vous n’avez plus besoin. Conservez l’enregistrement de la clé publique pour les prochaines compilations et renouvelez la paire de clés lorsque l’accès au dépôt change.
Compilations Docker
Pour une compilation Docker, build.ssh active le montage SSH de BuildKit, mais le Dockerfile doit l’utiliser dans les commandes qui récupèrent le code source privé :
# syntax=docker/dockerfile:1
FROM golang:1.25 AS build
ARG GOPRIVATE
ENV GOPRIVATE=$GOPRIVATE
WORKDIR /src
COPY go.mod go.sum ./
RUN mkdir -p -m 0700 /root/.ssh \
&& ssh-keyscan bitbucket.org >> /root/.ssh/known_hosts \
&& git config --global \
url."ssh://git@bitbucket.org/".insteadOf \
"https://bitbucket.org/"
RUN --mount=type=ssh go mod download
Conservez la configuration correspondante du manifeste sous build.ssh et build.env. N’utilisez pas COPY ou un argument de compilation pour placer la clé privée dans l’image.
Dépannage
terminal prompts disabled
Vérifiez que build.ssh est présent, que le nom du secret correspond exactement et que le secret appartient à l’équipe active de l’application. Pour les compilations Docker, vérifiez aussi que la commande de récupération de la dépendance utilise RUN --mount=type=ssh.
Permission denied (publickey)
La clé privée a été chargée, mais le fournisseur Git l’a refusée. Vérifiez que vous avez enregistré le fichier correspondant .pub sur le bon dépôt et que la clé dispose toujours d’un accès en lecture.
Go contacte encore proxy.golang.org ou la base de données des sommes de contrôle
Corrigez le motif GOPRIVATE pour qu’il couvre le chemin d’importation complet du module privé. Séparez les motifs par des virgules pour plusieurs espaces de noms.
invalid format ou error in libcrypto
La valeur stockée doit être le fichier de clé privée, et non le fichier .pub, une empreinte ou du texte copié avec la mise en forme du terminal. Importez à nouveau le fichier avec --from-file pour préserver la clé exactement.
repository not found
Vérifiez d’abord le chemin du module et le nom du dépôt. Si les deux sont corrects, la clé de déploiement peut être associée à un autre dépôt ou ne pas avoir accès à une dépendance privée indirecte.