Actions - Jusaba/Domo-Serverpic GitHub Wiki

Actions es una solución de integración continua en GitHub.

Vamos a utilizar Actions para compilar y distribuir las nuevas versiones del software de los dispositivos. Para conseguirlo, es imprescindible configuras GitHub Actions de forma que cuando subamos una nueva versión de software a GitHub se desencadenen las acciones para compilar esta nueva versión y se distribuya entre los dispositivos que utilicen ese software.

Para que Actions actue en GitHub, incluiremos un fichero build.yml en .github\workflows en nuestra carpeta de trabajo

build.yml

Como ejemplo, esto sería el build.yml debidamente comentado para el proyecto TermostatoM5Dial

name: Build de TermostatoM5Dial

on:
  push:
    branches:
      - main

jobs:
  build:
    runs-on: ubuntu-latest

    steps:
      - name: Clonar codigo
        uses: actions/checkout@v4

      # Ponemos en ServePic.h el numero de version correspondiente a la Build actual (github.run_number)
      - name: Cambio de version                                             
        run: |
          nLinea=$(grep "#define VBuild" -n ServerPic.h | cut -d ":" -f 1 )
          sed -i "${nLinea} d" ServerPic.h
          sed -i "${nLinea} s|^|\t#define VBuild  \"${{ github.run_number }}\"\n|" ServerPic.h
      
      # Hacemos Push del nuevo ServerPic.h con el comentario [skip ci] para no volver a 'disparar' Actions 
      - name: Commit version update
        run: |
          git config --global user.name 'Github action'
          git config --global user.email 'jsbpublico@gmail.com'
          git add . "ServerPic.h"
          git commit -am "[skip ci] version actualizada"
          git push
      
      # Creamos en el espacio de trabajo los direcotrios librerias y librerias/Serverpic
      # En librerias copiaremos las carpetas de jusaba/Librerias-Cli
      # En librerias/Serverpic dejaremos los ficheros correrspondientes a la libreria de Serverpic almacenados en jusaba/LibreriasServerpic
      - name: Crear carpetas librerias
        run: |
          mkdir librerias
          mkdir librerias/ServerPic

      # Copiamos en  librerias/ServerPic el contenido del repositorio  jusaba/LibreriasServerpic
      - name: Clonar repositorio librerias Serverpic
        uses: actions/checkout@v4
        with:
          repository: jusaba/LibreriasServerpic
          path: librerias/ServerPic
          ref: master
          token: ${{ secrets.gh_token }}

      # Copiamos las librerias Serverpic que hemos guardado en el directorio Librerias        
      - name: Copia librerias serverpic
        run: |
          cp -r librerias/ServerPic Librerias
      
      # Copiamos en  librerias el contenido del repositorio  jusaba/Librerias-Cli que coincide con todas las librerias que tenemos para IDE Arduino en Local
      - name: Clonar repositorio librerias Arduino-Cli
        uses: actions/checkout@v4
        with:
          repository: jusaba/Librerias-Cli
          path: librerias
          ref: main
          token: ${{ secrets.gh_token }}

      # Copiamos en Librerias las librerias que necesita el proyecto
      - name: Copia librerias para proyecto
        run: |
          cp -r librerias/AsyncTC Librerias
          cp -r librerias/ESPAsyncWebServer Librerias/ESPAsyncWebServer
          cp -r librerias/DFRobot_SHT20-master Librerias/DFRobot_SHT20
          cp -r librerias/esp32-http-update-master Librerias/esp32-http-update-master
          cp -r librerias/M5Dial-master Librerias/M5Dial-master
          cp -r librerias/M5GFX Librerias/M5GFX
          cp -r librerias/M5Stack Librerias/M5Stack
          cp -r librerias/M5Unified Librerias/M5Unified

      # Llamamos a boardlist.sh que es un ficehro bash que recorrera todos los hardwares utilizados
      # y llamara a Docker ESP32-Cli con los parametro necesarios para cada Hardware   
      # A boardlist.sh le pasamos los parametros Numero de compilacion y Nombre del area de trabajo 
      - name: Leer líneas de Hardware y Compilar
        run: |
          sh boardlist.sh ${{ github.run_number }} ${{ github.workspace }}

Como se observa, en build.yml, para acceder a otros repositorios utilizamos la variable secreta gh_token. En el siguiente apartado se detalla como crear esa variable y como se congfigura el repositorio para que Actions pueda actuar.

Configuracion GitHub

Lo primero que debenmos conseguir es el Token por si desde el repositorio se debe acceder a otros repositorios de la misma cuenta, para ello, primero vamos a la opcion Settings de la cuenta.

Ahora se debe seleccionar Developer settings

Seleccionamos ahora la opción Personal access tokens

Pulsamos el boton Generate New Token y nos aparece una ventana para generar el Token, en esa ventana ponemos una referencia para el Token Token Actions, le decimos que no expire y autorizamos todos los permisos

Pulsamos el boton Generate Token

La siguiente pantalla es la presentación de la clave Token que necesitaremos para configurar Acceder a los repositorios desde Actions. Se debe copiar uy guardar el Token porque se necesitará en cada uno de lso repositoriosa los que queramos agregar Actions y ya no podremos volver a obtener el contenido del Token desde Github

