<?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: Rejoice Mucheri</title>
    <description>The latest articles on Forem by Rejoice Mucheri (@cloudriri15).</description>
    <link>https://forem.com/cloudriri15</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%2F1046667%2F9f7357a4-0c7c-4ff0-be88-e0a661ff196f.png</url>
      <title>Forem: Rejoice Mucheri</title>
      <link>https://forem.com/cloudriri15</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/cloudriri15"/>
    <language>en</language>
    <item>
      <title>Building a Jenkins Multi-Branch Pipeline for 11 Microservices on AWS EKS</title>
      <dc:creator>Rejoice Mucheri</dc:creator>
      <pubDate>Tue, 04 Mar 2025 14:37:03 +0000</pubDate>
      <link>https://forem.com/aws-builders/building-a-jenkins-multi-branch-pipeline-for-11-microservices-on-aws-eks-3am8</link>
      <guid>https://forem.com/aws-builders/building-a-jenkins-multi-branch-pipeline-for-11-microservices-on-aws-eks-3am8</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Hey there! So you want to set up a continuous integration and continuous deployment (CI/CD) pipeline for a microservices application? Don't worry if some of these terms sound intimidating—I'll walk you through everything step by step, explaining what we're doing and why we're doing it.&lt;/p&gt;

&lt;p&gt;In this guide, we'll build an automated system that takes code from developers, packages it into containers, and deploys it to a cloud environment with minimal manual intervention. Pretty cool, right? By the end, you'll have implemented a professional-grade pipeline that many tech companies use for their applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  What We're Building
&lt;/h2&gt;

&lt;p&gt;We're setting up an automated pipeline for an e-commerce application made up of 11 microservices. Each microservice is responsible for a specific function, working together to deliver a seamless shopping experience. Here’s an overview of some key services:&lt;/p&gt;

&lt;p&gt;🔹 &lt;em&gt;Frontend (Customer Interface)&lt;/em&gt;&lt;br&gt;
The website customers see and interact with. It communicates with backend services to display products, handle user actions, and process orders.&lt;/p&gt;

&lt;p&gt;🔹 &lt;em&gt;Cart Service (Shopping Cart Management)&lt;/em&gt;&lt;br&gt;
Keeps track of the items a customer adds to their cart before checkout. It ensures cart data is stored and updated in real time.&lt;/p&gt;

&lt;p&gt;🔹 &lt;em&gt;Payment Service (Transaction Processing)&lt;/em&gt;&lt;br&gt;
Handles customer payments securely. It interacts with payment gateways to process transactions and confirm successful payments.&lt;/p&gt;

&lt;p&gt;🔹 &lt;em&gt;Shipping Service (Order Fulfillment)&lt;/em&gt;&lt;br&gt;
Manages shipping details, calculates delivery times, and tracks orders after they leave the warehouse.&lt;/p&gt;

&lt;p&gt;🔹 &lt;em&gt;Email Service (Notifications &amp;amp; Communication)&lt;/em&gt;&lt;br&gt;
Sends order confirmations, shipping updates, and promotional emails to customers.&lt;/p&gt;

&lt;p&gt;Other microservices like &lt;em&gt;Product Catalog, Recommendation Service&lt;/em&gt;, and &lt;em&gt;Checkout Service&lt;/em&gt; help complete the shopping experience by handling product listings, personalized recommendations, and final order processing.&lt;/p&gt;

&lt;p&gt;The beauty of microservices is that we can update one part of the application without touching the others. Think of microservices like a string of festive lights—if one bulb goes out, you can replace that single bulb without having to take down and replace the entire string. Each light operates independently, but together they create a seamless experience!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Project Credit: &lt;a href="https://www.youtube.com/watch?v=SO3XIJCtmNs&amp;amp;t=2023s&amp;amp;ab_channel=DevOpsShack" rel="noopener noreferrer"&gt;DevOps Shack&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;Before we dive into the technical steps, let's understand why this approach is so valuable:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;em&gt;Independent Development &amp;amp; Deployment&lt;/em&gt;&lt;br&gt;
Each microservice can be developed, tested, and deployed separately, allowing teams to work on different services without impacting the entire application.&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;em&gt;Scalability&lt;/em&gt;&lt;br&gt;
Microservices can be scaled individually based on demand. If one part of the system experiences high traffic, only that service needs to be scaled, saving resources and costs.&lt;/p&gt;

