Skip to main content

Jenkins Cheat Sheet

Installation​

Docker​

# Pull and run Jenkins
docker run -d -p 8080:8080 -p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
--name jenkins \
jenkins/jenkins:latest

# Get initial admin password
docker logs jenkins | grep -A 5 "initialAdminPassword"

Linux​

# Ubuntu/Debian
wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | \
sudo apt-key add -
echo "deb https://pkg.jenkins.io/debian-stable binary/" | \
sudo tee /etc/apt/sources.list.d/jenkins.list
sudo apt-get update
sudo apt-get install jenkins

# Start service
sudo systemctl start jenkins
sudo systemctl enable jenkins
sudo systemctl status jenkins

Jenkins CLI​

Basic Commands​

# Get help
java -jar jenkins-cli.jar -s http://localhost:8080 help

# List all jobs
java -jar jenkins-cli.jar -s http://localhost:8080 list-jobs

# Build a job
java -jar jenkins-cli.jar -s http://localhost:8080 build jobname

# Build with parameters
java -jar jenkins-cli.jar -s http://localhost:8080 build jobname \
-p PARAM1=value1 -p PARAM2=value2

# Get job info
java -jar jenkins-cli.jar -s http://localhost:8080 get-job jobname

# Delete job
java -jar jenkins-cli.jar -s http://localhost:8080 delete-job jobname

# Get console output
java -jar jenkins-cli.jar -s http://localhost:8080 console jobname buildnumber

Authentication​

# Using username and API token
java -jar jenkins-cli.jar -s http://localhost:8080 \
-auth username:apitoken \
list-jobs

# Using SSH key
java -jar jenkins-cli.jar -s http://localhost:8080 \
-i ~/.ssh/id_rsa \
list-jobs

Jenkinsfile Syntax​

Declarative Pipeline Structure​

pipeline {
agent any

options {
// Build options
timeout(time: 1, unit: 'HOURS')
timestamps()
buildDiscarder(logRotator(numToKeepStr: '30'))
}

environment {
// Global environment variables
BUILD_ID = "${BUILD_NUMBER}"
BUILD_USER = "${BUILD_USER}"
}

parameters {
// Build parameters
string(name: 'ENV', defaultValue: 'dev', description: 'Environment')
choice(name: 'REGION', choices: ['us-east-1', 'us-west-2'], description: 'AWS Region')
booleanParam(name: 'DEPLOY', defaultValue: false, description: 'Deploy?')
}

triggers {
// Build triggers
githubPush()
pollSCM('*/5 * * * *')
cron('@daily')
}

stages {
stage('Stage Name') {
agent {
// Agent specification
label 'linux'
}

when {
// Conditional stage execution
branch 'main'
}

environment {
// Stage-specific environment
APP_ENV = 'production'
}

steps {
// Stage tasks
sh 'echo "Running stage"'
}
}
}

post {
// Post-build actions
always {
cleanWs()
}

success {
echo 'Build successful'
}

failure {
echo 'Build failed'
}
}
}

All Directives​

DirectivePurposeExample
agentWhere to runagent any, agent { label 'linux' }
environmentEnvironment variablesJAVA_HOME='/usr/lib/jvm/java'
optionsBuild optionstimeout(time: 1, unit: 'HOURS')
parametersBuild parametersstring(name: 'ENV', defaultValue: 'dev')
triggersBuild triggersgithubPush(), pollSCM('* * * * *')
stagesBuild stagesContains multiple stage blocks
stageSingle stageContains steps and post
stepsStage actionsShell commands, scripts
postPost-build actionsalways, success, failure
whenConditional executionbranch 'main', expression { ... }

Common Pipeline Snippets​

Checkout from Git​

// Basic checkout
checkout scm

// Checkout specific branch
checkout([
$class: 'GitSCM',
branches: [[name: 'main']],
userRemoteConfigs: [[url: 'https://github.com/org/repo.git']]
])

// Checkout with credentials
checkout([
$class: 'GitSCM',
branches: [[name: 'main']],
userRemoteConfigs: [[
url: 'git@github.com:org/repo.git',
credentialsId: 'github-ssh'
]]
])

Build with Maven​

// Standard Maven build
sh 'mvn clean package'

// With custom settings
sh 'mvn -s settings.xml clean package'

// Skip tests
sh 'mvn clean package -DskipTests'

// Specific goals
sh 'mvn clean compile test package'

Build with Gradle​

// Standard Gradle build
sh './gradlew clean build'

// With custom properties
sh './gradlew clean build -Penv=production'

// Skip tests
sh './gradlew build -x test'

Build with Node.js​