Ya tenemos el Token, para utilizarlo desde build.yml lo tenemos que registrar en el repositorio con el que vamos a trabajar, en este caso TermostatoM5Dial.

Vamos a Settings del repositorio

En el menu izquierdo, seleccionamos Actions en Secrets and variables

Ahora, en la pestaña Secrets pulsamos el boton New repository secret

Escribimos el nombre del Token ( nen nuestro caso gh_token ) y escribimos el contenido del Token que habíamso copiado y depositado en un sitio seguro anteriormente.

Pulsamos el boton Add secret y listo, ya tenmos gh_token disponible para build.yml

Además de registrar el Token, para que Actions funcione, en el mismo menu izquierdo, ahora debemos ir a la opcion General de Actions

y Salvar la siguiente confoiguracion

boardlist.sh

Siguiendo con el mismo ejemoplo TermostatoM5Dial, el bash boardlist.sh sería de la siguiente forma

# Genera el fichero parametros.env para pasar parametros al contenedor Docker. Como contenido incluye el nombre del ino y el fqbn del hardware utilizado
# _ino="TermostatoM5Dial.ino"
# _fqbn=esp32:esp32:stamp-s3 
Genera_Parametros () {
    rm parametros.env
    touch parametros.env
    echo _ino="TermostatoM5Dial" | tee parametros.env
    case $1 in
        "STAMP-S3")
                echo _fqbn=esp32:esp32:stamp-s3 | tee -a parametros.env
                ;;
    esac
}

#Recorremos todos los Hardwares que utilizan este ino
for cLinea in $(cat hardware)

do
echo "------------------------"
echo $cLinea
echo "-------------------------"

 # Si existe un hardware leido 
 if [ !  -z $cLinea ];then
       
        nLinea=$(grep "//Hardware Utilizado" -n ServerPic.h | cut -d ":" -f 1 )     #Buscamos la linea en ServerPic.h donde poner el hardware obtenido del fiochero harwad
        #------------------------------------------------------------------------------------------------
        # Ponemos en ServerPic.h el hardware con el que compilar
        #------------------------------------------------------------------------------------------------
        nLinea=$((nLinea+2))
        sed -i "${nLinea}d" ServerPic.h                                             #Borramos la linea donde vamos a grabar el nombre del hardware    
        sed -i "${nLinea} s|^|  #define  ${cLinea}\n|" ServerPic.h                  #Agregamos la linea con el hardware adecuado    
        
        nLinea=$(grep "#ifdef ${cLinea}" -n ServerPic.h | cut -d ":" -f 1 )         #Buscamos la linea en ServerPic.h donde esta el modelo de placa leido en hardware
        #------------------------------------------------------------------------------------------------
        # Para ese hardware, exraemos de ServerPic.h del modelo de ESP que corresponde
        #------------------------------------------------------------------------------------------------
        nLineaTmp=$nLinea
        while [  ! "$(awk  "NR==${nLineaTmp}"  ServerPic.h| grep '#define Modelo' )" ]; do
                nLineaTmp=$((nLineaTmp+1))
        done
        cModelo=$(sed -n $nLineaTmp'p' ServerPic.h| cut -d " " -f 3 | sed 's/"//g')
        cModelo="${cModelo#"${cModelo%%[![:space:]]*}"}"
        cModelo="${cModelo%"${cModelo##*[![:space:]]}"}"
        #------------------------------------------------------------------------------------------------
        # Para ese hardware, exraemos de ServerPic.h el Ino que corresponde
        #------------------------------------------------------------------------------------------------
        nLineaTmp=$nLinea
        while [  ! "$(awk  "NR==${nLineaTmp}"  ServerPic.h| grep '#define Ino' )" ]; do
                nLineaTmp=$((nLineaTmp+1))
        done
        cIno=$(sed -n $nLineaTmp'p' ServerPic.h | cut -d " " -f 3 | sed 's/"//g')
        cIno="${cIno#"${cIno%%[![:space:]]*}"}"
        cIno="${cIno%"${cIno##*[![:space:]]}"}"
        #------------------------------------------------------------------------------------------------
        #Generamos el fichero parametros.env con los datos del modelo ESP y el nombre del ino
        #------------------------------------------------------------------------------------------------
        Genera_Parametros $cModelo


        #Elaboramos el nombre del bin que correpsonde a este Hardware con su numero de version
        #y recuperamos el nombre original (master) del bin
        cInoVersion=$cIno"_$1.bin"
        cInoTmp="TermostatoM5Dial.bin"

        #Llamamos al contenedor Docker 
        #Para mas informacion de la imagen docker, visitar 
        #       https://github.com/Jusaba/esp32-cli 
        #       o 
        #       https://hub.docker.com/repository/docker/jusaba/esp32-cli/general

        docker run --rm -v ${2}/Librerias:/root/Arduino/libraries -v ${2}:/home/bin/esp32 --env-file parametros.env -i jusaba/esp32-cli:latest

        # Renombremos el bin master al bin con numero de version correspondiente a este hardware

        mv $cInoTmp $cInoVersion

        # Subimos el bin obtenido a Serverpic
        curl  http://picservertest.jusaba.es:2001/firmware -F "file=@$cInoVersion"


 fi
done