<?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: Sherdil Cloud</title>
    <description>The latest articles on DEV Community by Sherdil Cloud (@sherdilcloud).</description>
    <link>https://dev.to/sherdilcloud</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%2F3979483%2F1f2fb7dd-d170-43dc-b491-7d44c25a2761.png</url>
      <title>DEV Community: Sherdil Cloud</title>
      <link>https://dev.to/sherdilcloud</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sherdilcloud"/>
    <language>en</language>
    <item>
      <title>How to Build a CI/CD Pipeline from Scratch</title>
      <dc:creator>Sherdil Cloud</dc:creator>
      <pubDate>Thu, 11 Jun 2026 14:07:41 +0000</pubDate>
      <link>https://dev.to/sherdilcloud/how-to-build-a-cicd-pipeline-from-scratch-5234</link>
      <guid>https://dev.to/sherdilcloud/how-to-build-a-cicd-pipeline-from-scratch-5234</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;TL;DR:&lt;/strong&gt; Teams with mature CI/CD pipelines deploy &lt;strong&gt;208× more frequently&lt;/strong&gt;, experience &lt;strong&gt;60% fewer deployment failures&lt;/strong&gt;, and &lt;strong&gt;recover 96× faster&lt;/strong&gt; (&lt;a href="https://dora.dev/research/" rel="noopener noreferrer"&gt;DORA State of DevOps Report&lt;/a&gt;). A production-ready pipeline builds in five stages: source control with branch protection → three-layer automated testing → containerized builds with vulnerability scanning → multi-environment deployment with blue-green/canary strategies → post-deploy monitoring with automated rollback. Most teams ship a basic pipeline in 1–2 weeks and a production-ready one in 4–8 weeks.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Building a CI/CD pipeline from scratch is one of the highest-leverage investments an engineering team can make. A well-designed pipeline transforms deployment from a manual, error-prone process that takes hours into an automated, reliable workflow that completes in minutes.&lt;/p&gt;

&lt;p&gt;At Sherdil Cloud, we've built CI/CD pipelines for organizations across Pakistan, the UAE, and the United States since 2014 — for Python monoliths, Node.js microservices, containerized Java enterprise apps, and serverless functions. The principles of effective CI/CD stay consistent regardless of stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is a CI/CD pipeline?
&lt;/h2&gt;

&lt;p&gt;A CI/CD pipeline is an automated workflow that takes code from a developer's commit through testing, building, and deployment stages without manual intervention. CI and CD are related but distinct:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Integration (CI)&lt;/strong&gt; — Every developer merges code into the shared repo at least daily. Each merge triggers automated builds and tests, catching integration problems early when they're cheap to fix.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Delivery (CD)&lt;/strong&gt; — Every successful build auto-deploys to staging and is available for one-click production deployment. Production still requires a human decision.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Continuous Deployment (CD)&lt;/strong&gt; — Every commit that passes tests deploys to production automatically. Safer than manual deployment because every change is small, tested, and easily reversible.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This guide builds toward Continuous Delivery, with the option to enable Continuous Deployment once your test suite and monitoring provide enough confidence.&lt;/p&gt;

&lt;h2&gt;
  
  
  Source control setup
&lt;/h2&gt;

&lt;p&gt;Every CI/CD pipeline starts with source control. If your team isn't using Git with a structured branching strategy, fix that before anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose a Git platform.&lt;/strong&gt; &lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;, &lt;a href="https://docs.gitlab.com/ci/" rel="noopener noreferrer"&gt;GitLab&lt;/a&gt;, or Bitbucket. All three provide CI/CD capabilities. GitHub Actions and GitLab CI are the most popular and best-documented.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Establish a branching strategy.&lt;/strong&gt; For most teams, trunk-based development with feature branches works best:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The main branch always reflects deployable code&lt;/li&gt;
&lt;li&gt;Developers create short-lived feature branches for each task&lt;/li&gt;
&lt;li&gt;Feature branches merge to main through pull requests requiring at least one review&lt;/li&gt;
&lt;li&gt;The CI pipeline runs on every pull request and every merge to main&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Protect the main branch:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Require pull request reviews before merging&lt;/li&gt;
&lt;li&gt;Require the CI pipeline to pass before merging&lt;/li&gt;
&lt;li&gt;Prevent direct pushes (all changes go through pull requests)&lt;/li&gt;
&lt;li&gt;Enable automatic branch deletion after merge&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Automated testing
&lt;/h2&gt;

