Scripted Pipeline, like Declarative Pipeline, is built on top of the underlying Pipeline sub-system. Unlike Declarative, Scripted Pipeline is effectively a general purpose DSL built with Groovy. Most functionality provided by the Groovy language is made available to users of Scripted Pipeline, which means it can be a very expressive and flexible tool with which one can author continuous delivery pipelines.
Flow Control
Scripted Pipeline is serially executed from the top of a Jenkinsfile
downwards, like most traditional scripts in Groovy or other languages.
Providing flow control therefore rests on Groovy expressions, such as the
if/else
conditionals, for example:
// Scripted // node { stage('Example') { if (env.BRANCH_NAME == 'main') { echo 'I only execute on the main branch' } else { echo 'I execute elsewhere' } } } // Declarative //
Another way Scripted Pipeline flow control can be managed is with Groovy’s
exception handling support. When Steps fail for whatever reason
they throw an exception. Handling behaviors on-error must make use of
the try/catch/finally
blocks in Groovy, for example:
// Scripted // node { stage('Example') { try { sh 'exit 1' } catch (exc) { echo 'Something failed, I should sound the klaxons!' throw } } } // Declarative //
Steps
The most fundamental part of a Pipeline is the "step." Fundamentally, steps tell Jenkins what to do, and serve as the basic building block for both Declarative and Scripted Pipeline syntax.
Scripted Pipeline does not introduce any steps which are specific to its syntax; Pipeline Steps reference which contains a comprehensive list of steps provided by Pipeline and plugins.
Differences from plain Groovy
In order to provide durability, which means that running Pipelines can
survive a restart of the Jenkins controller, Scripted
Pipeline must serialize data back to the controller. Due to this design
requirement, some Groovy idioms such as collection.each { item → /* perform
operation */ }
are not fully supported. See
JENKINS-27421
and
JENKINS-26481
for more information.