La decisión de Jorge sobre el hierro arm64 («sólo lo puedo mirar en e… #106
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: build | |
| on: | |
| push: | |
| pull_request: | |
| # Disparo manual. Ademas de ser comodo para relanzar sin tocar el codigo, | |
| # es la unica via cuando GitHub tiene throttled los webhooks: durante la | |
| # incidencia de Actions del 2026-08-06 los push no creaban ejecuciones y | |
| # workflow_dispatch si. | |
| workflow_dispatch: | |
| jobs: | |
| # LOS BANCOS QUE NO NECESITAN MAQUINA NI ISO, en cada push (tarea 6 de | |
| # tareas/refactorizacion.md, 2026-08-28). Hasta ese dia habia cinco bancos con | |
| # cinco puntos de entrada y la CI no corria ninguno: solo corrian si alguien | |
| # se acordaba. 'make bancos' es UNA orden, para en el primero que falle y sale | |
| # distinto de cero, y es la misma orden que en el Mac. El sabotaje de siempre | |
| # esta pagado en local (un banco roto a proposito pone esto en rojo por ese | |
| # motivo, MEDICIONES.md §4.80) y no aqui: romper la CI a proposito exige un | |
| # push, y eso es de Jorge. | |
| bancos: | |
| name: bancos · enlaces, vigencia, ci-copias, versiones, cadena, veredicto, conteo, shellcheck | |
| runs-on: ubuntu-24.04 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Instalar lo que necesitan los bancos | |
| run: | | |
| sudo apt-get update | |
| # ffmpeg: banco-veredicto.sh mide los pixeles de sus capturas de control. | |
| # shellcheck: bancos/shellcheck.sh usa el binario si lo hay (en el Mac | |
| # no lo hay y va por docker). | |
| sudo apt-get install -y ffmpeg shellcheck | |
| - name: make bancos | |
| run: make bancos | |
| build: | |
| name: ${{ matrix.arch }} · ${{ matrix.package }} | |
| # Las dos arquitecturas, y no por simetria (2026-08-23, MEDICIONES.md | |
| # §4.69): arm64 es el producto que D9 declara y hasta hoy era la UNICA que | |
| # no construia ninguna maquina automatica. Los tres .deb son | |
| # 'Architecture: all', asi que las dos filas tienen que dar el MISMO byte | |
| # y cuadrar con la misma huella del manifiesto; si un dia no lo hacen, | |
| # eso es un hallazgo de reproducibilidad y no un fallo de la matriz. | |
| # 'ubuntu-24.04' en vez de 'ubuntu-latest' porque es lo que 'latest' | |
| # resolvia ya (imagen ubuntu-24.04, medido en la ejecucion 32635412798) | |
| # y porque la fila arm64 no tiene alias: las dos van con el nombre puesto. | |
| runs-on: ${{ matrix.runner }} | |
| strategy: | |
| fail-fast: false | |
| # Cada paquete tiene su propio script de construccion, asi que la matriz | |
| # lleva las dos cosas emparejadas. Antes solo listaba el nombre y no lo | |
| # usaba en ningun sitio: el paso ejecutaba siempre construir-branding.sh y | |
| # subia debian-packages/*.deb, de modo que anadir una entrada mas habria | |
| # construido encina-branding dos veces sin que se notara. | |
| # | |
| # La forma es la de «expanding configurations» de GitHub: 'arch' y | |
| # 'package' son los ejes (2 x 3 = 6 trabajos), y cada 'include' ANADE | |
| # una clave a las combinaciones cuyo eje coincide -el runner a las de su | |
| # arch, el guion a las de su package- sin crear combinaciones nuevas. | |
| matrix: | |
| arch: [amd64, arm64] | |
| package: [encina-branding, encina-firefox-native, encina-meta] | |
| include: | |
| - arch: amd64 | |
| runner: ubuntu-24.04 | |
| - arch: arm64 | |
| runner: ubuntu-24.04-arm | |
| - package: encina-branding | |
| script: scripts/construir-branding.sh | |
| - package: encina-firefox-native | |
| script: scripts/construir-firefox.sh | |
| # encina-meta entra en la matriz en el MISMO commit que su | |
| # debian/changelog, y no antes: construir-meta.sh se detiene sin | |
| # construir nada si no lo encuentra, asi que una entrada de matriz sin | |
| # changelog pondria la CI roja a sabiendas. | |
| - package: encina-meta | |
| script: scripts/construir-meta.sh | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - name: Instalar dependencias de construcción | |
| run: | | |
| sudo apt-get update | |
| # build-essential es dependencia de construccion implicita de todo | |
| # paquete Debian: sin el, dpkg-checkbuilddeps aborta con | |
| # "Unmet build dependencies: build-essential:native". En una VM de | |
| # desarrollo suele estar ya puesto porque devscripts lo recomienda, | |
| # asi que este fallo SOLO se manifiesta en el runner. | |
| # | |
| # gnupg lo necesita construir-firefox.sh para verificar la huella | |
| # de la clave de firma de Mozilla. | |
| sudo apt-get install -y build-essential devscripts debhelper lintian gnupg | |
| - name: Construir y validar ${{ matrix.package }} | |
| run: | | |
| chmod +x scripts/*.sh | |
| ENCINA_REPO="$GITHUB_WORKSPACE" ./${{ matrix.script }} | |
| # EL CONTROL VA ANTES QUE LA MEDICION, que es el orden que sirve: primero | |
| # se calibra el instrumento y despues se mide con el. Si el paso de abajo | |
| # dijera [OK] sin comprobar nada, este lo caza aqui y no dentro de tres | |
| # meses. | |
| - name: CONTROL — con la huella saboteada tiene que ponerse en rojo | |
| run: | | |
| set -u | |
| M=$(mktemp); LOG=$(mktemp) | |
| awk -F'\t' -v OFS='\t' -v p='${{ matrix.package }}' \ | |
| '$1=="PROPIO" && $2==p { c=substr($6,1,1); $6=(c=="0"?"1":"0") substr($6,2) } 1' \ | |
| imagen/repo-manifiesto.tsv > "$M" | |
| # El sabotaje tiene que sabotear. En §4.37c un 'sed 1s/^./f/' no | |
| # cambio nada porque la linea ya empezaba por 'f': un sabotaje que no | |
| # sabotea deja el control en decoracion. | |
| if cmp -s imagen/repo-manifiesto.tsv "$M"; then | |
| echo "[FALLO] el manifiesto saboteado es identico al original"; exit 1 | |
| fi | |
| if ./imagen/comprobar-propios.sh '${{ matrix.package }}' --manifiesto "$M" >"$LOG" 2>&1; then | |
| echo "[FALLO] dice que cuadra con una huella falsa: no comprueba nada" | |
| cat "$LOG"; exit 1 | |
| fi | |
| # Y que falle POR EL MOTIVO CORRECTO, no por un error de sintaxis: es | |
| # la trampa del control negativo que no es negativo (§9). | |
| grep -q '^\[HALLAZGO\]' "$LOG" \ | |
| || { echo "[FALLO] fallo, pero no por la huella"; cat "$LOG"; exit 1; } | |
| echo "[OK] sabe decir que no: $(grep -m1 '^\[HALLAZGO\]' "$LOG")" | |
| # Y AHORA LA MEDICION DE VERDAD. Las huellas del manifiesto se midieron en | |
| # encina-dev, que es arm64; hasta el 2026-08-23 este runner era solo | |
| # amd64, y desde entonces la matriz lo mide en las dos. Que el paso anterior | |
| # subiera el .deb a un artefacto sin mirarlo no comprobaba nada: un | |
| # artefacto se sube igual de bien con otros bytes dentro. | |
| - name: Comprobar la huella de ${{ matrix.package }} contra el manifiesto | |
| run: ./imagen/comprobar-propios.sh '${{ matrix.package }}' | |
| # always(): si la huella NO cuadra, el .deb del runner es justamente lo | |
| # que hay que desglosar contra el de arm64, asi que es cuando mas falta | |
| # hace tenerlo. El nombre lleva la arquitectura porque upload-artifact@v4 | |
| # se niega a subir dos artefactos con el mismo nombre en una ejecucion: | |
| # con la matriz de dos filas, '<package>-deb' a secas habria puesto en | |
| # rojo a la segunda fila en llegar, fuera cual fuera. | |
| - name: Subir el paquete como artefacto | |
| if: always() | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.package }}-${{ matrix.arch }}-deb | |
| path: debian-packages/${{ matrix.package }}_*.deb | |
| if-no-files-found: error |