-
Notifications
You must be signed in to change notification settings - Fork 0
147 lines (138 loc) · 7.3 KB
/
Copy pathbuild.yml
File metadata and controls
147 lines (138 loc) · 7.3 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
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