Answer
Jenkins + Docker Integration
1. Use Docker as a Build Agent
Run each pipeline stage inside a Docker container — no need to install tools on agents.
GROOVY
pipeline {
agent {
docker {
image 'maven:3.9-openjdk-17-slim'
args '-v /root/.m2:/root/.m2 --network host'
}
}
stages {
stage('Build & Test') {
steps {
// Runs inside the Maven container
sh 'mvn clean test'
}
}
}
}
2. Different Docker Images Per Stage
GROOVY
pipeline {
agent none
stages {
stage('Build') {
agent {
docker { image 'maven:3.9-openjdk-17' }
}
steps {
sh 'mvn clean package -DskipTests'
stash name: 'jar', includes: 'target/*.jar'
}
}
stage('Code Quality') {
agent {
docker { image 'sonarsource/sonar-scanner-cli:latest' }
}
steps {
withCredentials([string(credentialsId: 'sonar-token', variable: 'SONAR_TOKEN')]) {
sh 'sonar-scanner -Dsonar.login=$SONAR_TOKEN'
}
}
}
stage('Run Selenium Tests') {
agent {
docker {
image 'selenium/standalone-chrome:latest'
args '-p 4444:4444 --shm-size=2g'
}
}
steps {
unstash 'jar'
sh 'mvn test -Dbrowser=chrome -Dselenium.hub=http://localhost:4444'
}
}
}
}
3. Build and Push a Docker Image
GROOVY
pipeline {
agent any
environment {
DOCKER_IMAGE = "myorg/myapp:${env.BUILD_NUMBER}"
DOCKER_CREDS = credentials('docker-hub-creds')
}
stages {
stage('Build App') {
steps {
sh 'mvn clean package -DskipTests'
}
}
stage('Build Docker Image') {
steps {
sh "docker build -t ${DOCKER_IMAGE} ."
}
}
stage('Run Tests Against Container') {
steps {
sh "docker run --rm ${DOCKER_IMAGE} mvn test"
}
}
stage('Push to Docker Hub') {
when { branch 'main' }
steps {
sh """
echo $DOCKER_CREDS_PSW | docker login -u $DOCKER_CREDS_USR --password-stdin
docker push ${DOCKER_IMAGE}
docker tag ${DOCKER_IMAGE} myorg/myapp:latest
docker push myorg/myapp:latest
"""
}
}
stage('Deploy') {
when { branch 'main' }
steps {
sh "docker-compose -f docker-compose.prod.yml up -d"
}
}
}
post {
always {
// Clean up local Docker images
sh "docker rmi ${DOCKER_IMAGE} || true"
}
}
}
4. Dockerfile for the Application
DOCKERFILE
# Dockerfile
FROM openjdk:17-jre-slim
WORKDIR /app
COPY target/myapp-*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]
Requirements on Jenkins Agent
Bash
# Docker must be installed on agent
sudo apt install docker.io
sudo usermod -aG docker jenkins # allow jenkins user to run docker
sudo systemctl restart jenkins