&lt;p&gt;3️⃣ &lt;em&gt;Technology Flexibility&lt;/em&gt;&lt;br&gt;
Teams can use different programming languages, databases, and frameworks best suited for each service rather than being locked into a single tech stack.&lt;/p&gt;

&lt;p&gt;4️⃣ &lt;em&gt;Fault Isolation &amp;amp; Resilience&lt;/em&gt;&lt;br&gt;
If one microservice fails, it doesn’t bring down the entire system. The failure is contained, improving system reliability and availability.&lt;/p&gt;

&lt;p&gt;5️⃣ &lt;em&gt;Faster Development &amp;amp; Innovation&lt;/em&gt;&lt;br&gt;
Smaller, independent services enable faster development cycles, allowing teams to release updates and new features more frequently.&lt;/p&gt;

&lt;p&gt;6️⃣ &lt;em&gt;Better Maintainability&lt;/em&gt;&lt;br&gt;
Since each service has a smaller codebase and a clear scope, it’s easier to update, debug, and refactor without affecting other parts of the system.&lt;/p&gt;

&lt;p&gt;7️⃣ &lt;em&gt;Enhanced Security &amp;amp; Compliance&lt;/em&gt;&lt;br&gt;
Sensitive data and business logic can be isolated within specific microservices, making it easier to enforce security policies and meet compliance requirements.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Tools We'll Use
&lt;/h2&gt;

&lt;p&gt;We'll be working with several powerful tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GitHub&lt;/strong&gt;: Stores our code&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Jenkins&lt;/strong&gt;: Automates our build and deployment processes&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt;: Packages our applications into containers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kubernetes (EKS)&lt;/strong&gt;: Manages how our containers run in the cloud&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AWS&lt;/strong&gt;: Provides the cloud infrastructure where everything runs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't worry if you're not familiar with all of these—I'll explain each one as we go along.&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Setting Up Our Server
&lt;/h2&gt;

&lt;p&gt;First, we need a computer in the cloud_ (an EC2 instance)_ that will run Jenkins and manage our Kubernetes cluster.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating an EC2 Instance
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Log into your &lt;strong&gt;AWS account&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Navigate to &lt;strong&gt;EC2&lt;/strong&gt; service&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Launch Instance"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select a &lt;strong&gt;name&lt;/strong&gt; for your instance (e.g., "Jenkins-Kubernetes-Server")&lt;/li&gt;
&lt;li&gt;Choose an Amazon Machine Image (AMI) with &lt;strong&gt;Ubuntu&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Select instance type: &lt;strong&gt;t2.large&lt;/strong&gt; (2 vCPUs, 8GB memory)&lt;/li&gt;
&lt;li&gt;Configure storage: &lt;em&gt;20 GB minimum&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Create or select a &lt;strong&gt;key pair&lt;/strong&gt; for SSH access&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Launch&lt;/strong&gt; the instance&lt;/li&gt;
&lt;li&gt;Configure your instance &lt;code&gt;inbound rules&lt;/code&gt; with the ports shown in the image below.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnalyabvhud6ms878c18y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnalyabvhud6ms878c18y.png" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Setting Up AWS Permissions
&lt;/h2&gt;

