Skip to content

Commit 0dccf41

Browse files
authored
ci: provision environments dynamically (#116)
* ci: provision environments dynamically * ci: post gh comment for manual validation * ci: move gh comment task out of server pool * ci: fix gh comment task
1 parent 213ab54 commit 0dccf41

File tree

4 files changed

+168
-21
lines changed

4 files changed

+168
-21
lines changed

azure-pipelines-pull-request.yml

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,18 @@
11
name: $(GITVERSION_FullSemVer)
2+
23
trigger: none
4+
35
pr:
46
- master
7+
58
pool:
69
vmImage: 'windows-latest'
10+
711
stages:
8-
- stage: BuildAndTest
9-
displayName: Build and test
10-
jobs:
11-
- template: templates/include-build-and-test-steps.yml
12+
- template: templates/build-and-test-stages.yml
13+
parameters:
14+
environmentIdentifier: $(Build.BuildId)
15+
environmentDisplayName: SpecFlow Bindings - pr
16+
environmentDomainName: sfb-pr
17+
buildUrl: https://dev.azure.com/capgeminiuk/GitHub%20Support/_build/results?buildId=$(Build.BuildId)
18+
repositoryName: $(Build.Repository.Name)

azure-pipelines.yml

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,27 @@
11
name: $(GITVERSION_FullSemVer)
2+
23
trigger:
34
batch: true
45
branches:
56
include:
67
- master
8+
79
pr: none
10+
811
pool:
9-
vmImage: 'windows-latest'
10-
variables:
11-
solution: '**/*.sln'
12-
buildPlatform: 'Any CPU'
13-
buildConfiguration: 'Release'
14-
GitVersion.SemVer: ''
12+
vmImage: windows-latest
1513
stages:
16-
- stage: BuildAndTest
17-
displayName: Build and test
18-
jobs:
19-
- template: templates/include-build-and-test-steps.yml
14+
- template: templates/build-and-test-stages.yml
15+
parameters:
16+
environmentIdentifier: $(Build.BuildId)
17+
environmentDisplayName: SpecFlow Bindings - CI
18+
environmentDomainName: sfb-ci
19+
buildUrl: https://dev.azure.com/capgeminiuk/GitHub%20Support/_build/results?buildId=$(Build.BuildId)
20+
repositoryName: $(Build.Repository.Name)
21+
2022
- stage: Publish
2123
displayName: Publish
24+
dependsOn: ManualValidation
2225
jobs:
2326
- job: PublishJob
2427
displayName: Publish

templates/include-build-and-test-steps.yml renamed to templates/build-and-test-job.yml

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,21 @@
1+
parameters:
2+
- name: environmentUrl
3+
displayName: Environment URL
4+
type: string
5+
- name: environmentName
6+
displayName: environmentName
7+
type: string
8+
- name: username
9+
displayName: Username
10+
type: string
11+
- name: password
12+
displayName: Password
13+
type: string
14+
115
jobs:
2-
- job: BuildJob
16+
# build and tests executed in single job in order to allow SonarCloud to capture coverage
17+
- job: BuildAndTestJob
18+
displayName: Build and Test
319
variables:
420
- name: GitVersion.SemVer
521
value: ''
@@ -10,8 +26,6 @@ jobs:
1026
value: 'Any CPU'
1127
- name: buildConfiguration
1228
value: 'Release'
13-
# build and tests executed in single job in order to allow SonarCloud to capture coverage
14-
displayName: Build and Test
1529
timeoutInMinutes: 180
1630
steps:
1731
- task: gitversion/setup@0
@@ -66,7 +80,7 @@ jobs:
6680
- task: PublishTestResults@2
6781
displayName: Publish unit test results
6882
inputs:
69-
testResultsFiles: driver\test_results\reports\TESTS-*.xml
83+
testResultsFiles: driver\test_results\reports\TESTS-*.xml
7084
- task: PublishCodeCoverageResults@1
7185
displayName: Publish unit code coverage results
7286
inputs:
@@ -90,11 +104,11 @@ jobs:
90104
POWERAPPS_SPECFLOW_BINDINGS_TEST_TENANTID: $(Application User Tenant ID)
91105
POWERAPPS_SPECFLOW_BINDINGS_TEST_CLIENTID: $(Application User Client ID)
92106
POWERAPPS_SPECFLOW_BINDINGS_TEST_CLIENTSECRET: $(Application User Client Secret)
93-
POWERAPPS_SPECFLOW_BINDINGS_TEST_ADMIN_USERNAME: $(User ADO Integration Username)
94-
POWERAPPS_SPECFLOW_BINDINGS_TEST_ADMIN_PASSWORD: $(User ADO Integration Password)
107+
POWERAPPS_SPECFLOW_BINDINGS_TEST_ADMIN_USERNAME: ${{ parameters.username }}
108+
POWERAPPS_SPECFLOW_BINDINGS_TEST_ADMIN_PASSWORD: ${{ parameters.password }}
95109
POWERAPPS_SPECFLOW_BINDINGS_TEST_ADMIN_USERNAME2: $(Extra Admin User Username)
96110
POWERAPPS_SPECFLOW_BINDINGS_TEST_ADMIN_PASSWORD2: $(Extra Admin User Password)
97-
POWERAPPS_SPECFLOW_BINDINGS_TEST_URL: $(URL)
111+
POWERAPPS_SPECFLOW_BINDINGS_TEST_URL: ${{ parameters.environmentUrl }}
98112
- task: SonarCloudAnalyze@1
99113
displayName: Analyse with SonarCloud
100114
- task: SonarCloudPublish@1

templates/build-and-test-stages.yml

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
parameters:
2+
- name: environmentIdentifier
3+
displayName: Environment identifier
4+
type: string
5+
- name: environmentDisplayName
6+
displayName: Environment display name
7+
type: string
8+
- name: environmentDomainName
9+
displayName: Environment domain name
10+
type: string
11+
- name: buildUrl
12+
displayName: Build URL
13+
type: string
14+
- name: repositoryName
15+
displayName: Repository Name
16+
type: string
17+
18+
stages:
19+
- stage: ProvisionEnvironment
20+
displayName: Provision environment
21+
variables:
22+
- name: Environment.Identifier
23+
value: ${{ parameters.environmentIdentifier }}
24+
- name: Environment.DisplayName
25+
value: ${{ parameters.environmentDisplayName }} $(Environment.Identifier)
26+
- name: TestEnvironment.DomainName
27+
value: ${{ parameters.environmentDomainName }}-$(Environment.Identifier)
28+
- group: Dataverse users
29+
jobs:
30+
- job: ProvisionEnvironmentJob
31+
displayName: Provision environment
32+
steps:
33+
- task: PowerPlatformToolInstaller@0
34+
displayName: Install Power Platform Build Tools
35+
inputs:
36+
DefaultVersion: true
37+
- task: PowerPlatformCreateEnvironment@0
38+
displayName: Create environment
39+
inputs:
40+
authenticationType: PowerPlatformSPN
41+
PowerPlatformSPN: Dataverse (placeholder)
42+
DisplayName: $(Environment.DisplayName)
43+
EnvironmentSku: Sandbox
44+
LocationName: unitedkingdom
45+
LanguageName: 1033
46+
CurrencyName: GBP
47+
DomainName: $(TestEnvironment.DomainName)
48+
- powershell: |
49+
echo "##vso[task.setvariable variable=EnvironmentUrl;isOutput=true]$env:BUILDTOOLS_ENVIRONMENTURL"
50+
echo "##vso[task.setvariable variable=EnvironmentName;isOutput=true]$env:BUILDTOOLS_ENVIRONMENTID"
51+
displayName: Set output variables
52+
name: SetEnvironmentOutputVariables
53+
- stage: BuildAndTest
54+
displayName: Build and Test
55+
dependsOn: ProvisionEnvironment
56+
variables:
57+
- name: BuildTools.EnvironmentUrl
58+
value: $[ stageDependencies.ProvisionEnvironment.ProvisionEnvironmentJob.outputs['SetEnvironmentOutputVariables.EnvironmentUrl'] ]
59+
- name: BuildTools.EnvironmentId
60+
value: $[ stageDependencies.ProvisionEnvironment.ProvisionEnvironmentJob.outputs['SetEnvironmentOutputVariables.EnvironmentName'] ]
61+
- group: Dataverse users
62+
jobs:
63+
- template: build-and-test-job.yml
64+
parameters:
65+
environmentUrl: $(BuildTools.EnvironmentUrl)
66+
environmentName: $(BuildTools.EnvironmentId)
67+
username: $(DataverseUsers.AzureDevOps.Username)
68+
password: $(DataverseUsers.AzureDevOps.Password)
69+
- stage: ManualValidation
70+
displayName: Manual validation
71+
dependsOn:
72+
- ProvisionEnvironment
73+
- BuildAndTest
74+
condition: and(not(canceled()), ne(dependencies.ProvisionEnvironment.outputs['ProvisionEnvironmentJob.SetEnvironmentOutputVariables.EnvironmentUrl'], ''))
75+
variables:
76+
RepositoryName: ${{ parameters.repositoryName }}
77+
BuildUrl: ${{ parameters.buildUrl }}
78+
BuildTools.EnvironmentUrl: $[ stageDependencies.ProvisionEnvironment.ProvisionEnvironmentJob.outputs['SetEnvironmentOutputVariables.EnvironmentUrl'] ]
79+
jobs:
80+
- job: ManualValidationCommentJob
81+
displayName: Manual validation (comment)
82+
steps:
83+
- task: GitHubComment@0
84+
inputs:
85+
gitHubConnection: 'github.com_tdashworth'
86+
repositoryName: '$(RepositoryName)'
87+
comment: |
88+
**Manual validation requested**
89+
Please perform any checks required on $(BuildTools.EnvironmentUrl) then approve $(BuildUrl).
90+
- job: ManualValidationJob
91+
displayName: Manual validation
92+
pool: server
93+
timeoutInMinutes: 8640
94+
steps:
95+
- task: ManualValidation@0
96+
displayName: Wait for manual validation
97+
timeoutInMinutes: 7200
98+
inputs:
99+
onTimeout: resume
100+
instructions: Please perform any checks required on $(BuildTools.EnvironmentUrl).
101+
- stage: DeleteEnvironment
102+
displayName: Delete environment
103+
dependsOn:
104+
- ProvisionEnvironment
105+
- ManualValidation
106+
condition: ne(dependencies.ProvisionEnvironment.outputs['ProvisionEnvironmentJob.SetEnvironmentOutputVariables.EnvironmentUrl'], '')
107+
variables:
108+
BuildTools.EnvironmentUrl: $[ stageDependencies.ProvisionEnvironment.ProvisionEnvironmentJob.outputs['SetEnvironmentOutputVariables.EnvironmentUrl'] ]
109+
jobs:
110+
- job: DeleteEnvironmentJob
111+
displayName: Delete environment
112+
steps:
113+
- checkout: none
114+
- task: PowerPlatformToolInstaller@0
115+
displayName: Install Power Platform Build Tools
116+
inputs:
117+
DefaultVersion: true
118+
- task: PowerPlatformDeleteEnvironment@0
119+
displayName: Delete environment
120+
continueOnError: true
121+
inputs:
122+
authenticationType: PowerPlatformSPN
123+
PowerPlatformSPN: Dataverse (placeholder)

0 commit comments

Comments
 (0)