This article is based on reporting originally published on TheServerSide.com (2017). Some details relate to Jenkins releases from that era; see the review notes for context.
Background: Jenkins 2.0 and the Pipeline Feature
The Jenkins 2.0 release was widely described as evolutionary rather than revolutionary. Its most anticipated change was the formal, first-class integration of the Jenkins Pipeline — a suite of plugins that allows teams to define their entire continuous integration and continuous delivery (CI/CD) workflow as code. While Jenkins 2.0 delivered that foundation, the syntax available at launch was the scripted pipeline, written in a Groovy-based DSL that gave experienced users enormous flexibility but presented a steep learning curve for newcomers.
What Is the Declarative Jenkins Pipeline?
The declarative pipeline syntax was introduced (in late 2016 / early 2017) as a higher-level, opinionated way to write Jenkins pipelines. It does not replace or alter the underlying pipeline engine — it is a different way to express the same CI/CD logic. Both declarative and scripted pipelines compile down to the same internal representation and execute on the same runtime.
The key difference is structure. A declarative pipeline wraps everything inside a pipeline block and enforces a fixed schema of sections (agent, stages, steps, post, etc.). This makes pipelines easier to read, validate statically, and generate via graphical tools.
Minimal Declarative Pipeline Example
pipeline {
agent any
stages {
stage('Build') {
steps {
sh 'mvn -B clean package'
}
}
stage('Test') {
steps {
sh 'mvn test'
}
}
stage('Deploy') {
steps {
sh './deploy.sh'
}
}
}
post {
success {
echo 'Pipeline completed successfully.'
}
failure {
mail to: 'team@example.com',
subject: "Build failed: ${env.JOB_NAME}",
body: "Check the console output at ${env.BUILD_URL}"
}
}
}Code language: PHP (php)
The rigid structure means Jenkins can catch configuration errors before a build runs and can render the pipeline visually in the Blue Ocean UI.
Declarative vs. Scripted Pipeline: Key Differences
| Characteristic | Declarative Pipeline | Scripted Pipeline |
|---|---|---|
| Syntax style | Structured, schema-enforced DSL | Free-form Groovy |
| Learning curve | Low — readable without deep Groovy knowledge | Higher — requires Groovy familiarity |
| Static validation | Yes — schema validated before execution | Limited — errors surface at runtime |
| Graphical editor support | Yes (Blue Ocean Pipeline Editor) | Partial |
| Flexibility / advanced logic | Good; use script {} blocks for Groovy when needed | Full Groovy power available everywhere |
| Compatibility | Same pipeline engine underneath | Same pipeline engine underneath |
Why Adoption Matters for DevOps Teams
Sacha Labourey, CEO of CloudBees (the primary commercial sponsor of Jenkins), was quoted explaining the original pipeline’s problem: “When you start with pipeline, you are not a sophisticated user. The learning curve is too high for new users.” The declarative syntax was the direct response — designed so that a developer new to Jenkins could create a working, production-quality pipeline without first mastering Groovy.
This matters at the team level. When pipeline-as-code is accessible to all contributors — not just a dedicated DevOps specialist — pipeline definitions get reviewed in pull requests, versioned in Git alongside application code, and improved iteratively by the whole team.
The Graphical Pipeline Editor
The declarative syntax was designed hand-in-hand with the Blue Ocean Pipeline Editor, a point-and-click interface for building pipelines visually. Because declarative pipelines have a predictable structure, the editor can round-trip between the visual canvas and the Jenkinsfile stored in source control. Teams can start by clicking through the editor and then graduate to editing the Jenkinsfile directly as their needs grow.
Mixing Declarative and Scripted Syntax
Teams do not have to choose one approach permanently. Within a declarative pipeline, any steps block can include a script { } section that runs arbitrary Groovy, giving access to the full power of the scripted approach when needed. This means you can start simple and add complexity incrementally without rewriting the entire pipeline.
stage('Conditional Logic') {
steps {
script {
if (env.BRANCH_NAME == 'main') {
sh './full-deploy.sh'
} else {
sh './staging-deploy.sh'
}
}
}
}Code language: JavaScript (javascript)
Storing Pipelines as Code (Jenkinsfile)
Whether you use declarative or scripted syntax, Jenkins best practice is to store the pipeline definition in a file named Jenkinsfile at the root of your repository. Jenkins reads this file automatically when a Multibranch Pipeline project is configured, meaning every branch and pull request gets its own pipeline with no manual configuration required.
- Version control: Pipeline changes are tracked alongside application changes.
- Code review: Pipeline modifications go through the same PR process as feature code.
- Auditability: You always know which pipeline definition ran for a given build.
- Reuse: Shared libraries allow common pipeline logic to be extracted and reused across repositories.
Getting Started
If you are new to Jenkins pipelines, the recommended path is:
- Install Jenkins 2.x (LTS recommended) and the Pipeline plugin (bundled by default).
- Install the Blue Ocean plugin for the visual editor.
- Create a Multibranch Pipeline project pointing at your Git repository.
- Add a
Jenkinsfileusing declarative syntax to the root of your repository. - Iterate: add stages, post conditions, and environment variables as your workflow grows.
- Introduce
script { }blocks or shared libraries when you need logic that declarative syntax cannot express cleanly.
The official Jenkins documentation at jenkins.io/doc/book/pipeline/ is the authoritative reference for both syntax variants and is kept up to date with each Jenkins release.
Summary
The declarative Jenkins pipeline lowers the barrier to pipeline-as-code adoption without sacrificing the power that advanced users need. Its structured syntax enables static validation, graphical editing, and easier code review, while the underlying engine remains identical to the scripted approach. Teams can start with declarative pipelines and incrementally adopt more advanced patterns — making it a practical choice for organisations at any stage of their DevOps journey.