&lt;p&gt;Before we can create our Kubernetes cluster, we need to set up the proper permissions.&lt;/p&gt;
&lt;h3&gt;
  
  
  Creating an IAM User for EKS
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In the &lt;strong&gt;AWS console&lt;/strong&gt;, navigate to &lt;strong&gt;IAM&lt;/strong&gt; (Identity and Access Management)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create a new use&lt;/strong&gt;r named "eks-devops" #use whatever name you want&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Attach the following permission policies:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AmazonEKSClusterPolicy&lt;/li&gt;
&lt;li&gt;AmazonEKSServicePolicy&lt;/li&gt;
&lt;li&gt;AmazonEC2FullAccess&lt;/li&gt;
&lt;li&gt;AmazonS3FullAccess&lt;/li&gt;
&lt;li&gt;IAMFullAccess&lt;/li&gt;
&lt;li&gt;AmazonVPCFullAccess&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an inline policy with the necessary permissions:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2012-10-17"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Statement"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Sid"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"VisualEditor0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Effect"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"Allow"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Action"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"eks:*"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
            &lt;/span&gt;&lt;span class="nl"&gt;"Resource"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"*"&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;Generate &lt;a href="https://docs.aws.amazon.com/keyspaces/latest/devguide/create.keypair.html" rel="noopener noreferrer"&gt;access keys&lt;/a&gt; for this user and save them securely.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;
  
  
  Step 3: Installing Essential Tools on Our Server
&lt;/h2&gt;

&lt;p&gt;Now let's connect to our EC2 instance and install the tools we need.&lt;/p&gt;
&lt;h3&gt;
  
  
  Connecting to Your EC2 Instance
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh &lt;span class="nt"&gt;-i&lt;/span&gt; path/to/your-key.pem ubuntu@your-ec2-public-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Alternatively, you can connect to EC2 using &lt;a href="https://www.freecodecamp.org/news/connect-to-your-ec2-instance-using-mobaxterm/" rel="noopener noreferrer"&gt;MobaXterm&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Once you have successfully ssh-ed into your EC2 instance run the following command&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing AWS CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="s2"&gt;"https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip"&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; &lt;span class="s2"&gt;"awscliv2.zip"&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;unzip &lt;span class="nt"&gt;-y&lt;/span&gt;
unzip awscliv2.zip
&lt;span class="nb"&gt;sudo&lt;/span&gt; ./aws/install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Configuring AWS CLI
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When prompted, enter:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Access Key ID: [Your access key]&lt;/li&gt;
&lt;li&gt;AWS Secret Access Key: [Your secret key]&lt;/li&gt;
&lt;li&gt;Default region name: &lt;code&gt;af-south-1&lt;/code&gt; #your preferred region&lt;/li&gt;
&lt;li&gt;Default output format: &lt;code&gt;json&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing kubectl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-o&lt;/span&gt; kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectl
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x ./kubectl
&lt;span class="nb"&gt;sudo mv&lt;/span&gt; ./kubectl /usr/local/bin
kubectl version &lt;span class="nt"&gt;--short&lt;/span&gt; &lt;span class="nt"&gt;--client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: &lt;code&gt;kubectl&lt;/code&gt; is a command-line tool that allows us to interact with and manage a Kubernetes cluster. Think of it like a remote control for your Kubernetes setup—it lets you deploy applications, check their status, and make changes, all from your terminal&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Installing eksctl
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;--silent&lt;/span&gt; &lt;span class="nt"&gt;--location&lt;/span&gt; &lt;span class="s2"&gt;"https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;uname&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;_amd64.tar.gz"&lt;/span&gt; | &lt;span class="nb"&gt;tar &lt;/span&gt;xz &lt;span class="nt"&gt;-C&lt;/span&gt; /tmp
&lt;span class="nb"&gt;sudo mv&lt;/span&gt; /tmp/eksctl /usr/local/bin
eksctl version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: eksctl is a tool specifically designed to make creating Kubernetes clusters on AWS easier.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An alternative, is to create a script to install all the tools&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 4: Creating a Kubernetes Cluster on AWS
&lt;/h2&gt;

