Build Robust Jenkins CI/CD Pipelines
Expert skill for building Jenkins CI/CD pipelines with declarative and scripted syntax, following enterprise-grade best practices.
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
Develop declarative and scripted Jenkins pipelines
Implement agent management and parallel execution
Configure error handling, notifications, and security
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
Runs build pipelines, tests, and deploys to environments.
Stores, rotates, and injects API keys and credentials.
Creates unit, integration, or end-to-end test cases.
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,shwith 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.