OpsCanary
azureiacPractitioner

Automate Azure Deployments: Bicep Files with GitHub Actions

5 min read Microsoft LearnJul 26, 2026Reviewed for accuracy
Share
PractitionerHands-on experience recommended

In the fast-paced world of cloud infrastructure, automating deployments is crucial. Using GitHub Actions to deploy Bicep files allows you to define Azure resources declaratively and automate their deployment seamlessly. This integration minimizes manual errors and accelerates your development workflow.

The process begins with a GitHub Actions workflow that triggers on push events to the main branch. You define parameters in your Bicep file, such as storagePrefix (which must be between 3 to 11 characters) and storageSKU (defaulting to 'Standard_LRS'). The workflow uses the azure/arm-deploy@v1 action to deploy the Bicep file to Azure, leveraging your Azure credentials stored securely in GitHub Secrets. This setup not only simplifies the deployment process but also enhances security by keeping sensitive information out of your codebase.

In production, remember to use environment secrets for added security, especially in public repositories. If your environment requires approval, be aware that jobs cannot access secrets until approved. Always use GitHub Secrets instead of passing values directly in workflows to protect sensitive data. This approach ensures that your deployments are both secure and efficient, keeping your infrastructure aligned with your code changes.

Key takeaways

  • Use GitHub Actions to automate Azure deployments with Bicep files.
  • Define parameters like `storagePrefix` and `storageSKU` in your Bicep files for customizable resource creation.
  • Secure your workflows by utilizing GitHub Secrets instead of hardcoding sensitive values.

Why it matters

Automating deployments reduces the risk of human error and speeds up the release cycle, allowing teams to focus on development rather than manual infrastructure management.

Code examples

Bicep
1@minLength(3)
2@maxLength(11)
3param storagePrefix string
4
5@allowed([
6  'Standard_LRS'
7  'Standard_GRS'
8  'Standard_RAGRS'
9  'Standard_ZRS'
10  'Premium_LRS'
11  'Premium_ZRS'
12  'Standard_GZRS'
13  'Standard_RAGZRS'
14])
15param storageSKU string = 'Standard_LRS'
16
17param location string = resourceGroup().location
18
19var uniqueStorageName = '${storagePrefix}${uniqueString(resourceGroup().id)}'
20
21resource stg 'Microsoft.Storage/storageAccounts@2025-06-01' = {
22  name: uniqueStorageName
23  location: location
24  sku: {
25    name: storageSKU
26    kind: 'StorageV2'
27  }
28  properties: {
29    supportsHttpsTrafficOnly: true
30  }
31}
32
33output storageEndpoint object = stg.properties.primaryEndpoints
YAML
1on: [push]
2name: Azure ARM
3permissions:
4  id-token: write
5  contents: read
6jobs:
7  build-and-deploy:
8    runs-on: ubuntu-latest
9    steps:
10
11      # Checkout code
12    - uses: actions/checkout@main
13
14      # Log into Azure
15    - uses: azure/login@v2
16      with:
17        client-id: ${{ secrets.AZURE_CLIENT_ID }}
18        tenant-id: ${{ secrets.AZURE_TENANT_ID }}
19        subscription-id: ${{ secrets.AZURE_SUBSCRIPTION_ID }}
20
21      # Deploy Bicep file
22    - name: deploy
23      uses: azure/arm-deploy@v1
24      with:
25        subscriptionId: ${{ secrets.AZURE_SUBSCRIPTION }}
26        resourceGroupName: ${{ secrets.AZURE_RG }}
27        template: ./main.bicep
28        parameters: 'storagePrefix=mystore storageSKU=Standard_LRS'
29        failOnStdErr: false
CLI
az group create -n exampleRG -l westus

When NOT to use this

The official docs don't call out specific anti-patterns here. Use your judgment based on your scale and requirements.

Want the complete reference?

Read official docs

Test what you just learned

Quiz questions written from this article

Take the quiz →
DigitalOceanSponsor

Simple, affordable cloud — VMs, Kubernetes, and managed databases in minutes. Trusted by 600,000+ developers. Spin up a Droplet in 60 seconds.

Try DigitalOcean →

Get the daily digest

One email. 5 articles. Every morning.

No spam. Unsubscribe anytime.