Pular para o conteúdo
AdiosDocumentação
Explorar a documentação

Dependências privadas do Git

Use uma chave de implantação SSH reservada à compilação quando o aplicativo depender de código de um repositório Git privado. Este guia usa um módulo Go privado no Bitbucket, mas o mesmo fluxo build.ssh funciona com GitHub e GitLab.

Se uma compilação parar com um erro desse tipo, a dependência é privada, mas a compilação não tem uma credencial utilizável sem interação:

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

Não coloque senha, token de acesso ou chave privada em adios.yaml, go.mod, nem na URL do repositório. Adicione a chave pública de implantação ao repositório, armazene a parte privada no Adios e referencie o nome do segredo no manifesto.

1. Criar uma Chave de Implantação Dedicada

Gere uma nova chave para compilações em vez de enviar sua chave SSH pessoal:

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

Isso cria dois arquivos:

  • ~/.ssh/adios-build.pub é a chave pública. Adicione-a ao seu provedor Git.
  • ~/.ssh/adios-build é a chave privada. Armazene-a no Adios e nunca faça commit dela.

A chave não tem uma frase secreta interativa, pois uma compilação automatizada não consegue responder a uma solicitação de senha. Mantenha-a dedicada a esse uso, de somente leitura e limitada aos repositórios de código-fonte necessários à compilação.

2. Dar à chave pública acesso ao repositório

Mostrar a chave pública:

cat ~/.ssh/adios-build.pub

Adicione a linha completa como chave de acesso ao repositório ou chave de implantação de somente leitura:

  • Bitbucket: adicione-a às chaves de acesso do repositório privado.
  • GitHub: adicione-a como chave de implantação de somente leitura.
  • GitLab: adicione-a como chave de implantação sem acesso de escrita.

Para vários repositórios privados, autorize a chave em qualquer lugar que precise de acesso de leitura ou use uma conta de máquina suportada pelo provedor com o menor escopo prático. Nunca cole o arquivo privado no provedor Git.

3. Armazenar a chave privada no Adios

Confirme que a CLI está usando a equipe proprietária do aplicativo e envie o arquivo da chave privada:

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

Você pode direcionar uma equipe explicitamente em vez disso:

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

Confirme que o nome secreto existe sem revelar o seu valor:

adios secrets list

BITBUCKET_DEPLOY_KEY é apenas um nome de exemplo. Você pode escolher outro nome, mas o nome depois secret:// em adios.yaml deve corresponder exatamente a esse nome.

4. Configurar adios.yaml

Para um módulo Go privado hospedado em um espaço de trabalho 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 torna a chave disponível apenas para a compilação. O Adios resolve o segredo no worker e remove o arquivo temporário de chave privada quando a compilação termina. Para compilações nativas build_cmd, o worker também prepara o SSH para os hosts Git compatíveis. A chave não é adicionada ao ambiente nem ao sistema de arquivos do aplicativo em execução. As compilações Docker precisam usar a montagem SSH como mostrado abaixo.

GOPRIVATE informa ao Go quais caminhos de módulos precisam ignorar o proxy público e o banco de dados de somas de verificação. Use o caminho de importação do módulo, não o nome de exibição do repositório:

Git hostExemplo de padrão Go
Bitbucketbitbucket.org/my-workspace/*
GitHubgithub.com/my-organization/*
GitLabgitlab.com/my-group/*

Você não precisa alterar uma importação HTTPS existente de módulo para incluir um nome de usuário ou credencial. Para hosts compatíveis, o worker de compilação Adios usa SSH, e o repositório mantém seu caminho de importação canônico normal.

5. Implantar e Verificar

Execute a implantação novamente:

adios up

O download bem-sucedido de uma dependência comprova a conexão das duas partes: o manifesto encontrou a chave privada na equipe Adios correta e o provedor Git aceitou a chave pública para o repositório solicitado.

Após a primeira compilação bem-sucedida, remova das máquinas compartilhadas as cópias temporárias de chaves de que não precisa mais. Mantenha a chave pública registrada para compilações futuras e renove o par quando o acesso ao repositório mudar.

Compilações Docker

Para uma compilação Docker, build.ssh ativa a montagem SSH do BuildKit, mas o Dockerfile precisa usá-la nos comandos que buscam código-fonte 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

Mantenha a configuração correspondente do manifesto em build.ssh e build.env. Não use COPY ou um argumento de compilação para colocar a chave privada dentro da imagem.

Resolução de Problemas

terminal prompts disabled

Verifique se build.ssh está presente, que o nome do segredo corresponde exatamente e que o segredo pertence à equipe ativa do aplicativo. Para compilações Docker, confira também se o comando da dependência usa RUN --mount=type=ssh.

Permission denied (publickey)

A chave privada foi carregada, mas o provedor Git não a aceitou. Confirme que registrou o arquivo correspondente .pub no repositório correto e que a chave ainda tem acesso de leitura.

O Go ainda contata proxy.golang.org ou o banco de dados de somas de verificação

Corrija o padrão GOPRIVATE para que cubra o caminho completo de importação do módulo privado. Para vários espaços de nomes, separe os padrões com vírgulas.

invalid format ou error in libcrypto

O valor armazenado deve ser o arquivo de chave privada, não o .pub, uma impressão digital ou texto copiado com formatação do terminal. Envie o arquivo novamente com --from-file para preservar a chave exatamente.

repository not found

Verifique primeiro o caminho do módulo e o nome do repositório. Se ambos estiverem corretos, a chave de implantação pode ser anexada a um repositório diferente ou não ter acesso a uma das dependências privadas transitivas.