// Install and build
sh 'npm install'
sh 'npm run build'
sh 'npm test'

// Using specific Node version
withEnv(['NODE_PATH=/opt/nodejs/bin']) {
sh 'npm install && npm build'
}

Docker Build and Push​

// Build Docker image
sh 'docker build -t myapp:${BUILD_NUMBER} .'

// Push to registry
sh '''
docker login -u $DOCKER_USER -p $DOCKER_PASS myregistry.azurecr.io
docker tag myapp:${BUILD_NUMBER} myregistry.azurecr.io/myapp:${BUILD_NUMBER}
docker push myregistry.azurecr.io/myapp:${BUILD_NUMBER}
'''

// Using credentials
withCredentials([
usernamePassword(credentialsId: 'docker-hub', usernameVariable: 'USER', passwordVariable: 'PASS')
]) {
sh '''
docker login -u $USER -p $PASS
docker build -t myapp:${BUILD_NUMBER} .
docker push myapp:${BUILD_NUMBER}
'''
}

Deploy to Kubernetes​

// Deploy using kubectl
sh '''
kubectl apply -f deployment.yaml
kubectl set image deployment/myapp \
myapp=myregistry.azurecr.io/myapp:${BUILD_NUMBER}
'''

// Deploy using Helm
sh '''
helm upgrade --install myapp ./chart \
--set image.tag=${BUILD_NUMBER}
'''

Parallel Execution​

parallel(
'Unit Tests': {
sh 'npm test'
},
'Integration Tests': {
sh 'npm run test:integration'
},
'Lint': {
sh 'npm run lint'
}
)

Error Handling​

try {
sh 'failing-command'
} catch (Exception e) {
echo "Command failed: ${e.message}"
currentBuild.result = 'FAILURE'
}

// Or using script step
script {
def result = sh(script: 'some-command', returnStatus: true)
if (result != 0) {
error('Command failed')
}
}

Artifact Archiving​

// Archive build artifacts
archiveArtifacts artifacts: 'build/libs/*.jar', allowEmptyArchive: true

// Archive multiple patterns
archiveArtifacts artifacts: '''
build/libs/**/*.jar,
build/reports/**/*,
dist/**/*
''', allowEmptyArchive: true

// Publish to repository
sh '''
curl -v -u user:pass \
-F file=@build/app.jar \
https://repository.example.com/artifacts/
'''

Test Result Publishing​

// Publish JUnit test results
junit 'target/surefire-reports/**/*.xml'

// Publish code coverage
publishHTML([
allowMissing: false,
alwaysLinkToLastBuild: false,
keepAll: false,
reportDir: 'coverage',
reportFiles: 'index.html',
reportName: 'Code Coverage'
])

Notifications​

// Email notification
emailext(
subject: 'Build ${BUILD_NUMBER} ${BUILD_STATUS}',
body: '''
Build: ${BUILD_NUMBER}
Status: ${BUILD_STATUS}
Log: ${BUILD_LOG}
''',
to: '${DEFAULT_RECIPIENTS}',
attachmentsPattern: 'build/reports/*'
)

// Slack notification
slackSend(
color: currentBuild.result == 'SUCCESS' ? 'good' : 'danger',
message: "Build ${BUILD_NUMBER}: ${currentBuild.result}\n${BUILD_URL}"
)

Groovy Snippets​

Variables and Strings​

// Define variables
def name = "Jenkins"
def version = 2.300

// String interpolation
echo "Running ${name} version ${version}"

// Multi-line strings
def script = '''
#!/bin/bash
echo "Hello World"
exit 0
'''

Conditionals​

// If statement
if (env.BRANCH_NAME == 'main') {
echo "Running on main branch"
} else {
echo "Running on feature branch"
}

// Switch statement
switch(env.BUILD_NUMBER) {
case '1':
echo "First build"
break
default:
echo "Regular build"
}

// Ternary operator
def environment = env.BRANCH_NAME == 'main' ? 'prod' : 'dev'

Loops​

// For loop
for (int i = 0; i < 3; i++) {
echo "Iteration ${i}"
}

// For-each loop
def items = ['a', 'b', 'c']
for (item in items) {
echo "Item: ${item}"
}

// While loop
def count = 0
while (count < 3) {
echo "Count: ${count}"
count++
}

Functions​

// Define function
def greet(name) {
return "Hello, ${name}!"
}

// Call function
echo greet("Jenkins")

// Function with default parameters
def deploy(env = 'dev') {
echo "Deploying to ${env}"
}

Exception Handling​

