
From Commit to Production: Hands-On GitOps Promotion with GitHub Actions, Argo CD, Helm, and Kargo
From Commit to Production: Hands-On GitOps Promotion with GitHub Actions, Argo CD, Helm, and Kargo κ΄λ ¨
Have you ever wanted to go beyond βhello worldβ and build a real, production-style CI/CD pipeline β starting from scratch?
Letβs pause for a moment: what are you trying to learn from your DevOps journey? Are you focusing on GitOps-style deployments, or promotions? This guide will help you tackle all of it β one step at a time.
As a DevOps engineer interested in creating a complete CI/CD pipeline, I wanted more than a basic "hello world" microservice. I was looking for a project where I could start from scratch β beginning with raw source code, writing my own Docker Compose and Kubernetes files, deploying locally, and then adding automation, environment promotion, and GitOps practices step by step.
In my search, I found several GitHub repositories. Most were either too simple to be useful or too complicated and already set up, leaving no room for learning. They often included ready-made Docker Compose files and Kubernetes manifests, which didn't help with learning through hands-on experience.
Thatβs when I discovered Craftista, a project maintained by Gourav Shah (gouravshah
). This wasnβt just another training repo. As described in its documentation:
βCraftista is not your typical hello world app or off-the-shelf WordPress app used in most DevOps trainings. It is the real deal.β

Craftista stood out to me for several reasons:
- Itβs a polyglot microservices application, designed to resemble a real-world platform.
- Each service uses its own technology stack β exactly like in modern enterprises.
- It includes essential building blocks of a real e-commerce system:
- A modern UI built in Node.js
- A Product Catalogue Service
- A Recommendation Engine
- A Voting/Review Service
By the end of this guide, you wonβt just have a βhello worldβ demo β youβll have a fully functioning CI/CD/GitOps pipeline modeled on a real-world microservices stack. Youβll understand how the pieces fit together, why each tool exists, and how to adapt this workflow to your own projects.
Ready to go beyond hello world and build a production-style pipeline from scratch? Letβs dive in.
Table of Contents
(1/6) Topics Outside the Scope of This Guide (2/6) What is GitOps? (3/6) Tools We Are Using in This Guide (4/6) How to Structure Repositories for Microservice Applications (5/6) How to Organize Kubernetes Manifests for GitOps (6/6) How to Deploy and Promote Your Craftista Microservices Application
Prerequisites and What Youβll Learn:
Before you progress through this guide, ask yourself:
- Do I understand how semantic tagging improves traceability across environments?
- Can I replicate a multi-environment GitOps setup using Helm and Kubernetes?
- Am I confident in organizing Helm charts and manifests for scalable deployments?
- Do I know how Kargo and Argo CD work together to automate promotions and approvals?
This guide will help you confidently answer those questions by walking you through:
- β An optimized Git branching strategy: using feature branches and a single main branch
- β Semantic Docker image tagging for clean version tracking
- β Helm chart and Kubernetes manifest structuring for multi-environment GitOps
- β CI pipelines using GitHub Actions for build β test β tag automation
- β Full GitOps workflows with Kargo and Argo CD for seamless promotion and delivery
Topics Outside the Scope of This Guide
- Deployment to managed services like EKS, AKS, or GKE is not included. Weβll use Minikube for local development.
- I assume you are already familiar with writing basic Kubernetes manifests. I wonβt explain Pods, Services, Deployments, and their YAML structures here.
- I also wonβt discuss topics like logging, metrics, tracing, and security hardening.
- This guide does not cover Managing Secrets and ConfigMaps and Implementing Service Discovery.
- And finally, we wonβt go over ArgoCD and Kargo installation.
What is GitOps?
GitOps is a modern way to manage applications and infrastructure using Git as the main source of truth. Developers have used Git for a long time to manage and work together on code. GitOps takes this further by including infrastructure setup, deployment processes, and automation.
By keeping everything β from Kubernetes files and Helm charts to infrastructure code and app settings β in Git, teams have a central, version-controlled system that can be tracked. Changes in Git are automatically updated and matched with the target environments by GitOps tools like Argo CD or Flux.
Core Principles of GitOps
- Git as the single source of truth
- Declarative systems
- Immutable deployments
- Centralized change audit
Tools We Are Using in This Guide

