Adios
BlogGuida

Guida

Come distribuire un'app che usa una dipendenza Git privata

Una dipendenza privata richiede una credenziale durante la compilazione, ma questa non deve stare nel codice sorgente. Una deploy key collega il repository senza esporre la tua chiave SSH personale.

Team di Adios6 min di lettura

Quando una dipendenza privata non viene scaricata durante una compilazione nel cloud, il codice può essere corretto. La compilazione semplicemente non ha un modo sicuro per dimostrare il diritto a leggere il repository.

Cosa significa davvero l'errore

Un comando Git locale può chiedere nome utente, password o chiave SSH. Una compilazione remota non può fermarsi ad aspettare una risposta. Quando Go, npm, pip o un altro strumento raggiunge un repository privato tramite HTTPS senza credenziali, Git segnala che i prompt del terminale sono disabilitati.

Quel messaggio di solito non significa che il nome del pacchetto sia sbagliato. Significa che la compilazione richiede un'identità non interattiva con il permesso di leggere il repository.

A typical private Go module failure

fatal: could not read Username for 'https://bitbucket.org': terminal prompts disabled

Usa una deploy key, non la tua chiave personale

Una chiave SSH ha due parti. Quella pubblica può essere registrata su Bitbucket, GitHub o GitLab. Quella privata dimostra che il processo di compilazione possiede la chiave pubblica. Solo la parte privata richiede l'archiviazione come segreto.

Crea una chiave dedicata a questo compito. Se viene esposta, puoi revocarla senza compromettere il tuo accesso Git personale o l'account di un altro sviluppatore.

  • —Concedile accesso in sola lettura, salvo che la compilazione debba davvero inviare codice al repository.
  • —Limitala ai repository necessari al grafo delle dipendenze.
  • —Non riutilizzare la chiave SSH personale di uno sviluppatore.
  • —Non salvare mai nei commit la chiave privata né un URL di repository che contenga credenziali.
ssh-keygen -t ed25519 -C "adios-build" -f ~/.ssh/adios-build -N ""

Metti ogni parte nel posto giusto

Aggiungi il contenuto di adios-build.pub come chiave di accesso in sola lettura al repository privato. Carica poi adios-build, senza il suffisso .pub, nel team Adios proprietario dell'applicazione.

Il nome del segreto è un'etichetta che scegli tu. L'esempio usa BITBUCKET_DEPLOY_KEY perché ne rende chiaro lo scopo nel manifest e nell'elenco dei segreti.

cat ~/.ssh/adios-build.pub

adios secrets set BITBUCKET_DEPLOY_KEY \
  --from-file ~/.ssh/adios-build

Indica ad Adios e Go dove si trova il sorgente privato

Il manifest collega la compilazione alla chiave salvata tramite build.ssh. Nei progetti Go, GOPRIVATE indica anche allo strumento dei moduli quali percorsi di importazione devono evitare il proxy pubblico e il database dei checksum.

Puoi mantenere in go.mod il normale percorso del modulo in formato HTTPS. Sugli host Git supportati, il worker di compilazione Adios prepara l'accesso SSH per la compilazione senza aggiungere la chiave all'applicazione in esecuzione.

build:
  ssh:
    - default=secret://BITBUCKET_DEPLOY_KEY
  env:
    GOPRIVATE: "bitbucket.org/your-workspace/*"

build_cmd: go build -o app ./cmd/api

Riprova la compilazione e leggi l'errore successivo

Esegui di nuovo adios up quando entrambe le parti della chiave e il manifest sono configurati. Se la dipendenza privata viene scaricata, il collegamento è completo. Adios risolve il segreto all'interno del worker e rimuove il file temporaneo della chiave al termine della compilazione.

Se fallisce ancora, il nuovo messaggio di solito indica uno dei due lati del collegamento. Permission denied significa che il provider non ha accettato la chiave pubblica. Un segreto mancante significa che la chiave privata è salvata con un altro nome o in un altro team. Se Go contatta il proxy pubblico, GOPRIVATE non copre il percorso di importazione completo del modulo.

Ruota le credenziali di accesso senza modificare il codice applicativo

Un riferimento a un segreto mantiene la credenziale fuori dal repository, quindi la rotazione non richiede modifiche a go.mod o ai file sorgente. Crea una nuova coppia, autorizza la chiave pubblica e aggiorna BITBUCKET_DEPLOY_KEY con adios secrets set.

Esegui una compilazione riuscita con la nuova chiave prima di rimuovere quella pubblica precedente. Questa breve sovrapposizione evita un'interruzione inutile e lascia una sola credenziale di compilazione attiva al termine della rotazione.

Tutti gli articoli