DEV Community

Cover image for Raspberry Pi como runner do GitHub Action
Pedro H. Santos
Pedro H. Santos

Posted on

2 1 1

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

Heroku

Built for developers, by developers.

Whether you're building a simple prototype or a business-critical product, Heroku's fully-managed platform gives you the simplest path to delivering apps quickly — using the tools and languages you already love!

Learn More

Top comments (0)

Quickstart image

Django MongoDB Backend Quickstart! A Step-by-Step Tutorial

Get up and running with the new Django MongoDB Backend Python library! This tutorial covers creating a Django application, connecting it to MongoDB Atlas, performing CRUD operations, and configuring the Django admin for MongoDB.

Watch full video →

👋 Kindness is contagious

Explore a trove of insights in this engaging article, celebrated within our welcoming DEV Community. Developers from every background are invited to join and enhance our shared wisdom.

A genuine "thank you" can truly uplift someone’s day. Feel free to express your gratitude in the comments below!

On DEV, our collective exchange of knowledge lightens the road ahead and strengthens our community bonds. Found something valuable here? A small thank you to the author can make a big difference.

Okay