GitHub Actions
GitHub Actions is a platform for continuous integration and delivery (CI/CD) that helps automate your build, test, and deployment processes.
In our project, weβll use it to store our microservice application code. Weβll use GitHub Actions workflows to build and push Docker images to Docker Hub as our Docker registry. Weβll rely on GitHub Actions for continuous delivery.
Minikube
We are deploying our application and ArgoCD locally on Minikube. To simulate promotion between different environments, I am using namespaces.
Argo CD
Argo CD is a declarative GitOps continuous deployment tool for Kubernetes that automates the deployment and synchronization of microservice applications with Git repositories. It follows GitOps principles and uses declarative configurations with a pull-based approach.

Hereβs a summary of the flow depicted in the above image:
- The developer modifies application code and changes are pushed to a Git repository.
- The CI pipeline is triggered and builds a new container image and pushes it to a container registry.
- Merge triggers a webhook to notify Argo CD of changes in the Git repository.
- Argo CD clones the updated Git repository. Compares the desired state (from Git) with the current state in the Kubernetes cluster.
- Argo CD applies the necessary changes to bring the cluster to the desired state.
- Kubernetes controllers reconcile resources until the cluster matches the desired configuration.
- Argo CD continuously monitors the application and cluster state.
- Argo CD can automatically or manually revert the changes to match the Git configuration, ensuring Git remains the single source of truth.
Kargo
Kargo manages promotion by watching repositories (Git, Image, Helm) for changes and making the needed commits to your Git repository, while Argo CD takes care of reconciliation. Kargo is built to simplify multi-stage application promotion using GitOps principles, removing the need for custom automation or CI pipelines.

Kargo Components
- Warehouse: Watches image registries and discovers new container images. Monitors DockerHub for new tags like
v1.2.0
,v1.2.1
, etc., and stores metadata about discovered images. - Stage: Defines a deployment environment (Dev, Stage, Prod). When a new image is found by the warehouse, it updates the manifest under
env/dev/
with the new image tag. This triggers Argo CD to sync thedev
environment. - PromotionPolicy: Defines how promotion should happen between stages (for example, auto or manual).
- Freight: An artifact version to be promoted (for example, a specific container image or Helm chart). When
v1.2.1
is discovered by the warehouse, a new Freight is created.

Practical Examples
- A new
v1.2.0
image is pushed to DockerHub. - Kargo detects it via a warehouse and updates the
dev
environment. - Once verified (either by tests or metrics), Kargo automatically updates Helm values in the Git repo for staging.
- Argo CD sees the Git change and syncs the new version to staging.
- Manual approval (via Slack or UI) is required to push to production.
Why Kargo is the Perfect Companion to Argo CD
Have you ever had to manually promote versions across environments and wished it were automated? How would integrating Kargo have saved time or prevented errors in your last deployment?
Argo CD excels at GitOps-driven continuous deployment β syncing your Kubernetes cluster with the desired state declared in Git. But it lacks native support for promotion workflows between environments (like dev β staging β production) based on image metadata, test results, or approval gates. This is where Kargo becomes the perfect companion.

Kargo doesnβt replace Argo CD β it extends it. You continue to use Argo CD for syncing and deploying apps, but Kargo adds promotion intelligence and automation.
How to Structure Repositories for Microservice Applications
My example application consists of 4 microservices (frontend (nitheeshp-irl/microservice-frontend
), recommendation (nitheeshp-irl/microservice-recommendation
), catalogues (nitheeshp-irl/microservice-catalogue
), and voting (nitheeshp-irl/microservice-voting
)). Designing your repository structure is very important to start your project. There is a lot of debate between monorepo and multi-service repo.
A monorepo is a unified repository that houses all the code for a project or a set of related projects. It consolidates code from various services, libraries, and applications into a single centralized location.
On the other hand, a polyrepo architecture comprises multiple repositories, each containing the code for a distinct service, library, or application component.
Why a Polyrepo Fits My Microservice-Service App
Imagine you're onboarding a new team to your app. Would you prefer giving them access to an entire monorepo or just the relevant serviceβs repo? What trade-offs are you willing to accept?β
Well, using a polyrepo approach,
- Teams can work independently on the frontend, recommendations, catalogs, and voting without stepping on each otherβs toes.
- Sensitive services remain locked down without complex directory-level rules.
- CI runners operate on a smaller codebase, speeding up checkouts and reducing bandwidth.
- Each service has its own release cadence (for example,
catalogues
v2.1.0 andvoting
v1.7.3). - As your organization grows, new teams can onboard to only the repos they care about.
- Shared libraries can be versioned and published to an internal package registry, then consumed by each service.
Git Branching is Anti Pattern to GitOps Principles

