Este tutorial mostra como usar executores autohospedados do GitHub em pools de trabalhadores para executar os fluxos de trabalho definidos no seu repositório do GitHub.
Você vai implantar um pool de workers do Cloud Run para processar essa carga de trabalho e, opcionalmente, uma função do Cloud Run para oferecer suporte ao escalonamento do pool de workers.
Sobre executores auto-hospedados do GitHub
Em um fluxo de trabalho do GitHub Actions, os executores são as máquinas que executam jobs. Por exemplo, um executor pode clonar seu repositório localmente, instalar um software de teste e executar comandos que avaliam seu código.
É possível usar executores auto-hospedados para executar ações do GitHub em instâncias de pool de trabalhadores do Cloud Run. Este tutorial mostra como escalonar automaticamente um pool de executores com base no número de jobs em execução e não programados, até mesmo escalonando o pool para zero quando não há jobs.
Objetivos
Com este tutorial, você vai:
- Implante um pool de workers do Cloud Run no Cloud Run.
- Implante uma função do Cloud Run para oferecer suporte ao escalonamento do pool de workers.
- Crie secrets do Secret Manager para armazenar tokens e secrets com segurança.
- Implante um runner autohospedado do GitHub para oferecer suporte a um repositório do GitHub.
Custos
Neste documento, você vai usar os seguintes componentes faturáveis do Google Cloud:
Para gerar uma estimativa de custo baseada na sua projeção de uso, utilize a calculadora de preços.
Antes de começar
- Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
Roles required to select or create a project
- Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
-
Create a project: To create a project, you need the Project Creator role
(
roles/resourcemanager.projectCreator), which contains theresourcemanager.projects.createpermission. Learn how to grant roles.
-
Verify that billing is enabled for your Google Cloud project.
-
Enable the Cloud Run, Secret Manager, Artifact Registry, and Cloud Build APIs.
Roles required to enable APIs
To enable APIs, you need the Service Usage Admin IAM role (
roles/serviceusage.serviceUsageAdmin), which contains theserviceusage.services.enablepermission. Learn how to grant roles. -
Administrador do repositório do Artifact Registry (
roles/artifactregistry.repoAdmin) -
Editor do Cloud Build (
roles/cloudbuild.builds.editor) -
Administrador do Cloud Run (
roles/run.admin) -
Criar contas de serviço (
roles/iam.serviceAccountCreator) -
Administrador do Secret Manager (
roles/secretmanager.admin) -
Usuário da conta de serviço (
roles/iam.serviceAccountUser) -
Consumidor do Service Usage (
roles/serviceusage.serviceUsageConsumer)
Funções exigidas
Para conseguir as permissões necessárias a fim de concluir o tutorial, peça ao administrador para conceder a você os seguintes papéis do IAM no projeto:
Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.
Também é possível conseguir as permissões necessárias por meio de papéis personalizados ou de outros papéis predefinidos.
Você precisa de permissão para editar as configurações de um repositório do GitHub e configurar os executores autohospedados. O repositório pode ser de propriedade do usuário ou de uma organização.
Recuperar a amostra de código
Para recuperar o exemplo de código para uso, siga estas etapas:
Clone o repositório de amostra na sua máquina local:
git clone https://github.com/GoogleCloudPlatform/cloud-run-samplesMude para o diretório que contém o código de amostra do Cloud Run:
cd cloud-run-samples/github-runner
Entenda o código principal
A amostra é implementada como um pool de workers e um escalonador automático, conforme descrito a seguir.
Pool de workers
O pool de workers é configurado com um Dockerfile baseado na imagem actions/runner criada pelo GitHub.
Toda a lógica está contida nessa imagem, exceto um pequeno script auxiliar.
Esse script auxiliar é executado quando o contêiner é iniciado, registrando-se no repositório configurado como uma instância efêmera, usando um token que você vai criar. O script também define quais ações serão realizadas quando o contêiner for reduzido.
Escalonador automático
O autoescalador é uma função que aumenta o pool de workers quando há um novo job na fila ou diminui quando um job é concluído. Ela usa a API Cloud Run para verificar o número atual de workers no pool e ajusta esse valor conforme necessário.
Configurar o IAM
Este tutorial usa uma conta de serviço personalizada com as permissões mínimas necessárias para usar os recursos provisionados. Para configurar a conta de serviço, faça o seguinte:
Defina o ID do projeto em
gcloud:gcloud config set project PROJECT_IDSubstitua PROJECT_ID pela ID do seu projeto.
Crie uma conta de serviço do Identity and Access Management:
gcloud iam service-accounts create gh-runnersConceda à conta de serviço permissões para atuar como uma conta de serviço no seu projeto:
gcloud projects add-iam-policy-binding PROJECT_ID \ --member "serviceAccount:gh-runners@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/iam.serviceAccountUserSubstitua PROJECT_ID pela ID do seu projeto.
Recuperar informações do GitHub
A documentação do GitHub sobre como adicionar executores autohospedados sugere adicionar executores pelo site do GitHub, que fornece um token específico para usar na autenticação.
Este tutorial adiciona e remove executores de forma dinâmica e precisa de um token estático do GitHub para isso.
Para concluir este tutorial, crie um token do GitHub com acesso para interagir com o repositório selecionado.
Identificar o repositório do GitHub
Neste tutorial, a variável GITHUB_REPO representa o nome do repositório. É a parte do nome do repositório do GitHub que vem depois do nome de domínio, tanto para repositórios de usuários pessoais quanto de organizações.
Você vai referenciar o nome do repositório que vem depois do nome de domínio para repositórios de usuários e organizações.
Neste tutorial:
- Para
https://github.com/myuser/myrepo, o GITHUB_REPO émyuser/myrepo. - Para
https://github.com/mycompany/ourrepo, o GITHUB_REPO émycompany/ourrepo.
Criar token de acesso
Você precisa criar um token de acesso no GitHub e salvá-lo com segurança no Secret Manager:
- Confira se você fez login na sua conta do GitHub.
- Acesse a página Configurações > Configurações do desenvolvedor > Tokens de acesso pessoal do GitHub.
- Clique em Gerar novo token e selecione Gerar novo token (clássico).
- Crie um novo token com o escopo "repo".
- Clique em Gerar token.
- Copie o token gerado.
Criar valor do secret
Pegue o token secreto que você acabou de criar, armazene-o no Secret Manager e defina permissões de acesso.
Crie o secret no Secret Manager:
echo -n "GITHUB_TOKEN" | gcloud secrets create github_runner_token --data-file=-Substitua GITHUB_TOKEN pelo valor que você copiou do GitHub.
Conceda acesso ao secret recém-criado:
gcloud secrets add-iam-policy-binding github_runner_token \ --member "serviceAccount:gh-runners@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/secretmanager.secretAccessor"
Implantar pool de workers
Crie um pool de workers do Cloud Run para processar ações do GitHub. Esse pool vai usar uma imagem baseada na imagem actions/runner criada pelo GitHub.
Configurar o pool de workers do Cloud Run
Navegue até o exemplo de código do pool de worker:
cd worker-pool-containerImplante o pool de workers:
gcloud beta run worker-pools deploy WORKER_POOL_NAME \ --region WORKER_POOL_LOCATION \ --source . \ --scaling 1 \ --set-env-vars GITHUB_REPO=GITHUB_REPO \ --set-secrets GITHUB_TOKEN=github_runner_token:latest \ --service-account gh-runners@PROJECT_ID.iam.gserviceaccount.com \ --memory 2Gi \ --cpu 4Substitua:
- WORKER_POOL_NAME: o nome do pool de workers
- WORKER_POOL_LOCATION a região do pool de workers
- GITHUB_REPO o nome do repositório do GitHub identificado
- PROJECT_ID o ID do projeto Google Cloud
Se esta for a primeira vez que você usa implantações de origem do Cloud Run neste projeto, será solicitado que você crie um repositório padrão do Artifact Registry.
Como usar o pool de workers
Agora você tem uma única instância no seu pool de trabalhadores, pronta para aceitar jobs das ações do GitHub.
Para verificar se você concluiu a configuração do executor autohospedado, invoque uma ação do GitHub no seu repositório.
Para que sua ação use os executores auto-hospedados, mude um
trabalho de
ação do GitHub.
No job, mude o valor de runs-on para self-hosted.
Se o repositório ainda não tiver nenhuma ação, siga o início rápido para o GitHub Actions.
Depois de configurar uma ação para usar os executores autohospedados, execute-a.
Confirme se a ação foi concluída na interface do GitHub.
Implantar o escalonador automático do runner do GitHub
Você implantou um worker no pool original, o que permite o processamento de uma ação por vez. Dependendo do uso da CI, talvez seja necessário escalonar seu pool para lidar com um fluxo de trabalho a ser feito.
Depois de implantar o pool de workers com um runner do GitHub ativo, configure o escalonador automático para provisionar instâncias de worker com base no status do job na fila de ações.
Essa implementação detecta um evento
workflow_job. Quando um job de fluxo de trabalho é criado, ele aumenta a escala do pool de workers e, quando o job é concluído, diminui a escala novamente. Ele não vai escalonar o pool além do número máximo de instâncias configuradas e vai escalonar para zero quando todos os jobs em execução forem concluídos.
É possível adaptar esse escalonador automático com base nas suas cargas de trabalho.
Criar valor de secret do webhook
Para criar um valor secreto para o webhook, faça o seguinte:
Crie um secret do Secret Manager que contenha um valor de string arbitrário.
echo -n "WEBHOOK_SECRET" | gcloud secrets create github_webhook_secret --data-file=-Substitua WEBHOOK_SECRET por um valor de string arbitrário.
Conceda acesso ao secret para a conta de serviço do escalonador automático:
gcloud secrets add-iam-policy-binding github_webhook_secret \ --member "serviceAccount:gh-runners@PROJECT_ID.iam.gserviceaccount.com" \ --role "roles/secretmanager.secretAccessor"
Implantar a função para receber solicitações de webhook
Para implantar a função de recebimento de solicitações de webhook, faça o seguinte:
Navegue até o exemplo de código do webhook:
cd ../autoscalerImplante a Cloud Run function
gcloud run deploy github-runner-autoscaler \ --function github_webhook_handler \ --region WORKER_POOL_LOCATION \ --source . \ --set-env-vars GITHUB_REPO=GITHUB_REPO \ --set-env-vars WORKER_POOL_NAME=WORKER_POOL_NAME \ --set-env-vars WORKER_POOL_LOCATION=WORKER_POOL_LOCATION \ --set-env-vars MAX_RUNNERS=5 \ --set-secrets GITHUB_TOKEN=github_runner_token:latest \ --set-secrets WEBHOOK_SECRET=github_webhook_secret:latest \ --service-account gh-runners@PROJECT_ID.iam.gserviceaccount.com \ --allow-unauthenticatedSubstitua:
- GITHUB_REPO a parte do nome do repositório do GitHub depois do nome de domínio
- WORKER_POOL_NAME: o nome do pool de workers
- WORKER_POOL_LOCATION a região do pool de workers
- REPOSITORY_NAME o nome do repositório do GitHub
Anote o URL em que seu serviço foi implantado. Você vai usar esse valor em uma etapa posterior.
Conceda permissões à conta de serviço para atualizar seu pool de workers:
gcloud alpha run worker-pools add-iam-policy-binding WORKER_POOL_NAME \ --member "serviceAccount:gh-runners@PROJECT_ID.iam.gserviceaccount.com" \ --role=roles/run.developerSubstitua PROJECT_ID pela ID do seu projeto.
Criar webhook do GitHub
Para criar o webhook do GitHub, siga estas etapas:
- Confira se você fez login na sua conta do GitHub.
- Navegue até seu repositório do GitHub.
- Clique em Configurações.
- Em "Código e automação", clique em Webhooks.
- Clique em Add webhook.
Digite o seguinte:
Em URL de payload, insira o URL da função do Cloud Run que você implantou anteriormente.
O URL vai ser parecido com este:
https://github-runner-autoscaler-PROJECTNUM.REGION.run.app, em que PROJECTNUM é o identificador numérico exclusivo do seu projeto e REGION é a região em que você implantou o serviço.Em Tipo de conteúdo, selecione application/json.
Em Secret, insira o valor de WEBHOOK_SECRET criado anteriormente.
Em Verificação SSL, selecione Ativar verificação SSL.
Em "Quais eventos você quer acionar com este webhook?", selecione Quero selecionar eventos individuais.
Na seleção de eventos, escolha Jobs de fluxo de trabalho. Desmarque qualquer outra opção.
Clique em Add webhook.
Reduzir a escala do pool de workers
O webhook já está no lugar, então você não precisa ter um worker persistente no pool. Isso também garante que não haja trabalhadores em execução quando não houver trabalho a ser feito, reduzindo os custos.
Ajuste o pool para escalonar para zero:
gcloud beta run worker-pools update WORKER_POOL_NAME \ --region WORKER_POOL_LOCATION \ --scaling 0
Usar o runner de escalonamento automático
Para verificar se o executor de escalonamento automático está funcionando corretamente, execute uma ação que você configurou anteriormente para runs-on: self-hosted.
Você pode acompanhar o progresso das ações do GitHub na guia "Ações" do seu repositório.
Para verificar a execução da função de webhook e do pool de trabalhadores, acesse a guia "Registros" da função do Cloud Run e do pool de trabalhadores do Cloud Run respectivamente.
Limpar
Para evitar cobranças extras na sua conta do Google Cloud , exclua todos os recursos implantados com este tutorial.
Excluir o projeto
Se você criou um novo projeto para este tutorial, exclua-o. Se você usou um projeto atual e precisa mantê-lo sem as mudanças adicionadas neste tutorial, exclua os recursos criados para o tutorial.
O jeito mais fácil de evitar cobranças é excluindo o projeto que você criou para o tutorial.
Para excluir o projeto:
- In the Google Cloud console, go to the Manage resources page.
- In the project list, select the project that you want to delete, and then click Delete.
- In the dialog, type the project ID, and then click Shut down to delete the project.
Excluir recursos do tutorial
Exclua o serviço do Cloud Run que você implantou neste tutorial. Os serviços do Cloud Run não geram custos até receberem solicitações.
Para excluir o serviço do Cloud Run, execute o seguinte comando:
gcloud run services delete SERVICE-NAME
SERVICE-NAME pelo nome do serviço;
Também é possível excluir os serviços do Cloud Run no console doGoogle Cloud .
Remova a configuração da região padrão do
gcloudque você adicionou durante a configuração do tutorial:gcloud config unset run/regionRemova a configuração do projeto:
gcloud config unset projectExclua outros recursos do Google Cloud criados neste tutorial:
A seguir
- Saiba mais sobre os pools de workers do Cloud Run
- Conheça outras demonstrações, tutoriais e amostras do Cloud Run