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
Top comments (0)