Files
threadnet-call/.gitlab-ci.yml
T
Thore Cimbal e793902ae0 ci: do not create a pipeline for docs-only commits
Same trap as in ThreadNet-Web: a commit touching only docs/ produced a pipeline with zero jobs, which GitLab marks as failed - pipeline 187 on 2026-08-06. build_embedded is skipped by its changes rule and publish_npm depends on it, so nothing is left.

The path list is now a YAML anchor shared with build_embedded instead of a second copy. CI_PIPELINE_SOURCE == web stays allowed so publish_npm remains reachable after a docs-only commit.

Refs axion1337.chat/threadnet-call#1
2026-08-07 12:00:00 +00:00

116 lines
4.8 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:
- 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