Skip to content

diario: LA FASE 3, PRIMERA SESIÓN (§4.82): hecho todo lo que no depen… #95

diario: LA FASE 3, PRIMERA SESIÓN (§4.82): hecho todo lo que no depen…

diario: LA FASE 3, PRIMERA SESIÓN (§4.82): hecho todo lo que no depen… #95

Workflow file for this run

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