Skip to content

Commit

Permalink
feat: add support for tag-based trigger
Browse files Browse the repository at this point in the history
  • Loading branch information
angela-tran committed Aug 31, 2023
1 parent fc5abc2 commit 10127a2
Show file tree
Hide file tree
Showing 3 changed files with 57 additions and 4 deletions.
36 changes: 32 additions & 4 deletions terraform/pipeline/azure-pipelines.yml
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,15 @@ trigger:
- dev
- test
- prod
tags:
include:
- 20??.??.?*-rc?*
- 20??.??.?*
# only run for changes to Terraform files
paths:
include:
- terraform/*

pool:
vmImage: ubuntu-latest

Expand All @@ -22,6 +27,8 @@ stages:
value: $[variables['System.PullRequest.SourceBranch']]
- name: INDIVIDUAL_SOURCE
value: $[variables['Build.SourceBranchName']]
- name: IS_TAG
value: $[startsWith(variables['Build.SourceBranch'], 'refs/tags/')]
- name: TARGET
value: $[variables['System.PullRequest.TargetBranch']]
steps:
Expand All @@ -30,6 +37,9 @@ stages:
- bash: |
WORKSPACE=$(python terraform/pipeline/workspace.py)
echo "##vso[task.setvariable variable=workspace;isOutput=true]$WORKSPACE"
TAG_TYPE=$(python terraform/pipeline/tag.py)
echo "##vso[task.setvariable variable=tag_type;isOutput=true]$TAG_TYPE"
name: setvars
displayName: Determine deployment environment
env:
Expand Down Expand Up @@ -82,34 +92,52 @@ stages:
- publish: "$(Build.ArtifactStagingDirectory)"
displayName: "Publish tfplan for use in TerraformApply"
artifact: savedPlan
condition: in(variables['Build.SourceBranchName'], 'dev', 'test', 'prod')
condition: |
or(
in(variables['Build.SourceBranchName'], 'dev', 'test', 'prod'),
or(
eq(variables['setvars.tag_type'], 'test'),
eq(variables['setvars.tag_type'], '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')
- name: tag_type
value: $[ dependencies.TerraformPlan.outputs['Plan.setvars.tag_type'] ]
# only run on dev, test, or prod branches OR if it's a tag for test or prod
condition: |
or(
in(variables['Build.SourceBranchName'], 'dev', 'test', 'prod'),
or(
eq(variables['tag_type'], 'test'),
eq(variables['tag_type'], 'prod')
)
)
jobs:
- deployment: Apply
condition: succeeded()
environment: Approval
variables:
- name: workspace
value: $[ stageDependencies.TerraformPlan.Plan.outputs['setvars.workspace'] ]
- name: tag_type
value: $[ stageDependencies.TerraformPlan.Plan.outputs['setvars.tag_type'] ]
strategy:
runOnce:
deploy:
steps:
- checkout: self
# https://github.com/microsoft/azure-pipelines-terraform/tree/main/Tasks/TerraformTask/TerraformTaskV3#readme
- download: current
displayName: "Download plan file published from TerraformPlan"
artifact: savedPlan
- task: TerraformInstaller@0
displayName: Install Terraform
inputs:
terraformVersion: 1.3.1
# https://github.com/microsoft/azure-pipelines-terraform/tree/main/Tasks/TerraformTask/TerraformTaskV3#readme
- task: TerraformTaskV3@3
displayName: Terraform init
inputs:
Expand Down
19 changes: 19 additions & 0 deletions terraform/pipeline/tag.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import os
import re

REASON = os.environ["REASON"]
# use variable corresponding to tag triggers
SOURCE = os.environ["INDIVIDUAL_SOURCE"]
IS_TAG = os.environ["IS_TAG"].lower() == "true"

if REASON == "IndividualCI" and IS_TAG:
if re.fullmatch(r"20\d\d.\d\d.\d+-rc\d+", SOURCE):
tag_type = "test"
elif re.fullmatch(r"20\d\d.\d\d.\d+", SOURCE):
tag_type = "prod"
else:
tag_type = None
else:
tag_type = None

print(tag_type)
6 changes: 6 additions & 0 deletions terraform/pipeline/workspace.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
import os
import re
import sys

REASON = os.environ["REASON"]
# the name of the variable that Azure Pipelines uses for the source branch depends on the type of run, so need to check both
SOURCE = os.environ.get("OTHER_SOURCE") or os.environ["INDIVIDUAL_SOURCE"]
TARGET = os.environ["TARGET"]
IS_TAG = os.environ["IS_TAG"].lower() == "true"

# the branches that correspond to environments
ENV_BRANCHES = ["dev", "test", "prod"]
Expand All @@ -15,6 +17,10 @@
elif REASON in ["IndividualCI", "Manual"] and SOURCE in ENV_BRANCHES:
# it's being run on one of the environment branches, so use that
environment = SOURCE
elif REASON in ["IndividualCI"] and IS_TAG and re.fullmatch(r"20\d\d.\d\d.\d+-rc\d+", SOURCE):
environment = "test"
elif REASON in ["IndividualCI"] and IS_TAG and re.fullmatch(r"20\d\d.\d\d.\d+", SOURCE):
environment = "prod"
else:
# default to running against dev
environment = "dev"
Expand Down

0 comments on commit 10127a2

Please sign in to comment.