Aller au contenu
AdiosDocumentation
Parcourir la documentation

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.pub est la clé publique. Ajoutez-la chez votre fournisseur Git.
  • ~/.ssh/adios-build est 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 GitExemple de motif Go
Bitbucketbitbucket.org/my-workspace/*
GitHubgithub.com/my-organization/*
GitLabgitlab.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.