Skip to content

EES-5896 Azure DevOps pipeline for Search infrastructure deployment #5628

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

Merged
merged 1 commit into from
Feb 26, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
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
1 change: 1 addition & 0 deletions infrastructure/infrastructure-pipeline.yml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ trigger:
exclude:
- README.md
- infrastructure/templates/public-api/*
- infrastructure/templates/search/*
pr: none

pool:
Expand Down
4 changes: 4 additions & 0 deletions infrastructure/templates/search/abbreviations.bicep
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
// Originally sourced from https://github.com/Azure-Samples/todo-csharp-sql/blob/main/infra/abbreviations.json.
@export()
var abbreviations = {
}
5 changes: 5 additions & 0 deletions infrastructure/templates/search/bicepconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"experimentalFeaturesEnabled": {
"userDefinedTypes": true
}
}
83 changes: 83 additions & 0 deletions infrastructure/templates/search/ci/azure-pipelines.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
trigger: none

parameters:
- name: deployAlerts
displayName: Do the Azure Monitor alerts need creating or updating?
type: string
values:
- Yes
- No
default: No
- name: deploySearchService
displayName: Does the Search Service need creating or updating?
type: string
values:
- Yes
- No
default: No
- name: forceDeployToEnvironment
displayName: Set to either dev, test or preprod to force a deploy to that environment from the chosen branch.
type: string
values:
- none
- dev
- test
- preprod
default: none

resources:
pipelines:
- pipeline: MainBuild
source: Explore Education Statistics
trigger:
branches:
- dev
- test
- master

variables:
- group: Search Infrastructure - Common
- name: forceDeployToEnvironment
value: ${{parameters.forceDeployToEnvironment}}
- name: isDev
value: $[or(eq(variables['forceDeployToEnvironment'], 'dev'), eq(variables['Build.SourceBranch'], 'refs/heads/dev'))]
- name: isTest
value: $[or(eq(variables['forceDeployToEnvironment'], 'test'), eq(variables['Build.SourceBranch'], 'refs/heads/test'))]
- name: isPreProd
value: $[or(eq(variables['forceDeployToEnvironment'], 'preprod'), eq(variables['Build.SourceBranch'], 'refs/heads/master'))]
- name: isMaster
value: $[eq(variables['Build.SourceBranch'], 'refs/heads/master')]
- name: vmImageName
value: ubuntu-latest
- name: deployAlerts
value: ${{ iif(eq(parameters.deployAlerts, 'Yes'), true, false) }}
- name: deploySearchService
value: ${{ iif(eq(parameters.deploySearchService, 'Yes'), true, false) }}

pool:
vmImage: $(vmImageName)

stages:
- template: stages/deploy.yml
parameters:
stageName: DeployDev
condition: eq(variables.isDev, true)
environment: Dev
serviceConnection: $(serviceConnectionDev)
bicepParamFile: dev

- template: stages/deploy.yml
parameters:
stageName: DeployTest
condition: eq(variables.isTest, true)
environment: Test
serviceConnection: $(serviceConnectionTest)
bicepParamFile: test

- template: stages/deploy.yml
parameters:
stageName: DeployPreProd
condition: eq(variables.isPreProd, true)
environment: Pre-Prod
serviceConnection: $(serviceConnectionPreProd)
bicepParamFile: preprod
46 changes: 46 additions & 0 deletions infrastructure/templates/search/ci/jobs/deploy-infrastructure.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
parameters:
- name: serviceConnection
type: string
- name: environment
type: string
- name: bicepParamFile
type: string

jobs:
- deployment: DeploySearchInfrastructure
displayName: Deploy search infrastructure
environment: ${{ parameters.environment }}
variables:
templateDirectory: $(Build.SourcesDirectory)/infrastructure/templates/search
templateFile: $(templateDirectory)/main.bicep
paramDirectory: $(templateDirectory)/parameters
paramFile: $(paramDirectory)/main-${{ parameters.bicepParamFile }}.bicepparam
strategy:
runOnce:
deploy:
steps:
- checkout: self

- task: AzureCLI@2
displayName: Install Bicep
inputs:
azureSubscription: ${{ parameters.serviceConnection }}
scriptType: bash
scriptLocation: inlineScript
inlineScript: az bicep install

- template: ../tasks/deploy-bicep.yml
parameters:
displayName: Validate Bicep template
action: validate
serviceConnection: ${{ parameters.serviceConnection }}
parameterFile: $(paramFile)
deploySearchService: false

- template: ../tasks/deploy-bicep.yml
parameters:
displayName: Deploy Bicep template
action: create
serviceConnection: ${{ parameters.serviceConnection }}
parameterFile: $(paramFile)
deploySearchService: $(deploySearchService)
46 changes: 46 additions & 0 deletions infrastructure/templates/search/ci/stages/deploy.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
parameters:
- name: stageName
type: string
- name: environment
type: string
- name: serviceConnection
type: string
- name: bicepParamFile
type: string
values:
- dev
- test
- preprod
- prod
- name: condition
type: string
- name: dependsOn
type: object
default: []
- name: trigger
type: string
default: automatic
values:
- automatic
- manual

stages:
- stage: ${{ parameters.stageName }}
displayName: Deploy ${{ parameters.environment }}
dependsOn: ${{ parameters.dependsOn }}
trigger: ${{ parameters.trigger }}
# Prevent this stage from running in parallel with the same deploy stage in other
# ongoing runs of this pipeline. Instead, multiple executions of this stage will
# be queued and run sequentially in the order that their pipelines were triggered.
lockBehavior: sequential
condition: ${{ parameters.condition }}
variables:
- group: Search Infrastructure - ${{ parameters.environment }}
- name: infraDeployName
value: SearchInfrastructure$(Build.BuildNumber)
jobs:
- template: ../jobs/deploy-infrastructure.yml
parameters:
serviceConnection: ${{ parameters.serviceConnection }}
environment: ${{ parameters.environment }}
bicepParamFile: ${{ parameters.bicepParamFile }}
36 changes: 36 additions & 0 deletions infrastructure/templates/search/ci/tasks/deploy-bicep.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
parameters:
- name: action
type: string
default: create
values:
- create
- validate
- name: displayName
type: string
- name: serviceConnection
type: string
- name: parameterFile
type: string
- name: deploySearchService
type: string

steps:
- task: AzureCLI@2
displayName: ${{ parameters.displayName }}
inputs:
azureSubscription: ${{ parameters.serviceConnection }}
scriptType: bash
scriptLocation: inlineScript
addSpnToEnvironment: true
inlineScript: |
set -e

az deployment group ${{ parameters.action }} \
--name $(infraDeployName) \
--resource-group $(resourceGroupName) \
--template-file $(templateFile) \
--parameters ${{ parameters.parameterFile }} \
--parameters \
subscription='$(subscription)' \
resourceTags='$(resourceTags)' \
deploySearchService=${{ parameters.deploySearchService }}
34 changes: 34 additions & 0 deletions infrastructure/templates/search/main.bicep
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
import { abbreviations } from 'abbreviations.bicep'

@description('Environment : Subscription name e.g. s101d01. Used as a prefix for created resources.')
param subscription string = ''

@description('Environment : Specifies the location in which the Azure resources should be deployed.')
param location string = resourceGroup().location

@description('Tagging : Environment name e.g. Development. Used for tagging resources created by this infrastructure pipeline.')
param environmentName string

@description('Tagging : Used for tagging resources created by this infrastructure pipeline.')
param resourceTags {
CostCentre: string
Department: string
Solution: string
ServiceOwner: string
CreatedBy: string
DeploymentRepoUrl: string
}?

@description('Tagging : Date Provisioned. Used for tagging resources created by this infrastructure pipeline.')
param dateProvisioned string = utcNow('u')

@description('Do Azure Monitor alerts need creating or updating?')
param deployAlerts bool = false

@description('Does the Search Service need creating or updating?')
param deploySearchService bool = false

var tagValues = union(resourceTags ?? {}, {
Environment: environmentName
DateProvisioned: dateProvisioned
})
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
using '../main.bicep'

// Environment Params
param environmentName = 'Development'
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
using '../main.bicep'

// Environment Params
param environmentName = 'Pre-Production'
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
using '../main.bicep'

// Environment Params
param environmentName = 'Production'
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
using '../main.bicep'

// Environment Params
param environmentName = 'Test'
7 changes: 7 additions & 0 deletions infrastructure/templates/search/types.bicep
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
@export()
type ResourceNames = {
existingResources: {
}
search: {
}
}