Raspberry Pi 🖱️ + GitHubActions 🤖
Estamos em 2023, o carnaval já passou e agora estou retomando meus estudos e laboratórios. Há alguns eu tive a ideia de utilizar o meu "Home Server" (foto abaixo) que no caso é um Raspberry Pi 4 como um Runner para executar processos de CI/CD no GitHub Actions.
Então neste artigo a ideia é exemplificar como configurar um self-hosted runner para utilizar em seus processos de CI/CD.
Eu utilizei como base para esse hands-on a documentação do oficial do GitHub, lá você irá encontrar todos os detalhes sobre sistemas operacionais suportados, arquitetura e mais detalhes das configurações possíveis.
Instalação e configuração do runner 🛠
Vamos lá! Você pode adicionar self hosted runners a nível de organização se utilizar o GitHub Corporativo. Assim todos os repositórios dentro daquela conta poderão utilizar os servidores configurados, ou você pode configurar a nível de repositório, que é como irei seguir por aqui.
O primeiro passo da configuração é ir no seu repositório em: Settings -> Actions -> Runners e clica no botão "New self-hosted runner", nesse momento você irá selecionar a arquitetura do servidor e o sistemas operacional.
Será exibido um passo-a-passo que precisar ser feito no servidor que será o runner.
Agora eu vou conectar no meu Raspberry Pi e executar o passo-a-passo informado para fazer instalação.
Download
# Create a folder
$ mkdir actions-runner && cd actions-runner
# Download the latest runner package
$ curl -o actions-runner-linux-arm64-2.302.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.302.1/actions-runner-linux-arm64-2.302.1.tar.gz
# Extract the installer
$ tar xzf ./actions-runner-linux-arm64-2.302.1.tar.gz
Configure
# Create the runner and start the configuration experience
$ ./config.sh --url https://github.com/santospedroh/raspberry-pi-runner --token XXXXXXXXXXXXXXXXXXXXXX
# Last step, run it!
$ ./run.sh
Após esses passos de instalação será exibida uma tela no seu terminal para que seja feita as configurações do self-hosted runner onde será solicitado o grupo do runner, nome do runner e diretório de working.
Após a instalação e configuração finalizadas com sucesso o runner precisar ser iniciado, utilizando o script run: $ ./
run.sh
.
Se tudo deu certo, o seu repositório já irá exibir o runner como Idle quer dizer que está ativo aguardando um Job para executar. 🤓
Testando um hello world 🌎
Na branch main do repositório eu deixei salvo um workflow que vai executar no Raspberry Pi que acabamos de configura como self-runner.
Abaixo dos detalhes do workflow:
name: workflow-raspberry
on:
push:
branches: [ "main" ]
jobs:
hello-world:
runs-on: self-hosted
steps:
- uses: actions/checkout@v3
- name: Run a one-line script
run: echo Hello, world in runner raspberry-pi
No comando run do workflow além da mensagem de hello world vou adicionar o comando uname -a
para exibir as informações do meu Raspberry Pi, assim que o commit for feito a action será disparada para execução. 🚀
Exemplo prático 💡
Já que agora já temos o runner instalado e configurado no Raspberry Pi para executar os jobs do GitHub Actions tive a ideia de fazer o deploy de um programinha em python para piscar um led utilizando as portas GPIO do Raspberry Pi.
Segue abaixo o esquema eletrônico com as conexões na GPIO:
Segue abaixo o código fonte que vou utilizar na branch ´feature/led´ é um código bem simples que faz o led piscar 10 vezes.
import RPi.GPIO as GPIO
import time
pinoLed = 12
cont = 10
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(12, GPIO.OUT)
print("---------- Inicio ----------")
for i in range(cont):
GPIO.output(pinoLed, GPIO.HIGH)
time.sleep(1)
GPIO.output(pinoLed, GPIO.LOW)
time.sleep(1)
i = i+1
print("Piscou... " + str(i) + " de " + str(cont) + "")
print("------------ Fim -----------")
GPIO.cleanup()
Também vamos precisar alterar o workflow para executar o código python dentro do runner Raspberry:
name: workflow-raspberry
on:
push:
branches: [ "main" ]
jobs:
hello-world:
runs-on: self-hosted
steps:
- uses: actions/checkout@v3
- name: Run a one-line script
run: echo Hello, world in runner raspberry-pi && uname -a
## Novo Job pisca led
led:
needs: hello-world
runs-on: self-hosted
steps:
- name: Run script python blink led 10x
run: python3 app/led.py
Veja no YouTube como ficou o resultado final com o led piscando no Raspberry 🏮
Repositório GitHub - raspberry-pi-runner