<?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: Harshit Ghagre</title>
    <description>The latest articles on DEV Community by Harshit Ghagre (@harshitghagre).</description>
    <link>https://dev.to/harshitghagre</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3979511%2Fc2b99940-752b-4654-8091-15a2dce168ee.jpg</url>
      <title>DEV Community: Harshit Ghagre</title>
      <link>https://dev.to/harshitghagre</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/harshitghagre"/>
    <language>en</language>
    <item>
      <title>Getting Started with PipeCD — Deploy Your First App in 10 Minutes</title>
      <dc:creator>Harshit Ghagre</dc:creator>
      <pubDate>Tue, 16 Jun 2026 11:28:16 +0000</pubDate>
      <link>https://dev.to/harshitghagre/getting-started-with-pipecd-deploy-your-first-app-in-10-minutes-3h6g</link>
      <guid>https://dev.to/harshitghagre/getting-started-with-pipecd-deploy-your-first-app-in-10-minutes-3h6g</guid>
      <description>&lt;p&gt;Hey folks! In this blog, we are going to set up PipeCD from scratch on our local Linux machine and deploy our first application using it. By the end of this, you will have a working PipeCD setup and a clear picture of how GitOps-style deployments work with PipeCD.&lt;/p&gt;

&lt;p&gt;Let's jump right in.&lt;/p&gt;




&lt;h2&gt;
  
  
  So, What is PipeCD?
&lt;/h2&gt;

&lt;p&gt;Before we touch any commands, let me quickly explain what PipeCD actually is.&lt;/p&gt;

&lt;p&gt;PipeCD is a &lt;strong&gt;continuous delivery (CD) tool&lt;/strong&gt;. Its job is to take the code or configuration you push to Git and deploy it to your servers — automatically.&lt;/p&gt;

&lt;p&gt;Now, you might be thinking — "we already have Argo CD and Flux for that." And you're right, those are great tools. But here's the thing:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Argo CD and Flux only work with Kubernetes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;PipeCD works with Kubernetes, Terraform, AWS Lambda, Amazon ECS, and Google Cloud Run — all from one single tool. So if your team is using more than just Kubernetes (which most teams do), PipeCD saves you from juggling multiple tools.&lt;/p&gt;

&lt;p&gt;PipeCD is also a &lt;strong&gt;CNCF Sandbox project&lt;/strong&gt;, meaning it's backed by the same foundation that manages Kubernetes, Prometheus, and other big projects.&lt;/p&gt;




&lt;h2&gt;
  
  
  How Does PipeCD Work?
&lt;/h2&gt;

&lt;p&gt;PipeCD has two main parts. Think of it like this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Control Plane&lt;/strong&gt; = The Manager&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This runs the web dashboard&lt;/li&gt;
&lt;li&gt;It stores all the data about your deployments&lt;/li&gt;
&lt;li&gt;You install it once and it manages everything&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Piped&lt;/strong&gt; = The Worker (Agent)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is a small agent that runs inside your cluster&lt;/li&gt;
&lt;li&gt;It watches your Git repo for changes&lt;/li&gt;
&lt;li&gt;When it detects a change, it deploys the new version&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here's the important part — &lt;strong&gt;Piped only makes outbound connections&lt;/strong&gt;. It calls the Control Plane, the Control Plane never calls Piped. This means your cluster credentials and secrets never leave your environment. Very secure.&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%2Fevlnm8dbcwlvd8blstm8.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%2Fevlnm8dbcwlvd8blstm8.png" alt="PipeCD Architecture" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That's it. Let's set it up now.&lt;/p&gt;




&lt;h2&gt;
  
  
  What You Need (Prerequisites)
&lt;/h2&gt;

&lt;p&gt;We are doing everything on &lt;strong&gt;Linux&lt;/strong&gt;. Before we start, make sure you have these four tools installed:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Docker&lt;/strong&gt; — Runs containers. Minikube needs this to create your local cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Minikube&lt;/strong&gt; — Creates a local Kubernetes cluster on your machine.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;kubectl&lt;/strong&gt; — The command-line tool that lets you talk to your Kubernetes cluster.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Git&lt;/strong&gt; — Version control. You probably already have this installed.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Installing Docker
&lt;/h3&gt;

