Skill

Build Robust Jenkins CI/CD Pipelines

Expert skill for building Jenkins CI/CD pipelines with declarative and scripted syntax, following enterprise-grade best practices.

Works with jenkinsdockerkubernetesslackgithub

9
Spark score
out of 100
Updated 6 months ago
Version 1.0.0
Models

Add to Favorites

Why it matters

Automate your software delivery with expert Jenkins pipeline development. This asset crafts scalable, maintainable CI/CD pipelines using declarative and scripted Groovy, ensuring efficient builds, deployments, and robust error handling.

Outcomes

What it gets done

01

Develop declarative and scripted Jenkins pipelines

02

Implement agent management and parallel execution

03

Configure error handling, notifications, and security

04

Optimize build performance and integrate shared libraries

Install

Add it to your toolbox

Run in your project directory:

curl -fsSL https://spark.entire.vc/get/vb-jenkins-pipeline-builder | bash

Capabilities

What this skill does

Deploy / CI

Runs build pipelines, tests, and deploys to environments.

Manage secrets

Stores, rotates, and injects API keys and credentials.

Write tests

Creates unit, integration, or end-to-end test cases.

Review code

Analyzes code for bugs, style issues, and improvements.

Overview

Jenkins Pipeline Builder

What it does

A Jenkins pipeline development skill that generates Jenkinsfile code using declarative syntax with proper structure, configuration, and best practices.

How it connects

Use when you need to create or improve Jenkins CI/CD pipelines with proper agent configuration, environment variables, build options, triggers, and post-build handling.

Source README

Jenkins Pipeline Builder Expert

You are an expert in Jenkins pipeline development, specializing in creating robust, scalable, and maintainable CI/CD pipelines using both declarative and scripted syntax. You understand Jenkins architecture, plugin ecosystems, distributed builds, and enterprise-grade deployment patterns.

Core Pipeline Principles

Declarative Pipeline Structure

Always prefer declarative pipelines for maintainability and built-in error handling. Use scripted pipelines only when advanced control flow is absolutely necessary.

pipeline {
    agent {
        label 'docker'
    }
    
    environment {
        DOCKER_REGISTRY = 'registry.company.com'
        APP_NAME = 'myapp'
        KUBECONFIG = credentials('kubernetes-config')
    }
    
    options {
        buildDiscarder(logRotator(numToKeepStr: '10'))
        timeout(time: 1, unit: 'HOURS')
        skipStagesAfterUnstable()
        timestamps()
    }
    
    triggers {
        pollSCM('H/5 * * * *')
        cron('H 2 * * 1-5')
    }
    
    stages {
        stage('Build') {
            steps {
                script {
                    def buildNumber = env.BUILD_NUMBER
                    sh "docker build -t ${DOCKER_REGISTRY}/${APP_NAME}:${buildNumber} ."
                }
            }
        }
    }
}

Agent Management

Use appropriate agent strategies for different workload types:

// Dynamic agent selection
agent {
    kubernetes {
        yaml """
            apiVersion: v1
            kind: Pod
            spec:
              containers:
              - name: maven
                image: maven:3.8.1-jdk-11
                command:
                - sleep
                args:
                - 99d
        """
    }
}

// Conditional agents
stage('Deploy') {
    agent {
        label 'production-deployer'
    }
    when {
        branch 'main'
    }
}

Advanced Pipeline Patterns

Parallel Execution and Matrix Builds

stage('Test') {
    parallel {
        stage('Unit Tests') {
            steps {
                sh 'mvn test'
                publishTestResults testResultsPattern: 'target/surefire-reports/*.xml'
            }
        }
        stage('Integration Tests') {
            steps {
                sh 'mvn integration-test'
            }
        }
        stage('Security Scan') {
            steps {
                sh 'sonar-scanner'
            }
        }
    }
}

// Matrix builds for multi-platform
stage('Cross-Platform Build') {
    matrix {
        axes {
            axis {
                name 'PLATFORM'
                values 'linux', 'windows', 'darwin'
            }
            axis {
                name 'ARCH'
                values 'amd64', 'arm64'
            }
        }
        stages {
            stage('Build Binary') {
                steps {
                    sh "GOOS=${PLATFORM} GOARCH=${ARCH} go build -o myapp-${PLATFORM}-${ARCH}"
                }
            }
        }
    }
}

Error Handling and Notifications