&lt;p&gt;Now we'll create our Kubernetes cluster where our application will run.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating the EKS Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eksctl create cluster &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eks-microservices &lt;span class="se"&gt;\&lt;/span&gt;
                      &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;af-south-1 &lt;span class="se"&gt;\&lt;/span&gt;
                      &lt;span class="nt"&gt;--zones&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;af-south-1a,af-south-1b &lt;span class="se"&gt;\ &lt;/span&gt; &lt;span class="c"&gt;#your-region&lt;/span&gt;
                      &lt;span class="nt"&gt;--without-nodegroup&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: This command creates an Amazon EKS (Elastic Kubernetes Service) cluster.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Setting Up Identity and Access for Kubernetes
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eksctl utils associate-iam-oidc-provider &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; af-south-1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--cluster&lt;/span&gt; eks-microservices &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--approve&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt; This command sets up a secure trust between your EKS cluster and AWS, allowing Kubernetes applications to access AWS services safely without storing long-term credentials.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Adding Worker Nodes to Our Cluster
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eksctl create nodegroup &lt;span class="nt"&gt;--cluster&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;eks-microservices &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--region&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;af-south-1 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;node2 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--node-type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;t3.medium &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--nodes&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--nodes-min&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--nodes-max&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--node-volume-size&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20 &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--ssh-access&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--ssh-public-key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;DevOps &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--managed&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--asg-access&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--external-dns-access&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--full-ecr-access&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--appmesh-access&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                       &lt;span class="nt"&gt;--alb-ingress-access&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: We're adding worker machines (nodes) to our Kubernetes cluster. We start with 3, but the system can automatically adjust between 2 and 4 based on demand.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfcursyasjxwh3fg98xn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwfcursyasjxwh3fg98xn.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Installing Jenkins on Our Server
&lt;/h2&gt;

&lt;p&gt;Jenkins will orchestrate our CI/CD pipeline, automatically building and deploying our code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Java (Required for Jenkins)
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;openjdk-17-jdk &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Jenkins
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget &lt;span class="nt"&gt;-q&lt;/span&gt; &lt;span class="nt"&gt;-O&lt;/span&gt; - https://pkg.jenkins.io/debian/jenkins.io.key | &lt;span class="nb"&gt;sudo &lt;/span&gt;apt-key add -
&lt;span class="nb"&gt;sudo &lt;/span&gt;sh &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s1"&gt;'echo deb http://pkg.jenkins.io/debian-stable binary/ &amp;gt; /etc/apt/sources.list.d/jenkins.list'&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;jenkins &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Starting Jenkins Service
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start jenkins
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Accessing Jenkins
&lt;/h3&gt;

&lt;p&gt;Open a web browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://your-ec2-public-ip:8080
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To get the initial admin password:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo cat&lt;/span&gt; /var/lib/jenkins/secrets/initialAdminPassword
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw6k5ojbu6jcm4l8hgsw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw6k5ojbu6jcm4l8hgsw.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: Jenkins will automatically build, test, and deploy our code whenever changes are made.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 6: Installing Docker on Our Server
&lt;/h2&gt;

&lt;p&gt;Docker will package our applications into containers.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;apt &lt;span class="nb"&gt;install &lt;/span&gt;docker.io &lt;span class="nt"&gt;-y&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl start docker
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Giving Jenkins Permission to Use Docker
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker jenkins
&lt;span class="nb"&gt;sudo chmod &lt;/span&gt;666 /var/run/docker.sock
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart jenkins
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7: Configuring Jenkins for Our Pipeline
&lt;/h2&gt;

&lt;p&gt;Now let's set up Jenkins to work with Docker and Kubernetes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Necessary Plugins
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;strong&gt;"Manage Jenkins"&lt;/strong&gt; &amp;gt;** "Plugins"** &amp;gt; &lt;strong&gt;"Available Plugins"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Search for and install:

