Ir al contenido
AdiosDocumentación
Explorar la documentación

Dependencias Git privadas

Usa una clave SSH de despliegue exclusiva de compilación cuando tu aplicación dependa de código de un repositorio Git privado. Esta guía utiliza un módulo Go privado en Bitbucket, pero el mismo build.ssh funciona con GitHub y GitLab.

Si una compilación se detiene con un error como este, la dependencia es privada pero la compilación no tiene una credencial no interactiva:

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

No pongas una contraseña, token de acceso ni clave privada en adios.yaml, go.mod, o la URL del repositorio. Añade al repositorio una clave pública de despliegue, almacena la parte privada en Adios y referencia el nombre de su secreto desde el manifiesto.

1. Crear una clave de despliegue dedicada

Genera una clave nueva para las compilaciones en lugar de subir tu clave SSH personal:

ssh-keygen -t ed25519 \
  -C "adios-build" \
  -f ~/.ssh/adios-build \
  -N ""

Esto crea dos archivos:

  • ~/.ssh/adios-build.pub es la clave pública. Añádela a tu proveedor Git.
  • ~/.ssh/adios-build es la clave privada. Guárdala en Adios y nunca la añadas al repositorio.

La clave no tiene frase de contraseña interactiva porque una compilación automatizada no puede responder a esa solicitud. Mantenla dedicada, de solo lectura y limitada a los repositorios de código fuente que necesita la compilación.

2. Dar acceso al repositorio a la clave pública

Mostrar la clave pública:

cat ~/.ssh/adios-build.pub

Añade la línea completa como clave de acceso al repositorio o clave de despliegue de solo lectura:

  • Bitbucket: añádela a las claves de acceso del repositorio privado.
  • GitHub: añádela como clave de despliegue de solo lectura.
  • GitLab: añádela como clave de despliegue sin acceso de escritura.

Para varios repositorios privados, autoriza la clave en todos los lugares donde necesite acceso de lectura o utiliza una cuenta de máquina compatible con el proveedor y con el menor alcance práctico. Nunca pegues el archivo privado en el proveedor Git.

3. Almacenar la clave privada en Adios

Asegúrate de que la CLI utiliza el equipo al que pertenece la aplicación y después sube el archivo privado:

adios teams switch <team-id>
adios secrets set BITBUCKET_DEPLOY_KEY \
  --from-file ~/.ssh/adios-build

También puedes especificar un equipo de forma explícita:

adios secrets set BITBUCKET_DEPLOY_KEY \
  --from-file ~/.ssh/adios-build \
  --team <team-id>

Confirma que existe el nombre del secreto sin revelar su valor:

adios secrets list

BITBUCKET_DEPLOY_KEY es solo un nombre de ejemplo. Puedes elegir otro, pero el nombre que sigue a secret:// dentro adios.yaml debe coincidir exactamente.

4. Configurar adios.yaml

Para un módulo Go privado alojado en un espacio de trabajo 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 hace que la clave esté disponible solo durante la compilación. Adios resuelve el secreto dentro del worker y elimina el archivo temporal de clave privada al terminar la compilación. Para compilaciones nativas de build_cmd, el worker también prepara SSH para los hosts Git compatibles. La clave no se añade al entorno ni al sistema de archivos de la aplicación en ejecución. Las compilaciones Docker deben utilizar el montaje SSH como se muestra a continuación.

GOPRIVATE indica a Go qué rutas de módulos deben omitir el proxy público de módulos y la base de datos de sumas de comprobación. Hazlo coincidir con la ruta de importación del módulo, no con el nombre visible del repositorio:

Host GitEjemplo de patrón Go
Bitbucketbitbucket.org/my-workspace/*
GitHubgithub.com/my-organization/*
GitLabgitlab.com/my-group/*

No necesitas cambiar una importación HTTPS de módulo existente para incluir un nombre de usuario o una credencial. Para los hosts compatibles, el worker de compilación de Adios utiliza SSH mientras el repositorio mantiene su ruta canónica habitual de importación.

5. Desplegar y verificar

Vuelve a ejecutar el despliegue:

adios up

Una descarga correcta de dependencias demuestra que ambas partes están conectadas: el manifiesto encontró la clave privada en el equipo Adios correcto y el proveedor Git aceptó su clave pública para el repositorio solicitado.

Después de la primera compilación correcta, elimina de los equipos compartidos las copias temporales de claves que ya no necesites. Mantén registrada la clave pública para futuras compilaciones y rota el par cuando cambie el acceso al repositorio.

Compilaciones Docker

Para una compilación Docker, build.ssh habilita el montaje SSH de BuildKit, pero el Dockerfile debe utilizar ese montaje en los comandos que obtienen código fuente privado:

# 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

Mantén la configuración correspondiente del manifiesto en build.ssh y build.env. No uses COPY ni un argumento de compilación para introducir la clave privada en la imagen.

Solución de problemas

terminal prompts disabled

Comprueba que build.ssh está presente, el nombre del secreto coincide exactamente y el secreto pertenece al equipo activo de la aplicación. En las compilaciones Docker, comprueba también que el comando de dependencias utiliza RUN --mount=type=ssh.

Permission denied (publickey)

La clave privada se cargó, pero el proveedor Git no la aceptó. Confirma que registraste el .pub en el repositorio correcto y que la clave siga teniendo acceso de lectura.

Go sigue contactando con proxy.golang.org o la base de datos de la suma de comprobación

Corrige el GOPRIVATE para que cubra toda la ruta de importación del módulo privado. Para varios espacios de nombres, separa los patrones con comas.

invalid format o error in libcrypto

El valor almacenado debe ser el archivo de clave privada, no el .pub, una huella digital ni formato copiado del terminal. Vuelve a subirla con --from-file para conservar la clave exactamente.

repository not found

Verifica primero la ruta del módulo y el nombre del repositorio. Si ambos son correctos, la clave de despliegue puede estar asociada a otro repositorio o carecer de acceso a alguna dependencia privada transitiva.