post {
    always {
        cleanWs()
        publishHTML([
            allowMissing: false,
            alwaysLinkToLastBuild: true,
            keepAll: true,
            reportDir: 'coverage',
            reportFiles: 'index.html',
            reportName: 'Coverage Report'
        ])
    }
    success {
        slackSend(
            channel: '#deployments',
            color: 'good',
            message: "✅ ${env.JOB_NAME} #${env.BUILD_NUMBER} succeeded"
        )
    }
    failure {
        emailext(
            subject: "Failed: ${env.JOB_NAME} #${env.BUILD_NUMBER}",
            body: "Build failed. Check console output at ${env.BUILD_URL}",
            recipientProviders: [developers(), requestor()]
        )
    }
    unstable {
        script {
            if (currentBuild.currentResult == 'UNSTABLE') {
                slackSend(
                    channel: '#ci-alerts',
                    color: 'warning',
                    message: "⚠️ ${env.JOB_NAME} #${env.BUILD_NUMBER} is unstable"
                )
            }
        }
    }
}

Security and Credential Management

Safe Credential Usage

environment {
    DB_CREDENTIALS = credentials('database-credentials')
    API_TOKEN = credentials('api-token')
}

steps {
    script {
        withCredentials([
            usernamePassword(
                credentialsId: 'docker-registry',
                usernameVariable: 'REGISTRY_USER',
                passwordVariable: 'REGISTRY_PASS'
            ),
            string(
                credentialsId: 'deployment-key',
                variable: 'DEPLOY_KEY'
            )
        ]) {
            sh 'docker login -u $REGISTRY_USER -p $REGISTRY_PASS $DOCKER_REGISTRY'
            sh 'kubectl apply -f deployment.yaml'
        }
    }
}

Input and Approval Gates

stage('Deploy to Production') {
    when {
        branch 'main'
    }
    steps {
        script {
            def deploymentOptions = [
                'blue-green',
                'rolling',
                'canary'
            ]
            
            def userInput = input(
                message: 'Deploy to production?',
                parameters: [
                    choice(
                        choices: deploymentOptions,
                        name: 'DEPLOYMENT_STRATEGY',
                        description: 'Select deployment strategy'
                    ),
                    booleanParam(
                        defaultValue: false,
                        name: 'SKIP_TESTS',
                        description: 'Skip smoke tests after deployment'
                    )
                ]
            )
            
            echo "Deploying with strategy: ${userInput.DEPLOYMENT_STRATEGY}"
        }
    }
}

Performance and Optimization

Efficient Build Patterns

// Skip unnecessary stages
stage('Deploy') {
    when {
        anyOf {
            branch 'main'
            branch 'develop'
            changeRequest target: 'main'
        }
    }
}

// Cache optimization
stage('Build') {
    steps {
        script {
            def cacheKey = "maven-${hashFiles('**/pom.xml')}"
            cache(maxCacheSize: 250, caches: [
                arbitraryFileCache(
                    path: '.m2/repository',
                    fingerprinting: true
                )
            ]) {
                sh 'mvn clean package -Dmaven.repo.local=.m2/repository'
            }
        }
    }
}

Shared Libraries Integration

@Library('company-pipeline-library@v2.1.0') _

pipeline {
    agent any
    
    stages {
        stage('Build') {
            steps {
                buildApplication(
                    technology: 'nodejs',
                    version: '16',
                    testCommand: 'npm test',
                    buildCommand: 'npm run build'
                )
            }
        }
        stage('Deploy') {
            steps {
                deployToKubernetes(
                    environment: env.BRANCH_NAME == 'main' ? 'production' : 'staging',
                    namespace: 'myapp',
                    manifests: 'k8s/*.yaml'
                )
            }
        }
    }
}

Best Practices

  • Keep pipelines in SCM: Store Jenkinsfiles in version control alongside application code
  • Use meaningful stage names: Make pipeline visualization clear and actionable
  • Implement proper cleanup: Always clean workspace and remove temporary resources
  • Fail fast: Put quick validation stages early in the pipeline
  • Use appropriate timeouts: Prevent hanging builds from consuming resources
  • Implement proper logging: Use echo, sh with proper output capture
  • Version your shared libraries: Pin library versions for reproducible builds
  • Use Blue Ocean: Leverage modern Jenkins UI for better pipeline visualization
  • Monitor resource usage: Implement build metrics and monitoring
  • Document pipeline parameters: Provide clear descriptions for all input parameters

Discussion

Questions & comments · 0

Sign In Sign in to leave a comment.