&lt;p&gt;If you don't have Docker yet:&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-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; docker.io
&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;span class="nb"&gt;sudo &lt;/span&gt;usermod &lt;span class="nt"&gt;-aG&lt;/span&gt; docker &lt;span class="nv"&gt;$USER&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Important:&lt;/strong&gt; Log out and log back in after the &lt;code&gt;usermod&lt;/code&gt; command so the group change takes effect.&lt;/p&gt;

&lt;p&gt;Verify Docker is working:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker &lt;span class="nt"&gt;--version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Installing Minikube
&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;-LO&lt;/span&gt; https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64
&lt;span class="nb"&gt;sudo install &lt;/span&gt;minikube-linux-amd64 /usr/local/bin/minikube
&lt;span class="nb"&gt;rm &lt;/span&gt;minikube-linux-amd64
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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;-LO&lt;/span&gt; &lt;span class="s2"&gt;"https://dl.k8s.io/release/&lt;/span&gt;&lt;span class="si"&gt;$(&lt;/span&gt;curl &lt;span class="nt"&gt;-L&lt;/span&gt; &lt;span class="nt"&gt;-s&lt;/span&gt; https://dl.k8s.io/release/stable.txt&lt;span class="si"&gt;)&lt;/span&gt;&lt;span class="s2"&gt;/bin/linux/amd64/kubectl"&lt;/span&gt;
&lt;span class="nb"&gt;sudo install &lt;/span&gt;kubectl /usr/local/bin/kubectl
&lt;span class="nb"&gt;rm &lt;/span&gt;kubectl
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl version &lt;span class="nt"&gt;--client&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Alright, all tools are ready. Let's start building.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Start Your Minikube Cluster
&lt;/h2&gt;

&lt;p&gt;First, let's create our local Kubernetes cluster using Minikube.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;minikube start &lt;span class="nt"&gt;--driver&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;docker &lt;span class="nt"&gt;--memory&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;4096 &lt;span class="nt"&gt;--cpus&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We are giving it 4GB of RAM and 2 CPUs. PipeCD runs a few services, so it needs a bit of resources.&lt;/p&gt;

&lt;p&gt;Once it's done, verify the cluster is running:&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 nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;NAME       STATUS   ROLES           AGE   VERSION
minikube   Ready    control-plane   30s   v1.xx.x
&lt;/span&gt;&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%2Fzago38j2uhclckzttdtq.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%2Fzago38j2uhclckzttdtq.png" alt="Minikube cluster running" width="636" height="75"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see &lt;code&gt;Ready&lt;/code&gt;, we're good. Let's move on.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Install the PipeCD Control Plane
&lt;/h2&gt;

&lt;p&gt;Now let's install the PipeCD Control Plane. This is the "manager" that runs the web UI and keeps track of everything.&lt;/p&gt;

&lt;p&gt;PipeCD provides ready-made manifest files for quickstart. We just need to apply them.&lt;/p&gt;

&lt;p&gt;Create the namespace first:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Now install the Control Plane:&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;-n&lt;/span&gt; pipecd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/pipe-cd/pipecd/master/quickstart/manifests/control-plane.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This single command installs everything the Control Plane needs — the server, the database, the cache, all of it.&lt;/p&gt;

&lt;p&gt;Wait for the pods to come up:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You'll see a few pods being created. Wait until all of them show &lt;code&gt;Running&lt;/code&gt; status. It usually takes 2-3 minutes. Press &lt;code&gt;Ctrl+C&lt;/code&gt; to stop watching once they're all running.&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%2Fdarfm5kay3han0m5kwsz.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%2Fdarfm5kay3han0m5kwsz.png" alt="Control Plane pods running" width="798" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All running? Great. Let's access the dashboard.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 3: Access the PipeCD Dashboard
&lt;/h2&gt;

&lt;p&gt;The Control Plane has a web UI. To access it from our browser, we need to forward the port.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl port-forward &lt;span class="nt"&gt;-n&lt;/span&gt; pipecd svc/pipecd 8080 &amp;amp;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The &lt;code&gt;&amp;amp;&lt;/code&gt; at the end runs it in the background so you can keep using the terminal.&lt;/p&gt;

