Este tutorial demonstra como usar o Secret Manager com o Cloud Build para aceder a repositórios GitHub privados a partir de uma compilação. O Secret Manager é um Google Cloud serviço que armazena em segurança chaves de API, palavras-passe e outros dados confidenciais.
Crie uma chave SSH
Abra uma janela de terminal.
Crie um novo diretório denominado
workingdir
e navegue para o mesmo:mkdir workingdir cd workingdir
Crie uma nova chave SSH do GitHub, em que github-email é o seu endereço de email do GitHub:
ssh-keygen -t rsa -b 4096 -N '' -f id_github -C github-email
Este comando cria uma nova chave SSH
workingdir/id_github
sem uma frase secreta para a sua chave SSH. O Cloud Build não pode usar a sua chave SSH se estiver protegida com uma frase secreta.
Armazene a chave SSH privada no Secret Manager
Quando cria uma chave SSH,
é criado um ficheiro id_github
no seu ambiente. Uma vez que qualquer pessoa pode autenticar-se na sua conta com este ficheiro, tem de armazená-lo no Secret Manager antes de o usar numa compilação.
Para armazenar a sua chave SSH no Secret Manager, faça o seguinte:
Aceda à página Secret Manager na Google Cloud consola:
Na página Secret Manager, clique em Create Secret.
Na página Criar segredo, em Nome, introduza um nome para o segredo.
No campo Valor secreto, clique em Carregar e carregue o ficheiro
workingdir/id_github
.Não altere a secção Regiões.
Clique no botão Criar segredo.
Esta ação carrega o ficheiro id_github
para o Secret Manager.
Adicione a chave pública de SSH às chaves de implementação do seu repositório privado
Inicie sessão no GitHub.
No canto superior direito, clique na sua foto do perfil e, de seguida, clique em O seu perfil.
Na página do seu perfil, clique em Repositórios e, de seguida, clique no nome do seu repositório.
No repositório, clique em Definições.
Na barra lateral, clique em Deploy Keys e, de seguida, em Add deploy key.
Indique um título e cole a chave SSH pública de
workingdir/id_github.pub
.Selecione Permitir acesso de escrita se quiser que esta chave tenha acesso de escrita ao repositório. Uma chave de implementação com acesso de escrita permite que uma implementação seja enviada para o repositório.
Clique em Adicionar chave.
Elimine a chave SSH do disco:
rm id_github*
Conceder autorizações
Tem de conceder autorização para aceder ao Secret Manager à conta de serviço que está a usar para a compilação.
-
Na Google Cloud consola, aceda à página settings Autorizações do Cloud Build:
Na lista pendente, selecione a conta de serviço cujas funções quer alterar.
Defina o estado da função
Secret Manager Secret Accessor
como Ativar.
Adicione a chave pública de SSH aos anfitriões conhecidos
A maioria das máquinas contém um ficheiro denominado known_hosts
, que contém chaves conhecidas para hosts remotos. As chaves são frequentemente recolhidas dos anfitriões remotos quando se ligam
aos mesmos pela primeira vez, mas também podem ser adicionadas manualmente. As chaves neste ficheiro são usadas para validar a identidade do anfitrião remoto e proteger contra roubo de identidade.
Para que o Cloud Build se ligue ao GitHub, tem de adicionar a chave SSH pública ao ficheiro known_hosts
no ambiente de compilação do Cloud Build. Pode fazê-lo adicionando a chave a um ficheiro known_hosts.github
temporário e, em seguida, copiando o conteúdo de known_hosts.github
para o ficheiro known_hosts
no ambiente de compilação do Cloud Build.
No diretório workingdir
, crie um ficheiro denominado known_hosts.github
e
adicione a chave SSH pública a este ficheiro:
ssh-keyscan -t rsa github.com > known_hosts.github
Na secção seguinte, quando configurar a compilação, vai adicionar instruções no ficheiro de configuração do Cloud Build para copiar o conteúdo de known_hosts.github
para o ficheiro known_hosts
no ambiente de compilação do Cloud Build.
Configure a compilação
Para configurar a compilação:
Crie um ficheiro de configuração de compilação denominado
cloudbuild.yaml
com dois passos: o primeiro passogcloud
acede à chave SSH no Secret Manager e guarda-a comoid_rsa
num volume denominadossh
, juntamente com uma cópia doknown_hosts.github
. O volume é usado para persistir ficheiros nos passos de compilação. O segundo passogit
usa a chave emid_rsa
para se ligar ao repositório emgit@github.com:git-username/git-repository
.# Access the id_github file from Secret Manager, and setup SSH steps: - name: 'gcr.io/cloud-builders/git' secretEnv: ['SSH_KEY'] entrypoint: 'bash' args: - -c - | echo "$$SSH_KEY" >> /root/.ssh/id_rsa chmod 400 /root/.ssh/id_rsa cp known_hosts.github /root/.ssh/known_hosts volumes: - name: 'ssh' path: /root/.ssh # Clone the repository - name: 'gcr.io/cloud-builders/git' args: - clone - --recurse-submodules - git@github.com:GIT_USERNAME/GIT_REPOSITORY volumes: - name: 'ssh' path: /root/.ssh availableSecrets: secretManager: - versionName: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest env: 'SSH_KEY'
Substitua os valores dos marcadores de posição nos comandos acima pelo seguinte:
GIT_USERNAME
: o nome de utilizador do GitHub do proprietário do repositório.GIT_REPOSITORY
: o nome do repositório do GitHub ao qual quer aceder.PROJECT_ID
: O ID do Google Cloud projeto onde armazenou os seus segredos.SECRET_NAME
: o nome do segredo que criou no Secret Manager.
Para saber mais sobre as strings multilinha YAML usadas no fragmento acima, consulte YAML multilinha.
Envie a compilação
Para enviar a compilação, execute o seguinte comando:
gcloud builds submit --config=cloudbuild.yaml .
O resultado é semelhante ao seguinte:
Creating temporary tarball archive of 3 file(s) totalling 4.1 KiB before compression.
Uploading tarball of [.] to [gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz]
Created [https://cloudbuild.googleapis.com/v1/projects/[PROJECT-ID]/builds/871b68bc---].
Logs are available at [https://console.cloud.google.com/cloud-build/builds/871b68bc---?project=[PROJECT-ID]].
----------------------------- REMOTE BUILD OUTPUT ------------------------------
starting build "871b68bc-cefc-4411-856c-2a2b7c7d2487"
FETCHSOURCE
Fetching storage object: gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178
Copying gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz#1504288640827178...
/ [1 files][ 3.9 KiB/ 3.9 KiB]
Operation completed over 1 objects/3.9 KiB.
BUILD
Step #0: Already have image (with digest): gcr.io/cloud-builders/gcloud
Starting Step #0
Finished Step #0
Step #1: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #1
Step #1: # github.com SSH-2.0-libssh_0.7.0
Finished Step #1
Step #2: Already have image (with digest): gcr.io/cloud-builders/git
Starting Step #2
Step #2: Cloning into '[REPOSITORY-NAME]'...
Step #2: Warning: Permanently added the RSA host key for IP address 'XXX.XXX.XXX.XXX' to the list of known hosts.
Finished Step #2
PUSH
DONE
-----------------------------------------------------------------------------------------------------------------
ID CREATE_TIME DURATION SOURCE IMAGES STATUS
871b68bc-cefc-4411-856c-2a2b7c7d2487 XXXX-XX-XXT17:57:21+00:00 13S gs://[PROJECT-ID]_cloudbuild/source/1504288639.02---.tgz - SUCCESS