try {
sh 'failing-command'
} catch (Exception e) {
echo "Error: ${e.message}"
currentBuild.result = 'FAILURE'
error('Build failed')
} finally {
echo "Cleanup"
}

Environment Variables​

Predefined Variables​

VariableDescriptionExample
BUILD_NUMBERBuild number123
BUILD_IDBuild ID2021-03-15_10-30-45
BUILD_URLBuild URLhttp://jenkins/job/myjob/123/
BUILD_LOGBuild log(see below)
WORKSPACEJob workspace/var/jenkins_home/jobs/myjob/workspace
JOB_NAMEJob namemyjob
GIT_BRANCHGit branchmain
GIT_COMMITGit commit SHAabc123def456
BUILD_TIMESTAMPBuild timestamp2021-03-15T10:30:45Z
BRANCH_NAMEPipeline branchmain

Setting Variables​

// In environment block
environment {
BUILD_ENV = 'production'
APP_VERSION = "${BUILD_NUMBER}.0"
}

// In script
script {
env.CUSTOM_VAR = "value"
}

// From command output
script {
env.GIT_COMMIT = sh(script: 'git rev-parse HEAD', returnStdout: true).trim()
}

Common Plugins Reference​

Source Control​

PluginPurpose
GitGit repository integration
GitHubGitHub-specific features
GitLabGitLab integration
SubversionSVN support

Build Tools​

PluginPurpose
MavenMaven build support
GradleGradle build support
Node.jsNode.js plugin
DockerDocker build/push
KubernetesKubernetes integration

Reporting​

PluginPurpose
JUnitTest result publishing
CoberturaCode coverage reports
SonarQubeCode quality analysis
HTMLPublisherHTML report publishing

Notifications​

PluginPurpose
Email ExtensionAdvanced email notifications
SlackSlack integration
GitHubGitHub status updates
TeamsMicrosoft Teams notifications

Pipeline​

PluginPurpose
PipelinePipeline support
Blue OceanModern pipeline UI
Shared LibraryReusable pipeline code

Global Configuration​

Jenkins Configuration File​

Located at /var/jenkins_home/config.xml (Docker) or /var/lib/jenkins/config.xml (Linux)

Backup and Restore​

# Backup Jenkins home
tar -czf jenkins-backup.tar.gz /var/jenkins_home/

# Restore
tar -xzf jenkins-backup.tar.gz -C /

# Or Docker
docker exec jenkins tar -czf /var/jenkins_home/backup.tar.gz /var/jenkins_home
docker cp jenkins:/var/jenkins_home/backup.tar.gz .

Jenkins File Locations​

ItemLocation
Home/var/jenkins_home or /var/lib/jenkins
Config$JENKINS_HOME/config.xml
Jobs$JENKINS_HOME/jobs/
Workspace$JENKINS_HOME/workspace/
Plugins$JENKINS_HOME/plugins/
Logs$JENKINS_HOME/logs/

Pipeline Best Practices​

// Use descriptive stage names
stage('Build and Package Application') {
steps {
sh './build.sh'
}
}

// Fail fast on errors
steps {
sh 'set -e' // Exit on first error
sh './test.sh'
}

// Use timeouts
options {
timeout(time: 1, unit: 'HOURS')
}

// Clean workspace
post {
always {
cleanWs()
}
}

// Use credentials safely
withCredentials([string(credentialsId: 'secret-id', variable: 'SECRET')]) {
sh 'echo $SECRET > /tmp/secret' // Masked in logs
}

// Parallel for performance
parallel(
'Test': { sh 'npm test' },
'Build': { sh 'npm run build' }
)

Troubleshooting​

# View Jenkins logs
tail -f /var/log/jenkins/jenkins.log

# Check Jenkins status
systemctl status jenkins

# Restart Jenkins
systemctl restart jenkins

# Access Jenkins Script Console (for debugging)
# http://localhost:8080/script

# Monitor running builds
curl http://localhost:8080/api/json

# Get job configuration
curl http://localhost:8080/job/jobname/config.xml

Quick Reference​

Pipeline Syntax: pipeline { agent any; stages { stage('Name') { steps { sh 'command' } } } }

Common Commands:

  • Build: sh 'command'
  • Docker: docker build -t app:latest .
  • Maven: mvn clean package
  • Test: junit 'test-results/**/*.xml'
  • Deploy: kubectl apply -f deployment.yaml
  • Notify: slackSend(message: 'Build complete')

Common Patterns:

  • Checkout: checkout scm
  • Parallel: parallel(...)
  • Post: post { always { ... } success { ... } failure { ... } }
  • Credentials: withCredentials([...])
  • Artifacts: archiveArtifacts artifacts: '...'