Azure DevOps service starter built as a public portfolio demo, demonstrating CI/CD, Docker, testing, logging, health checks, and Azure-ready infrastructure.
High-level CI/CD and deployment flow for the service starter.
src/config: runtime configurationsrc/routes: HTTP endpointssrc/middleware: logging and error handlingtests: endpoint testsinfra: Azure (Bicep)docs: architecture notes
See docs/ARCHITECTURE.md for details.
Beyond CI/CD and deployment, this repository is documented as something that can actually be operated and supported. It demonstrates:
- Reproducible deployment — immutable, SHA-tagged container images and Bicep infrastructure-as-code.
- Operational documentation — a runbook, access-control model, and onboarding/offboarding checklists.
- Health checks & monitoring thinking —
/healthand/readyendpoints with structured stdout logging ready for centralized log collection. - Incident response — a realistic support flow from "user reports an outage" through triage, log review, deployment check, escalation, and documentation.
- Access control & security baseline — a simple role model and practical least-privilege / secrets-hygiene expectations.
This makes the repo relevant to IT Support, System Operations, Azure, CI/CD, technical documentation, and service reliability — not just application delivery. It is a reusable service template with serious operational documentation, not a full enterprise platform.
- Operations Runbook — health checks, restart/redeploy, log review, triage, rollback, escalation
- Access Control — Owner/Admin, Developer, Support, Viewer role model
- Onboarding & Offboarding — access grant/removal and handover checklists
- Security Baseline — secrets, least privilege, dependency and image hygiene
- Architecture — app structure and operational view
- Incident Simulation — worked support/incident walkthrough
- Operational Changelog — example record of deploys, incidents, and access changes
GET /→ service metadata (name, environment, version)GET /health→ liveness (uptime, timestamp)GET /ready→ readinessGET /api/incidents/demo→ simulated incident payload
CI/CD is disabled by default. Enable it by updating the GitHub Actions triggers and providing the required secrets.
When run manually:
npm cinpm testnpm run buildnpm run lintdocker build- Push image to GHCR:
ghcr.io/${{ github.repository }}:${{ github.sha }} - Optional
latesttag
Uses GITHUB_TOKEN. Azure deploy is optional.
npm install
cp .env.example .env
npm run devRuns on http://localhost:3000.
./scripts/init-template.sh my-service-nameUpdates common identifiers. Review changes after running.
docker build -t azure-devops-service-starter .
docker run -p 3000:3000 --env-file .env azure-devops-service-starterdocker compose up --buildRuns with basic health check and restart policy for local testing.
npm test
npm run build
npm run lintinfra/main.bicep provides a minimal Container Apps setup:
- Log Analytics
- Container Apps environment
- Container App
Example:
az deployment group create \
--resource-group my-rg \
--template-file infra/main.bicep \
--parameters appName=my-service containerImage=ghcr.io/my-org/my-service:latest- Azure Container Apps: deploy the built image
- Azure App Service: container-based deployment
- Extend IaC: expand Bicep or switch to Terraform
- GHCR uses
GITHUB_TOKEN - Azure uses
AZURE_CREDENTIALS,AZURE_RESOURCE_GROUP,AZURE_CONTAINER_APP_NAME - Store secrets in GitHub Secrets or Azure Key Vault
- Do not commit credentials
- CI/CD pipeline (build → test → package → publish)
- Containerization and reproducible builds
- Basic Azure setup with Bicep
- Service structure with health checks and logging
This starter focuses on the delivery pipeline and service structure.
It intentionally excludes:
- database integration
- authentication
- domain-specific logic
The goal is to provide a clean base that can be extended for different services without unnecessary pre-existing complexity.
- TypeScript Node.js service with a clear structure
- Health and readiness endpoints (
/health,/ready) - Logging and centralized error handling
- Jest tests
- Docker for local and cloud runs
- GitHub Actions CI/CD (template, disabled by default)
- Docker image publishing to GHCR
- Minimal Azure Container Apps example using Bicep
- Simple starter/template setup for reuse
