todos-contra-el-fuego-web/.forgejo/workflows/build-image.yml
vjrj 6aa057f739
Some checks failed
build-image / build (push) Failing after 8s
staging: la web se descarga del registry, no se compila en groucho
Cloudflare ya no esta delante de git.comunes.org, asi que el registry de Forgejo acepta
la capa de 508 MB del bundle (comprobado: subida completa desde groucho, la imagen esta
en comunes/-/packages/container/tcef-web con los tags meteor3 y a24c7a567c).

- compose: `build:` -> `image: git.comunes.org/comunes/tcef-web:${TCEF_WEB_TAG:-meteor3}`.
  groucho pasa de 30 min de `meteor build` (que lo dejaron sin ssh) a un pull de segundos.
- workflow: se activa el disparo por push, y se anade una comprobacion de secretos como
  primer paso. Sin ella, faltar REGISTRY_TOKEN se descubria a los ~30 min, al intentar
  el push; ahora falla en 2 segundos diciendo exactamente que crear y donde.
2026-07-28 13:50:23 +02:00

109 lines
4.7 KiB
YAML

# Construye la imagen Docker de la web y la sube al registry de Forgejo.
#
# POR QUÉ: antes el build corría en groucho, el host de despliegue (5,9 GB de RAM
# compartidos con Mongo 7 + web + notifications + redis + node-red). Un `meteor build`
# lo asfixiaba hasta dejarlo sin ssh. A partir de aquí groucho **no compila**: hace
# `docker compose pull && up -d web` y ya.
#
# runs-on: docker → el runner de aaron (forge.yml, label `docker`, capacity 1).
#
# ⚠️ POR QUÉ KANIKO Y NO `docker build`:
# aaron es un host COMPARTIDO — aloja git.comunes.org, Jenkins y GlitchTip. Construir con
# `docker build` exige montar /var/run/docker.sock en el job, que es poder
# root-equivalente sobre aaron; y además el límite de memoria del contenedor del job NO
# afectaría al build, porque quien construye es el demonio, fuera del job. Kaniko
# construye DENTRO del contenedor del job: no hace falta socket y `--memory` sí acota al
# proceso que se come la RAM. Si el `meteor build` muere por memoria, sube el `--memory`
# de `container.options` (y mira qué más está corriendo en aaron), no lo quites.
name: build-image
on:
push:
branches: [meteor3-wip, tcef-master]
paths-ignore: ['**.md']
workflow_dispatch:
jobs:
build:
runs-on: docker
container:
# `:debug` trae busybox: el runner necesita una shell para ejecutar los `run:`.
image: gcr.io/kaniko-project/executor:v1.23.2-debug
# Tope duro para no asfixiar aaron. memory-swap == memory ⇒ swap 0: preferimos que
# muera el build a que el host empiece a paginar y se lleve por delante la forja.
options: --memory=4g --memory-swap=4g --cpus=3
env:
IMAGE: git.comunes.org/comunes/tcef-web
steps:
# Primero de todo: sin credenciales el build tarda ~30 min en llegar al push para
# morir ahí. Mejor fallar en 2 segundos y decir exactamente qué falta.
- name: Comprobar secretos
shell: sh
env:
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
run: |
export PATH=/busybox:/kaniko:$PATH
if [ -z "$REGISTRY_USER" ] || [ -z "$REGISTRY_TOKEN" ]; then
echo "Faltan los secretos REGISTRY_USER / REGISTRY_TOKEN."
echo "Crealos en Settings -> Actions -> Secrets de este repositorio."
echo "REGISTRY_TOKEN: token de git.comunes.org con scope write:package"
echo "(Settings -> Applications -> Generate New Token). No reutilices uno con scope 'all'."
exit 1
fi
# Checkout a mano contra el Forgejo interno, igual que el CI de fires_flutter:
# la imagen de kaniko no tiene Node, así que las actions basadas en JS no valen.
- name: Checkout
shell: sh
env:
TOKEN: ${{ github.token }}
run: |
set -e
export PATH=/busybox:/kaniko:$PATH
git config --global --add safe.directory '*'
git init -q .
git remote add origin "http://x-access-token:${TOKEN}@forgejo:3000/${GITHUB_REPOSITORY}.git"
git fetch -q --depth 1 origin "${GITHUB_SHA}"
git checkout -q FETCH_HEAD
- name: Credenciales del registry
shell: sh
env:
REGISTRY_USER: ${{ secrets.REGISTRY_USER }}
REGISTRY_TOKEN: ${{ secrets.REGISTRY_TOKEN }}
run: |
set -e
export PATH=/busybox:/kaniko:$PATH
mkdir -p /kaniko/.docker
AUTH=$(printf '%s:%s' "$REGISTRY_USER" "$REGISTRY_TOKEN" | base64 | tr -d '\n')
printf '{"auths":{"git.comunes.org":{"auth":"%s"}}}' "$AUTH" > /kaniko/.docker/config.json
- name: Build y push
shell: sh
run: |
set -e
export PATH=/busybox:/kaniko:$PATH
SHORT_SHA=$(echo "$GITHUB_SHA" | cut -c1-12)
BRANCH_TAG=$(echo "$GITHUB_REF_NAME" | tr '/' '-')
# --cache: reutiliza capas entre builds (apt, meteor-tool, npm install) contra
# el propio registry; sin esto cada push recompila el mundo.
# --single-snapshot y --compressed-caching=false bajan mucho el pico de RAM,
# que es justo lo que nos importa en un host compartido.
/kaniko/executor \
--context "dir:///$(pwd)" \
--dockerfile Dockerfile \
--destination "${IMAGE}:${BRANCH_TAG}" \
--destination "${IMAGE}:${SHORT_SHA}" \
--cache=true \
--cache-repo "${IMAGE}/cache" \
--compressed-caching=false \
--snapshot-mode=redo \
--verbosity=info
echo "Publicado ${IMAGE}:${BRANCH_TAG} y :${SHORT_SHA}"
- name: Cómo desplegar
shell: sh
run: |
echo "En groucho: cd /data/tcef-staging && docker compose pull web && docker compose up -d web"