Skip to content

Commit 1a0bb56

Browse files
TravisEz13anamnavi
andauthored
Automate the deployment. (PowerShell#82)
Co-authored-by: Anam Navied <[email protected]>
1 parent 3a6db47 commit 1a0bb56

5 files changed

Lines changed: 153 additions & 64 deletions

File tree

.vsts-ci/releaseBuild.yml

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,23 @@
1+
parameters:
2+
- name: release
3+
type: string
4+
displayName: |
5+
Use `stable` to release by default.
6+
7+
Use `private` if you want to create a branch on the store to test the package.
8+
This will create a branch under the edge branch automatically that are difficult, but not impossible to find.
9+
10+
`candidate`, `beta`, and `edge` are public but we don't have any existing meaning for these channels.
11+
values:
12+
- private
13+
- stable
14+
- candidate
15+
- beta
16+
- edge
17+
default: stable
18+
19+
trigger: none
20+
121
resources:
222
repositories:
323
- repository: self
@@ -17,19 +37,20 @@ stages:
1737
- template: ./templates/releaseBuildAndPushStage.yml
1838
parameters:
1939
channel: stable
40+
release: ${{ parameters.release }}
2041

2142
- template: ./templates/releaseBuildAndPushStage.yml
2243
parameters:
2344
channel: preview
45+
release: ${{ parameters.release }}
2446

2547
- template: ./templates/releaseBuildAndPushStage.yml
2648
parameters:
2749
channel: lts
50+
release: ${{ parameters.release }}
2851

29-
- stage: virus_scan
30-
dependsOn:
31-
- build_and_push_stable
32-
- build_and_push_preview
33-
- build_and_push_lts
52+
- stage: Compliance
53+
dependsOn: []
54+
displayName: Compliance
3455
jobs:
3556
- template: ./templates/virusScanPhase.yml

.vsts-ci/templates/Approval.yml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
parameters:
2+
- name: displayName
3+
type: string
4+
- name: instructions
5+
type: string
6+
- name: jobName
7+
type: string
8+
- name: timeoutInMinutes
9+
type: number
10+
# 2 days
11+
default: 2880
12+
- name: onTimeout
13+
type: string
14+
default: 'reject'
15+
values:
16+
- resume
17+
- reject
18+
19+
jobs:
20+
- job: ${{ parameters.jobName }}
21+
displayName: ${{ parameters.displayName }}
22+
pool: server
23+
timeoutInMinutes: 4320 # job times out in 3 days
24+
steps:
25+
- task: ManualValidation@0
26+
displayName: ${{ parameters.displayName }}
27+
timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
28+
inputs:
29+
instructions: ${{ parameters.instructions }}
30+
onTimeout: ${{ parameters.onTimeout }}

.vsts-ci/templates/pushPhase.yml

Lines changed: 82 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,73 @@
11
parameters:
2-
vmImage: 'ubuntu-18.04'
3-
parentJobs: []
4-
matrix:
2+
- name: vmImage
3+
default: 'ubuntu-18.04'
4+
- name: channel
5+
type: string
6+
- name: release
7+
default: 'private'
58

69
jobs:
7-
- job: push
8-
strategy:
9-
matrix:
10-
${{ parameters.matrix }}
10+
- job: scan
11+
displayName: Scan ${{ parameters.channel }}
12+
1113
pool:
12-
vmImage: ${{ parameters.vmImage }}
14+
vmImage: ubuntu-latest
1315

1416
variables:
15-
ReleaseTag: edge/default
17+
- name: channel
18+
value: ${{ parameters.channel }}
19+
20+
steps:
21+
- checkout: self
22+
path: $(repoFolder)
23+
- checkout: ComplianceRepo
24+
25+
- task: DownloadBuildArtifacts@0
26+
displayName: 'Download Build Artifacts'
27+
inputs:
28+
downloadType: specific
29+
itemPattern: '$(channel)/**/*.snap'
30+
31+
- template: EsrpScan.yml@ComplianceRepo
32+
parameters:
33+
scanPath: $(System.ArtifactsDirectory)
34+
pattern: |
35+
**/*.snap
36+
scanningService: 'pwshEsrpScanning'
37+
38+
- template: ./Approval.yml
39+
parameters:
40+
displayName: 'Approve ${{ parameters.channel }}-${{ parameters.release }} upload'
41+
instructions: 'Approving this will trigger the upload of the snap as "${{ parameters.channel }}-${{ parameters.release }}"'
42+
jobName: 'push_approval'
1643

44+
- job: push
1745
dependsOn:
18-
${{ parameters.parentJobs }}
46+
- push_approval
47+
- scan
48+
49+
displayName: Push to ${{ parameters.release }}
50+
51+
pool:
52+
vmImage: ${{ parameters.vmImage }}
53+
54+
variables:
55+
- name: ReleaseTag
56+
value: edge/default
57+
- group: SnapLogin
58+
- name: channel
59+
value: ${{ parameters.channel }}
1960

2061
steps:
62+
- checkout: self
63+
2164
- task: DownloadBuildArtifacts@0
2265
displayName: 'Download Build Artifacts'
2366
inputs:
2467
downloadType: specific
2568
itemPattern: '$(channel)/**/*.snap'
2669

27-
- powershell: |
70+
- pwsh: |
2871
$snaps = Get-ChildItem $(System.ArtifactsDirectory)/*.snap -recurse -File
2972
if($snaps.Count -gt 1)
3073
{
@@ -33,52 +76,54 @@ jobs:
3376
}
3477
displayName: Verify that only one snap was downloaded
3578
36-
- powershell: |
79+
- pwsh: |
3780
[string]$Branch=$env:BUILD_SOURCEBRANCH
3881
$branchOnly = $Branch -replace '^refs/heads/';
3982
$branchOnly = $branchOnly -replace '[_\-]'
4083
41-
if($branchOnly -eq 'master' -or $branchOnly -like '*dailytest*')
42-
{
43-
Write-verbose "release branch:" -verbose
44-
$generatedBranch = (get-date).ToString('yyyyMMddHH')
45-
$releaseTag = "edge/$generatedBranch"
46-
$vstsCommandString = "vso[task.setvariable variable=ReleaseTag]$releaseTag"
47-
Write-Verbose -Message "setting ReleaseTag to $releaseTag" -Verbose
48-
Write-Host -Object "##$vstsCommandString"
49-
}
50-
else
51-
{
52-
Write-verbose "non-release branch" -verbose
53-
# Branch is named <previewname>
54-
$releaseTag = "edge/$branchOnly"
55-
$vstsCommandString = "vso[task.setvariable variable=ReleaseTag]$releaseTag"
56-
Write-Verbose -Message "setting ReleaseTag to $releaseTag" -Verbose
57-
Write-Host -Object "##$vstsCommandString"
84+
if('${{ parameters.release }}' -eq 'private') {
85+
if($branchOnly -eq 'master' -or $branchOnly -like '*dailytest*')
86+
{
87+
Write-verbose "release branch:" $branchOnly -verbose
88+
$generatedBranch = (get-date).ToString('yyyyMMddHH')
89+
$releaseTag = "edge/$generatedBranch"
90+
}
91+
else
92+
{
93+
Write-verbose "non-release branch" -verbose
94+
# Branch is named <previewname>
95+
$releaseTag = "edge/$branchOnly"
96+
}
97+
} else {
98+
$releaseTag = "${{ parameters.release }}"
5899
}
100+
101+
$vstsCommandString = "vso[task.setvariable variable=ReleaseTag]$releaseTag"
102+
Write-Verbose -Message "setting ReleaseTag to $releaseTag" -Verbose
103+
Write-Host -Object "##$vstsCommandString"
59104
displayName: Set ReleaseTag Variable
60105
61-
- powershell: |
106+
- pwsh: |
62107
sudo chown root:root /
63108
displayName: 'Make sure root owns root'
64109
condition: succeeded()
65110
66-
- powershell: |
111+
- pwsh: |
67112
$channel = (Get-Content ./snapcraftConfig.json | ConvertFrom-Json).channel
68113
Write-Verbose -Verbose -Message "using Channel $channel"
69114
sudo snap install snapcraft --classic "--channel=$channel"
70115
condition: succeeded()
71116
displayName: 'Install snapcraft'
72117
73-
- powershell: |
118+
- pwsh: |
74119
$loginFile='./snapstore.login'
75120
76121
'$(SNAPLOGIN)' | base64 --decode --ignore-garbage > $loginFile
77122
snapcraft login --with $loginFile
78123
rm $loginFile
79124
displayName: 'snapcraft login'
80125
81-
- powershell: |
126+
- pwsh: |
82127
$track = 'latest'
83128
if('$(channel)' -eq 'lts')
84129
{
@@ -89,15 +134,15 @@ jobs:
89134
90135
foreach($snap in $snaps)
91136
{
92-
snapcraft push --release "$track/$(ReleaseTag)" $snap
137+
Write-Verbose -Verbose -Message "Uploading $snap to $track/$(ReleaseTag)"
138+
snapcraft upload --release "$track/$(ReleaseTag)" $snap
93139
}
94-
displayName: 'snapcraft push'
140+
displayName: 'snapcraft upload'
95141
96-
- powershell: |
142+
- pwsh: |
97143
snapcraft logout
98144
displayName: 'snapcraft logout'
99145
condition: always()
100146
101147
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
102148
displayName: 'Component Detection'
103-
Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,26 @@
11
parameters:
2-
channel: ''
3-
vmImage: ubuntu-18.04
2+
- name: channel
3+
default: ''
4+
- name: vmImage
5+
default: ubuntu-18.04
6+
- name: release
7+
default: 'private'
48

59
stages:
6-
- stage: build_and_push_${{ parameters.channel }}
7-
displayName: Build and Push - ${{ parameters.channel }}
10+
- stage: build_${{ parameters.channel }}
11+
displayName: Build - ${{ parameters.channel }}
812
dependsOn: []
913
jobs:
1014
- template: ./releaseBuildPhase.yml
1115
parameters:
1216
channel: ${{ parameters.channel }}
1317
vmImage: ${{ parameters.vmImage }}
1418

19+
- stage: Push_${{ parameters.channel }}
20+
displayName: Push - ${{ parameters.channel }} to ${{ parameters.release }}
21+
dependsOn: build_${{ parameters.channel }}
22+
jobs:
1523
- template: ./pushPhase.yml
1624
parameters:
17-
matrix:
18-
${{ parameters.channel }}:
19-
channel: ${{ parameters.channel }}
20-
parentJobs: build
25+
channel: ${{ parameters.channel }}
26+
release: ${{ parameters.release }}

.vsts-ci/templates/virusScanPhase.yml

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
jobs:
22
- job: compliance
33
pool:
4-
name: 'PowerShell1ES'
4+
name: '1ES'
55

66
displayName: Compliance
77

@@ -16,19 +16,6 @@ jobs:
1616
path: $(repoFolder)
1717
- checkout: ComplianceRepo
1818

19-
- task: DownloadBuildArtifacts@0
20-
displayName: 'Download Build Artifacts'
21-
inputs:
22-
downloadType: specific
23-
downloadPath: '$(System.ArtifactsDirectory)'
24-
25-
- template: EsrpScan.yml@ComplianceRepo
26-
parameters:
27-
scanPath: $(System.ArtifactsDirectory)
28-
pattern: |
29-
**\*
30-
scanningService: 'pwshEsrpScanning'
31-
3219
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
3320
displayName: 'Component Detection'
3421

0 commit comments

Comments
 (0)