&lt;p&gt;Now open your browser and go 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://localhost:8080?project=quickstart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see the PipeCD login page.&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%2Fczillo55qky5k2j9ta0b.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%2Fczillo55qky5k2j9ta0b.png" alt="PipeCD login page" width="800" height="410"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Login with these quickstart credentials — &lt;strong&gt;Project:&lt;/strong&gt; &lt;code&gt;quickstart&lt;/code&gt;, &lt;strong&gt;Username:&lt;/strong&gt; &lt;code&gt;hello-pipecd&lt;/code&gt;, &lt;strong&gt;Password:&lt;/strong&gt; &lt;code&gt;hello-pipecd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Once you log in, you'll see the PipeCD dashboard. It's clean and simple — you'll see sections for Applications, Deployments, and more.&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%2Frwfkbceifjeci3d31hvv.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%2Frwfkbceifjeci3d31hvv.png" alt="PipeCD dashboard" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a moment to look around. This is where you'll see all your deployments happening in real time later.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Install the Piped Agent
&lt;/h2&gt;

&lt;p&gt;The Control Plane is the manager, but it doesn't deploy anything by itself. We need the &lt;strong&gt;Piped agent&lt;/strong&gt; (the worker) to do the actual deploying.&lt;/p&gt;

&lt;p&gt;First, apply the piped manifest:&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;-n&lt;/span&gt; pipecd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/pipe-cd/pipecd/master/quickstart/manifests/piped.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now here's the important part that trips up most people — the piped manifest ships with &lt;strong&gt;placeholder values&lt;/strong&gt; for the piped ID and key. You need to register the piped through the UI first.&lt;/p&gt;

&lt;p&gt;Go to the PipeCD dashboard → click &lt;strong&gt;Settings&lt;/strong&gt; (bottom-left gear icon) → go to the &lt;strong&gt;Piped&lt;/strong&gt; tab → click &lt;strong&gt;+ ADD&lt;/strong&gt;. Give it a name like &lt;code&gt;quickstart-piped&lt;/code&gt; and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll see a popup with three values — &lt;strong&gt;Piped ID&lt;/strong&gt;, &lt;strong&gt;Piped Key&lt;/strong&gt;, and &lt;strong&gt;Base64 Encoded Piped Key&lt;/strong&gt;. Copy the Piped ID and the Base64 Encoded Piped Key (the third field). Save them somewhere — you won't see the key again.&lt;/p&gt;

&lt;p&gt;Now update the piped's configmap with your actual values:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl edit configmap piped &lt;span class="nt"&gt;-n&lt;/span&gt; pipecd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find the &lt;code&gt;pipedID&lt;/code&gt; and &lt;code&gt;pipedKeyData&lt;/code&gt; fields and replace the placeholders with the values you just copied. The &lt;code&gt;pipedKeyData&lt;/code&gt; field expects the &lt;strong&gt;Base64 Encoded Piped Key&lt;/strong&gt; (the third field from the popup). Save the file and restart the piped:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl delete pod &lt;span class="nt"&gt;-n&lt;/span&gt; pipecd &lt;span class="nt"&gt;-l&lt;/span&gt; app.kubernetes.io/name&lt;span class="o"&gt;=&lt;/span&gt;piped
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Wait for the new pod to start:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;You should see the piped pod in &lt;code&gt;Running&lt;/code&gt; status with &lt;code&gt;1/1&lt;/code&gt; ready.&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%2Fvan6ing5c7k1l2m297la.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%2Fvan6ing5c7k1l2m297la.png" alt="All pods including piped running" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go back to the PipeCD dashboard → &lt;strong&gt;Settings&lt;/strong&gt; → &lt;strong&gt;Piped&lt;/strong&gt; tab. You should see your piped showing a green connected status. That means the agent is now watching for changes and ready to deploy.&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%2Fb5toiliyyh5j2h9m1z3y.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%2Fb5toiliyyh5j2h9m1z3y.png" alt=" " width="800" height="407"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Understanding the GitOps Flow
&lt;/h2&gt;

&lt;p&gt;Now before we deploy anything, let me explain what happens behind the scenes. This is important — don't skip this part.&lt;/p&gt;

&lt;p&gt;In PipeCD, every application has two things in Git:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. &lt;code&gt;app.pipecd.yaml&lt;/code&gt;&lt;/strong&gt; — This is the PipeCD configuration file. It tells PipeCD what kind of app this is and how to deploy it.&lt;/p&gt;

