Whether you're a DevOps engineer, backend developer, or automation enthusiast, mastering Jenkins pipelines is a must. In this guide, we’ll break down everything you need to know to write powerful, flexible Jenkins pipelines using Groovy — all in one place. You'll also get a universal Jenkinsfile that you can use across projects and tweak to your needs.


🚀 What is a Jenkinsfile?

A Jenkinsfile is a text file that contains the definition of a Jenkins pipeline and is checked into your source control (GitHub, GitLab, Bitbucket, etc). Instead of configuring jobs in the Jenkins UI, you define everything as code – which makes it version-controlled, repeatable, and collaborative.


🧠 Declarative vs Scripted Pipeline: What’s the Difference?

Feature Declarative Scripted
Syntax Structured (block-based) Freestyle (Groovy code)
Readability Easier to read and write More flexible, less readable
Groovy Knowledge Minimal required Moderate to advanced Groovy needed
Recommended For Most users/projects Complex, dynamic logic

📚 Groovy Concepts You Need to Know for Jenkins Pipelines

Jenkins pipelines are written in Groovy, but you only need a subset of it:

✅ Variables

def name = "Jenkins"

✅ String Interpolation

echo "Hello ${name}"

✅ Lists & Maps

def servers = ["web1", "web2"]
def config = [env: "prod", region: "us"]

✅ Conditionals & Loops

if (env == "prod") {
    echo "Production deploy"
}

servers.each { s -> echo "Deploying to ${s}" }

✅ Functions

def greet(name) {
    echo "Hi ${name}"
}

✅ Closures
Used behind the scenes with blocks like steps {} and stage {}.


🧱 Jenkins Declarative Pipeline Concepts (Explained)

pipeline { }
Root block that wraps everything.

agent
Defines where the pipeline runs (any, docker, specific label).

agent any

stages { } & stage { }
Defines the steps in your CI/CD lifecycle.

stages {
    stage('Build') {
        steps {
            echo "Building..."
        }
    }
}

steps { }
Actual shell commands or Jenkins steps.

steps {
    sh 'npm install'
    echo "Done"
}

environment
Set environment variables.

environment {
    NODE_ENV = "production"
    VERSION = "${env.BUILD_ID}"
}

when
Conditional execution of stages.

when {
    branch 'main'
}

post
Defines actions after success/failure/always.

post {
    success { echo "✔️ Success" }
    failure { echo "❌ Failed" }
    always  { cleanWs() }
}

parameters
Accept runtime input to your pipeline.

parameters {
    string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: 'Choose env')
    booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Run tests?')
}

credentials
Access stored secrets securely.

withCredentials([usernamePassword(credentialsId: 'git-creds', usernameVariable: 'USER', passwordVariable: 'PASS')]) {
    sh 'git push https://${USER}:${PASS}@repo.git'
}

tools
Preinstalled tools like JDK, Maven, etc.

tools {
    maven 'Maven 3.8.1'
}

script
For advanced Groovy logic inside declarative pipelines.

script {
    def result = "build_${env.BUILD_NUMBER}"
    echo result
}

🌐 Universal Jenkinsfile Template (Copy-Paste & Customize)

pipeline {
    agent any

    options {
        timeout(time: 15, unit: 'MINUTES')
        buildDiscarder(logRotator(numToKeepStr: '10'))
        skipDefaultCheckout()
    }

    parameters {
        string(name: 'DEPLOY_ENV', defaultValue: 'staging', description: 'Target environment')
        booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Run tests before build')
    }

    environment {
        APP_NAME = "universal-app"
        BUILD_TAG = "${env.BUILD_NUMBER}-${new Date().format('yyyyMMdd-HHmm')}"
    }

    stages {
        stage('Init') {
            steps {
                echo "🚀 Starting pipeline for ${APP_NAME}"
                checkout scm
            }
        }

        stage('Install Dependencies') {
            steps {
                script {
                    if (fileExists('package.json')) {
                        echo "Node project detected"
                        sh 'npm install'
                    } else if (fileExists('requirements.txt')) {
                        echo "Python project detected"
                        sh 'pip install -r requirements.txt'
                    } else {
                        echo "Unknown project type"
                    }
                }
            }
        }

        stage('Test') {
            when {
                expression { return params.RUN_TESTS }
            }
            steps {
                script {
                    try {
                        sh 'npm test || echo "Tests skipped/failing gracefully"'
                    } catch (e) {
                        echo "Test failure ignored for now"
                    }
                }
            }
        }

        stage('Build') {
            steps {
                script {
                    echo "🛠️ Building ${APP_NAME} - ${BUILD_TAG}"
                    sh 'mkdir -p build && echo "Build successful" > build/status.txt'
                }
            }
        }

        stage('Deploy') {
            when {
                anyOf {
                    branch 'main'
                    expression { params.DEPLOY_ENV == 'production' }
                }
            }
            steps {
                echo "🚀 Deploying to ${params.DEPLOY_ENV}"
                sh './deploy.sh ${params.DEPLOY_ENV} || echo "Deploy script not found"'
            }
        }

        stage('Parallel Quality Checks') {
            parallel {
                stage('Lint') {
                    steps {
                        echo "🔍 Linting code..."
                        sh 'sleep 3'
                    }
                }
                stage('Security Scan') {
                    steps {
                        echo "🔐 Running security scan..."
                        sh 'sleep 3'
                    }
                }
            }
        }
    }

    post {
        success {
            echo "✅ Pipeline completed successfully"
        }
        failure {
            echo "❌ Pipeline failed"
        }
        always {
            echo "🧹 Cleaning up workspace"
            cleanWs()
        }
    }
}

🎯 Final Thoughts
With this article, you now:

  • Understand how Jenkins pipelines work

  • Know the key Groovy concepts used inside Jenkins

  • Can write and reuse a universal Jenkinsfile

  • Are ready to build, test, deploy, and automate like a DevOps pro 🚀