<?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>DEV Community: SUNATH KHADIKAR</title>
    <description>The latest articles on DEV Community by SUNATH KHADIKAR (@sunath2711).</description>
    <link>https://dev.to/sunath2711</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%2F3694715%2Fb08fac2f-18a0-4851-81cb-7cf9e43df697.jpg</url>
      <title>DEV Community: SUNATH KHADIKAR</title>
      <link>https://dev.to/sunath2711</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sunath2711"/>
    <language>en</language>
    <item>
      <title>Building an End-to-End CI/CD Pipeline with Spring Boot, Jenkins, Kubernetes &amp; Security Scans</title>
      <dc:creator>SUNATH KHADIKAR</dc:creator>
      <pubDate>Mon, 05 Jan 2026 19:29:08 +0000</pubDate>
      <link>https://dev.to/sunath2711/building-an-end-to-end-cicd-pipeline-with-spring-boot-jenkins-kubernetes-security-scans-28e0</link>
      <guid>https://dev.to/sunath2711/building-an-end-to-end-cicd-pipeline-with-spring-boot-jenkins-kubernetes-security-scans-28e0</guid>
      <description>&lt;h2&gt;
  
  
  Why I Built This Project
&lt;/h2&gt;

&lt;p&gt;I’ve worked with CI/CD concepts and tools before, but there was always a gap between &lt;em&gt;knowing the tools&lt;/em&gt; and &lt;em&gt;building a complete system&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Most tutorials stop at:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Pipeline executed successfully”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;But real CI/CD systems involve:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Versioning strategies&lt;/li&gt;
&lt;li&gt;Webhooks&lt;/li&gt;
&lt;li&gt;Code quality gates&lt;/li&gt;
&lt;li&gt;Security scanning&lt;/li&gt;
&lt;li&gt;Kubernetes rollouts&lt;/li&gt;
&lt;li&gt;Failures, restarts, and a lot of debugging&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So I decided to build a &lt;strong&gt;true end-to-end CI/CD pipeline&lt;/strong&gt;, starting from a &lt;code&gt;git push&lt;/code&gt; and ending with a fully deployed, secure, observable Spring Boot application running on Kubernetes.&lt;/p&gt;

&lt;p&gt;This blog is a &lt;strong&gt;learning engineering story&lt;/strong&gt; of what I built, what broke, how I fixed it (glad I did), and what I learned.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Was Built
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;production-like CI/CD pipeline&lt;/strong&gt; with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Git push → automatic Jenkins trigger&lt;/li&gt;
&lt;li&gt;Maven build &amp;amp; tests&lt;/li&gt;
&lt;li&gt;Application versioning with &lt;code&gt;/release&lt;/code&gt; endpoint&lt;/li&gt;
&lt;li&gt;Docker image build (immutable)&lt;/li&gt;
&lt;li&gt;SonarQube code quality gates&lt;/li&gt;
&lt;li&gt;Trivy image security scanning&lt;/li&gt;
&lt;li&gt;Kubernetes deployment &amp;amp; rollout&lt;/li&gt;
&lt;li&gt;Email notifications&lt;/li&gt;
&lt;li&gt;MongoDB-backed application persistence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Everything runs locally — but behaves like production.&lt;/p&gt;




&lt;h2&gt;
  
  
  Technology Stack
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Layer&lt;/th&gt;
&lt;th&gt;Technology&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Application&lt;/td&gt;
&lt;td&gt;Spring Boot&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Versioning&lt;/td&gt;
&lt;td&gt;Maven + &lt;code&gt;/release&lt;/code&gt; API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SCM&lt;/td&gt;
&lt;td&gt;GitHub&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CI/CD&lt;/td&gt;
&lt;td&gt;Jenkins (Pipeline as Code)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Code Quality&lt;/td&gt;
&lt;td&gt;SonarQube&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Exposure&lt;/td&gt;
&lt;td&gt;Ngrok&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Containers&lt;/td&gt;
&lt;td&gt;Docker&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Trivy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orchestration&lt;/td&gt;
&lt;td&gt;Kubernetes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Database&lt;/td&gt;
&lt;td&gt;MongoDB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Notifications&lt;/td&gt;
&lt;td&gt;Jenkins Mailer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;




&lt;h2&gt;
  
  
  High-Level Architecture
&lt;/h2&gt;

&lt;p&gt;GitHub (push)&lt;br&gt;
   ↓&lt;br&gt;
Webhook (Ngrok)&lt;br&gt;
   ↓&lt;br&gt;
Jenkins Pipeline&lt;br&gt;
   ↓&lt;br&gt;
Maven Build &amp;amp; Tests&lt;br&gt;
   ↓&lt;br&gt;
SonarQube Quality Gate&lt;br&gt;
   ↓&lt;br&gt;