Many teams default to βGitFlow (novai-devops-101
)β-style branching β creating long-lived branches for dev
, staging
, prod
, and more. But in a true GitOps workflow, Git is your control plane, and βenvironmentsβ shouldnβt live as branches.
Instead, you can keep things simple with just:
- A long-lived
master
(ormain
) branch - Short-lived feature branches for code work
How to Organize Kubernetes Manifests for GitOps
This repo (nitheeshp-irl/microservice-helmcharts
) shows how you can keep ArgoCD application manifests, environment-specific values, Kargo promotion tasks, Helm charts for each microservice, and CI/CD workflows all in one place. It is organized so that:
- ArgoCD application manifests live under
argocd/
, split by environment (for example,dev/
,staging/
,prod/
). - Environment-specific overrides (Helm values or Kustomize patches) go under
env/
. - Kargo promotion configurations are grouped under
kargo/
, defining how new images move between environments. - Service Helm charts reside in
service-charts/
, one chart per microservice.
/microservice-helmcharts/
βββ argocd/ # ArgoCD application manifests
β βββ application/ # Application definitions
β β βββ dev/ # Development environment applications
β β β βββ catalogue.yaml
β β β βββ catalogue-db.yaml
β β β βββ frontend.yaml
β β β βββ recommendation.yaml
β β β βββ voting.yaml
β β β βββ kustomization.yaml
β β βββ staging/ # Staging environment applications
β β β βββ [similar structure as dev]
β β βββ prod/ # Production environment applications
β β β βββ [similar structure as dev]
β β βββ craftista-project.yaml
β βββ blog-post.md
β βββ deployment-guide-blog.md
β βββ repository-structure.md
βββ env/ # Environment-specific configurations
β βββ dev/ # Development environment values
β β βββ catalogue/
β β β βββ catalogue-values.yaml
β β βββ catalogue-db/
β β β βββ catalogue-db-values.yaml
β β βββ frontend/
β β β βββ frontend-values.yaml
β β βββ recommendation/
β β β βββ recommendation-values.yaml
β β βββ voting/
β β β βββ voting-values.yaml
β β βββ kustomization.yaml
β βββ staging/ # Similar structure as dev but with image files
β βββ prod/ # Similar structure as staging
βββ kargo/ # Kargo promotion configuration
β βββ catalogue-config/ # Catalogue service promotion
β β βββ catalogue-promotion-tasks.yaml
β β βββ catalogue-stages.yaml
β β βββ catalogue-warehouse.yaml
β βββ frontend-config/ # Frontend service promotion
β β βββ frontend-promotion-tasks.yaml
β β βββ frontend-stages.yaml
β β βββ frontend-warehouse.yaml
β βββ recommendation-config/ # Recommendation service promotion
β β βββ recommendation-promotion-tasks.yaml
β β βββ recommendation-stages.yaml
β β βββ recommendation-warehouse.yaml
β βββ voting-config/ # Voting service promotion
β β βββ voting-promotion-tasks.yaml
β β βββ voting-stages.yaml
β β βββ voting-warehouse.yaml
β βββ kargo.yaml # ArgoCD application for Kargo
β βββ kustomization.yaml # Combines all Kargo resources
β βββ project.yaml # Kargo project definition
β βββ projectconfig.yaml # Project-wide promotion policies
βββ service-charts/ # Helm charts for each microservice
β βββ catalogue/ # Catalogue service chart
β β βββ templates/
β β β βββ deployment.yaml
β β β βββ service.yaml
β β βββ Chart.yaml
β β βββ values.yaml
β βββ catalogue-db/ # Similar structure as catalogue
β βββ frontend/ # Similar structure as catalogue
β βββ recommendation/ # Similar structure as catalogue
β βββ voting/ # Similar structure as catalogue
βββ .github/workflows/ # CI/CD workflows
β βββ docker-ci.yml # Docker image build and push
βββ README.md # Repository documentation
Argo CD Folders
The argocd/
directory contains all of the manifests that Argo CD needs in order to track, group, and deploy your microservices. In this guide, we break that directory into two main pieces:
- Argo CD Project Definition
- Argo CD Application Manifests (organized by environment)
ArgoCD Projects

