<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ismail Shaikh</title>
    <description>The latest articles on Forem by Ismail Shaikh (@ismail_shaikh_5d32ffadaa5).</description>
    <link>https://forem.com/ismail_shaikh_5d32ffadaa5</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3660023%2Fdcc3ea1f-0c9f-49dc-a870-d320a3a26cd3.png</url>
      <title>Forem: Ismail Shaikh</title>
      <link>https://forem.com/ismail_shaikh_5d32ffadaa5</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ismail_shaikh_5d32ffadaa5"/>
    <language>en</language>
    <item>
      <title>End-to-End CI/CD Pipeline using Jenkins</title>
      <dc:creator>Ismail Shaikh</dc:creator>
      <pubDate>Sat, 13 Dec 2025 13:32:27 +0000</pubDate>
      <link>https://forem.com/ismail_shaikh_5d32ffadaa5/end-to-end-cicd-pipeline-using-jenkins-36de</link>
      <guid>https://forem.com/ismail_shaikh_5d32ffadaa5/end-to-end-cicd-pipeline-using-jenkins-36de</guid>
      <description>&lt;p&gt;📌 Scenario (Real-World)&lt;/p&gt;

&lt;p&gt;We will deploy an application using this flow:&lt;/p&gt;

&lt;p&gt;Developer → Git → Jenkins → Build → Test → Package → Deploy&lt;/p&gt;

&lt;p&gt;Below is Text Based Diagram.&lt;/p&gt;

&lt;p&gt;Developer&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Git Repository (GitHub / Bitbucket)&lt;br&gt;
   |&lt;br&gt;
   v&lt;br&gt;
Jenkins (Pipeline)&lt;br&gt;
   |&lt;br&gt;
   ├── Build&lt;br&gt;
   ├── Test&lt;br&gt;
   ├── Package&lt;br&gt;
   └── Deploy&lt;br&gt;
          |&lt;br&gt;
          v&lt;br&gt;
      Server / Cloud (EC2, VM, etc.)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Jenkins Server&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Jenkins installed on EC2 / VM / Local&lt;/p&gt;

&lt;p&gt;Java installed&lt;/p&gt;

&lt;p&gt;Jenkins running on port 8080&lt;/p&gt;

&lt;p&gt;2 Required Jenkins Plugins&lt;/p&gt;

&lt;p&gt;Install from Manage Jenkins → Plugins:&lt;/p&gt;

&lt;p&gt;✔ Git&lt;br&gt;
✔ Pipeline&lt;br&gt;
✔ SSH Agent&lt;br&gt;
✔ Credentials Binding&lt;/p&gt;

&lt;p&gt;Step 2: Application Source Code&lt;/p&gt;

&lt;p&gt;my-app/&lt;br&gt;
├── app.py&lt;br&gt;
├── requirements.txt&lt;br&gt;
├── Dockerfile&lt;br&gt;
└── Jenkinsfile&lt;/p&gt;

&lt;p&gt;Step 3: Jenkins Credentials Setup&lt;br&gt;
Add credentials in Jenkins&lt;/p&gt;

&lt;p&gt;Manage Jenkins → Credentials&lt;/p&gt;

&lt;p&gt;Git credentials&lt;/p&gt;

&lt;p&gt;Server SSH key&lt;/p&gt;

&lt;p&gt;Docker registry credentials (if needed)&lt;/p&gt;

&lt;p&gt;Jenkins NEVER stores passwords in plain text.&lt;/p&gt;

&lt;p&gt;Step 4: Create Jenkins Pipeline Job&lt;/p&gt;

&lt;p&gt;Jenkins Dashboard → New Item&lt;/p&gt;

&lt;p&gt;Select Pipeline&lt;/p&gt;

&lt;p&gt;Name: my-app-pipeline&lt;/p&gt;

&lt;p&gt;Pipeline Definition:&lt;/p&gt;

&lt;p&gt;Pipeline script from SCM&lt;/p&gt;

&lt;p&gt;SCM: Git&lt;/p&gt;

&lt;p&gt;Repo URL&lt;/p&gt;

&lt;p&gt;Branch: main&lt;/p&gt;

&lt;p&gt;Script path: Jenkinsfile&lt;/p&gt;

&lt;p&gt;Step 5: Jenkinsfile (Heart of Pipeline)&lt;/p&gt;

&lt;p&gt;Complete End-to-End Jenkinsfile&lt;/p&gt;