Docker Image Build&lt;br&gt;
   ↓&lt;br&gt;
Trivy Image Scan&lt;br&gt;
   ↓&lt;br&gt;
Kubernetes Deployment&lt;br&gt;
   ↓&lt;br&gt;
Email Notification&lt;/p&gt;
&lt;h2&gt;
  
  
  Design and Architecture
&lt;/h2&gt;

&lt;p&gt;The project was structured into &lt;strong&gt;distinct phases&lt;/strong&gt; to incrementally build complexity, moving from a basic code setup to an &lt;strong&gt;event-driven, secured CI/CD pipeline&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
Each phase intentionally introduced a new real-world concern such as versioning, security, observability, or deployment reliability.&lt;/p&gt;


&lt;h2&gt;
  
  
  The Core Pipeline Flow
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Code Push
&lt;/h3&gt;

&lt;p&gt;A developer pushes code to &lt;strong&gt;GitHub&lt;/strong&gt;, which automatically triggers the Jenkins pipeline via a &lt;strong&gt;webhook exposed using Ngrok&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This eliminates manual pipeline execution and establishes a true event-driven CI/CD workflow.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Continuous Integration
&lt;/h3&gt;

&lt;p&gt;Jenkins clones the repository and executes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean &lt;span class="nb"&gt;test&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The code compiles&lt;/li&gt;
&lt;li&gt;Unit tests pass&lt;/li&gt;
&lt;li&gt;The build is in a deployable state before proceeding further&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Static Code Analysis
&lt;/h3&gt;

&lt;p&gt;The codebase is analyzed using &lt;strong&gt;SonarQube&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins sends the analysis report to SonarQube&lt;/li&gt;
&lt;li&gt;The pipeline &lt;strong&gt;waits for the Quality Gate result&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;The build &lt;strong&gt;fails automatically&lt;/strong&gt; if quality gates are not met&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This enforces engineering standards instead of relying on human judgment.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Multi-Stage Docker Build
&lt;/h3&gt;

&lt;p&gt;A &lt;strong&gt;multi-stage Dockerfile&lt;/strong&gt; is used to build the application image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why multi-stage?&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The build stage contains Maven and build dependencies&lt;/li&gt;
&lt;li&gt;The final runtime stage contains &lt;strong&gt;only the JRE and the JAR&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Results in a &lt;strong&gt;smaller, more secure production image&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  5. Security Scanning
&lt;/h3&gt;

&lt;p&gt;Before pushing the image to the registry, &lt;strong&gt;Trivy&lt;/strong&gt; scans it for vulnerabilities.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Critical and High vulnerabilities are detected&lt;/li&gt;
&lt;li&gt;The pipeline can be configured to fail based on severity&lt;/li&gt;
&lt;li&gt;This ensures vulnerable images never reach deployment&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  6. Continuous Deployment
&lt;/h3&gt;

&lt;p&gt;Once all checks pass:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins pushes the &lt;strong&gt;versioned image&lt;/strong&gt; to Docker Hub&lt;/li&gt;
&lt;li&gt;The Kubernetes deployment is updated using &lt;code&gt;kubectl&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Rollout progress is monitored using:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl rollout status deployment/&amp;lt;deployment-name&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Key Challenges and Technical Solutions
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Docker-in-Docker Permission Hurdle
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jenkins runs inside a Docker container but needs to build Docker images.&lt;br&gt;&lt;br&gt;
This caused permission issues with &lt;code&gt;/var/run/docker.sock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mounted the host Docker socket into the Jenkins container&lt;/li&gt;
&lt;li&gt;Added the &lt;code&gt;docker&lt;/code&gt; group inside the Jenkins image&lt;/li&gt;
&lt;li&gt;Added the &lt;code&gt;jenkins&lt;/code&gt; user to that group&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allowed Jenkins to build images &lt;strong&gt;without running as root&lt;/strong&gt;, maintaining better security practices.&lt;/p&gt;


&lt;h3&gt;
  
  
  2. Kubernetes Connectivity from Containers
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Jenkins, running inside a container, could not access the Kubernetes API server using &lt;code&gt;127.0.0.1&lt;/code&gt; on a Windows host.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Used the following flag while running the Jenkins container:&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="nt"&gt;--add-host&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;localhost:host-gateway
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This mapped the container’s &lt;code&gt;localhost&lt;/code&gt; to the host gateway, allowing Jenkins to communicate with the KIND Kubernetes cluster.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. Handling Rollouts in Kubernetes
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Problem:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Kubernetes does not trigger a new rollout if the deployment still references the &lt;code&gt;:latest&lt;/code&gt; image tag — even if the image has changed in the registry.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Implemented &lt;strong&gt;dynamic image tagging&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins replaces an &lt;code&gt;IMAGE_PLACEHOLDER&lt;/code&gt; in &lt;code&gt;deployment.yaml&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;The placeholder is replaced with a unique version using &lt;code&gt;${BUILD_NUMBER}&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guarantees:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Every deployment triggers a rollout&lt;/li&gt;
&lt;li&gt;Rollbacks are deterministic&lt;/li&gt;
&lt;li&gt;Image versions are traceable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What Differentiates This Project
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Operational Visibility
&lt;/h3&gt;