Before you can give Argo CD a set of Applications to manage, itβs often best practice to define a βProject.β A Project in Argo CD serves as a logical boundary around a group of Applications. It can control which Git repos those Applications are allowed to reference, which Kubernetes clusters/namespaces they can target, and even which resource kinds they can manage.
In our example repo, the file craftisia-project.yaml
lives at the top of argocd/
:
apiVersion: argoproj.io/v1alpha1
kind: AppProject
metadata:
name: craftisia
namespace: argocd
spec:
# 1) Which Git repos are we allowed to pull from?
sourceRepos:
- "https://github.com/nitheeshp-irl/microservice-helmcharts"
# (Or you could use "*" to allow any repo, but this is less secure.)
# 2) Which clusters/namespaces can these Apps be deployed to?
destinations:
- namespace: "*"
server: "*" # Allow deployment to any cluster (for a local Minikube demo, this is fine).
# 3) Which kinds of Kubernetes resources may be created/updated?
# (For example, we want Pods, Services, Deployments, Ingresses, etc.)
# Argo CD will reject any manifest containing a disallowed kind.
clusterResourceWhitelist:
- group: "" # core API group (Pods, Services, ConfigMaps, etc.)
kind: Pod
- group: "apps" # deployments, statefulsets, etc.
kind: Deployment
- group: "networking.k8s.io"
kind: Ingress
# (You can list additional resource kinds as needed.)
# 4) Optional: define role-based access control or sync policies at the project level.
# (Not shown here, but you could add roles, namespace resource quotas, etc.)
2. Argo CD Application Manifests (by Environment)
Inside argocd/
, there is a subdirectory called application/
. We use this to keep all of our Argo CD Application YAMLs, broken out by environment. The high-level layout looks like this:
rCopyEditargocd/
βββ application/
βββ dev/ # βDevβ environment Applications
β βββ catalogue.yaml
β βββ catalogue-db.yaml
β βββ frontend.yaml
β βββ recommendation.yaml
β βββ voting.yaml
β βββ kustomization.yaml
βββ staging/ # βStagingβ environment Applications (same names/structure as dev/)
β βββ [β¦]
βββ prod/ # βProdβ environment Applications (same names/structure as dev/)
βββ [β¦]
Each of those YAML files is a standalone Argo CD Application. An Application tells Argo CD:
- Which project it belongs to (in our case,
craftisia
), - Where to find its manifests (a Git repo and path),
- Which Kubernetes cluster and namespace to deploy into, and
- How to keep itself up to date (that is, sync policies).
Below is a example of the frontend.yaml
file for the dev environment:
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: frontend-dev
namespace: argocd
spec:
project: craftisia
# 1) Source: Where to find the Helm chart and which values file to use
source:
repoURL: https://github.com/nitheeshp-irl/microservice-helmcharts
targetRevision: main
path: service-charts/frontend # Helm chart folder for the frontend service
helm:
valueFiles:
- ../../env/dev/frontend/frontend-values.yaml
# 2) Destination: Which cluster & namespace to deploy into
destination:
server: https://kubernetes.default.svc # (Assumes Argo CD is running in-cluster)
namespace: front-end-dev # A dedicated namespace for βdevβ frontend
# 3) Sync Policy: Automate synchronization and enable self-healing
syncPolicy:
automated:
prune: true # Delete resources that are no longer in Git
selfHeal: true # If someone manually changes live resources, revert to Git state
syncOptions:
- CreateNamespace=true # If the namespace doesnβt exist, Argo CD will create it
You would repeat a similar pattern under argocd/application/staging/
and argocd/application/prod/
β each environment has its own frontend.yaml
, catalogue.yaml
, and so on, but each will point to a different values file under env/staging/β¦
or env/prod/β¦
and likely deploy into a different namespace (for example, front-end-staging
, front-end-prod
).
Env Folders
The /env
directory is a critical part of our GitOps implementation, containing all environment-specific configurations for our microservices. Each environment (dev, staging, prod) has its own subdirectory containing service-specific configurations. These contain general Helm chart values like resource limits and replica counts and container image repository and tag.
image:
repository: nitheesh86/microservice-frontend
tag: 1.0.11
replicaCount: 2
resources:
limits:
memory: "512Mi"
requests:
cpu: "100m"
memory: "128Mi"
Kargo Folders
Our Kargo setup is organized in the /kargo
directory with several key components:
/kargo/
βββ catalogue-config/ # Catalogue service promotion configuration
β βββ catalogue-promotion-tasks.yaml # Defines how to update catalogue images
β βββ catalogue-stages.yaml # Dev, staging, prod stages for catalogue
β βββ catalogue-warehouse.yaml # Monitors catalogue image repository
βββ frontend-config/ # Frontend service promotion configuration
β βββ frontend-promotion-tasks.yaml # Defines how to update frontend images
β βββ frontend-stages.yaml # Dev, staging, prod stages for frontend
β βββ frontend-warehouse.yaml # Monitors frontend image repository
βββ recommendation-config/ # Recommendation service promotion configuration
β βββ recommendation-promotion-tasks.yaml # Image update workflow
β βββ recommendation-stages.yaml # Environment stages
β βββ recommendation-warehouse.yaml # Image monitoring
βββ voting-config/ # Voting service promotion configuration
β βββ voting-promotion-tasks.yaml # Image update workflow
β βββ voting-stages.yaml # Environment stages
β βββ voting-warehouse.yaml # Image monitoring
βββ kargo.yaml # ArgoCD application for Kargo installation
βββ kustomization.yaml # This file - combines all resources
βββ project.yaml # Defines the Kargo project
βββ projectconfig.yaml # Project-wide promotion policies
Stage Configurations: Kargo uses the concept of "stages" to represent our deployment environments. Each stage defines:
- Which freight (container images) to deploy
- The promotion workflow to execute
- Environment-specific variables
Warehouse Configuration: The warehouse monitors our container registry for new images.
Promotion Tasks: Promotion tasks define the actual workflow for promoting between environments.
How to Deploy and Promote Your Craftista Microservices Application
Now I'll explain how to deploy your Craftista microservices application using Argo CD.