&lt;p&gt;pipeline {&lt;br&gt;
    agent any&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment {
    APP_NAME = "my-app"
    DEPLOY_SERVER = "ubuntu@10.0.0.10"
    DEPLOY_PATH = "/var/www/my-app"
}

stages {

    stage('Checkout Code') {
        steps {
            git branch: 'main',
                url: 'https://github.com/your-org/my-app.git'
        }
    }

    stage('Build') {
        steps {
            echo "Building application..."
            sh 'pip install -r requirements.txt'
        }
    }

    stage('Test') {
        steps {
            echo "Running tests..."
            sh 'pytest || echo "Tests skipped"'
        }
    }

    stage('Package') {
        steps {
            echo "Packaging application..."
            sh 'tar -czf app.tar.gz *'
        }
    }

    stage('Deploy') {
        steps {
            echo "Deploying application..."
            sshagent(['server-ssh-key']) {
                sh """
                scp app.tar.gz ${DEPLOY_SERVER}:/tmp/
                ssh ${DEPLOY_SERVER} '
                    mkdir -p ${DEPLOY_PATH} &amp;amp;&amp;amp;
                    tar -xzf /tmp/app.tar.gz -C ${DEPLOY_PATH} &amp;amp;&amp;amp;
                    systemctl restart my-app
                '
                """
            }
        }
    }
}

post {
    success {
        echo "✅ Deployment Successful"
    }
    failure {
        echo "❌ Deployment Failed"
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;p&gt;Step 6: Deployment Server Setup&lt;/p&gt;

&lt;p&gt;On target server (EC2 / VM):&lt;/p&gt;

&lt;p&gt;sudo mkdir -p /var/www/my-app&lt;br&gt;
sudo useradd my-app&lt;br&gt;
sudo systemctl enable my-app&lt;/p&gt;

&lt;p&gt;Example systemd service:&lt;/p&gt;

&lt;p&gt;[Unit]&lt;br&gt;
Description=My App Service&lt;/p&gt;

&lt;p&gt;[Service]&lt;br&gt;
ExecStart=/usr/bin/python3 /var/www/my-app/app.py&lt;br&gt;
Restart=always&lt;/p&gt;

&lt;p&gt;[Install]&lt;br&gt;
WantedBy=multi-user.target&lt;/p&gt;

&lt;p&gt;Step 7: Triggering the Pipeline&lt;br&gt;
Option 1: Manual Trigger&lt;/p&gt;

&lt;p&gt;Click Build Now&lt;/p&gt;

&lt;p&gt;Option 2: Auto Trigger (Recommended)&lt;/p&gt;

&lt;p&gt;Enable Git Webhook&lt;/p&gt;

&lt;p&gt;Git Push → Jenkins Auto Build → Auto Deploy&lt;/p&gt;

&lt;p&gt;Step 8: What Happens End-to-End (Interview Explanation)&lt;/p&gt;

&lt;p&gt;👉 When developer pushes code:&lt;/p&gt;

&lt;p&gt;Git notifies Jenkins&lt;/p&gt;

&lt;p&gt;Jenkins pulls latest code&lt;/p&gt;

&lt;p&gt;Jenkins builds application&lt;/p&gt;

&lt;p&gt;Jenkins runs tests&lt;/p&gt;

&lt;p&gt;Jenkins packages the app&lt;/p&gt;

&lt;p&gt;Jenkins deploys to server&lt;/p&gt;

&lt;p&gt;Application restarts&lt;/p&gt;

&lt;p&gt;New version goes live 🚀&lt;/p&gt;

&lt;p&gt;Step 9: Common Interview Questions&lt;br&gt;
❓ Why Jenkinsfile?&lt;/p&gt;

&lt;p&gt;✔ Version controlled&lt;br&gt;
✔ Reproducible&lt;br&gt;
✔ Automated&lt;/p&gt;

&lt;p&gt;❓ What if deployment fails?&lt;/p&gt;

&lt;p&gt;✔ Pipeline stops&lt;br&gt;
✔ Old version remains running&lt;/p&gt;

&lt;p&gt;❓ Is Jenkins modifying infra?&lt;/p&gt;

&lt;p&gt;❌ No, pipeline is read-only unless explicitly allowed&lt;/p&gt;

&lt;p&gt;Step 10: Variations (Real Projects)&lt;/p&gt;

&lt;p&gt;You can extend this pipeline with:&lt;/p&gt;

&lt;p&gt;Docker build &amp;amp; push&lt;/p&gt;

&lt;p&gt;Kubernetes deployment&lt;/p&gt;

&lt;p&gt;AWS CodeDeploy&lt;/p&gt;

&lt;p&gt;Blue-Green deployment&lt;/p&gt;

&lt;p&gt;Rollback stage&lt;/p&gt;

&lt;p&gt;Final Summary (One-Line)&lt;/p&gt;

&lt;p&gt;Jenkins CI/CD pipeline automatically builds, tests, packages, and deploys application whenever code changes, ensuring fast, reliable, and repeatable deployments.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
      <category>automation</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
