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 host | Exemplo de padrão Go |
|---|---|
| Bitbucket | bitbucket.org/my-workspace/* |
| GitHub | github.com/my-organization/* |
| GitLab | gitlab.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.