&lt;ul&gt;
&lt;li&gt;Docker Pipeline&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Kubernetes CLI&lt;/li&gt;
&lt;li&gt;Multibranch Scan Webhook Trigger&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkawmebj9umnch6e1tagf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkawmebj9umnch6e1tagf.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhm0ca8hfi5a8orx88ii.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdhm0ca8hfi5a8orx88ii.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxuf3esb0p8mjokjd35w7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxuf3esb0p8mjokjd35w7.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8m32jegm6egtw787l773.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8m32jegm6egtw787l773.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Configuring Docker in Jenkins
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to** "Manage Jenkins"** &amp;gt; &lt;strong&gt;"Tools"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll to &lt;strong&gt;"Docker installations"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Add Docker"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set the name as &lt;strong&gt;"docker"&lt;/strong&gt; and check &lt;strong&gt;"Install automatically"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Save&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3mxgzy39jctt1tyinwt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3mxgzy39jctt1tyinwt.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sq3j27b9lisf20uvyje.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4sq3j27b9lisf20uvyje.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Adding Docker Hub Credentials
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;"Manage Jenkins"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Credentials"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"System"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Global credentials"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Add Credentials"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;"Username with password"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your &lt;code&gt;Docker Hub username&lt;/code&gt; and &lt;code&gt;password&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set ID as &lt;code&gt;"docker-cred"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: We're setting up Jenkins with our Docker Hub account so it can push our container images to a central repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Adding GitHub Credentials (Optional for Public Repos)
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;strong&gt;"Manage Jenkins" *&lt;em&gt;&amp;gt; *&lt;/em&gt;"Credentials"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"System"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Global credentials"&lt;/strong&gt; &lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Add Credentials"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Choose &lt;strong&gt;"Username with password"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your &lt;code&gt;GitHub username&lt;/code&gt; and &lt;code&gt;personal access token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Set ID as &lt;code&gt;"github-cred"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Create"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvggf8vuvnjocvgfkijoy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvggf8vuvnjocvgfkijoy.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Creating a Multi-Branch Pipeline in Jenkins
&lt;/h2&gt;

&lt;p&gt;This is where the magic happens! We'll set up Jenkins to automatically detect and build all our microservices.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the Jenkins dashboard, click &lt;strong&gt;"New Item"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter a&lt;code&gt;name&lt;/code&gt; for your pipeline (e.g. Microservice-ecommerce")&lt;/li&gt;
&lt;li&gt;Select "&lt;strong&gt;Multibranch Pipeline"&lt;/strong&gt; and click &lt;strong&gt;"OK"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv70x5sr2kmset8os12e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv70x5sr2kmset8os12e4.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ckypm60osqi7sax56t7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ckypm60osqi7sax56t7.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Under &lt;strong&gt;"Branch Sources"&lt;/strong&gt;, select &lt;strong&gt;"Git"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter your &lt;em&gt;repository URL&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Set credentials to &lt;code&gt;"github-cred"&lt;/code&gt; (if using private repo)&lt;/li&gt;
&lt;li&gt;Under &lt;strong&gt;"Build Configuration"&lt;/strong&gt;, set &lt;strong&gt;"Mode"&lt;/strong&gt; to &lt;strong&gt;"by Jenkinsfile"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set &lt;strong&gt;"Script Path"&lt;/strong&gt; to &lt;strong&gt;"Jenkinsfile"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Save"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7152y0k10e6e56vo1xum.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7152y0k10e6e56vo1xum.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Setting Up Webhook for Automatic Triggers
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;In Jenkins, go to your pipeline and click &lt;strong&gt;"Configure"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll down to find &lt;strong&gt;"Scan by webhook"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Check the box and set a trigger token (e.g., "my-webhook-token")&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save&lt;/strong&gt; the configuration&lt;/li&gt;
&lt;li&gt;In GitHub, go to your repository settings&lt;/li&gt;
&lt;li&gt;Click** "Webhooks" &lt;strong&gt;&amp;gt; **"Add webhook"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Set Payload URL to: &lt;code&gt;http://your-jenkins-url/multibranch-webhook-trigger/invoke?token=my-webhook-token&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Choose** "Content-type"** as &lt;strong&gt;"application/json"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Add webhook"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: We're connecting Jenkins to our GitHub repository and setting up an automatic trigger so that whenever code is pushed, Jenkins will automatically start building.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 9: Understanding the Jenkinsfile
&lt;/h2&gt;

