Skip to content

Automatisierung ​

Was nach einem Merge auf main von allein passiert, und wie du jeden Schritt von Hand auslöst, wenn du musst.

Wie du Inhalte schreibst, steht unter Redaktion.

Der Ablauf ​

Werktags 06:00 Uhr (Europe/Berlin)
  └─ sync:changelog liest die CHANGELOG.md aus sechs Repositories
       ├─ nichts Neues  ->  Ende, kein Commit
       └─ etwas Neues   ->  Commit auf main
                              │
Push auf main ────────────────┘
  ├─ deploy:production   Doku nach Vercel deployen
  └─ notify:slack        Meldung in #guppy, wenn es etwas zu melden gibt

Das Deployment liegt vor der Meldung. GitLab überspringt eine Stage, wenn eine frühere gescheitert ist, also unterbleibt die Meldung, wenn das Deployment schiefgeht. Sonst würde eine Nachricht mit toten Links im Kanal landen.

Eine Schleife ist ausgeschlossen: sync:changelog läuft ausschließlich auf einem Zeitplan, und notify:slack pusht nie.

Was eine Meldung auslöst ​

ÄnderungMeldung
Neue Datei in docs/news/ja
Release mit neuer Minor- oder Major-Nummerja
Release mit Breaking changesja, unabhängig von der Versionsnummer
Zurückgezogenes Releaseja
Release-Kandidat, etwa 2.8.0-rc1ja, mit #ReleaseCandidate
Reines Patch-Releasenein, wird in einer Zeile mitgezählt
Geänderter bestehender Beitragnein, nur neue Dateien zählen

Alles aus einem Push wird zu einer Nachricht zusammengefasst, nie eine pro Release.

Der wichtigste Punkt für dich als Entwickler: ein echter Breaking Change gehört unter die Überschrift Breaking changes, auch bei einem Patch. Diese Überschrift entscheidet, ob gemeldet oder still mitgezählt wird.

Die drei Jobs ​

Alles steht in .gitlab-ci.yml.

JobLäuft wannTut was
sync:changelognur auf ZeitplanChangelogs einlesen, bei Änderung committen und pushen
deploy:productionPush auf mainvercel deploy --prod
notify:slackPush auf mainDigest in #guppy

Warum nicht die Git-Integration von Vercel ​

Vercel ordnet einen Push dem Vercel-Konto hinter dem Commit-Autor zu. Das betreffende Konto ist nur Betrachter im Team, deshalb wurden diese Deployments abgelehnt. Das Deployment aus der Pipeline umgeht die Zuordnung und nutzt ein Token eines Kontos, das deployen darf. Die Git-Integration ist inzwischen getrennt, GitLab ist die einzige Quelle.

Manuell ​

Changelog einsammeln ​

bash
npm run changelog:sync

Schreibt docs/.vitepress/data/changelog.json. Braucht GUPPY_GITLAB_TOKEN in .env.local.

Wenn sich nichts geändert hat, bleibt die Datei byteweise identisch, auch das Feld generatedAt. Ein leerer git diff heißt also verlässlich: nichts Neues. Genau darauf stützt sich der Zeitplan-Job.

Meldung vorher ansehen ​

bash
node scripts/notify-slack.mjs --dry-run
node scripts/notify-slack.mjs --dry-run --since <commit>

Gibt die fertige Slack-Nachricht als JSON aus und verschickt nichts. Ohne gesetztes Token verschickt das Skript ohnehin nie etwas, ein lokaler Lauf kann also nicht aus Versehen posten.

Das JSON lässt sich direkt in den Block Kit Builder von Slack einfügen, wenn du sehen willst, wie es gerendert aussieht.

Deployen ​

bash
npx vercel deploy --yes          # Vorschau
npx vercel deploy --prod --yes   # Produktion

Im Normalfall brauchst du das nicht, die Pipeline macht es. Nützlich, wenn du etwas vor dem Merge zeigen willst.

Zeitplan von Hand starten ​

Build, Pipeline schedules, auf Play beim Eintrag Nightly changelog sync. Läuft sofort, sonst identisch zum nächtlichen Lauf.

Pipeline auf einem Branch testen ​

Eine Pipeline mit der Variable SLACK_NOTIFY_TEST auf 1 starten. Dann läuft notify:slack auch außerhalb von main, als manueller Job.

Achtung: die Slack-Variablen sind protected, erreichen also nur geschützte Branches. Auf einem normalen Feature-Branch läuft der Job durch, findet kein Token, gibt die Nachricht nur aus und wird grün. Das sieht nach Erfolg aus, hat aber nichts verschickt.

Variablen ​

Alle unter Settings, CI/CD, Variables des Projekts guppy-docs, jeweils masked und protected.

VariableWofür
GUPPY_GITLAB_TOKENChangelogs der anderen Projekte lesen
GUPPY_PUSH_TOKENCommit auf main pushen, braucht Rolle Maintainer
VERCEL_TOKENDeployment, Nutzer-Token mit Scope auf das Team
SLACK_BOT_TOKENNachricht senden, Scope chat:write
SLACK_CHANNELZiel-Kanal, als ID stabiler als als Name

Werte gehören nirgendwo ins Repository. .env.local ist für lokale Läufe da und steht in .gitignore.

Fehlersuche ​

SymptomUrsache
Job grün, aber nichts in SlackKein Token erreichbar, meist protected auf ungeschütztem Branch. Steht im Log
invalid_authSlack-Token falsch oder zurückgezogen
not_in_channelApp nicht im Kanal. /invite @Guppy Docs, oder Scope chat:write.public
Could not retrieve Project SettingsVercel-Token hat falschen Scope. Es muss ein Nutzer-Token mit Scope auf das Team sein
Zeitplan pusht nichtGUPPY_PUSH_TOKEN fehlt die Rolle Maintainer. main ist geschützt
Nichts gemeldet, obwohl Release daPatch ohne Breaking changes. So gewollt

Das Skript meldet jeden Slack-Fehler im Klartext samt Hinweis, was zu tun ist. Der Job-Log ist also die erste Anlaufstelle, nicht das Rätselraten.