Jenkins Integration & Extension
Master advanced Jenkins integrations with modern tools and platforms for enterprise-grade CI/CD automation.
Docker Integration
Jenkins integration with Docker enables containerized builds, consistent environments, and scalable CI/CD pipelines.
Docker Plugin Configuration
1. Docker Plugin Setup
// Install Docker plugin programmatically
import jenkins.model.Jenkins
import com.cloudbees.dockerpublish.DockerBuilder
def jenkins = Jenkins.getInstance()
def pluginManager = jenkins.getPluginManager()
// Install Docker plugin if not present
if (!pluginManager.getPlugin('docker-plugin')) {
pluginManager.install('docker-plugin', true)
jenkins.save()
}
2. Docker Agent Configuration
// Configure Docker cloud in Jenkins
import jenkins.model.Jenkins
import hudson.slaves.NodeProperty
import hudson.plugins.docker.DockerCloud
import hudson.plugins.docker.DockerTemplate
import hudson.slaves.EnvironmentVariablesNodeProperty
def jenkins = Jenkins.getInstance()
// Create Docker template
def dockerTemplate = new DockerTemplate(
'docker-agent', // template name
'jenkins/inbound-agent:latest', // docker image
'', // docker command
'', // remote FS root
'1', // number of executors
'docker-agent', // label
new EnvironmentVariablesNodeProperty([])
)
// Create Docker cloud
def dockerCloud = new DockerCloud(
'docker-cloud', // cloud name
[], // container list
'unix:///var/run/docker.sock', // docker host URI
100, // connect timeout
1, // read timeout
[dockerTemplate] // templates
)
// Add cloud to Jenkins
jenkins.clouds.add(dockerCloud)
jenkins.save()
Docker Pipeline Integration
1. Docker Build Pipeline
pipeline {
agent any
environment {
DOCKER_REGISTRY = 'ghcr.io'
IMAGE_NAME = 'myapp'
IMAGE_TAG = "${env.BUILD_NUMBER}"
}
stages {
stage('Build Docker Image') {
steps {
script {
// Build Docker image
def image = docker.build(
"${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}",
"--build-arg BUILD_NUMBER=${env.BUILD_NUMBER} ."
)
// Tag as latest for main branch
if (env.BRANCH_NAME == 'main') {
image.tag('latest')
}
// Push to registry
docker.withRegistry("https://${DOCKER_REGISTRY}", 'docker-registry-credentials') {
image.push()
if (env.BRANCH_NAME == 'main') {
image.push('latest')
}
}
}
}
}
stage('Test Docker Image') {
steps {
script {
// Run containerized tests
docker.image("${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}").inside {
sh 'npm test'
sh 'npm run test:integration'
}
}
}
}
stage('Security Scan') {
steps {
script {
// Run security scan on Docker image
sh """
docker run --rm -v /var/run/docker.sock:/var/run/docker.sock \
aquasec/trivy image \
${DOCKER_REGISTRY}/${IMAGE_NAME}:${IMAGE_TAG}
"""
}
}
}
}
post {
always {
// Clean up Docker images
sh 'docker system prune -f'
}
}
}
2. Multi-Stage Docker Pipeline
pipeline {
agent any
stages {
stage('Build Multi-Stage Docker') {
steps {
script {
// Build with multi-stage Dockerfile
def image = docker.build(
"myapp:${env.BUILD_NUMBER}",
"--target production -f Dockerfile.multi-stage ."
)
// Test the image
docker.image("myapp:${env.BUILD_NUMBER}").inside {
sh 'npm run test'
}
// Push to registry
docker.withRegistry('https://ghcr.io', 'docker-registry-credentials') {
image.push()
}
}
}
}
}
}
Docker Compose Integration
1. Docker Compose Pipeline
pipeline {
agent any
stages {
stage('Start Services') {
steps {
sh 'docker-compose -f docker-compose.test.yml up -d'
sh 'docker-compose -f docker-compose.test.yml ps'
}
}
stage('Wait for Services') {
steps {
sh '''
# Wait for database to be ready
until docker-compose -f docker-compose.test.yml exec -T db pg_isready -U postgres; do
echo "Waiting for database..."
sleep 2
done
# Wait for application to be ready
until curl -f http://localhost:3000/health; do
echo "Waiting for application..."
sleep 2
done
'''
}
}
stage('Run Tests') {
steps {
sh '''
docker-compose -f docker-compose.test.yml exec -T app npm test
docker-compose -f docker-compose.test.yml exec -T app npm run test:integration
'''
}
}
stage('Stop Services') {
steps {
sh 'docker-compose -f docker-compose.test.yml down'
}
}
}
post {
always {
// Cleanup
sh 'docker-compose -f docker-compose.test.yml down -v'
}
}
}
Kubernetes Integration
Jenkins integration with Kubernetes enables cloud-native CI/CD with dynamic scaling and container orchestration.
Kubernetes Plugin Configuration
1. Kubernetes Cloud Setup
// Configure Kubernetes cloud
import jenkins.model.Jenkins
import org.csanchez.jenkins.plugins.kubernetes.KubernetesCloud
import org.csanchez.jenkins.plugins.kubernetes.PodTemplate
import org.csanchez.jenkins.plugins.kubernetes.ContainerTemplate
def jenkins = Jenkins.getInstance()
// Create container templates
def mavenContainer = new ContainerTemplate(
'maven', // name
'maven:3.8-openjdk-11', // image
'mvn', // command
'/home/jenkins/agent' // working directory
)
def dockerContainer = new ContainerTemplate(
'docker',
'docker:20.10',
'dockerd-entrypoint.sh',
'/home/jenkins/agent'
)
// Create pod template
def podTemplate = new PodTemplate()
podTemplate.setName('maven-docker-pod')
podTemplate.setLabel('maven-docker')
podTemplate.setContainers([mavenContainer, dockerContainer])
podTemplate.setServiceAccount('jenkins-agent')
podTemplate.setVolumes([
new HostPathVolume('/var/run/docker.sock', '/var/run/docker.sock'),
new EmptyDirVolume('/tmp', '/tmp')
])
// Create Kubernetes cloud
def k8sCloud = new KubernetesCloud(
'kubernetes', // cloud name
null, // namespace
'https://kubernetes.default.svc.cluster.local', // server URL
'', // credentials
'10', // max requests per host
'5m', // connect timeout
'5m', // read timeout
'5m', // container cap
[podTemplate] // pod templates
)
// Add cloud to Jenkins
jenkins.clouds.add(k8sCloud)
jenkins.save()
2. Kubernetes Pipeline
pipeline {
agent {
kubernetes {
label 'maven-docker'
yaml """
apiVersion: v1
kind: Pod
spec:
containers:
- name: maven
image: maven:3.8-openjdk-11
command: ['sleep']
args: ['99d']
volumeMounts:
- name: maven-cache
mountPath: /root/.m2
- name: docker
image: docker:20.10
command: ['sleep']
args: ['99d']
volumeMounts:
- name: docker-sock
mountPath: /var/run/docker.sock
volumes:
- name: maven-cache
emptyDir: {}
- name: docker-sock
hostPath:
path: /var/run/docker.sock
"""
}
}
stages {
stage('Build') {
steps {
container('maven') {
sh 'mvn clean compile'
}
}
}
stage('Test') {
steps {
container('maven') {
sh 'mvn test'
}
}
}
stage('Package') {
steps {
container('maven') {
sh 'mvn package'
}
}
}
stage('Build Docker Image') {
steps {
container('docker') {
script {
def image = docker.build("myapp:${env.BUILD_NUMBER}")
docker.withRegistry('https://ghcr.io', 'docker-registry-credentials') {
image.push()
}
}
}
}
}
stage('Deploy to Kubernetes') {
steps {
script {
sh """
# Update image tag in deployment
sed -i 's|IMAGE_TAG|${env.BUILD_NUMBER}|g' k8s/deployment.yaml
# Apply deployment
kubectl apply -f k8s/deployment.yaml
# Wait for rollout
kubectl rollout status deployment/myapp
"""
}
}
}
}
}
Kubernetes Deployment Strategies
1. Blue-Green Deployment
pipeline {
agent any
stages {
stage('Blue-Green Deployment') {
steps {
script {
def currentColor = sh(
script: 'kubectl get service myapp -o jsonpath="{.spec.selector.color}"',
returnStdout: true
).trim()
def newColor = currentColor == 'blue' ? 'green' : 'blue'
echo "Current color: ${currentColor}, Deploying to: ${newColor}"
// Deploy to new color
sh """
# Deploy to new color environment
sed -i 's|COLOR|${newColor}|g' k8s/deployment-${newColor}.yaml
sed -i 's|IMAGE_TAG|${env.BUILD_NUMBER}|g' k8s/deployment-${newColor}.yaml
kubectl apply -f k8s/deployment-${newColor}.yaml
# Wait for new deployment to be ready
kubectl rollout status deployment/myapp-${newColor}
# Health check
kubectl get pods -l app=myapp,color=${newColor}
"""
// Switch traffic
input message: "Switch traffic to ${newColor}?", ok: 'Switch'
sh """
# Update service to point to new color
kubectl patch service myapp -p '{"spec":{"selector":{"color":"${newColor}"}}}'
# Verify switch
kubectl get service myapp
"""
}
}
}
}
}
2. Canary Deployment
pipeline {
agent any
stages {
stage('Canary Deployment') {
steps {
script {
def canaryPercentage = 10
// Deploy canary version
sh """
# Deploy canary
sed -i 's|IMAGE_TAG|${env.BUILD_NUMBER}|g' k8s/canary-deployment.yaml
kubectl apply -f k8s/canary-deployment.yaml
# Configure traffic splitting
kubectl apply -f - <<EOF
apiVersion: v1
kind: ConfigMap
metadata:
name: canary-config
data:
canary-percentage: "${canaryPercentage}"
EOF
"""
// Monitor canary
sh """
# Wait for canary to be ready
kubectl rollout status deployment/myapp-canary
# Monitor canary metrics
kubectl get pods -l app=myapp,version=canary
"""
// Gradual rollout
for (def percentage = 10; percentage <= 100; percentage += 20) {
sh """
# Update traffic percentage
kubectl patch configmap canary-config -p '{"data":{"canary-percentage":"${percentage}"}}'
# Wait and monitor
sleep 300
"""
if (percentage < 100) {
input message: "Continue rollout to ${percentage}%?", ok: 'Continue'
}
}
}
}
}
}
}
Cloud Platform Integration
AWS Integration
1. AWS CLI and SDK Integration
pipeline {
agent any
environment {
AWS_REGION = 'us-west-2'
ECR_REGISTRY = '123456789012.dkr.ecr.us-west-2.amazonaws.com'
ECR_REPOSITORY = 'myapp'
}
stages {
stage('AWS ECR Login') {
steps {
script {
sh """
aws ecr get-login-password --region ${AWS_REGION} | \
docker login --username AWS --password-stdin ${ECR_REGISTRY}
"""
}
}
}
stage('Build and Push to ECR') {
steps {
script {
def image = docker.build("${ECR_REPOSITORY}:${env.BUILD_NUMBER}")
docker.withRegistry("https://${ECR_REGISTRY}", 'ecr-credentials') {
image.push()
image.push('latest')
}
}
}
}
stage('Deploy to ECS') {
steps {
script {
sh """
# Update ECS service
aws ecs update-service \
--cluster myapp-cluster \
--service myapp-service \
--force-new-deployment
# Wait for deployment
aws ecs wait services-stable \
--cluster myapp-cluster \
--services myapp-service
"""
}
}
}
stage('Deploy to Lambda') {
steps {
script {
sh """
# Package Lambda function
zip -r lambda-function.zip .
# Update Lambda function
aws lambda update-function-code \
--function-name myapp-function \
--zip-file fileb://lambda-function.zip
# Publish new version
aws lambda publish-version \
--function-name myapp-function \
--description "Build ${env.BUILD_NUMBER}"
"""
}
}
}
}
}
2. AWS CodeDeploy Integration
pipeline {
agent any
stages {
stage('Build Application') {
steps {
sh 'npm run build'
sh 'tar -czf application.tar.gz dist/'
}
}
stage('Deploy with CodeDeploy') {
steps {
script {
sh """
# Upload to S3
aws s3 cp application.tar.gz s3://myapp-deployments/
# Create deployment
aws deploy create-deployment \
--application-name myapp \
--deployment-group-name myapp-dg \
--s3-location bucket=myapp-deployments,key=application.tar.gz,bundleType=tar
"""
}
}
}
}
}
Azure Integration
1. Azure Container Registry Integration
pipeline {
agent any
environment {
AZURE_REGISTRY = 'myregistry.azurecr.io'
AZURE_RESOURCE_GROUP = 'myapp-rg'
AZURE_CONTAINER_APP = 'myapp'
}
stages {
stage('Azure Login') {
steps {
script {
withCredentials([azureServicePrincipal('azure-credentials')]) {
sh 'az login --service-principal -u $AZURE_CLIENT_ID -p $AZURE_CLIENT_SECRET --tenant $AZURE_TENANT_ID'
}
}
}
}
stage('Build and Push to ACR') {
steps {
script {
sh """
# Login to ACR
az acr login --name myregistry
# Build and push
docker build -t ${AZURE_REGISTRY}/myapp:${env.BUILD_NUMBER} .
docker push ${AZURE_REGISTRY}/myapp:${env.BUILD_NUMBER}
"""
}
}
}
stage('Deploy to Container Apps') {
steps {
script {
sh """
# Update container app
az containerapp update \
--name ${AZURE_CONTAINER_APP} \
--resource-group ${AZURE_RESOURCE_GROUP} \
--image ${AZURE_REGISTRY}/myapp:${env.BUILD_NUMBER}
"""
}
}
}
}
}
GCP Integration
1. Google Cloud Build Integration
pipeline {
agent any
environment {
GCP_PROJECT = 'myproject'
GCR_REGISTRY = 'gcr.io/myproject'
}
stages {
stage('GCP Authentication') {
steps {
script {
withCredentials([file(credentialsId: 'gcp-service-account', variable: 'GOOGLE_APPLICATION_CREDENTIALS')]) {
sh 'gcloud auth activate-service-account --key-file $GOOGLE_APPLICATION_CREDENTIALS'
sh 'gcloud config set project ${GCP_PROJECT}'
}
}
}
}
stage('Build with Cloud Build') {
steps {
script {
sh """
# Submit build to Cloud Build
gcloud builds submit \
--tag ${GCR_REGISTRY}/myapp:${env.BUILD_NUMBER} \
--tag ${GCR_REGISTRY}/myapp:latest \
.
"""
}
}
}
stage('Deploy to Cloud Run') {
steps {
script {
sh """
# Deploy to Cloud Run
gcloud run deploy myapp \
--image ${GCR_REGISTRY}/myapp:${env.BUILD_NUMBER} \
--platform managed \
--region us-central1 \
--allow-unauthenticated
"""
}
}
}
}
}
Monitoring and Logging Integration
Prometheus Integration
1. Prometheus Metrics Collection
pipeline {
agent any
stages {
stage('Build with Metrics') {
steps {
script {
// Build application
sh 'mvn clean package'
// Start application with metrics
sh """
java -jar target/myapp.jar \
-Dserver.port=8080 \
-Dmanagement.endpoints.web.exposure.include=prometheus \
-Dmanagement.metrics.export.prometheus.enabled=true &
"""
// Wait for application to start
sh 'sleep 30'
// Collect metrics
sh """
curl -s http://localhost:8080/actuator/prometheus > metrics.txt
# Send metrics to Prometheus
curl -X POST \
-H "Content-Type: text/plain" \
--data-binary @metrics.txt \
http://prometheus:9091/metrics/job/jenkins-build/instance/${env.BUILD_NUMBER}
"""
}
}
}
}
}
2. Jenkins Prometheus Plugin
// Configure Prometheus plugin
import jenkins.model.Jenkins
import io.jenkins.plugins.prometheus.PrometheusConfiguration
def jenkins = Jenkins.getInstance()
def prometheusConfig = PrometheusConfiguration.get()
// Configure Prometheus settings
prometheusConfig.setCollectBuildMetrics(true)
prometheusConfig.setCollectNodeMetrics(true)
prometheusConfig.setCollectSystemMetrics(true)
prometheusConfig.setCollectMetrics(true)
prometheusConfig.setPath('prometheus')
prometheusConfig.save()
jenkins.save()
ELK Stack Integration
1. Log Aggregation Pipeline
pipeline {
agent any
stages {
stage('Build and Test') {
steps {
script {
// Build application
sh 'mvn clean compile'
// Run tests with structured logging
sh '''
mvn test -Dlogging.level.org.springframework=INFO \
-Dlogging.pattern.console="%d{yyyy-MM-dd HH:mm:ss} [%thread] %-5level %logger{36} - %msg%n"
'''
// Collect test logs
sh '''
# Format logs for ELK
echo "{\"timestamp\":\"$(date -u +%Y-%m-%dT%H:%M:%S.%3NZ)\",\"level\":\"INFO\",\"message\":\"Build completed\",\"buildNumber\":\"${BUILD_NUMBER}\",\"jobName\":\"${JOB_NAME}\"}" >> build-logs.json
'''
}
}
}
stage('Send Logs to ELK') {
steps {
script {
sh """
# Send logs to Elasticsearch
curl -X POST \
-H "Content-Type: application/json" \
-d @build-logs.json \
http://elasticsearch:9200/jenkins-logs/_doc
"""
}
}
}
}
}
2. Centralized Logging Configuration
// Configure logging for Jenkins
import jenkins.model.Jenkins
import java.util.logging.Logger
import java.util.logging.Level
def jenkins = Jenkins.getInstance()
// Configure log levels
Logger.getLogger("jenkins").setLevel(Level.INFO)
Logger.getLogger("hudson").setLevel(Level.INFO)
Logger.getLogger("org.springframework").setLevel(Level.INFO)
// Configure log file location
def logDir = new File(jenkins.getRootDir(), "logs")
if (!logDir.exists()) {
logDir.mkdirs()
}
// Configure log rotation
def logHandler = new java.util.logging.FileHandler(
"${logDir}/jenkins.log",
10 * 1024 * 1024, // 10MB
5, // 5 files
true // append
)
logHandler.setFormatter(new java.util.logging.SimpleFormatter())
Logger.getLogger("jenkins").addHandler(logHandler)
Grafana Dashboard Integration
1. Jenkins Metrics Dashboard
{
"dashboard": {
"title": "Jenkins Build Metrics",
"panels": [
{
"title": "Build Success Rate",
"type": "stat",
"targets": [
{
"expr": "rate(jenkins_builds_total{result=\"SUCCESS\"}[5m]) / rate(jenkins_builds_total[5m]) * 100",
"legendFormat": "Success Rate %"
}
]
},
{
"title": "Build Duration",
"type": "graph",
"targets": [
{
"expr": "jenkins_builds_duration_milliseconds",
"legendFormat": "{{job_name}}"
}
]
},
{
"title": "Queue Length",
"type": "graph",
"targets": [
{
"expr": "jenkins_queue_length",
"legendFormat": "Queue Length"
}
]
}
]
}
}
2. Alerting Configuration
// Configure alerting rules
def alertingRules = '''
groups:
- name: jenkins
rules:
- alert: JenkinsBuildFailure
expr: rate(jenkins_builds_total{result="FAILURE"}[5m]) > 0.1
for: 5m
labels:
severity: warning
annotations:
summary: "High build failure rate detected"
description: "Build failure rate is {{ $value }} failures per minute"
- alert: JenkinsQueueBacklog
expr: jenkins_queue_length > 10
for: 10m
labels:
severity: critical
annotations:
summary: "Jenkins queue backlog is high"
description: "Queue length is {{ $value }}"
'''
// Write alerting rules to Prometheus
writeFile file: 'jenkins-alerts.yml', text: alertingRules
sh 'mv jenkins-alerts.yml /etc/prometheus/rules/'