Files
threadnet-call/.gitlab-ci.yml
T
Thore Cimbal 3675cab385 ci: stamp the widget build with its version
Without VITE_APP_VERSION the bundle calls itself dev - in developer settings and in every error message. Someone reporting a call problem then cannot say which build they were on.

Set to the package version plus the short commit: the first says what was published, the second what was actually built. Between two publishes only the latter changes, and then it is the only thing that tells two builds apart.

Closes axion1337.chat/threadnet-call#3
2026-08-09 12:00:00 +00:00

127 lines
5.5 KiB
YAML

# GitLab-CI fuer den threadnet-call-Fork (Lab-GitLab; siehe docs/axion1337-fork.md).
# Ersetzt die geerbten, hier nie lauffaehigen Upstream-Workflows (threadnet-call#1).
# Trigger-Schema wie ThreadNet-Web: Pushes pruefen nur bei relevanten Pfaden,
# Veroeffentlichen ist ein bewusster manueller Akt.
# --- Wann ueberhaupt eine Pipeline entsteht ------------------------------------
# Gleiche Falle wie in ThreadNet-Web: Ein Commit, der nur docs/ anfasst, erzeugt
# eine Pipeline mit NULL Jobs - und die zaehlt als "failed". Real passiert am
# 2026-08-06 (Pipeline 187). Ursache ist die needs-Kette: build_embedded laeuft
# wegen changes: nicht, publish_npm haengt per needs daran, und damit bleibt gar
# nichts uebrig.
#
# ⚠️ Rot, das nichts bedeutet, gewoehnt einem das Hinsehen ab - und in diesem
# Verbund IST die rote Pipeline die Alarmanlage (siehe gitops/CLAUDE.md zur
# TURN-Rotation).
#
# CI_PIPELINE_SOURCE == "web" bleibt erlaubt, damit publish_npm auch nach einem
# reinen Doku-Commit ueber "Run pipeline" erreichbar ist.
.pfade_mit_pipeline: &pfade_mit_pipeline
- src/**/*
- embedded/**/*
- public/**/*
- package.json
- pnpm-lock.yaml
- vite*.config.*
- .env.production
- .gitlab-ci.yml
workflow:
rules:
- if: $CI_COMMIT_TAG =~ /^v/
- if: $CI_PIPELINE_SOURCE == "schedule"
- if: $CI_PIPELINE_SOURCE == "web"
- if: $CI_COMMIT_BRANCH
changes: *pfade_mit_pipeline
- when: never
stages:
- build
- publish
build_embedded:
stage: build
image: node:24-bullseye
rules:
- if: $CI_COMMIT_TAG =~ /^v/
- if: $CI_COMMIT_BRANCH
# derselbe Anker wie im workflow-Block oben - zwei Listen wuerden driften.
# .env.production steht dort mit drin: sie setzt VITE_PRODUCT_NAME und landet
# damit im Bundle - ohne den Eintrag aendert man den Produktnamen und die CI
# baut gar nicht erst.
changes: *pfade_mit_pipeline
before_script:
- corepack enable
script:
# Ohne VITE_APP_VERSION meldet sich das Widget als "dev" - im Entwicklermodus
# und in jeder Fehlermeldung. Wer einen Call-Fehler schildert, kann dann nicht
# sagen, welcher Stand lief (threadnet-call#3).
#
# Paketversion UND Commit: die erste sagt, was veroeffentlicht wurde, die
# zweite, was genau gebaut wurde. Zwischen zwei Publishes aendert sich nur die
# zweite - und genau dann ist sie die einzige Unterscheidung.
- |
VER=$(node -p "require('./embedded/web/package.json').version")
export VITE_APP_VERSION="${VER}+${CI_COMMIT_SHORT_SHA}"
echo "VITE_APP_VERSION=$VITE_APP_VERSION"
- pnpm install --frozen-lockfile
# baut mit der media_quality-Konfiguration aus vite-embedded.config.ts
# (1440p-Defaults, h264 - siehe docs/axion1337-fork.md)
- pnpm build:embedded
# Vite schreibt nach dist/, das npm-Paket (embedded/web/package.json, files: [dist])
# erwartet es aber unter embedded/web/dist. Upstream loest das ueber den Zielpfad des
# Artefakt-Downloads (.github/workflows/publish-embedded-packages.yaml); hier
# verschieben wir direkt, damit publish_npm es per needs:artifacts vorfindet.
- mv dist embedded/web/dist
artifacts:
paths:
- embedded/web/dist
expire_in: 1 week
# Publisht das Embedded-Package in die Gitea-npm-Registry auf rohana - dort MUSS es
# bleiben, solange ThreadNet-Webs pnpm-lock.yaml die Tarball-URL darauf pinnt
# (Konsument: apps/web-Dependency @sorb/threadnet-call-embedded).
# Versionierung: package.json-Version in embedded/web VOR dem Publish per Commit bumpen.
# Auth: CI-Variable GITEA_NPM_TOKEN (Gitea-Token, Scope write:package) - ersetzt die
# fruehere lokale, untracked .npmrc mit Klartext-Token (Rotationsliste CFGMON-11).
publish_npm:
stage: publish
image: node:24-bullseye
needs:
- job: build_embedded
artifacts: true
rules:
- if: $CI_COMMIT_TAG =~ /^v/
when: manual
allow_failure: true
- if: $CI_COMMIT_BRANCH == "main"
when: manual
allow_failure: true
script:
- test -n "$GITEA_NPM_TOKEN" || { echo "CI-Variable GITEA_NPM_TOKEN fehlt (Gitea-Token mit write:package)"; exit 1; }
- |
cat > embedded/web/.npmrc <<EOF
@sorb:registry=https://rohana.axion1337.de/api/packages/sorb/npm/
//rohana.axion1337.de/api/packages/sorb/npm/:_authToken=${GITEA_NPM_TOKEN}
EOF
# Schutz gegen ein leeres Paket: am 2026-08-06 landete 0.19.2-threadnet.6 mit
# 12,5 KB statt 12,8 MB in der Registry - package.json und Lizenzen, kein dist/.
# Eine npm-Version laesst sich nicht ueberschreiben, die kaputte Nummer ist
# dauerhaft verbrannt. Lieber hier hart abbrechen als das nochmal zu erleben.
- |
N=$(find embedded/web/dist -type f 2>/dev/null | wc -l)
if [ "$N" -lt 50 ]; then
echo "embedded/web/dist enthaelt nur $N Dateien (erwartet: ~150)."
echo "build_embedded hat kein brauchbares Artefakt geliefert - Publish abgebrochen,"
echo "sonst verbrennt diese Versionsnummer mit einem leeren Paket."
exit 1
fi
- cd embedded/web
# --tag ist Pflicht, nicht Geschmack: unsere Versionen tragen den Suffix
# -threadnet.N und gelten npm damit als Prerelease. Ohne expliziten dist-tag
# bricht npm ab ("You must specify a tag using --tag when publishing a
# prerelease version"). "threadnet" statt "latest" ist dabei das Richtige -
# latest soll nicht auf eine Vorabversion zeigen. Fuer den Konsumenten ist es
# ohnehin unerheblich, ThreadNet-Webs pnpm-lock.yaml pinnt die Tarball-URL.
- npm publish --access public --tag threadnet