Dipendenze private da Git
Usa una chiave di distribuzione SSH riservata alla compilazione quando la tua applicazione dipende da codice in un repository Git privato. Questa guida usa un modulo Go privato su Bitbucket, ma lo stesso flusso build.ssh funziona con GitHub e GitLab.
Se una compilazione si interrompe con un errore come questo, la dipendenza è privata ma la compilazione non dispone di credenziali utilizzabili senza interazione:
fatal: could not read Username for 'https://bitbucket.org': terminal prompts disabled
Non inserire password, token di accesso o chiavi private in adios.yaml, go.mod, o nell’URL del repository. Assegna al repository una chiave pubblica di distribuzione, conserva la chiave privata in Adios e indica il nome del segreto nel manifest.
1. Crea una chiave di distribuzione dedicata
Genera una nuova chiave per le compilazioni invece di caricare la tua chiave SSH personale:
ssh-keygen -t ed25519 \
-C "adios-build" \
-f ~/.ssh/adios-build \
-N ""
Questo crea due file:
~/.ssh/adios-build.pubè la chiave pubblica. Aggiungila al tuo fornitore Git.~/.ssh/adios-buildè la chiave privata. Conservala in Adios e non inserirla mai in un commit.
La chiave non ha una passphrase interattiva perché una compilazione automatica non può rispondere a una richiesta di passphrase. Mantienila dedicata, in sola lettura e limitata ai repository sorgente necessari alla compilazione.
2. Concedi alla chiave pubblica accesso al repository
Mostra la chiave pubblica:
cat ~/.ssh/adios-build.pub
Aggiungi l’intera riga come chiave di accesso al repository o di distribuzione in sola lettura:
- Bitbucket: aggiungila alle chiavi di accesso del repository privato.
- GitHub: aggiungila come chiave di distribuzione in sola lettura.
- GitLab: aggiungila come chiave di distribuzione senza accesso in scrittura.
Per più repository privati, autorizza la chiave ovunque serva accesso in lettura oppure usa un account macchina supportato dal fornitore con l’ambito minimo praticabile. Non incollare mai il file privato nel fornitore Git.
3. Conserva la chiave privata in Adios
Assicurati che la CLI usi il team proprietario dell’applicazione, poi carica il file privato:
adios teams switch <team-id>
adios secrets set BITBUCKET_DEPLOY_KEY \
--from-file ~/.ssh/adios-build
Puoi invece selezionare esplicitamente un team:
adios secrets set BITBUCKET_DEPLOY_KEY \
--from-file ~/.ssh/adios-build \
--team <team-id>
Conferma che il nome del segreto esista senza mostrarne il valore:
adios secrets list
BITBUCKET_DEPLOY_KEY è solo un nome di esempio. Puoi sceglierne un altro, ma il nome dopo secret:// in adios.yaml deve corrispondere esattamente.
4. Configura adios.yaml
Per un modulo Go privato ospitato in uno spazio di lavoro 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 rende la chiave disponibile solo alla compilazione. Adios recupera il segreto all’interno del worker ed elimina il file temporaneo della chiave privata al termine della compilazione. Per le compilazioni native build_cmd, il worker prepara anche SSH per gli host Git supportati. La chiave non viene aggiunta all’ambiente o al filesystem dell’applicazione in esecuzione. Le compilazioni Docker devono usare il mount SSH come mostrato sotto.
GOPRIVATE indica a Go quali percorsi dei moduli devono evitare il proxy pubblico dei moduli e il database dei checksum. Fallo corrispondere al percorso di importazione del modulo, non al nome visualizzato del repository:
| Host Git | Esempio di modello Go |
|---|---|
| Bitbucket | bitbucket.org/my-workspace/* |
| GitHub | github.com/my-organization/* |
| GitLab | gitlab.com/my-group/* |
Non devi modificare un’importazione HTTPS esistente di un modulo per includere un nome utente o credenziali. Per gli host supportati, il worker di compilazione Adios usa SSH mentre il repository mantiene il normale percorso canonico di importazione.
5. Distribuisci e verifica
Esegui di nuovo la distribuzione:
adios up
Il download riuscito di una dipendenza dimostra che entrambe le chiavi sono collegate: il manifest ha trovato la chiave privata nel team Adios corretto e il fornitore Git ha accettato la chiave pubblica per il repository richiesto.
Dopo la prima compilazione riuscita, elimina dai computer condivisi le copie temporanee delle chiavi che non servono più. Mantieni registrata la chiave pubblica per le compilazioni future e ruota la coppia quando cambia l’accesso al repository.
Compilazioni Docker
Per una compilazione Docker, build.ssh abilita il mount SSH di BuildKit, ma il Dockerfile deve usarlo nei comandi che scaricano sorgenti private:
# 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
Mantieni la configurazione corrispondente del manifest sotto build.ssh e build.env. Non usare COPY o un argomento di compilazione per inserire la chiave privata nell’immagine.
Risoluzione dei problemi
terminal prompts disabled
Controlla che build.ssh sia presente, il nome del segreto corrisponda esattamente e il segreto appartenga al team attivo dell’applicazione. Per le compilazioni Docker, controlla anche che il comando delle dipendenze usi RUN --mount=type=ssh.
Permission denied (publickey)
La chiave privata è stata caricata, ma il fornitore Git non l’ha accettata. Conferma di aver registrato il file corrispondente .pub nel repository corretto e che la chiave abbia ancora accesso in lettura.
Go contatta ancora proxy.golang.org o il database di checksum
Correggi il modello GOPRIVATE affinché copra l’intero percorso di importazione del modulo privato. Per più namespace, separa i modelli con virgole.
invalid format o error in libcrypto
Il valore conservato deve essere il file della chiave privata, non il file .pub, un’impronta o la formattazione copiata dal terminale. Caricala di nuovo con --from-file per preservare esattamente la chiave.
repository not found
Verifica prima il percorso del modulo e il nome del repository. Se entrambi sono corretti, la chiave di distribuzione potrebbe essere associata a un altro repository o non avere accesso a una delle dipendenze private transitive.