Raspberry Pi como runner do GitHub Action

santospedroh

Pedro H. Santos

Posted on March 13, 2023

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
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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 utilizar 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
Enter fullscreen mode Exit fullscreen mode

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()
Enter fullscreen mode Exit fullscreen mode

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        
Enter fullscreen mode Exit fullscreen mode

Veja no YouTube como ficou o resultado final com o led piscando no Raspberry 🏮

Repositório GitHub - raspberry-pi-runner

💖 💪 🙅 🚩
santospedroh
Pedro H. Santos

Posted on March 13, 2023

Join Our Newsletter. No Spam, Only the good stuff.

Sign up to receive the latest update from our blog.

Related

Raspberry Pi como runner do GitHub Action