&lt;p&gt;Each branch in our repository has a Jenkinsfile that defines what happens when code changes. Here's a typical Jenkinsfile for our microservices:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;

    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Build &amp;amp; Tag Docker Image'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;withDockerRegistry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;credentialsId:&lt;/span&gt; &lt;span class="s1"&gt;'docker-cred'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;toolName:&lt;/span&gt; &lt;span class="s1"&gt;'docker'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"docker build -t yourusername/servicename:latest ."&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;

        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Push Docker Image'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;withDockerRegistry&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;credentialsId:&lt;/span&gt; &lt;span class="s1"&gt;'docker-cred'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;toolName:&lt;/span&gt; &lt;span class="s1"&gt;'docker'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                        &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"docker push yourusername/servicename:latest"&lt;/span&gt;
                    &lt;span class="o"&gt;}&lt;/span&gt;
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: This Jenkinsfile is like a recipe that tells Jenkins what to do with our code. It builds a Docker container and uploads it to Docker Hub.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Step 10: Setting Up Kubernetes for Deployment
&lt;/h2&gt;

&lt;p&gt;Now we need to configure Kubernetes so Jenkins can deploy our applications.&lt;/p&gt;

&lt;h3&gt;
  
  
  Creating a Namespace
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl create namespace webapps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: A namespace is like a virtual cluster inside our Kubernetes cluster. It helps us organize our applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Creating a Service Account
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;svc.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jenkins&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webapps&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; svc.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Creating a Role with Permissions
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;role.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rbac.authorization.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Role&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-role&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webapps&lt;/span&gt;
&lt;span class="na"&gt;rules&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;apiGroups&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;apps&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;autoscaling&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;batch&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;extensions&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;policy&lt;/span&gt;
        &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;rbac.authorization.k8s.io&lt;/span&gt;
    &lt;span class="na"&gt;resources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pods&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;componentstatuses&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;configmaps&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;daemonsets&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;deployments&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;events&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;endpoints&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;horizontalpodautoscalers&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;ingress&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;jobs&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;limitranges&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;namespaces&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;nodes&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;pods&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;persistentvolumes&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;persistentvolumeclaims&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;resourcequotas&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;replicasets&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;replicationcontrollers&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;serviceaccounts&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="s"&gt;services&lt;/span&gt;
    &lt;span class="na"&gt;verbs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;get"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;list"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;watch"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;create"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;update"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;patch"&lt;/span&gt;&lt;span class="pi"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;delete"&lt;/span&gt;&lt;span class="pi"&gt;]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; role.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Binding the Role to the Service Account
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;bind.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rbac.authorization.k8s.io/v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;RoleBinding&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-rolebinding&lt;/span&gt;
  &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webapps&lt;/span&gt; 
&lt;span class="na"&gt;roleRef&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;apiGroup&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;rbac.authorization.k8s.io&lt;/span&gt;
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Role&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;app-role&lt;/span&gt; 
&lt;span class="na"&gt;subjects&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
&lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;namespace&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;webapps&lt;/span&gt; 
  &lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ServiceAccount&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jenkins&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; bind.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: We're creating a special account (service account) for Jenkins in Kubernetes and giving it permissions to deploy and manage our applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Creating a Token for Authentication
&lt;/h3&gt;