&lt;p&gt;A &lt;code&gt;/release&lt;/code&gt; endpoint was implemented in the Spring Boot application.&lt;/p&gt;

&lt;p&gt;It exposes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application version&lt;/li&gt;
&lt;li&gt;Jenkins build number&lt;/li&gt;
&lt;li&gt;Runtime environment metadata&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This allows anyone to verify &lt;strong&gt;exactly which build is running inside a Kubernetes Pod&lt;/strong&gt;, directly from the application.&lt;/p&gt;




&lt;h3&gt;
  
  
  Infrastructure as Code
&lt;/h3&gt;

&lt;p&gt;Instead of relying on manual Jenkins setup:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;custom Jenkins Docker image&lt;/strong&gt; was built&lt;/li&gt;
&lt;li&gt;Pre-installed with:

&lt;ul&gt;
&lt;li&gt;Maven&lt;/li&gt;
&lt;li&gt;Docker CLI&lt;/li&gt;
&lt;li&gt;Kubectl&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;This ensures:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reproducibility&lt;/li&gt;
&lt;li&gt;Consistency across environments&lt;/li&gt;
&lt;li&gt;Faster onboarding&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Key Takeaways
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Security Integration
&lt;/h3&gt;

&lt;p&gt;Security must be &lt;strong&gt;shifted left&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Using Trivy helped identify &lt;strong&gt;critical CVEs&lt;/strong&gt;, including Tomcat RCE vulnerabilities, &lt;em&gt;before&lt;/em&gt; deployment.&lt;/p&gt;




&lt;h3&gt;
  
  
  Network Orchestration
&lt;/h3&gt;

&lt;p&gt;The hardest problems were not tools — they were &lt;strong&gt;network boundaries&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Managing communication between:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;li&gt;SonarQube&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;Docker&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;was the most valuable learning experience.&lt;/p&gt;




&lt;h3&gt;
  
  
  Automation Reliability
&lt;/h3&gt;

&lt;p&gt;A pipeline is only real CI/CD when:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It is event-driven&lt;/li&gt;
&lt;li&gt;It requires no manual triggers&lt;/li&gt;
&lt;li&gt;Humans are removed from the deployment path&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;GitHub webhooks completed that transformation.&lt;/p&gt;




&lt;h2&gt;
  
  
  Final Thought
&lt;/h2&gt;

&lt;p&gt;This project was not about tools —&lt;br&gt;&lt;br&gt;
it was about understanding &lt;strong&gt;how systems talk to each other&lt;/strong&gt;, &lt;strong&gt;how failures surface&lt;/strong&gt;, and &lt;strong&gt;how automation earns trust&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That understanding is what turns DevOps from scripts into engineering.&lt;/p&gt;

&lt;p&gt;Feedback appreciated&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Github : [&lt;a href="https://github.com/sunath2711/ci-cd-springboot" rel="noopener noreferrer"&gt;https://github.com/sunath2711/ci-cd-springboot&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;Linkedin : [&lt;a href="https://www.linkedin.com/in/sunath-khadikar/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/sunath-khadikar/&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Some screenshots from the project
&lt;/h3&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%2F326riw6qtxwayss88c9m.jpg" 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%2F326riw6qtxwayss88c9m.jpg" alt="Pipeline running on Jenkins triggered on git push" width="800" height="362"&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%2Fbap513g7u2s8oetqdnjo.jpg" 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%2Fbap513g7u2s8oetqdnjo.jpg" alt="Post build image pushed to docker hub repo" width="800" height="365"&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%2Fc1g3yu5h5pxwrlfbey5a.jpg" 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%2Fc1g3yu5h5pxwrlfbey5a.jpg" alt="Deployment status" width="800" height="225"&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%2Fotqli0jgfxbte8aow1l4.jpg" 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%2Fotqli0jgfxbte8aow1l4.jpg" alt="Pipeline executed successfully" width="800" height="346"&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%2F1vyers9sdjq0n2lnk607.jpg" 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%2F1vyers9sdjq0n2lnk607.jpg" alt="Sonarqube analysis" width="800" height="401"&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%2F531g3id5jaf678ia93k1.jpg" 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%2F531g3id5jaf678ia93k1.jpg" alt="Trivy vulnerability scan" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

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