Was ist die CPS-Transformation in Jenkins-Pipelines?
Jenkins führt Pipeline-Groovy durch den Continuation Passing Style (CPS) Transformer, damit Pipelines nach einem Controller-Neustart an der letzten Stage fortgesetzt werden können. Das erzwingt Serialisierbarkeit und verbietet bestimmte Groovy-Features in regulären Pipeline-Steps. Mit der @NonCPS-Annotation werden einzelne Methoden aus der CPS-Transformation ausgenommen, was etwa für nicht serialisierbare Objekte oder direkte Jenkins-API-Aufrufe nötig ist.
Auch bekannt als: CPS · Continuation Passing Style · Jenkins CPS
Ist CPS-Transformation (Jenkins) bei Ihnen gerade ein Thema?
Wir fragen kurz, wie dringend das Thema bei Ihnen gerade ist. Je nach Antwort zeigen wir Ihnen direkt den passenden nächsten Schritt — ganz ohne Formular.
Die Transformation passiert, bevor die Pipeline läuft. Jenkins schreibt den Groovy-Code so um, dass jeder Aufruf seinen Folgeschritt als Continuation mitgibt, also als Objekt, das beschreibt, wie es weitergeht. Den aktuellen Programmzustand speichert Jenkins laufend in die Build-Verzeichnisse. Startet der Controller neu, liest er diesen Zustand wieder ein und setzt die Pipeline an der Stelle fort, an der sie stand. Diese Eigenschaft heißt Durability.
Der Preis dafür ist Serialisierbarkeit. Jede lokale Variable, die über einen Pipeline-Step hinweg lebt, muss sich speichern lassen. Objekte wie das Ergebnis von JsonSlurper oder ein regulärer Matcher können das nicht und lösen eine NotSerializableException aus. Dazu kommen Methoden der Groovy-Standardbibliothek, die selbst nicht transformiert sind, aber eine transformierte Closure bekommen. Die Jenkins-Dokumentation nennt toSorted als Beispiel: Der Code läuft, liefert aber nicht das erwartete Ergebnis. Solche Fehler kosten Stunden, weil das Groovy auf den ersten Blick trivial aussieht und in jeder lokalen Groovy-Konsole funktioniert.
Das Gegenmittel ist die Annotation @NonCPS. Eine so markierte Methode läuft als normales, schnelles Groovy außerhalb der Transformation. Sie darf dafür keine Pipeline-Steps aufrufen, auch kein sh oder echo, und ihr eigener Ablauf übersteht keinen Neustart. Die Faustregel: Reine Datenverarbeitung gehört in @NonCPS-Methoden, Steps bleiben im CPS-Kontext. KI-Assistenz kann bestehende Pipelines nach riskanten Stellen durchsuchen und passende Refactorings vorschlagen.
JSON-Antwort parsen ohne Serialisierungsfehler
Eine Pipeline holt eine große JSON-Antwort aus einem Artefakt-Repository und scheitert beim nächsten sh-Step mit NotSerializableException. Das Team lagert Parsen und Filtern in eine @NonCPS-Methode aus, die nur eine einfache Liste von Strings zurückgibt. Danach läuft die Pipeline durch und bleibt restart-fest.
Controller-Neustart mitten im Wartungsfenster
Ein mehrstufiger OT-Deploy dauert mehrere Stunden. In der dritten Stunde startet der Controller nach einem Update neu. Dank Durability setzt die Pipeline an der letzten abgeschlossenen Stage fort, und das Wartungsfenster reicht trotzdem.
CPS-Prüfung vor dem Library-Release
Vor einem Release einer Shared Library weiß das Team nicht, wo nicht-serialisierbare Objekte über Steps hinweg gehalten werden. Claude Code prüft die vars- und src-Dateien darauf und markiert Methoden, die @NonCPS brauchen. Das Team entscheidet anhand der Liste, bevor ein Nutzer den Fehler findet.
Woran haken Ihre Jenkins-Pipelines?
Die CPS-Transformation macht Groovy in Jenkins pausierbar — und sorgt für die berüchtigten NotSerializableException und stillen Fallstricke. Zwei Klicks zeigen, wo Sie ansetzen.
Was erleben Sie in Ihren Pipelines?
- Wann sollte man @NonCPS verwenden und wann nicht?
- @NonCPS eignet sich für reine Datenverarbeitung wie Parsen, Filtern oder Mappen ohne Pipeline-Steps. Ungeeignet ist es für Code, der sh, echo oder andere Steps aufruft oder einen Restart überdauern muss. Solcher Code gehört in den regulären CPS-Kontext.
- Warum funktionieren manche Closure-Methoden wie toSorted in Pipelines nicht?
- Weil die Methode selbst nicht CPS-transformiert ist, die übergebene Closure aber schon, und beide dann nicht zusammenpassen. Häufige Methoden wie each, collect oder findAll funktionieren seit einer Korrektur in Jenkins (JENKINS-26481), einzelne andere wie toSorted weiterhin nicht. Die robuste Lösung ist, solche Verarbeitung in eine @NonCPS-Methode auszulagern oder eine einfache for-Schleife zu schreiben.
- Beeinträchtigt @NonCPS die Restart-Fähigkeit der gesamten Pipeline?
- Nein. Nur der Ablauf innerhalb der @NonCPS-Methode ist nicht fortsetzbar, deshalb sollte sie kurz sein. Die umgebende Pipeline bleibt restart-fest, solange der @NonCPS-Aufruf abgeschlossen ist, bevor ein Neustart eintritt.
- Wie behebt man eine NotSerializableException in einer Jenkins-Pipeline?
- Die Exception entsteht, wenn eine nicht-serialisierbare Variable über einen Pipeline-Step hinweg im CPS-Kontext lebt, häufig ein JsonSlurper-Ergebnis oder ein regulärer Matcher. Kapseln Sie die Verarbeitung in eine @NonCPS-Methode, die nur ein serialisierbares Ergebnis wie eine einfache Map oder Liste zurückgibt. Für JSON gibt es zusätzlich den Step readJSON aus dem Plugin Pipeline Utility Steps.
Wo steht Ihr Team bei CPS-Transformation (Jenkins)?
Uns interessiert, wo Ihr Team bei diesem Thema steht. Auf Basis Ihrer Antwort schlagen wir Ihnen den sinnvollsten nächsten Schritt vor — ganz ohne Formular.
Weiterführende Primärquellen zu CPS-Transformation (Jenkins): Normtexte, Hersteller- und Projektdokumentation. Alle Ziele öffnen in einem neuen Tab.
- /01JenkinsPipeline CPS Method Mismatches(externe Seite, öffnet in neuem Tab)
Erklärt, warum manche Groovy-Konstrukte in Pipelines anders laufen als erwartet.
- /02GitHubgroovy-cps(externe Seite, öffnet in neuem Tab)
Die Bibliothek, die Groovy-Code in Continuation-Passing-Style überführt.
- /03Jenkins PluginsPipeline: Groovy(externe Seite, öffnet in neuem Tab)
Das Plugin, das die Ausführung samt Serialisierung des Pipeline-Zustands verantwortet.
Erstgespräch.
Kostenlos.
90 Tage zum Ergebnis.
Wir klären gemeinsam, wie Sie in 90 Tagen die ersten messbaren Industrial-DevOps-Erfolge erzielen.
Industrie · Automotive · Finance