&lt;p&gt;Create a file named &lt;code&gt;sec.yml&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;apiVersion&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
&lt;span class="na"&gt;kind&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Secret&lt;/span&gt;
&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;kubernetes.io/service-account-token&lt;/span&gt;
&lt;span class="na"&gt;metadata&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jenkins-token&lt;/span&gt;
  &lt;span class="na"&gt;annotations&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;kubernetes.io/service-account.name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;jenkins&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; sec.yml &lt;span class="nt"&gt;-n&lt;/span&gt; webapps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Retrieve the token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl describe secret jenkins-token &lt;span class="nt"&gt;-n&lt;/span&gt; webapps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the token value shown in the output.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 11: Creating a Deployment Pipeline in Jenkins
&lt;/h2&gt;

&lt;p&gt;Now let's set up the final piece: a pipeline that deploys our applications to Kubernetes.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;From the Jenkins dashboard, click &lt;strong&gt;"New Item"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Enter a &lt;code&gt;name&lt;/code&gt;(e.g., "E-Commerce-Deployment")&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;"Pipeline"&lt;/strong&gt; and click &lt;strong&gt;"OK"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Scroll down to **"Pipeline" **section&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Pipeline Syntax"&lt;/strong&gt; to open the syntax generator&lt;/li&gt;
&lt;li&gt;Find &lt;code&gt;"withKubeCredentials: Configure Kubernetes CLI"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Add"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Jenkins"&lt;/strong&gt; &amp;gt; &lt;strong&gt;"Secret text"&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Paste your &lt;code&gt;Kubernetes token&lt;/code&gt; and set ID as &lt;code&gt;"k8-token"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Enter your &lt;code&gt;Kubernetes API Endpoint&lt;/code&gt; (found in the EKS console)&lt;/li&gt;
&lt;li&gt;Set Cluster Name to &lt;code&gt;"eks-microservice"&lt;/code&gt; and Namespace to&lt;code&gt;"webapps"&lt;/code&gt; &lt;em&gt;Cluster name and Namespace must match what you named them.&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;"Generate Pipeline Script"&lt;/strong&gt; and copy the output&lt;/li&gt;
&lt;li&gt;Use this script to create your Jenkinsfile in the main branch:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight groovy"&gt;&lt;code&gt;&lt;span class="n"&gt;pipeline&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt;

    &lt;span class="n"&gt;stages&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Deploy to Kubernetes'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;withKubeCredentials&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;kubectlCredentials:&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="nl"&gt;caCertificate:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;clusterName:&lt;/span&gt; &lt;span class="s1"&gt;' eks-mciroservice'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;contextName:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;credentialsId:&lt;/span&gt; &lt;span class="s1"&gt;'k8s-token'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;namespace:&lt;/span&gt; &lt;span class="s1"&gt;'webapps'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;serverUrl:&lt;/span&gt; &lt;span class="s1"&gt;'https://84D54FB3773FF9409BD7701FD10FE847.gr7.af-south-1.eks.amazonaws.com'&lt;/span&gt;&lt;span class="o"&gt;]])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"kubectl apply -f deployment-service.yml"&lt;/span&gt;

                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="n"&gt;stage&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'verify deployment'&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
            &lt;span class="n"&gt;steps&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;withKubeCredentials&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nl"&gt;kubectlCredentials:&lt;/span&gt; &lt;span class="o"&gt;[[&lt;/span&gt;&lt;span class="nl"&gt;caCertificate:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;clusterName:&lt;/span&gt; &lt;span class="s1"&gt;' eks-mciroservice'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;contextName:&lt;/span&gt; &lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;credentialsId:&lt;/span&gt; &lt;span class="s1"&gt;'k8s-token'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;namespace:&lt;/span&gt; &lt;span class="s1"&gt;'webapps'&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nl"&gt;serverUrl:&lt;/span&gt; &lt;span class="s1"&gt;'https://84D54FB3773FF9409BD7701FD10FE847.gr7.af-south-1.eks.amazonaws.com'&lt;/span&gt;&lt;span class="o"&gt;]])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                    &lt;span class="n"&gt;sh&lt;/span&gt; &lt;span class="s2"&gt;"kubectl get service -n webapps"&lt;/span&gt;   
                &lt;span class="o"&gt;}&lt;/span&gt;
            &lt;span class="o"&gt;}&lt;/span&gt;
        &lt;span class="o"&gt;}&lt;/span&gt;    
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Beginner's Note&lt;/strong&gt;: This pipeline takes our Docker containers and deploys them to Kubernetes, making our application available to users.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsr1sv5t8le5qrht8gbjp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsr1sv5t8le5qrht8gbjp.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 12: Putting It All Together
&lt;/h2&gt;

