Raspberry Pi como runner do GitHub Action

Raspberry Pi como runner do GitHub Action

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.

Image description

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.

Image description

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.

Image description

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. 🤓

Image description

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. 🚀

Image description

Image description

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:

Esquema eletronico

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