Prerequisites
- A local Kubernetes cluster: Weβll use Minikube for local development.
- kubectl and helm: Ensure both are installed and configured.
- Git Clone of the microservice-helmcharts Repo:
git clone https://github.com/nitheeshp-irl/microservice-helmcharts.git
cd microservice-helmcharts
1. Start Minikube
Start Minikube with the specified resources:
minikube start --memory=4096 --cpus=2
kubectl config use-context minikube
Adjust --memory
and --cpus
as needed for your machine.
2. Install Argo CD
Create a namespace:
kubectl create namespace argocd
Apply the official install manifest:
kubectl apply -n argocd \
-f https://raw.githubusercontent.com/argoproj/argo-cd/stable/manifests/install.yaml
3. Access the Argo CD UI
Port-forward the server:
kubectl port-forward svc/argocd-server \
-n argocd 8080:443
Login:
- Username:
admin
- Password:
kubectl -n argocd get secret argocd-initial-admin-secret \
-o jsonpath="{.data.password}" | base64 -d
Open your browser at http://localhost:8080
.
4. Define a βCraftistaβ Argo CD Project
Scope Repos, Clusters, and Namespaces:
kubectl apply -f argocd/application/craftista-project.yaml
#
# project.argoproj.io/craftista created
5. Deploy the Development Environment
Create Argo CD applications:
kubectl apply -f argocd/application/dev/
Argo CD will:
- Clone the microservice-helmcharts repo.
- Render each Helm chart with its
env/dev/*-values.yaml
. - Create Deployment, Service, and so on in your dev namespaces.
- Continuously reconcile desired vs. actual state.
Monitor your progress:
argocd app list
argocd app get frontend-dev
6. Manual Promotion (Staging & Prod)
Edit the image tag or other values:
env/staging/<service>/
<service>-values.yaml
env/prod/<service>/
<service>-values.yaml
Commit and push the changes:
git add env/staging env/prod
git commit -m "Promote v1.2.0 β staging & prod"
git push
Argo CD will detect the Git change and automatically sync your staging and prod applications (if automated sync is enabled).
7. Automated Promotion with Kargo

First, install Kargo:
kubectl apply -f kargo/kargo.yaml
Configure promotion tasks, stages, and warehouse:
kubectl apply -k kargo/
#
# apiVersion: kustomize.config.k8s.io/v1beta1
# kind: Kustomization
#
# resources:
# - project.yaml
# - projectconfig.yaml
# - catalogue-config/catalogue-warehouse.yaml
# - catalogue-config/catalogue-stages.yaml
# - catalogue-config/catalogue-promotion-tasks.yaml
# - frontend-config/frontend-warehouse.yaml
# - frontend-config/frontend-stages.yaml
# - frontend-config/frontend-promotion-tasks.yaml
# - recommendation-config/recommendation-warehouse.yaml
# - recommendation-config/recommendation-stages.yaml
# - recommendation-config/recommendation-promotion-tasks.yaml
# - voting-config/voting-warehouse.yaml
# - voting-config/voting-stages.yaml
# - voting-config/voting-promotion-tasks.yaml
How the GitOps Pipeline Works


- Developer Opens a Pull Request: The journey begins when a developer opens a pull request on one of the microservice repos. This signals that new code (feature, bugfix, config change) is ready to be integrated.
- CI (GitHub Actions)
- CI: Lint β Test β Build & Tag: A single workflow job lints the code, runs unit/integration tests, builds the Docker image, and applies a semantic tag (for example, v1.2.0).
- CI OK? (Decision):
- If No, the pipeline stops and the developer is notified to fix errors.
- If Yes, the newly built image is pushed to the container registry (DockerHub, ECR, and so on).
- Kargo
- Warehouse discovers new image tag: Kargoβs Warehouse component continuously watches your registry. As soon as it sees the new tag, it records that image metadata.
- Update env/dev values β Git: Kargo automatically commits an update to
env/dev/<service>/
β¦-values.yaml
, pointing the dev Helm values file to the new image tag. This Git commit will drive the next step.
- GitOps (Argo CD)
- Argo CD sync dev: Argo CD sees the Git change in the dev values file and pulls it into the cluster, reconciling the actual dev namespace with the desired state.
- Dev deployment healthy? (Decision):
- If No, Argo CD can optionally roll back and notifies the team (via Slack, email, etc.) of the failed dev rollout.
- If Yes, itβs time to promote to staging.
- Update env/staging values β Git: Kargo (or you, if manual) commits the same image tag into
env/staging/<service>/
β¦-values.yaml
.- Argo CD sync staging: Argo CD deploys that change to the staging namespace.
- Staging approval granted? (Decision):
- If No, Kargo waits (and optionally notifies) until a manual gate is lifted.
- If Yes, the final promotion commit is made: updating
env/prod/<service>/
β¦-values.yaml
.
- Argo CD sync prod β End: Argo CD applies the production change, completing the pipeline from commit all the way to live production rollout.
- Dev deployment healthy? (Decision):
Pipeline Summary
- Developer opens PR β CI tests and builds β Docker image pushed
- Kargo Warehouse detects new tag β Git commit to
env/dev
- Argo CD syncs dev β Health check β (if successful) commit to
env/staging
- Argo CD syncs staging β Approval β commit to
env/prod
- Argo CD syncs prod β Live deployment complete
Every stage must pass its health or approval check before the next begins, ensuring that only thoroughly tested and validated code makes it into production.
Conclusion
Building a real-world CI/CD pipeline isnβt just about getting code from your laptop into a Kubernetes cluster β itβs about creating a repeatable, auditable, and reliable system that scales with your team and your application complexity.
In this guide, we walked through how I built a complete GitOps-based promotion pipeline using GitHub Actions, Argo CD, and Kargo, all driven by a hands-on microservices project: Craftista. From the first code commit to automated environment promotion, we leveraged industry best practices like semantic versioning, declarative infrastructure, and environment-based GitOps directories.
What makes this approach powerful is not just the tools but also the principles. By treating Git as the single source of truth, and using Kargo to automate what was traditionally a manual and fragile promotion process, we gain predictability and control over our deployments. Argo CD ensures that whatβs in Git is always whatβs running in our clusters, while Kargo eliminates human error in multi-stage rollouts.
If youβre tired of overly abstract βhello worldβ DevOps tutorials and want to get your hands dirty with something that feels real, Craftista offers the perfect sandbox. This pipeline reflects how teams operate in production β polyglot services, independent deployments, environment promotion gates, and GitOps as the operational backbone.
Whether you're a DevOps engineer sharpening your skills, or a platform team setting standards for internal development, I hope this tutorial provided the clarity and inspiration to build your own commit-to-production pipeline β step by step, with confidence.
Further Reading & Resources



