Skip to content

srujantata/internal-developer-platform

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Internal Developer Platform (IDP)

CI

A Backstage-based Internal Developer Platform that gives developers a single portal to discover services, browse docs, scaffold new projects, and monitor CI/CD — without filing DevOps tickets. Golden-path templates turn a 2-week setup into a 5-minute prompt.


The Problem This Solves

Without an IDP:

  • Developer needs a new microservice → tickets to Platform, Security, and Ops teams → 2 weeks
  • No single place to find which team owns a service or what version is deployed
  • Docs live in 4 different wikis, none of them current

With an IDP:

Developer types: idp scaffold --template microservice --name payment-api

Result in 30 seconds:
  ✓  GitHub repo created (srujantata/payment-api)
  ✓  CI/CD pipeline wired (Jenkins → SonarQube → Harbor → ArgoCD)
  ✓  Kubernetes manifests generated (Deployment + Service + HPA + NetworkPolicy)
  ✓  Grafana dashboard pre-provisioned
  ✓  Service registered in Software Catalog
  ✓  TechDocs page created

Architecture

Developer Browser
        │
        ▼
  Backstage Portal (React SPA)
  ├── Software Catalog   ──► Component YAML in each repo
  ├── TechDocs           ──► mkdocs-material, auto-built from /docs
  ├── Templates          ──► Scaffolder: generates repos + registers components
  └── Plugins
      ├── Jenkins         ──► latest pipeline status per component
      ├── ArgoCD          ──► sync status + health
      ├── SonarQube       ──► quality gate + coverage metrics
      ├── Harbor          ──► image tags + vulnerability summary
      └── AWS Cost        ──► per-namespace spend from Cost Explorer API
              │
              ▼
  Backend (Node.js)
  ├── catalog-backend     ──► reads catalog-info.yaml from all repos
  ├── scaffolder-backend  ──► runs Cookiecutter / GitHub API calls
  └── techdocs-backend    ──► builds + serves MkDocs sites

Software Catalog

Every service registers itself by committing a catalog-info.yaml:

# catalog-info.yaml (in each service repo)
apiVersion: backstage.io/v1alpha1
kind: Component
metadata:
  name: payment-api
  description: Handles payment processing for checkout flow
  annotations:
    jenkins.io/job-full-name: "payment-api/main"
    argocd/app-name: payment-api
    sonarqube.org/project-key: payment-api
    github.com/project-slug: srujantata/payment-api
  tags:
    - java
    - payments
    - tier-1
  links:
  - url: https://grafana.internal/d/payment-api
    title: Grafana Dashboard
spec:
  type: service
  lifecycle: production
  owner: group:platform-team
  system: checkout
  dependsOn:
  - component:postgres-db
  - component:kafka
  providesApis:
  - payment-api-v1

Golden-Path Template

The scaffolder template creates everything a new microservice needs:

# templates/microservice/template.yaml
apiVersion: scaffolder.backstage.io/v1beta3
kind: Template
metadata:
  name: microservice
  title: "New Microservice"
  description: "Scaffold a production-ready microservice with CI/CD, k8s manifests, and observability"
  tags: [java, go, python, recommended]
spec:
  owner: group:platform-team
  type: service
  parameters:
  - title: Service Details
    required: [name, language, owner]
    properties:
      name:
        title: Service Name
        type: string
        pattern: '^[a-z][a-z0-9-]*$'
      language:
        title: Language
        type: string
        enum: [java, go, python]
      owner:
        title: Owner Team
        type: string
        ui:field: OwnerPicker

  steps:
  - id: fetch-template
    name: Fetch template
    action: fetch:template
    input:
      url: ./skeleton
      values:
        name: ${{ parameters.name }}
        language: ${{ parameters.language }}
        owner: ${{ parameters.owner }}

  - id: create-github-repo
    name: Create GitHub repo
    action: publish:github
    input:
      repoUrl: github.com?repo=${{ parameters.name }}&owner=srujantata
      defaultBranch: main
      repoVisibility: private

  - id: register-catalog
    name: Register in catalog
    action: catalog:register
    input:
      repoContentsUrl: ${{ steps['create-github-repo'].output.repoContentsUrl }}
      catalogInfoPath: /catalog-info.yaml

Plugins

Jenkins Plugin

Shows latest build status inline with each catalog component:

// packages/app/src/components/catalog/EntityPage.tsx
import { EntityJenkinsContent } from '@backstage-community/plugin-jenkins';

const serviceEntityPage = (
  <EntityLayout>
    <EntityLayout.Route path="/ci-cd" title="CI/CD">
      <EntityJenkinsContent />
    </EntityLayout.Route>
  </EntityLayout>
);

ArgoCD Plugin

import {
  EntityArgoCDOverviewCard,
  EntityArgoCDHistoryCard,
} from '@roadiehq/backstage-plugin-argo-cd';

// Shows sync status, health, and deployment history
<EntityArgoCDOverviewCard />
<EntityArgoCDHistoryCard />

AWS Cost Plugin

// Shows per-namespace AWS spend, helping teams own their cloud costs
import { EntityCostInsightsCard } from '@backstage-community/plugin-cost-insights';
<EntityCostInsightsCard />

TechDocs

Every service gets auto-generated documentation from its /docs directory:

# mkdocs.yml (in each service repo)
site_name: Payment API
docs_dir: docs/
plugins:
  - techdocs-core

nav:
  - Home: index.md
  - API Reference: api.md
  - Runbooks: runbooks/
  - Architecture: architecture.md

When a PR merges, the TechDocs pipeline builds and publishes the site automatically. Docs live next to code — they stay current because they break CI when they don't.


Install

# Create Backstage app
npx @backstage/create-app@latest --name internal-developer-platform

cd internal-developer-platform

# Install community plugins
yarn --cwd packages/backend add \
  @backstage-community/plugin-jenkins-backend \
  @roadiehq/backstage-plugin-argo-cd-backend

yarn --cwd packages/app add \
  @backstage-community/plugin-jenkins \
  @roadiehq/backstage-plugin-argo-cd

# Configure (app-config.yaml)
cat >> app-config.yaml << 'EOF'
jenkins:
  baseUrl: http://jenkins.jenkins.svc.cluster.local:8080
  username: ${JENKINS_USERNAME}
  apiKey: ${JENKINS_API_KEY}

argocd:
  baseUrl: https://argocd.your-cluster.internal
  token: ${ARGOCD_TOKEN}
EOF

# Run locally
yarn dev

# Deploy to Kubernetes
helm repo add backstage https://backstage.github.io/charts
helm install backstage backstage/backstage \
  -n backstage --create-namespace \
  -f helm/values.yaml

Who Uses This

  • Developers — scaffold new services, discover existing ones, check CI/CD without leaving the portal
  • Tech leads — see quality gates, coverage, and ownership for every component in the org
  • Platform team — enforce golden-path standards via templates instead of tribal knowledge
  • Finance/management — per-team AWS cost attribution from the Cost plugin

Skills Demonstrated

  • Backstage IDP deployment and configuration
  • Software Catalog with multi-team component ownership
  • Scaffolder golden-path templates (GitHub repo + CI/CD + k8s + catalog registration in one command)
  • TechDocs auto-generated living documentation
  • Plugin integration: Jenkins, ArgoCD, SonarQube, Harbor, AWS Cost
  • Developer self-service platform reducing time-to-new-service from weeks to minutes

Releases

No releases published

Packages

 
 
 

Contributors