End-to-End Developer Workflow
Connect GitHub Actions CI/CD, Azure Container Registry, Container Apps, and Application Insights into a complete developer inner loop from commit to observable production.
End-to-End Developer Workflow is a free Cloud & IT Cert Prep lesson on CoddyKit — lesson 4 of 4. You can read the complete lesson below for free — then practise it hands-on in the browser with a built-in code editor and a 24/7 AI tutor. It is part of the Cloud & IT Cert Prep learning path, one of 4 lessons in the course, and your progress syncs across the web and the CoddyKit app.
The Modern Azure Developer Loop
A modern Azure developer workflow connects source control, CI/CD, container infrastructure, and observability into a seamless inner loop from code commit to observable production. The key components are: GitHub (source), GitHub Actions (build and deploy pipeline), Azure Container Registry (image store), Azure Container Apps (runtime), and Application Insights (observability). Each change moves automatically from developer laptop to production within minutes, with quality gates at every step.
Step 1: Source Control and Branching Strategy
Organise your code in a GitHub repository using a trunk-based development or GitFlow branching strategy. For most microservices, trunk-based development (short-lived feature branches merged to main daily) reduces integration conflicts and keeps the pipeline simple. Use branch protection rules on main to require pull request reviews and passing CI checks before merging. A CODEOWNERS file ensures changes to critical services require approval from the relevant team's senior engineers.
# Example .github/CODEOWNERS
# Require payments-team review for any changes under /src/payments/
/src/payments/ @payments-team
/infrastructure/ @platform-teamStep 2: CI with GitHub Actions
The CI pipeline runs on every pull request. A typical workflow: checkout code → restore dependencies → run unit tests → run integration tests → build Docker image → push to Azure Container Registry. The image is tagged with the git commit SHA for traceability. Use OIDC-based authentication from GitHub Actions to Azure (via federated identity) to avoid storing Azure service principal secrets in GitHub — a managed identity equivalent for CI pipelines.
# .github/workflows/ci.yml (abbreviated)
name: CI
on: [pull_request]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Login to ACR
uses: azure/docker-login@v1
with:
login-server: myacr.azurecr.io
username: ${{ secrets.AZURE_CLIENT_ID }}
password: ${{ secrets.AZURE_CLIENT_SECRET }}
- name: Build and push image
run: |
docker build -t myacr.azurecr.io/myapi:${{ github.sha }} .
docker push myacr.azurecr.io/myapi:${{ github.sha }}Step 3: CD to Staging
After the CI pipeline succeeds on a merge to main, the CD pipeline automatically deploys to the staging environment. The pipeline updates the Container App's image tag to the newly built SHA, waits for the new revision to become healthy, and runs smoke tests against the staging URL. Smoke tests verify that critical API endpoints return the expected responses. If smoke tests fail, the pipeline rolls back by switching ingress traffic back to the previous revision without any manual intervention.
# CD stage: update Container App to new image
- name: Deploy to staging
uses: azure/cli@v2
with:
azcliversion: latest
inlineScript: |
az containerapp update \
--name myapi-staging \
--resource-group myRG \
--image myacr.azurecr.io/myapi:${{ github.sha }}
- name: Run smoke tests
run: |
STAGING_URL=$(az containerapp show --name myapi-staging \
--resource-group myRG \
--query 'properties.configuration.ingress.fqdn' -o tsv)
curl -f https://$STAGING_URL/health || exit 1Step 4: Approval Gate for Production
After staging validation, the CD pipeline pauses at an approval gate. GitHub Actions Environment protections allow you to configure required reviewers for the production environment. The pipeline sends a Slack notification to the on-call engineer who reviews the staging test results, the diff, and any open incidents before approving. Only on approval does the pipeline proceed to deploy the same image SHA to production. This human-in-the-loop step is critical for high-traffic or regulated services.
# In GitHub: create 'production' environment with required reviewers
# .github/workflows/cd.yml (abbreviated)
jobs:
deploy-production:
environment:
name: production
url: https://myapi.contoso.com
needs: deploy-staging
steps:
- name: Deploy to production
uses: azure/cli@v2
with:
inlineScript: |
az containerapp update \
--name myapi \
--resource-group myRG \
--image myacr.azurecr.io/myapi:${{ github.sha }}Step 5: Production Observability
Once deployed to production, Application Insights provides real-time visibility. The App Insights SDK (or auto-instrumentation for supported runtimes) tracks: request rates, failure rates, and latency (the three golden signals), dependency calls (to databases, Service Bus, other APIs), and exceptions with full stack traces. The Application Map visualises how services call each other and highlights which dependencies contribute the most to failures or latency.
# Python: Add Application Insights SDK
from opencensus.ext.azure.log_exporter import AzureLogHandler
from opencensus.ext.azure.trace_exporter import AzureExporter
from opencensus.trace.samplers import ProbabilitySampler
from opencensus.trace.tracer import Tracer
tracer = Tracer(
exporter=AzureExporter(connection_string='InstrumentationKey=<key>'),
sampler=ProbabilitySampler(1.0)
)Connecting Deployments to Traces
Use Application Insights Annotations to mark deployment events in your metrics charts. When a release annotation is created (via the GitHub Actions azure/appinsights-annotation action), it appears as a vertical line on all App Insights metric charts. This makes it immediately obvious whether a latency spike or error rate increase correlates with a recent deployment, significantly reducing mean-time-to-diagnose (MTTD) during incidents.
# Create a release annotation in Application Insights
- name: Annotate release in App Insights
uses: azure/appinsights-annotation@v1
with:
appInsightsResourceName: myAppInsights
resourceGroupName: myRG
releaseName: '${{ github.run_id }}-${{ github.sha }}'Automated Rollback on Error Rate Spike
For the most resilient pipelines, implement automated rollback. After production deployment, the pipeline waits 10 minutes and queries Application Insights for the error rate. If the error rate exceeds a configurable threshold (e.g., >5%), the pipeline automatically rolls back by updating the Container App's ingress traffic to point 100% to the previous revision. This progressive delivery pattern reduces the blast radius of a bad deployment and allows teams to deploy with confidence even for complex or sensitive changes.
# Query App Insights error rate via REST (abbreviated)
QUERY='requests | where timestamp > ago(10m) | summarize failed = countif(success == false), total = count() | extend errorRate = round(100.0 * failed / total, 2)'
RESULT=$(az monitor app-insights query \
--apps myAppInsights \
--resource-group myRG \
--analytics-query "$QUERY" \
--query 'tables[0].rows[0][2]' -o tsv)
if [ $(echo '$RESULT > 5' | bc -l) -eq 1 ]; then
echo 'Error rate $RESULT% - rolling back!'
az containerapp ingress traffic set --name myapi --resource-group myRG --revision-weight stable=100
fiDeveloper Productivity: Local Dev with Emulators
Developers should be able to run and test the full stack locally without connecting to production Azure resources. Use Azure Storage Emulator (Azurite) for local blob and queue storage, Cosmos DB Emulator for local database testing, and Service Bus Emulator for local messaging. The AZURE_ENVIRONMENT=local environment variable can switch DefaultAzureCredential to use connection strings pointing at emulators, while the same code uses managed identity in Azure. Docker Compose orchestrates all local dependencies in a single docker compose up.
# docker-compose.yml for local development
services:
azurite:
image: mcr.microsoft.com/azure-storage/azurite
ports:
- '10000:10000'
- '10001:10001'
cosmos-emulator:
image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator
ports:
- '8081:8081'Security in the Developer Workflow
Integrate security into every stage of the developer workflow: Dependabot scans for vulnerable dependencies in pull requests; GitHub Advanced Security (code scanning with CodeQL) detects vulnerabilities like SQL injection and hardcoded secrets; Microsoft Defender for DevOps integrates with GitHub to surface Azure security recommendations alongside code changes; and ACR Defender vulnerability scanning checks container images for OS and application-layer CVEs after every push. Security findings appear as pull request comments, so they are addressed before merging.
Putting It All Together
The complete developer workflow is a continuous feedback loop: a developer commits code, CI builds and tests the container image, the image is pushed to ACR with the commit SHA as tag, CD deploys to staging and runs smoke tests, a human approves the production deployment, the pipeline deploys to production and creates a release annotation, and Application Insights monitors error rates with automated rollback if thresholds are breached. Infrastructure as code (Bicep or Terraform) in the same repository ensures the pipeline, Container App, and monitoring configuration are all version-controlled alongside application code.
Quick Check
Test your understanding of Microsoft Azure Fundamentals (AZ-900) concepts from this lesson.
Lesson Recap
In this lesson you learned: the end-to-end developer workflow connects GitHub source control, GitHub Actions CI/CD, Azure Container Registry, Container Apps, and Application Insights, release annotations correlate deployments with metric changes for faster incident diagnosis, and automated rollback based on error rate queries reduces blast radius from bad deployments. Next up we shift to exam preparation with a comprehensive review of cloud concepts and Azure architecture.
Frequently asked questions
Is the “End-to-End Developer Workflow” lesson free?
Yes — the full text of “End-to-End Developer Workflow” is free to read here on the web, and the Cloud & IT Cert Prep course includes 4 lessons in total. To practise it interactively (a built-in code editor and a 24/7 AI tutor) and unlock the rest of the Cloud & IT Cert Prep course, upgrade to CoddyKit PRO.
What will I learn in “End-to-End Developer Workflow”?
Connect GitHub Actions CI/CD, Azure Container Registry, Container Apps, and Application Insights into a complete developer inner loop from commit to observable production. You practise Cloud & IT Cert Prep with hands-on code you run directly in the browser, and a 24/7 AI tutor answers your questions as you work through the lesson.
Do I need any experience to start Cloud & IT Cert Prep?
No prior experience is required. Cloud & IT Cert Prep on CoddyKit is structured for beginners through advanced learners; this is — lesson 4 of 4, so you can start here or from the beginning and move at your own pace.
How long does the “End-to-End Developer Workflow” lesson take?
Most CoddyKit lessons take about 5–10 minutes. Each one is bite-sized and interactive, so you make steady progress and pick up exactly where you left off across the web and the app.
Can I write and run code in this Cloud & IT Cert Prep lesson?
Yes. Every Cloud & IT Cert Prep lesson includes a built-in code editor, so you write and run real code right in your browser and get instant AI feedback — no local setup required.
All lessons in this course
- Managed Identity for Passwordless Auth
- Azure Service Bus for Decoupled Messaging
- Azure Container Apps
- End-to-End Developer Workflow