&lt;p&gt;Automated tests are the backbone of any pipeline. Without reliable tests, automated deployment is just automated risk. Structure your suite in three layers — the canonical test pyramid: many fast unit tests at the base, fewer integration tests in the middle, a small set of end-to-end tests at the top.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Test layer&lt;/th&gt;
&lt;th&gt;What it verifies&lt;/th&gt;
&lt;th&gt;Tools&lt;/th&gt;
&lt;th&gt;Run frequency&lt;/th&gt;
&lt;th&gt;Time budget&lt;/th&gt;
&lt;th&gt;Coverage target&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Unit tests&lt;/td&gt;
&lt;td&gt;Individual functions/methods in isolation&lt;/td&gt;
&lt;td&gt;Jest, PyTest, JUnit, RSpec&lt;/td&gt;
&lt;td&gt;Every PR + every commit&lt;/td&gt;
&lt;td&gt;&amp;lt;5 min full suite&lt;/td&gt;
&lt;td&gt;70–80% on business logic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integration tests&lt;/td&gt;
&lt;td&gt;Components working together (DB, API, service-to-service)&lt;/td&gt;
&lt;td&gt;TestContainers, Supertest, Postman&lt;/td&gt;
&lt;td&gt;Every merge to main&lt;/td&gt;
&lt;td&gt;5–15 min&lt;/td&gt;
&lt;td&gt;Cover critical paths&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;End-to-end tests&lt;/td&gt;
&lt;td&gt;Critical user flows in a real browser&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://www.cypress.io/" rel="noopener noreferrer"&gt;Cypress&lt;/a&gt;, Playwright, Selenium&lt;/td&gt;
&lt;td&gt;Before production deploy&lt;/td&gt;
&lt;td&gt;15–30 min&lt;/td&gt;
&lt;td&gt;5–10 critical journeys&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Coverage advice:&lt;/strong&gt; Aim for &lt;strong&gt;70–80% code coverage on business logic, not 100% everywhere&lt;/strong&gt;. Chasing 100% wastes effort on trivial code (getters, constructors) and creates fragile tests that break on every refactor.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Build and artifact creation
&lt;/h2&gt;

&lt;p&gt;After tests pass, the pipeline builds your application and creates deployable artifacts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Containerized applications.&lt;/strong&gt; Write a Dockerfile that installs dependencies, copies application code, and defines the startup command. Tag images with the Git commit hash (not &lt;code&gt;:latest&lt;/code&gt;) for traceability. Push to a container registry: Amazon ECR, Google Artifact Registry, Azure Container Registry, or Docker Hub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Non-containerized applications.&lt;/strong&gt; The build stage compiles code, bundles assets, and packages the app into a deployable format: a JAR for Java, a wheel for Python, a zip archive for serverless functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Speed up builds with caching&lt;/strong&gt; — reduce repeat build time by &lt;strong&gt;50–80%&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker layer caching&lt;/strong&gt; avoids rebuilding unchanged layers&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dependency caching&lt;/strong&gt; (Maven &lt;code&gt;.m2&lt;/code&gt;, Node &lt;code&gt;node_modules&lt;/code&gt;, pip wheels) avoids re-downloading unchanged packages&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build artifact caching&lt;/strong&gt; in the CI platform avoids recompiling unchanged modules&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Sign and scan artifacts before deployment.&lt;/strong&gt; Container image scanning with &lt;a href="https://aquasecurity.github.io/trivy/" rel="noopener noreferrer"&gt;Trivy&lt;/a&gt;, Snyk, or Grype identifies known vulnerabilities in base images and dependencies. Fail the pipeline if critical or high-severity vulnerabilities are detected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Deployment stages
&lt;/h2&gt;

