Raspberry Pi como runner do GitHub Action
Tags: raspberrypi, githubactions, devops, github
Published: 2023-03-13 22:40:37

## 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](https://www.raspberrypi.com/) como um Runner para executar processos de CI/CD no [GitHub Actions](https://github.com/features/actions).

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ew5y7xuo6h7kld9mbdzp.jpg)

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](https://docs.github.com/en/actions/hosting-your-own-runners/about-self-hosted-runners), 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](https://docs.github.com/pt/enterprise-cloud@latest/admin/overview/about-enterprise-accounts). 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u7k7l0aqgm1iziib3f00.gif)

Agora eu vou conectar no meu Raspberry Pi e executar o passo-a-passo informado para fazer instalação.

**Download**

```bash
# 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**

```bash
# 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/th35zw841ouiaxhxg2l4.png)

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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ueww284102i6k1jfpx9r.gif)

## 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:

```yaml
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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cae0x4pzez2owiw560er.png)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e31q61lxqpds5zyy12hn.png)

## 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](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/68nwyb0u215tmn22736v.png)

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.

```python
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:

```yaml
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 🏮

{% embed https://www.youtube.com/watch?v=_tl1sIPXpPo %}

Repositório GitHub - [raspberry-pi-runner](https://github.com/santospedroh/raspberry-pi-runner/tree/feature/ledr)