Skip to content

Jenkins - Automated Deployment

Automating deployment is a core part of Continuous Delivery and Continuous Deployment. Jenkins offers various methods and plugins to deploy applications to different environments.

While older plugins like ‘Deploy to container’ exist for deploying WAR/EAR files directly to traditional application servers (Tomcat, JBoss/WildFly), modern deployment often involves containers, cloud platforms, or artifact repositories.

Common Deployment Methods with Jenkins Pipeline

Section titled “Common Deployment Methods with Jenkins Pipeline”

This is a common method for deploying to traditional servers (VMs or bare metal). It typically involves:

  • Prerequisites: Install the ‘SSH Agent’ plugin.
  • Credentials: Store SSH private keys securely in Jenkins Credentials.
  • Pipeline Steps: Use the sshagent step to wrap commands that need SSH access. Inside the wrapper, use sh steps with commands like scp (to copy files) and ssh (to execute remote commands like restarting services, running deployment scripts).

Example Snippet (Declarative Pipeline):

stage('Deploy to Staging') {
steps {
sshagent(credentials: ['your-ssh-key-credential-id']) {
sh 'scp target/myapp.war user@staging.example.com:/opt/tomcat/webapps/'
sh 'ssh user@staging.example.com systemctl restart tomcat'
}
}
}

Containerization is extremely popular. Jenkins integrates well with Docker:

  • Prerequisites: Docker installed on the Jenkins agent (or use Docker agents). Install ‘Docker Pipeline’ and ‘Docker Commons’ plugins.
  • Credentials: Store Docker registry credentials (e.g., Docker Hub, AWS ECR, Google GCR) in Jenkins Credentials.
  • Pipeline Steps: Use Docker Pipeline steps like docker.build('myimage:latest') to build images, docker.withRegistry('https://registry.example.com', 'docker-registry-credential-id') { ... } to push/pull images, and potentially sh 'docker run ...' or orchestrator commands (see below).

Example Snippet (Declarative Pipeline):

stage('Build and Push Docker Image') {
steps {
script {
def customImage = docker.build('my-org/myapp:${env.BUILD_NUMBER}')
docker.withRegistry('https://docker.io', 'dockerhub-credentials') {
customImage.push()
customImage.push('latest')
}
}
}
}
stage('Deploy to Kubernetes') {
// Requires Kubernetes CLI (kubectl) configured on agent and appropriate plugins
steps {
echo 'Deploying using kubectl...'
// Example: sh 'kubectl apply -f deployment.yaml'
// Or use Kubernetes pipeline steps: https://plugins.jenkins.io/kubernetes-cli/
}
}

Major cloud providers have dedicated Jenkins plugins for seamless deployment:

  • AWS: Plugins for CodeDeploy, Elastic Beanstalk, S3, ECS, EKS, Lambda. Use appropriate Pipeline steps provided by these plugins (e.g., s3Upload, ecsDeploy).
  • Azure: Plugins for App Service, AKS, Azure Functions, Container Instances. Use relevant steps (e.g., azureWebAppPublish).
  • Google Cloud: Plugins for GKE, App Engine, Cloud Functions, Cloud Run. Use steps provided by the ‘Google Cloud SDK’ or specific plugins.

Credentials for cloud platforms should be stored securely in Jenkins Credentials.

Instead of direct deployment, pipelines often publish built artifacts (JARs, WARs, NPM packages, Docker images) to repositories like Nexus Repository Manager or JFrog Artifactory. Downstream processes or deployment tools then pull these artifacts.

  • Prerequisites: Plugins for Nexus Platform or Artifactory.
  • Build Tool Integration: Configure Maven/Gradle/NPM to publish to the repository.
  • Pipeline Steps: Use build tool commands (mvn deploy, gradle publish) or dedicated plugin steps (nexusPublisher, rtUpload).

The best deployment strategy depends on your application architecture, infrastructure, and team practices. Jenkins provides the flexibility to implement various approaches, often combining several methods within a single pipeline (e.g., build Docker image, push to registry, trigger deployment via SSH or Kubernetes command).