&lt;p&gt;Here's a simple example:&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;pipecd.dev/v1beta1&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;KubernetesApp&lt;/span&gt;
&lt;span class="na"&gt;spec&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;my-app&lt;/span&gt;
  &lt;span class="na"&gt;pipeline&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;stages&lt;/span&gt;&lt;span class="pi"&gt;:&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;K8S_PRIMARY_ROLLOUT&lt;/span&gt;
        &lt;span class="na"&gt;desc&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Deploy the new version&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is saying: "Hey PipeCD, this is a Kubernetes app. Deploy it using a rolling update."&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Your Kubernetes manifests&lt;/strong&gt; — These are your regular deployment, service, configmap files. Nothing special here. Just the normal YAML files you already know.&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;apps/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;Deployment&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;my-app&lt;/span&gt;
&lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;replicas&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;matchLabels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="pi"&gt;:&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;labels&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;app&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;my-app&lt;/span&gt;
    &lt;span class="na"&gt;spec&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="na"&gt;containers&lt;/span&gt;&lt;span class="pi"&gt;:&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&lt;/span&gt;
          &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;nginx:1.25&lt;/span&gt;
          &lt;span class="na"&gt;ports&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
            &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;containerPort&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;80&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When you push a change to either of these files — for example, changing the image from &lt;code&gt;nginx:1.25&lt;/code&gt; to &lt;code&gt;nginx:1.26&lt;/code&gt; — Piped will detect the change and deploy it automatically.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't run any deploy commands. You just push to Git. PipeCD does the rest.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That's the whole idea of GitOps.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 6: Deploy Your First Application
&lt;/h2&gt;

&lt;p&gt;Now let's actually deploy something. The piped is already configured to watch the &lt;code&gt;pipe-cd/examples&lt;/code&gt; Git repository, which has sample applications ready to go.&lt;/p&gt;

&lt;p&gt;Go to the PipeCD dashboard and click &lt;strong&gt;Applications&lt;/strong&gt; in the top navigation. Then click &lt;strong&gt;+ ADD&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You'll see a panel with tabs at the top. Click &lt;strong&gt;"PIPED V0 ADD FROM SUGGESTIONS"&lt;/strong&gt; — this shows all the applications the piped has discovered from the examples repository. You should see around 55 apps listed.&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%2Ftzkf3zyr46jyu9ql7bf8.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%2Ftzkf3zyr46jyu9ql7bf8.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pick &lt;strong&gt;&lt;code&gt;kubernetes/simple&lt;/code&gt;&lt;/strong&gt; from the list and click &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Go back to the &lt;strong&gt;Applications&lt;/strong&gt; tab. You'll see your new application listed there. Click on it.&lt;/p&gt;

&lt;p&gt;PipeCD will automatically trigger an initial deployment. You can watch each stage of the pipeline execute one by one — it's like watching a CI/CD pipeline run, but for deployments.&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%2F9w0y366si1dps08ymuhu.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%2F9w0y366si1dps08ymuhu.png" alt=" " width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once the deployment finishes, you'll see green checkmarks on all stages. Your application is now deployed to your cluster.&lt;/p&gt;

&lt;p&gt;You can verify it in your terminal too:&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 deployments &lt;span class="nt"&gt;-A&lt;/span&gt;
kubectl get pods &lt;span class="nt"&gt;-A&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see the sample application pods running alongside the PipeCD pods.&lt;/p&gt;

&lt;p&gt;If something goes wrong during deployment, PipeCD will &lt;strong&gt;automatically rollback&lt;/strong&gt; to the previous working version. You don't have to do anything.&lt;/p&gt;




&lt;h2&gt;
  
  
  What Makes PipeCD Special?
&lt;/h2&gt;

&lt;p&gt;After setting it up, here's what I think stands out:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Works with more than just Kubernetes.&lt;/strong&gt;&lt;br&gt;
Terraform, Lambda, ECS, Cloud Run — one tool handles all of them. You don't need Argo CD for Kubernetes AND a separate tool for Terraform.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Your secrets stay safe.&lt;/strong&gt;&lt;br&gt;
The Piped agent only makes outbound calls. Your cloud credentials never leave your cluster. This is a big deal for security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Deployment strategies are built in.&lt;/strong&gt;&lt;br&gt;
Canary deployments, blue-green deployments, automated analysis — you just configure them in the &lt;code&gt;app.pipecd.yaml&lt;/code&gt; file. No extra tools needed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Drift detection.&lt;/strong&gt;&lt;br&gt;
If someone manually changes something in your cluster (like editing a deployment with &lt;code&gt;kubectl edit&lt;/code&gt;), PipeCD catches it. It shows you exactly what drifted from your Git state.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. The UI is really clean.&lt;/strong&gt;&lt;br&gt;
You can see your deployment pipelines, logs, application state, and history — all in one place. No clicking through 10 different pages.&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%2Fsp89sx609i0h5ugbq1yj.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%2Fsp89sx609i0h5ugbq1yj.png" alt="PipeCD Applications view" width="800" height="408"&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%2Fu8xauq224tl4bjs6rr7h.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%2Fu8xauq224tl4bjs6rr7h.png" alt="PipeCD deployment pipeline" width="800" height="412"&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%2Fw2oaivxcwv5pjljtz3ow.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%2Fw2oaivxcwv5pjljtz3ow.png" alt="PipeCD application details" width="800" height="408"&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%2Fbmuoi24h6fy0g6rm5zpa.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%2Fbmuoi24h6fy0g6rm5zpa.png" alt="PipeCD live state" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Cleanup
&lt;/h2&gt;