&lt;p&gt;A production-ready pipeline deploys through multiple environments, each adding validation before reaching users.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Environment&lt;/th&gt;
&lt;th&gt;Receives&lt;/th&gt;
&lt;th&gt;Purpose&lt;/th&gt;
&lt;th&gt;Tests run&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Development&lt;/td&gt;
&lt;td&gt;Every successful build from feature branches&lt;/td&gt;
&lt;td&gt;Devs test changes in a complete environment before merging&lt;/td&gt;
&lt;td&gt;Smoke tests&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Staging&lt;/td&gt;
&lt;td&gt;Every successful build from main&lt;/td&gt;
&lt;td&gt;Final validation gate; mirrors production in config, infra, data&lt;/td&gt;
&lt;td&gt;Integration + end-to-end&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Production&lt;/td&gt;
&lt;td&gt;After staging validation passes&lt;/td&gt;
&lt;td&gt;Real user traffic&lt;/td&gt;
&lt;td&gt;Health checks + monitoring&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Choosing a deployment strategy&lt;/strong&gt; — pick based on the app's failure tolerance and your monitoring maturity:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Strategy&lt;/th&gt;
&lt;th&gt;How it works&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Rollback speed&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Blue-green&lt;/td&gt;
&lt;td&gt;Two identical prod environments; new version deploys to the inactive one; traffic switches all at once&lt;/td&gt;
&lt;td&gt;Stateless apps with budget for double infra&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;td&gt;Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rolling&lt;/td&gt;
&lt;td&gt;Gradually replaces old instances with new ones; pauses on health-check failure&lt;/td&gt;
&lt;td&gt;Most workloads; default for Kubernetes Deployments&lt;/td&gt;
&lt;td&gt;Minutes&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Canary&lt;/td&gt;
&lt;td&gt;Routes 5–10% of traffic to the new version; monitors metrics; gradually increases&lt;/td&gt;
&lt;td&gt;High-traffic apps where small errors must be caught fast&lt;/td&gt;
&lt;td&gt;Seconds&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Monitoring and rollback
&lt;/h2&gt;

&lt;p&gt;Deployment isn't the final step. Monitoring and automated rollback complete the pipeline.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Track deployment health for 15–30 minutes.&lt;/strong&gt; After each deployment, monitor error rates, response latency (p95 / p99), and throughput. Compare against pre-deployment baselines. If error rates exceed a threshold (we recommend &lt;strong&gt;2× the baseline error rate&lt;/strong&gt;), trigger an automatic rollback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Notify the team of every deployment.&lt;/strong&gt; Use Slack, Microsoft Teams, or email to broadcast what was deployed, to which environment, by whom, and the outcome (success, failure, rollback).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintain a deployment history.&lt;/strong&gt; Record every production deployment with version, timestamp, deployer, and outcome. The first question after a production issue is always "what changed recently?"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automate rollback.&lt;/strong&gt; Configure automated rollback that reverts to the previous known-good version when monitoring detects problems. Manual rollback under pressure is error-prone; automated rollback is consistent.&lt;/p&gt;

&lt;h2&gt;
  
  
  A real engagement: UAE fintech CI/CD migration
&lt;/h2&gt;