&lt;p&gt;Let's recap how the entire system works:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A developer pushes code changes to a branch in GitHub&lt;/li&gt;
&lt;li&gt;GitHub webhook triggers Jenkins build for that specific microservice&lt;/li&gt;
&lt;li&gt;Jenkins builds a Docker container for the microservice&lt;/li&gt;
&lt;li&gt;The container is pushed to Docker Hub&lt;/li&gt;
&lt;li&gt;The deployment pipeline pulls the latest container and deploys it to Kubernetes&lt;/li&gt;
&lt;li&gt;Users can access the updated application without any downtime&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Accessing Your Deployed Application
&lt;/h3&gt;

&lt;p&gt;To see your running application:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl get service &lt;span class="nt"&gt;-n&lt;/span&gt; webapps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Look for services with TYPE LoadBalancer and use the EXTERNAL-IP to access your application in a web browser.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7t2umc55e0b2g4a0fwh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd7t2umc55e0b2g4a0fwh.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91ni49lolrzqbftoiupi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F91ni49lolrzqbftoiupi.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ydea0gv2kjxvn4p5fd9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ydea0gv2kjxvn4p5fd9.png" alt="Image description" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've successfully set up a complete CI/CD pipeline for a microservices application on AWS EKS using Jenkins multibranch pipelines. This setup allows for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Automatic building of code changes&lt;/li&gt;
&lt;li&gt;Containerization of applications&lt;/li&gt;
&lt;li&gt;Deployment to a scalable, redundant Kubernetes cluster&lt;/li&gt;
&lt;li&gt;Independent updating of individual microservices&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;While this guide covers the essential steps, there's always room for improvement:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Add automated testing before deployment&lt;/li&gt;
&lt;li&gt;Implement monitoring and alerting&lt;/li&gt;
&lt;li&gt;Set up blue/green deployments for zero-downtime updates&lt;/li&gt;
&lt;li&gt;Add security scanning for your containers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Remember, this system isn't just a technical achievement—it's a business advantage that allows for faster innovation and more reliable service for your customers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cleanup (When Needed)
&lt;/h2&gt;

&lt;p&gt;If you want to remove the entire system to avoid ongoing charges:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;eksctl delete cluster &lt;span class="nt"&gt;--name&lt;/span&gt; EKS-1 &lt;span class="nt"&gt;--region&lt;/span&gt; ap-south-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl89hpcwm0a64jx7rt6e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl89hpcwm0a64jx7rt6e8.png" width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This will delete your Kubernetes cluster and all running applications.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Log into your console and delete your EC2 instance.&lt;/p&gt;

&lt;p&gt;I Hope you learnt something. I would love to get feedback from you. Let's connect on&lt;a href="//www.linkedin.com/in/rejoiceymucheri/"&gt; LinkedIn&lt;/a&gt;, &lt;a href="https://medium.com/@rejoiceymucheri" rel="noopener noreferrer"&gt;Medium&lt;/a&gt; &lt;/p&gt;

</description>
      <category>devops</category>
      <category>serverless</category>
      <category>kubernetes</category>
      <category>jenkins</category>
    </item>
  </channel>
</rss>
