Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat: infra pipeline tag trigger #310

Merged
merged 4 commits into from
Aug 31, 2023
Merged
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
95 changes: 75 additions & 20 deletions terraform/pipeline/azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,13 @@ trigger:
paths:
include:
- terraform/*
pool:
vmImage: ubuntu-latest

stages:
- stage: terraform
pool:
vmImage: ubuntu-latest
- stage: TerraformPlan
jobs:
- job: terraform
- job: Plan
variables:
- name: OTHER_SOURCE
value: $[variables['System.PullRequest.SourceBranch']]
Expand All @@ -28,7 +29,8 @@ stages:
# https://learn.microsoft.com/en-us/azure/devops/pipelines/process/set-variables-scripts?view=azure-devops&tabs=bash#about-tasksetvariable
- bash: |
WORKSPACE=$(python terraform/pipeline/workspace.py)
echo "##vso[task.setvariable variable=workspace]$WORKSPACE"
echo "##vso[task.setvariable variable=workspace;isOutput=true]$WORKSPACE"
name: setvars
displayName: Determine deployment environment
env:
REASON: $(Build.Reason)
Expand Down Expand Up @@ -59,7 +61,7 @@ stages:
provider: azurerm
command: custom
customCommand: workspace
commandOptions: select $(workspace)
commandOptions: select $(setvars.workspace)
workingDirectory: "$(System.DefaultWorkingDirectory)/terraform"
# service connection
environmentServiceNameAzureRM: deployer
Expand All @@ -70,21 +72,74 @@ stages:
command: plan
# wait for lock to be released, in case being used by another pipeline run
# https://discuss.hashicorp.com/t/terraform-plan-wait-for-lock-to-be-released/6870/2
commandOptions: -input=false -lock-timeout=5m
commandOptions: -input=false -lock-timeout=5m -out=$(Build.ArtifactStagingDirectory)/tfplan
workingDirectory: "$(System.DefaultWorkingDirectory)/terraform"
# service connection
environmentServiceNameAzureRM: deployer
# the plan is done as part of the apply (below), so don't bother doing it twice
condition: notIn(variables['Build.SourceBranchName'], 'dev', 'test', 'prod')
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

We no longer need a condition on the terraform plan step because it should always run.

- task: TerraformTaskV3@3
displayName: Terraform apply
inputs:
provider: azurerm
command: apply
# (ditto the lock comment above)
commandOptions: -input=false -lock-timeout=5m
workingDirectory: "$(System.DefaultWorkingDirectory)/terraform"
# service connection
environmentServiceNameAzureRM: deployer
# only run on certain branches
# need to publish the tfplan to used by next stage if it's going to run
- publish: "$(Build.ArtifactStagingDirectory)"
displayName: "Publish tfplan for use in TerraformApply"
artifact: savedPlan
condition: in(variables['Build.SourceBranchName'], 'dev', 'test', 'prod')
- stage: TerraformApply
dependsOn: TerraformPlan
variables:
- name: workspace
value: $[ dependencies.TerraformPlan.outputs['Plan.setvars.workspace'] ]
# only run on dev, test, or prod branches
condition: in(variables['Build.SourceBranchName'], 'dev', 'test', 'prod')
jobs:
- deployment: Apply
condition: succeeded()
environment: Approval
variables:
- name: workspace
value: $[ stageDependencies.TerraformPlan.Plan.outputs['setvars.workspace'] ]
strategy:
runOnce:
deploy:
steps:
- checkout: self
- download: current
displayName: "Download plan file published from TerraformPlan"
artifact: savedPlan
- task: TerraformInstaller@0
displayName: Install Terraform
inputs:
terraformVersion: 1.3.1
thekaveman marked this conversation as resolved.
Show resolved Hide resolved
# https://github.com/microsoft/azure-pipelines-terraform/tree/main/Tasks/TerraformTask/TerraformTaskV3#readme
- task: TerraformTaskV3@3
displayName: Terraform init
inputs:
provider: azurerm
command: init
workingDirectory: "$(System.DefaultWorkingDirectory)/terraform"
# https://developer.hashicorp.com/terraform/tutorials/automation/automate-terraform#automated-terraform-cli-workflow
commandOptions: -input=false
# service connection
backendServiceArm: deployer
# needs to match main.tf
backendAzureRmResourceGroupName: courtesy-cards-eligibility-terraform
backendAzureRmStorageAccountName: courtesycardsterraform
thekaveman marked this conversation as resolved.
Show resolved Hide resolved
backendAzureRmContainerName: tfstate
backendAzureRmKey: terraform.tfstate
- task: TerraformTaskV3@3
displayName: Select environment
inputs:
provider: azurerm
command: custom
customCommand: workspace
commandOptions: select $(workspace)
workingDirectory: "$(System.DefaultWorkingDirectory)/terraform"
# service connection
environmentServiceNameAzureRM: deployer
- task: TerraformTaskV3@3
displayName: Terraform apply
inputs:
provider: azurerm
command: apply
# (ditto the lock comment above)
commandOptions: -input=false -lock-timeout=5m $(Pipeline.Workspace)/savedPlan/tfplan
workingDirectory: "$(System.DefaultWorkingDirectory)/terraform"
# service connection
environmentServiceNameAzureRM: deployer