&lt;p&gt;Once you're done playing around, clean everything up:&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="c"&gt;# Stop the port-forward&lt;/span&gt;
&lt;span class="nb"&gt;kill&lt;/span&gt; %1

&lt;span class="c"&gt;# Delete PipeCD resources&lt;/span&gt;
kubectl delete &lt;span class="nt"&gt;-n&lt;/span&gt; pipecd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/pipe-cd/pipecd/master/quickstart/manifests/piped.yaml
kubectl delete &lt;span class="nt"&gt;-n&lt;/span&gt; pipecd &lt;span class="nt"&gt;-f&lt;/span&gt; https://raw.githubusercontent.com/pipe-cd/pipecd/master/quickstart/manifests/control-plane.yaml
kubectl delete namespace pipecd

&lt;span class="c"&gt;# Stop and delete the Minikube cluster&lt;/span&gt;
minikube stop
minikube delete
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything gone. Clean system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where to Go From Here?
&lt;/h2&gt;

&lt;p&gt;If you want to dig deeper, here are some useful links:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://play.pipecd.dev?project=play" rel="noopener noreferrer"&gt;PipeCD Playground&lt;/a&gt;&lt;/strong&gt; — Want to try PipeCD without installing anything? Use this hosted demo. No setup needed.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/pipe-cd/tutorial" rel="noopener noreferrer"&gt;Official Hands-on Tutorial&lt;/a&gt;&lt;/strong&gt; — A detailed, step-by-step tutorial that goes much deeper. Highly recommended.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://pipecd.dev/docs/" rel="noopener noreferrer"&gt;PipeCD Documentation&lt;/a&gt;&lt;/strong&gt; — Full docs with installation guides, configuration references, and advanced features.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://github.com/pipe-cd/pipecd" rel="noopener noreferrer"&gt;GitHub Repository&lt;/a&gt;&lt;/strong&gt; — Star the repo, look at open issues, and maybe even contribute!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;&lt;a href="https://slack.cncf.io" rel="noopener noreferrer"&gt;CNCF Slack — #pipecd&lt;/a&gt;&lt;/strong&gt; — Join the community. The maintainers are very helpful and active.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Wrapping Up
&lt;/h2&gt;

&lt;p&gt;PipeCD is one of those tools that just makes sense once you use it. It does continuous delivery for Kubernetes, Terraform, Lambda, ECS, and Cloud Run — all from one platform. The security model is solid, the UI is clean, and the GitOps workflow just works.&lt;/p&gt;

&lt;p&gt;Happy deploying! 🚀&lt;/p&gt;




&lt;p&gt;&lt;em&gt;PipeCD v0.56.0 was recently released with improvements to pipectl and deployment workflows. Check out the &lt;a href="https://github.com/pipe-cd/pipecd/releases" rel="noopener noreferrer"&gt;release notes&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Tags:&lt;/strong&gt; &lt;code&gt;#gitops&lt;/code&gt; &lt;code&gt;#kubernetes&lt;/code&gt; &lt;code&gt;#devops&lt;/code&gt; &lt;code&gt;#cicd&lt;/code&gt; &lt;code&gt;#pipecd&lt;/code&gt; &lt;code&gt;#cncf&lt;/code&gt; &lt;code&gt;#cloudnative&lt;/code&gt; &lt;code&gt;#linux&lt;/code&gt;&lt;/p&gt;

</description>
      <category>cloudnative</category>
      <category>cicd</category>
      <category>pipecd</category>
      <category>devops</category>
    </item>
  </channel>
</rss>
