Adios
BlogGuia

Guia

Como implantar um aplicativo que usa uma dependência de Git privada

Uma dependência privada precisa de uma credencial durante a compilação, mas ela não deve ficar no código-fonte. Uma chave de implantação conecta o repositório sem expor sua chave SSH pessoal.

Equipe Adios6 min de leitura

Quando uma dependência privada falha em uma compilação na cloud, o código pode estar correto. A compilação simplesmente não tem uma forma segura de comprovar que pode ler o repositório.

O que o erro está realmente dizendo

Um comando Git local pode pedir usuário, senha ou chave SSH. Uma compilação remota não pode parar para aguardar essa resposta. Quando Go, npm, pip ou outra ferramenta acessa um repositório privado por HTTPS sem credencial, o Git informa que os prompts do terminal estão desabilitados.

Essa mensagem geralmente não significa que o nome do pacote está errado. Isso significa que a compilação precisa de uma identidade não-interativa com permissão para ler o repositório.

A typical private Go module failure

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

Use uma chave de implantação, não sua chave pessoal

Uma chave SSH tem duas partes. A pública pode ser cadastrada no Bitbucket, GitHub ou GitLab. A privada comprova que a compilação possui aquela chave pública. Apenas a parte privada precisa de armazenamento de segredos.

Crie uma chave dedicada para este trabalho. Se a chave for exposta, você pode revogá-la sem quebrar seu acesso pessoal ao Git ou a conta de outro desenvolvedor.

  • —Conceda acesso somente leitura, a menos que a compilação realmente envie código ao repositório.
  • —Restrinja o acesso aos repositórios exigidos pelo grafo de dependências.
  • —Não reutilize a chave pessoal SSH de um desenvolvedor.
  • —Nunca grave em um commit a chave privada nem uma URL de repositório que contenha credenciais.
ssh-keygen -t ed25519 -C "adios-build" -f ~/.ssh/adios-build -N ""

Coloque cada metade no lugar certo

Adicione o conteúdo de adios-build.pub como chave de acesso somente leitura no repositório privado. Depois envie adios-build, sem o sufixo .pub, para a equipe Adios proprietária da aplicação.

O nome do segredo é um rótulo escolhido por você. O exemplo usa BITBUCKET_DEPLOY_KEY para deixar clara sua finalidade no manifesto e na lista de segredos.

cat ~/.ssh/adios-build.pub

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

Informar à Adios e ao Go onde está o código-fonte privado

O manifesto conecta a compilação à chave armazenada por build.ssh. Em projetos Go, GOPRIVATE também informa à ferramenta de módulos quais caminhos de importação devem ignorar o proxy público e o banco de checksums.

Você pode manter em go.mod o caminho normal do módulo no formato HTTPS. Nos hosts Git compatíveis, o worker de compilação da Adios prepara o acesso SSH sem adicionar a chave à aplicação em execução.

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

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

Repetir a compilação e ler o próximo erro

Execute adios up novamente depois que as duas partes da chave e o manifesto estiverem configurados. Se a dependência privada for baixada, a conexão está pronta. A Adios resolve o segredo dentro do worker e remove o arquivo temporário da chave quando a compilação termina.

Se ainda houver falha, a nova mensagem normalmente aponta para um dos lados da conexão. Permission denied significa que o provedor não aceitou a chave pública. Um segredo ausente significa que a chave privada foi armazenada com outro nome ou em outra equipe. Se o Go consulta seu proxy público, GOPRIVATE não cobre o caminho de importação completo do módulo.

Rotacionar o acesso sem alterar o código da aplicação

Uma referência a segredo mantém a credencial fora do repositório, então sua rotação não exige editar go.mod ou os arquivos de código-fonte. Crie um novo par de chaves, autorize a chave pública e atualize BITBUCKET_DEPLOY_KEY com adios secrets set.

Execute uma compilação bem-sucedida com a nova chave antes de remover a chave pública antiga. Essa breve sobreposição evita uma interrupção desnecessária e deixa apenas uma credencial de compilação ativa ao concluir a rotação.

Todos os artigos