Platform Engineering 2.0 — How Internal Developer Platforms Are Replacing Traditional CI/CD Pipelines
Remember when CI/CD pipelines were the answer to everything? We built Jenkins jobs, configured Argo workflows, and thought we had developer productivity figured out. But here’s the thing - most teams are drowning in pipeline sprawl and manual governance overhead.
Platform Engineering changes this. Instead of managing dozens of separate tools, Internal Developer Platforms (IDPs) give developers a single place to deploy, monitor, and manage their applications. It’s not just about building faster - it’s about building better.
Why Traditional CI/CD Pipelines Fall Short
Most teams I work with have the same problems. They’ve got Jenkins for builds, Argo for deployments, Spinnaker for complex workflows, and maybe some custom scripts holding it all together. Each tool does one thing well, but nobody talks to each other.
Developers spend more time figuring out which pipeline to use than actually coding. They need to know Jenkins syntax, Argo manifests, and whatever custom tooling your team built. It’s exhausting.
Security teams hate this setup too. Every pipeline has different approval processes. Some require manual sign-offs, others don’t. Compliance becomes a nightmare when you can’t track what’s deployed where.
The real problem isn’t the tools themselves - it’s that we’re asking developers to be infrastructure experts. They shouldn’t need to know Kubernetes internals to deploy a simple web app.
What Platform Engineering Brings to the Table
Platform Engineering flips this around. Instead of giving developers more tools, you give them fewer, better ones.
Unified Golden Paths
An IDP provides what we call “golden paths” - standardized ways to do common tasks. Want to deploy a new microservice? There’s one way to do it. Need a database? Same process every time. Developers don’t have to think about the underlying complexity.
This isn’t about limiting creativity. It’s about removing the boring stuff so developers can focus on business logic.
Environment-as-a-Service
Traditional CI/CD treats environments as static things you configure once. IDPs make environments dynamic. Need a staging environment for a feature branch? Click a button. Done with it? It gets torn down automatically.
This works because the platform handles all the infrastructure provisioning. Developers just say what they need, and the platform figures out how to build it.
Observability Built In
Every application deployed through an IDP gets monitoring, logging, and alerting automatically. No more “it works on my machine” because the platform ensures consistent observability across all environments.
Policy Enforcement
Security and compliance rules get baked into the platform itself. Developers can’t accidentally deploy to production without proper approvals. Resource limits are enforced automatically. Secrets management happens behind the scenes.
Building an IDP Using Modern Tools
Here’s how you can build a practical IDP using tools that actually work together:
The Stack
- Backstage: Developer portal and service catalog
- Crossplane: Infrastructure provisioning
- ArgoCD: GitOps deployments
- Terraform: Infrastructure as code
- Kubernetes: The control plane
The key is making Kubernetes the self-service control plane. Developers interact with Backstage, which talks to Crossplane for infrastructure and ArgoCD for deployments.
GitOps Principles Extended
GitOps isn’t just for application deployments anymore. With Crossplane, your infrastructure definitions live in Git too. Want a new database? Create a Crossplane resource in your repo. The platform provisions it automatically.
This means your entire stack - applications and infrastructure - follows the same GitOps workflow. Everything is versioned, auditable, and reversible.
Example: Implementing a Minimal Internal Developer Platform
Let me show you how this works in practice. We’ll build a simple IDP that can provision a development environment and deploy a sample application.
Backstage Developer Portal
First, we need a way for developers to request resources. Backstage provides a clean interface for this:
# backstage-catalog-info.yaml
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
name: sample-service
description: A sample microservice
spec:
type: service
lifecycle: production
owner: platform-team
system: backend-services
providesApis:
- sample-api
consumesApis:
- user-service-api
Infrastructure Provisioning with Crossplane
When a developer requests a new environment, Crossplane provisions the infrastructure:
# crossplane-environment.yaml
apiVersion: database.aws.crossplane.io/v1alpha1
kind: RDSInstance
metadata:
name: sample-service-db
namespace: sample-service
spec:
forProvider:
region: us-west-2
dbInstanceClass: db.t3.micro
engine: postgres
engineVersion: "13.7"
masterUsername: admin
allocatedStorage: 20
skipFinalSnapshot: true
writeConnectionSecretsToRef:
name: sample-service-db-credentials
namespace: sample-service
Terraform for Complex Infrastructure
For more complex setups, we use Terraform Cloud with Crossplane:
# terraform/environment.tf
resource "aws_eks_cluster" "dev_cluster" {
name = "dev-${var.service_name}"
role_arn = aws_iam_role.cluster.arn
version = "1.28"
vpc_config {
subnet_ids = var.subnet_ids
}
depends_on = [
aws_iam_role_policy_attachment.cluster_AmazonEKSClusterPolicy,
]
}
resource "aws_eks_node_group" "dev_nodes" {
cluster_name = aws_eks_cluster.dev_cluster.name
node_group_name = "dev-nodes"
node_role_arn = aws_iam_role.node.arn
subnet_ids = var.subnet_ids
scaling_config {
desired_size = 2
max_size = 4
min_size = 1
}
instance_types = ["t3.medium"]
}
ArgoCD for Application Deployment
Once infrastructure is ready, ArgoCD deploys the application:
# argocd-app.yaml
apiVersion: argoproj.io/v1alpha1
kind: Application
metadata:
name: sample-service
namespace: argocd
spec:
project: default
source:
repoURL: https://github.com/your-org/sample-service
targetRevision: HEAD
path: k8s
destination:
server: https://kubernetes.default.svc
namespace: sample-service
syncPolicy:
automated:
prune: true
selfHeal: true
syncOptions:
- CreateNamespace=true
Metrics and Success Indicators
How do you know if your IDP is working? Here are the metrics that matter:
Lead Time for Changes
This measures how long it takes from code commit to production deployment. Good IDPs get this down to minutes instead of hours or days.
Onboarding Time per Service
How long does it take a new developer to deploy their first service? With a good IDP, this should be under 30 minutes.
Mean Time to Recovery (MTTR)
When things break, how quickly can you fix them? IDPs with built-in observability and automated rollbacks improve MTTR significantly.
Developer Satisfaction
This one’s harder to measure, but it matters. Are developers spending more time coding and less time fighting infrastructure? That’s the real test.
Future Outlook — IDPs Meet AI
The next evolution is already happening. AI is starting to play a bigger role in platform engineering.
AI-Driven Platform Orchestration
Imagine your platform automatically tuning resource allocation based on usage patterns. Or automatically scaling environments based on developer activity. This isn’t science fiction - it’s happening now.
Integration with GenAI Copilots
GitHub Copilot and similar tools are getting smarter about infrastructure. Soon, developers will be able to describe what they want in plain English, and the AI will generate the necessary Crossplane resources and ArgoCD manifests.
The platform becomes the interface between human intent and infrastructure reality.
Getting Started
If you’re thinking about building an IDP, start small. Pick one team and one use case. Build a simple golden path for deploying a basic web service. Once that works, expand gradually.
The tools are there. The patterns are proven. The question isn’t whether you should build an IDP - it’s how quickly you can get started.
Platform Engineering isn’t just the future of DevOps. It’s the present for teams that want to move fast without breaking things. And honestly, that’s what most of us are trying to do anyway.
Want to learn more about building Internal Developer Platforms? Check out the Backstage documentation and Crossplane getting started guide.
Join the Discussion
Have thoughts on this article? Share your insights and engage with the community.