-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathazure-pipelines.yml
More file actions
179 lines (166 loc) · 6.41 KB
/
Copy pathazure-pipelines.yml
File metadata and controls
179 lines (166 loc) · 6.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
variables:
- group: AzureCredentials
- name: ImageName
readonly: true
value: 'learning-terraform-api'
- name: ImageTag
readonly: true
value: $(Build.BuildId)
- name: FirewallRuleName
readonly: true
value: 'pipeline-allow'
- name: ResourceGroup
readonly: true
value: 'LearningTerraform'
pool:
vmImage: 'ubuntu-latest'
trigger:
branches:
include:
- master
stages:
- stage: CreateDockerImage
displayName: Create Docker image
jobs:
- job: ApplyTerraform
displayName: Apply core Terraform changes
steps:
- script: terraform init
workingDirectory: Terraform/Core
displayName: Terraform - Initialize
env:
ARM_CLIENT_ID: '$(Azure.ClientId)'
ARM_CLIENT_SECRET: '$(Azure.ClientSecret)'
ARM_SUBSCRIPTION_ID: '$(Azure.SubscriptionId)'
ARM_TENANT_ID: '$(Azure.TenantId)'
- script: |
terraform plan -out=tfplan
terraform apply "tfplan"
workingDirectory: Terraform/Core
displayName: Terraform - Plan & Apply
env:
ARM_CLIENT_ID: '$(Azure.ClientId)'
ARM_CLIENT_SECRET: '$(Azure.ClientSecret)'
ARM_SUBSCRIPTION_ID: '$(Azure.SubscriptionId)'
ARM_TENANT_ID: '$(Azure.TenantId)'
- job: BuildAndPushDockerImage
displayName: Build & push Docker image
dependsOn: ApplyTerraform
condition: succeeded('ApplyTerraform')
steps:
- task: Docker@2
displayName: Login to Azure Container Registry
inputs:
command: login
containerRegistry: AzureServiceConnection
- task: Docker@2
displayName: Build Docker image
inputs:
command: build
buildContext: App/Src
Dockerfile: App/Src/LearningTerraform.Api/Dockerfile
repository: $(ImageName)
tags: $(ImageTag)
- task: Docker@2
displayName: Push Docker image
inputs:
command: push
containerRegistry: AzureServiceConnection
repository: $(ImageName)
tags: $(ImageTag)
- task: Docker@2
displayName: Log out of Azure Container Registry
inputs:
command: logout
- stage: DeployTest
displayName: Deploy to Test
dependsOn: CreateDockerImage
condition: succeeded('CreateDockerImage')
jobs:
- job: ApplyTerraformPredeploy
displayName: Apply pre-deployment Terraform changes
steps:
- script: terraform init
workingDirectory: Terraform/Predeploy
displayName: 'Terraform - Initialize'
env:
ARM_CLIENT_ID: '$(Azure.ClientId)'
ARM_CLIENT_SECRET: '$(Azure.ClientSecret)'
ARM_SUBSCRIPTION_ID: '$(Azure.SubscriptionId)'
ARM_TENANT_ID: '$(Azure.TenantId)'
- script: |
terraform plan -out=tfplan_test -var 'image_tag=$(ImageTag)' -var 'image_registry_username=$(Azure.ClientId)' -var 'image_registry_password=$(Azure.ClientSecret)' -var 'db_server_admin_login=$(Azure.DbServer.AdminLogin)' -var 'db_server_admin_password=$(Azure.DbServer.AdminPassword)'
terraform apply "tfplan_test"
sql_server_fqdn=`terraform output -json sql_server_fqdn | jq -r .`
echo "##vso[task.setvariable variable=SqlServerFqdn;isOutput=true]$sql_server_fqdn"
workingDirectory: Terraform/Predeploy
displayName: Terraform - Plan & Apply
name: TerraformPlanAndApply
env:
ARM_CLIENT_ID: '$(Azure.ClientId)'
ARM_CLIENT_SECRET: '$(Azure.ClientSecret)'
ARM_SUBSCRIPTION_ID: '$(Azure.SubscriptionId)'
ARM_TENANT_ID: '$(Azure.TenantId)'
- job: MigrateDatabase
displayName: Migrate SQL database
dependsOn: ApplyTerraformPredeploy
condition: succeeded('ApplyTerraformPredeploy')
variables:
SqlServerFqdn: $[ dependencies.ApplyTerraformPredeploy.outputs['TerraformPlanAndApply.SqlServerFqdn'] ]
steps:
- task: AzureCLI@2
displayName: Allow agent through firewall
name: createAgentFirewallRule
inputs:
azureSubscription: AzureResourceManagerServiceConnection
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
ip=$(curl ifconfig.me)
az sql server firewall-rule create --end-ip-address $ip --start-ip-address $ip --name $(FirewallRuleName) --resource-group $(ResourceGroup) --server 'learning-terraform-db'
- script: dotnet tool install --global --version 5.0.1 dotnet-ef
displayName: Install EF tools
- template: Pipeline/Templates/Steps/wait-for-port.yml
parameters:
host: $(SqlServerFqdn)
port: 1433
- script: |
export PATH=$PATH:$HOME/.dotnet/tools
. ~/.bashrc
dotnet ef database update -s ../LearningTerraform.Api
workingDirectory: App/Src/LearningTerraform.DataAccess.MsSql
displayName: Apply EF migrations
env:
ConnectionStrings__Default: 'Server=tcp:$(SqlServerFqdn),1433;Initial Catalog=learning-terraform-db;Persist Security Info=False;User ID=$(Azure.DbServer.AdminLogin);Password=$(Azure.DbServer.AdminPassword);MultipleActiveResultSets=False;Encrypt=True;TrustServerCertificate=False;Connection Timeout=30;'
- task: AzureCLI@2
displayName: Remove agent firewall rule
condition: succeeded('createAgentFirewallRule')
inputs:
azureSubscription: AzureResourceManagerServiceConnection
scriptType: bash
scriptLocation: inlineScript
inlineScript: |
az sql server firewall-rule delete --resource-group $(ResourceGroup) --server 'learning-terraform-db' --name $(FirewallRuleName)
- job: ApplyTerraform
displayName: Apply Terraform changes
dependsOn: MigrateDatabase
condition: succeeded('MigrateDatabase')
steps:
- script: terraform init
workingDirectory: Terraform/Deploy
displayName: 'Terraform - Initialize'
env:
ARM_CLIENT_ID: '$(Azure.ClientId)'
ARM_CLIENT_SECRET: '$(Azure.ClientSecret)'
ARM_SUBSCRIPTION_ID: '$(Azure.SubscriptionId)'
ARM_TENANT_ID: '$(Azure.TenantId)'
- script: |
terraform plan -out=tfplan_test -var 'image_tag=$(ImageTag)' -var 'image_registry_username=$(Azure.ClientId)' -var 'image_registry_password=$(Azure.ClientSecret)' -var 'db_connection_string='
terraform apply "tfplan_test"
workingDirectory: Terraform/Deploy
displayName: Terraform - Plan & Apply
env:
ARM_CLIENT_ID: '$(Azure.ClientId)'
ARM_CLIENT_SECRET: '$(Azure.ClientSecret)'
ARM_SUBSCRIPTION_ID: '$(Azure.SubscriptionId)'
ARM_TENANT_ID: '$(Azure.TenantId)'