Como configurar Github Actions Self-Hosted Runners no Docker Local para aplicações .NET na AWS.
Publicado em Novidades, Tutoriais, AWS, .NET, Terraform, Github, Github Actions, Docker, ARM64 data 08 Apr, 2023 por Victor Domingues ‐ 3 min de leitura
Olá, muito prazer me chamo Victor e sou desenvolvedor .NET. Hoje vamos falar um pouco sobre o Self-Hosted Runners do Github Actions que é um recurso que permite usar uma maquina na nuvem (Cloud) ou local para executar as actions do github. Você pode ver mais detalhes na documentação oficial About self-hosted runners - GitHub Docs.
No link a seguir temos o passo a passo de como configurar Adding self-hosted runners - GitHub Docs.
Caso de uso
Caso de uso: Imagine que você precise executar o build de uma aplicação que necessite de configurações bem especificas que os runners padrão do Github não atende ou que você tenha uma imagem Docker pré-configurada com tudo que você precisa para rodar os steps de build até mesmo em casos que você tenha limitações de arquitetura de CPU em seu ambiente de desenvolvimento local.
Para esse caso de uso vamos considerar usar um runner com a imagem base para .NET 7 da AWS em arquitetura ARM64 com dependência do Serverless Appllication Model (SAM) para executar a lambda na mesma arquitetura.
1. Ambiente
1.1. Instale o Docker:
1.2. Instale o Docker compose
Install the Compose plugin | Docker Docs
2. Instrumentação
Agora vamos ver como configuramos o ambiente local e Docker para rodar o Github Actions Self-Hosted Runner junto de uma imagem de .NET 7 na arquitetura ARM na AWS.
2.1. Docker-compose
crie um arquivo docker-compose.yml
Estamos subindo uma imagem Docker .NET 7 da AWS com o uso do SAM.
version: "3"
services:
aws-sam-dotnet7:
container_name: aws-sam-dotnet7
image: "public.ecr.aws/sam/build-dotnet7:latest-arm64"
restart: on-failure
command: ["sleep","infinity"]
Os comandos ["sleep","infinity"]
são para manter o container de pé.
Na mesma pasta do arquivo execute o comando docker-compose up
.
2.2. Configuração do Github Actions
Nas configurações da página da sua organização, acessa o submenu actions e em seguida acesse a opção runners, depois adicione um novo Self-hosted Runner
Organization > Settings > Actions > Runners
https://github.com/organizations/[SUA_ORGANIZACAO]/settings/actions/runners/new
Para esse exemplo configurei um Linux na arquitetura ARM64
2.3 Configurando o container
Siga as instruções descritas na própria documentação e não terá erro, para esse caso que estamos rodando em um container Docker precisamos acessar o bash do container e executar os comandos para configurar e executar os serviços do Github.
Copie exatamente os valores que o Github vai gerar automaticamente para você.
Os comandos demonstrados a seguir são apenas de exemplo:
Download
# Create a folder
$ mkdir actions-runner && cd actions-runner# Download the latest runner package
$ curl -o actions-runner-linux-arm64-2.309.0.tar.gz -L https://github.com/actions/runner/releases/download/v2.309.0/actions-runner-linux-arm64-2.309.0.tar.gz# Optional: Validate the hash
$ echo "XYZ actions-runner-linux-arm64-2.309.0.tar.gz" | shasum -a 256 -c# Extract the installer
$ tar xzf ./actions-runner-linux-arm64-2.309.0.tar.gz
Configure
# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/[ORGNALIZACAO] --token MEU_TOKEN# Last step, run it!
$ ./run.sh
Using your self-hosted runner
# Use this YAML in your workflow file for each job
runs-on: self-hosted
Depois de configurado no job do seu workflow basta informar que quer executa-lo como self-hosted
runs-on: self-hosted
Erros comuns no container linux
Ao rodar o comando
./run.sh
pode ocorrer o erroMust not run interactively with sudo
.
sh-4.2# ./run.sh
Must not run interactively with sudo
Exiting runner...
sh-4.2#
Solução:
Setar a variavel de ambiente RUNNER_ALLOW_RUNASROOT = “1”
export RUNNER_ALLOW_RUNASROOT="1"
Resultado
sh-4.2# ./run.sh
√ Connected to GitHub
Current runner version: '2.309.0'
2023-10-08 23:39:22Z: Listening for Jobs
2023-10-09 00:14:42Z: Running job: dotnet
2023-10-09 00:15:14Z: Job dotnet completed with result: Succeeded
2023-10-09 00:15:18Z: Running job: Upload Artifacts
2023-10-09 00:15:35Z: Job Upload Artifacts completed with result: Succeeded