Table of Contents
Prerequisites
Step 1: Dockerfile
Step 2: Azure Pipelines Configuration
Step 3: Additional Azure CLI Configuration
Best Practices
Troubleshooting
Conclusion
Resources
Dockerizing Other Technology Stacks
Prerequisites
- Azure DevOps account
- Azure Subscription
- Angular project
- Azure CLI installed
- Docker installed
- Azure Container Registry
- Azure Container Apps environment
Step 1: Dockerfile
# Stage 1: Build Angular application
FROM node:16-alpine AS build
WORKDIR /usr/src/app
COPY package.json package-lock.json ./
RUN npm install
COPY . .
RUN npm run build --configuration=production
# Stage 2: Serve with Nginx
FROM nginx:alpine
COPY --from=build /usr/src/app/dist/your-angular-app /usr/share/nginx/html
COPY nginx.conf /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
Step 2: Azure Pipelines Configuration
trigger:
- main
variables:
# Azure Container Registry details
acrName: 'yourcontainerregistry'
imageRepository: 'angular-app'
dockerfilePath: 'Dockerfile'
tag: '$(Build.BuildId)'
# Azure Container Apps details
containerAppName: 'your-container-app-name'
resourceGroup: 'your-resource-group'
stages:
- stage: Build
displayName: Build and Test
jobs:
- job: BuildAndTest
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '16.x'
displayName: 'Install Node.js'
- script: |
npm ci
npm run lint
npm run test -- --watch=false --browsers=ChromeHeadless
displayName: 'npm install, lint, and test'
- task: Docker@2
displayName: 'Build Docker Image'
inputs:
command: build
repository: $(imageRepository)
dockerfile: $(dockerfilePath)
tags:
- $(tag)
- latest
- task: Docker@2
displayName: 'Push to Azure Container Registry'
inputs:
command: push
repository: $(imageRepository)
containerRegistry: $(acrServiceConnection)
tags:
- $(tag)
- latest
- stage: Approval
displayName: Deployment Approval
jobs:
- job: ApprovalJob
pool: server
steps:
- task: ManualValidation@0
inputs:
instructions: 'Please review and approve the deployment'
onTimeout: 'reject'
timeoutInMinutes: 120
- stage: Deploy
displayName: Deploy to Azure Container Apps
dependsOn:
- Build
- Approval
condition: succeeded()
jobs:
- deployment: DeployToContainerApp
pool:
vmImage: 'ubuntu-latest'
environment: 'production'
strategy:
runOnce:
deploy:
steps:
- task: AzureCLI@2
displayName: 'Deploy to Azure Container Apps'
inputs:
azureSubscription: 'Your-Azure-Subscription'
scriptType: 'bash'
scriptLocation: 'inlineScript'
inlineScript: |
# Login to Azure Container Registry
az acr login --name $(acrName)
# Update Container App with new image
az containerapp update \
--name $(containerAppName) \
--resource-group $(resourceGroup) \
--image $(acrName).azurecr.io/$(imageRepository):$(tag)
Step 3: Additional Azure CLI Configuration
Before running the pipeline, set up your Azure Container Apps:
# Create Container Registry
az acr create --resource-group your-resource-group \
--name yourcontainerregistry \
--sku Basic
# Create Container Apps Environment
az containerapp env create \
--name your-container-app-environment \
--resource-group your-resource-group \
--location eastus
# Create Container App
az containerapp create \
--name your-container-app-name \
--resource-group your-resource-group \
--environment your-container-app-environment \
--image yourcontainerregistry.azurecr.io/angular-app:latest \
--target-port 80 \
--ingress external
Best Practices
- Use Azure Key Vault for sensitive configurations
- Implement comprehensive testing before deployment
- Use managed identities for secure access
- Set up proper RBAC for deployment
- Configure health checks in Container Apps
- Use staging slots for zero-downtime deployments
Troubleshooting
- Verify network configurations
- Check container logs in Azure Portal
- Ensure proper IAM roles are assigned
- Validate ACR permissions
- Check Container Apps network settings
Conclusion
This pipeline provides a robust CI/CD workflow for deploying an Angular application to Azure Container Apps with a manual approval stage.
Resources
so in summary, The pipeline includes:
- Build and test stage
- Manual approval stage
- Deployment to Azure Container Apps
- Azure Container Registry integration
Dockerizing Other Technology Stacks
The Dockerfile approach demonstrated for the Angular application can be easily adapted to other popular technology stacks as well
SOCIAL SHARE CARD GENERATOR