Jenkins
Overview
Jenkins is an open-source automation server used to build, test, and deploy software continuously. It enables teams to practice Continuous Integration and Continuous Deployment (CI/CD).
Core Concepts
Pipeline vs Freestyle Jobs
| Aspect |
Freestyle |
Pipeline |
| Definition |
UI configuration |
Code-based (Jenkinsfile) |
| Version Control |
Manual |
Stored in Git |
| Reusability |
Limited |
High |
| Debugging |
Difficult |
Easy |
| Scalability |
Limited |
Excellent |
Jenkins Architecture
┌─────────────────────────────────┐
│ Jenkins Master │
│ - Job Orchestration │
│ - Web UI │
│ - Plugin Management │
└──────────────┬──────────────────┘
│
┌─────────┼─────────┐
│ │ │
Agent1 Agent2 Agent3
(Linux) (Windows) (Docker)
Installation & Setup
Docker Installation
# Pull Jenkins image
docker pull jenkins/jenkins:lts
# Run Jenkins container
docker run -d -p 8080:8080 -p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
--name jenkins \
jenkins/jenkins:lts
# Get initial admin password
docker exec jenkins cat /var/jenkins_home/secrets/initialAdminPassword
Linux Installation
# Update package manager
sudo apt update
# Install Java
sudo apt install -y openjdk-11-jdk
# Add Jenkins repository
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -
sudo sh -c 'echo deb https://pkg.jenkins.io/debian-stable binary/ > /etc/apt/sources.list.d/jenkins.list'
# Install Jenkins
sudo apt update
sudo apt install -y jenkins
# Start Jenkins
sudo systemctl start jenkins
sudo systemctl enable jenkins
Pipeline Basics
Declarative Pipeline
pipeline {
agent any
triggers {
githubPush() // Trigger on GitHub push
}
environment {
APP_NAME = 'MyApp'
VERSION = '1.0.0'
DOCKER_REGISTRY = 'docker.io'
}
options {
buildDiscarder(logRotator(numToKeepStr: '10'))
timeout(time: 1, unit: 'HOURS')
}
stages {
stage('Checkout') {
steps {
echo 'Checking out code...'
checkout scm
}
}
stage('Build') {
steps {
echo 'Building application...'
sh 'mvn clean package'
}
}
stage('Test') {
steps {
echo 'Running tests...'
sh 'mvn test'
junit 'target/surefire-reports/*.xml'
}
}
stage('SonarQube Analysis') {
steps {
echo 'Running code quality scan...'
sh 'mvn sonar:sonar'
}
}
stage('Build Docker Image') {
steps {
echo 'Building Docker image...'
sh 'docker build -t ${DOCKER_REGISTRY}/${APP_NAME}:${VERSION} .'
}
}
stage('Push to Registry') {
steps {
echo 'Pushing image to registry...'
sh 'docker push ${DOCKER_REGISTRY}/${APP_NAME}:${VERSION}'
}
}
stage('Deploy to Dev') {
steps {
echo 'Deploying to development...'
sh 'kubectl set image deployment/myapp myapp=${DOCKER_REGISTRY}/${APP_NAME}:${VERSION} -n dev'
}
}
stage('Deploy to Prod') {
when {
branch 'main'
}
steps {
echo 'Deploying to production...'
input 'Approve production deployment?'
sh 'kubectl set image deployment/myapp myapp=${DOCKER_REGISTRY}/${APP_NAME}:${VERSION} -n prod'
}
}
}
post {
always {
echo 'Cleaning up...'
cleanWs()
}
success {
echo 'Pipeline succeeded!'
// Send success notification
}
failure {
echo 'Pipeline failed!'
// Send failure notification
}
}
}
Scripted Pipeline
node {
try {
stage('Checkout') {
checkout scm
}
stage('Build') {
sh 'mvn clean package'
}
stage('Test') {
sh 'mvn test'
}
stage('Deploy') {
sh './deploy.sh'
}
}
catch (Exception e) {
echo "Build failed: ${e.message}"
throw e
}
}
Essential Plugins
| Plugin |
Purpose |
Use Case |
| GitHub |
SCM integration |
Git repositories |
| Docker |
Container management |
Build & push images |
| Kubernetes |
K8s integration |
Deploy to Kubernetes |
| SonarQube |
Code quality |
Quality gates |
| Slack |
Notifications |
Team notifications |
| Email |
Email alerts |
Build notifications |
| JUnit |
Test reporting |
Test result parsing |
| Artifactory |
Artifact storage |
Artifact management |
Jenkins Credentials
Types of Credentials
pipeline {
agent any
environment {
// Use credentials plugin
DOCKER_CREDS = credentials('docker-credentials')
GIT_TOKEN = credentials('github-token')
}
stages {
stage('Authenticate') {
steps {
sh '''
echo $DOCKER_CREDS_PSW | docker login -u $DOCKER_CREDS_USR --password-stdin
'''
}
}
}
}
Store Credentials
// Jenkins Credentials UI: Manage Jenkins → Manage Credentials
// Use in pipeline:
withCredentials([
usernamePassword(
credentialsId: 'docker-creds',
usernameVariable: 'DOCKER_USER',
passwordVariable: 'DOCKER_PASS'
)
]) {
sh 'echo $DOCKER_PASS | docker login -u $DOCKER_USER --password-stdin'
}
Integration Examples
GitHub Webhook Trigger
pipeline {
agent any
triggers {
githubPush()
}
stages {
stage('Pull Code') {
steps {
checkout([
$class: 'GitSCM',
branches: [[name: '*/main']],
userRemoteConfigs: [[
url: 'https://github.com/user/repo.git'
]]
])
}
}
}
}
Docker Integration
pipeline {
agent any
stages {
stage('Build and Push') {
steps {
script {
docker.withRegistry('https://docker.io', 'docker-credentials') {
def app = docker.build("myapp:${BUILD_NUMBER}")
app.push("latest")
}
}
}
}
}
}
Kubernetes Deployment
pipeline {
agent any
stages {
stage('Deploy') {
steps {
withKubeConfig([credentialsId: 'kubeconfig']) {
sh 'kubectl apply -f deployment.yaml'
sh 'kubectl rollout status deployment/myapp'
}
}
}
}
}
Job Configuration
Job Types
| Type |
Use Case |
Benefit |
| Pipeline |
Complex workflows |
Code-based, version controlled |
| Freestyle |
Simple tasks |
Easy to configure |
| Multibranch |
Multiple branches |
Branch-specific builds |
| Folder |
Organization |
Logical grouping |
Common Parameters
pipeline {
agent any
parameters {
string(
name: 'ENVIRONMENT',
defaultValue: 'dev',
description: 'Deployment environment'
)
choice(
name: 'VERSION',
choices: ['1.0.0', '1.0.1', '1.1.0'],
description: 'Application version'
)
booleanParam(
name: 'RUN_TESTS',
defaultValue: true,
description: 'Run tests'
)
}
stages {
stage('Deploy') {
steps {
echo "Deploying version ${params.VERSION} to ${params.ENVIRONMENT}"
echo "Run tests: ${params.RUN_TESTS}"
}
}
}
}
Monitoring & Logging
View Logs
# Jenkins logs location
sudo journalctl -u jenkins -f
# Docker Jenkins logs
docker logs -f jenkins
# Workspace logs
/var/lib/jenkins/jobs/JobName/builds/1/log
Health Check
# Check Jenkins status
curl http://localhost:8080/api/json
# Verify plugins
curl http://localhost:8080/pluginManager/api/json
# Check nodes
curl http://localhost:8080/computer/api/json
Best Practices
| Practice |
Benefit |
Implementation |
| Use Jenkinsfile |
Version control |
Store in Git repo |
| Declarative syntax |
Readability |
Avoid scripted when possible |
| Secure credentials |
Security |
Use credential plugin |
| Parallel stages |
Performance |
Reduce build time |
| Build artifacts |
Reusability |
Archive outputs |
| Build history |
Troubleshooting |
Keep logs |
| Notifications |
Awareness |
Slack, email alerts |
| Test reports |
Quality |
Publish test results |
Troubleshooting
Common Issues
# Jenkins won't start
sudo systemctl status jenkins
sudo tail -f /var/log/jenkins/jenkins.log
# Out of memory
# Increase JVM heap: JAVA_ARGS="-Xmx2g"
# Slow builds
# Check agent connectivity, add more agents
# Plugin conflicts
# Disable plugin, restart Jenkins
Summary Table: Pipeline Stages
| Stage |
Purpose |
Command |
| Checkout |
Get source code |
checkout scm |
| Build |
Compile code |
mvn clean package |
| Test |
Run tests |
mvn test |
| Analysis |
Code quality |
mvn sonar:sonar |
| Publish |
Create artifact |
docker build |
| Deploy Dev |
Deploy to dev |
kubectl apply |
| Approval |
Manual gate |
input 'Approve?' |
| Deploy Prod |
Deploy to production |
kubectl apply |
Resources