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