&lt;p&gt;In a 2024 engagement with a UAE-based fintech client (10 microservices, 14-engineer team, manual deploys via shell scripts), we built a GitHub Actions pipeline over 5 weeks.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metric&lt;/th&gt;
&lt;th&gt;Before pipeline&lt;/th&gt;
&lt;th&gt;After 5 weeks&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment frequency&lt;/td&gt;
&lt;td&gt;1 per week&lt;/td&gt;
&lt;td&gt;18 per week&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Average build time&lt;/td&gt;
&lt;td&gt;22 minutes&lt;/td&gt;
&lt;td&gt;4 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Build failure recovery&lt;/td&gt;
&lt;td&gt;90 min (manual)&lt;/td&gt;
&lt;td&gt;&amp;lt;5 min (auto-rollback)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Deployment-tied incidents&lt;/td&gt;
&lt;td&gt;6 per quarter&lt;/td&gt;
&lt;td&gt;1 per quarter&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Engineer deploy hours / week&lt;/td&gt;
&lt;td&gt;~9 hours&lt;/td&gt;
&lt;td&gt;~1 hour&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;First-time deploy success rate&lt;/td&gt;
&lt;td&gt;~75%&lt;/td&gt;
&lt;td&gt;~98%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Pipeline stack:&lt;/strong&gt; GitHub Actions for orchestration. Jest and PyTest for unit testing. Cypress for end-to-end. Trivy for image scanning. Amazon ECR for the registry. EKS with rolling deployments for runtime. Auto-rollback triggered by Datadog watchdog alerts when post-deploy error rates exceeded 2× baseline.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The kicker:&lt;/strong&gt; The fintech closed its Series B five months after the engagement. Technical due diligence specifically cited the deployment-frequency increase (1/wk → 18/wk) as evidence of engineering discipline.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Choosing CI/CD tools
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tool&lt;/th&gt;
&lt;th&gt;Best for&lt;/th&gt;
&lt;th&gt;Free tier&lt;/th&gt;
&lt;th&gt;Hosting model&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/features/actions" rel="noopener noreferrer"&gt;GitHub Actions&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Teams already on GitHub; broad marketplace&lt;/td&gt;
&lt;td&gt;2,000 min/month for private repos&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://docs.gitlab.com/ci/" rel="noopener noreferrer"&gt;GitLab CI&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;All-in-one DevOps platform&lt;/td&gt;
&lt;td&gt;400 min/month on free tier&lt;/td&gt;
&lt;td&gt;Hosted or self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.jenkins.io/" rel="noopener noreferrer"&gt;Jenkins&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Enterprises needing maximum customization&lt;/td&gt;
&lt;td&gt;Open-source; pay only for infra&lt;/td&gt;
&lt;td&gt;Self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;AWS CodePipeline&lt;/td&gt;
&lt;td&gt;AWS-centric infra; tight IAM integration&lt;/td&gt;
&lt;td&gt;Pay per active pipeline&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure DevOps Pipelines&lt;/td&gt;
&lt;td&gt;Azure / Microsoft stack workflows&lt;/td&gt;
&lt;td&gt;1,800 min/month free for public&lt;/td&gt;
&lt;td&gt;Hosted or self-managed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Google Cloud Build&lt;/td&gt;
&lt;td&gt;GCP-centric / container-first workflows&lt;/td&gt;
&lt;td&gt;120 build-min/day free&lt;/td&gt;
&lt;td&gt;Hosted&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;The best tool is the one your team will actually use consistently.&lt;/strong&gt; Choose based on your existing workflow, not feature comparisons.&lt;/p&gt;

&lt;h2&gt;
  
  
  Frequently asked questions
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is a CI/CD pipeline and why is it important?&lt;/strong&gt;&lt;br&gt;
An automated workflow that takes code from commit through testing, building, and deployment. It eliminates manual deployment errors, enables faster release cycles, catches bugs early, and provides a repeatable, auditable process. Mature pipelines see 60% fewer deployment failures and recover 96× faster (DORA).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How long does it take to build a CI/CD pipeline from scratch?&lt;/strong&gt;&lt;br&gt;
A basic pipeline with automated testing and staging deployment: 1–2 weeks for a simple app. A production-ready pipeline with multi-stage deploys, security scanning, blue-green/canary strategies, monitoring, and automated rollback: typically 4–8 weeks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Which CI/CD tool should I use: GitHub Actions, GitLab CI, or Jenkins?&lt;/strong&gt;&lt;br&gt;
On GitHub? Start with GitHub Actions. Want an all-in-one platform? GitLab CI. Need maximum customization with self-hosted ops? Jenkins. Single-cloud workloads? Consider the provider's native tool (AWS CodePipeline, Azure DevOps).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What tests should run in a CI/CD pipeline?&lt;/strong&gt;&lt;br&gt;
Three layers: unit tests (fast, business logic, every commit), integration tests (component interactions, every merge to main), and focused end-to-end tests (5–10 critical journeys, before production). Plus static analysis, dependency scanning, and container image scanning if you deploy containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Can CI/CD work for small teams?&lt;/strong&gt;&lt;br&gt;
Yes — small teams benefit most. A 2-person team spending 4 hours/week on manual deployments saves 200+ hours per year by automating. Tools like GitHub Actions make setup accessible regardless of DevOps experience.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;This is a step-by-step companion to our longer &lt;a href="https://sherdilcloud.com/build-cicd-pipeline-from-scratch/" rel="noopener noreferrer"&gt;guide to building CI/CD pipelines&lt;/a&gt;. Originally published on the Sherdil Cloud blog.&lt;/em&gt;&lt;/p&gt;

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