Skip to content

Commit 192d257

Browse files
authored
Rework AZDO yaml to build and publish helper and library (#29)
***NO_CI***
1 parent 9dd0c43 commit 192d257

File tree

1 file changed

+241
-25
lines changed

1 file changed

+241
-25
lines changed

azure-pipelines.yml

+241-25
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ resources:
2929
name: nanoframework/nf-tools
3030
endpoint: nanoframework
3131

32-
pool:
33-
vmImage: 'windows-latest'
32+
# pool:
33+
# vmImage: 'windows-latest'
3434

3535
variables:
3636
- group: sign-client-credentials
@@ -45,26 +45,242 @@ variables:
4545
- name: nugetPackageName
4646
value: 'nanoFramework.System.Runtime.Serialization'
4747

48-
steps:
49-
50-
# step from template @ nf-tools repo
51-
# all build, update and publish steps
52-
- template: azure-pipelines-templates/class-lib-build.yml@templates
53-
parameters:
54-
sonarCloudProject: 'nanoframework_System.Runtime.Serialization'
55-
runUnitTests: true
56-
unitTestRunsettings: '$(System.DefaultWorkingDirectory)\nano.runsettings'
57-
58-
# run Unit Tests for helper class lib
59-
- template: azure-pipelines-templates/run-unit-tests.yml@templates
60-
parameters:
61-
skipInstall: true
62-
unitTestRunsettings: '$(System.DefaultWorkingDirectory)\helper.runsettings'
63-
64-
# step from template @ nf-tools repo
65-
# report error
66-
- template: azure-pipelines-templates/discord-webhook-task.yml@templates
67-
parameters:
68-
status: 'failure'
69-
webhookUrl: '$(DiscordWebhook)'
70-
message: ''
48+
stages:
49+
- stage: BuildPrep
50+
displayName: 'Build preparations'
51+
jobs:
52+
- job: RunPreChecks
53+
displayName: 'Running prep checks'
54+
55+
pool:
56+
vmImage: 'ubuntu-latest'
57+
58+
steps:
59+
- checkout: self
60+
fetchDepth: 1
61+
62+
- task: PowerShell@2
63+
displayName: Check changes
64+
name: CheckChanges
65+
inputs:
66+
targetType: 'inline'
67+
script: |
68+
git config --global user.email "[email protected]"
69+
git config --global user.name "nfbot"
70+
71+
$auth = "basic $([System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes(":$(GitHubToken)")))"
72+
73+
if($env:Build_Reason -eq "Manual")
74+
{
75+
# this is a manual build, no need to check anything
76+
Write-host "##[command] Manual build"
77+
}
78+
else
79+
{
80+
if($env:System_PullRequest_PullRequestNumber -ne $null)
81+
{
82+
# get files changed in PR, if this is a PR
83+
$commit = Invoke-RestMethod -Uri "https://api.github.com/repos/$env:BUILD_REPOSITORY_NAME/pulls/$env:System_PullRequest_PullRequestNumber/files" -Header @{"Authorization"="$auth"} -ContentType "application/json" -Method GET
84+
85+
# filter removed files
86+
$files = $commit.where{$_.status -ne 'removed'}
87+
}
88+
else
89+
{
90+
# get files changed in the commit, if this is NOT a PR
91+
$commit = Invoke-RestMethod -Uri "https://api.github.com/repos/$env:BUILD_REPOSITORY_NAME/commits/$(Build.SourceVersion)" -Header @{"Authorization"="$auth"} -ContentType "application/json" -Method GET
92+
93+
# filter removed files
94+
$files = $commit.files.where{$_.status -ne 'removed'}
95+
}
96+
97+
# get file names only
98+
$files = $files | % {$_.filename}
99+
100+
Write-host "##[group] Files changed:"
101+
$files | % { Write-host $_ }
102+
Write-host "##[endgroup]"
103+
104+
# set default values
105+
echo "##vso[task.setvariable variable=BUILD_LIBRARY;isOutput=true]false"
106+
echo "##vso[task.setvariable variable=BUILD_HELPER;isOutput=true]false"
107+
108+
if(
109+
(($files.where{$_.Contains('/')}).Count -eq 0) -Or
110+
(($files.where{$_.StartsWith('Serialization.Shared')}).Count -gt 0) -Or
111+
(($files.where{$_.StartsWith('Tests')}).Count -gt 0)
112+
)
113+
{
114+
# files at:
115+
# - repo root
116+
# - tests
117+
# - shared location
118+
119+
echo "##vso[task.setvariable variable=BUILD_LIBRARY;isOutput=true]true"
120+
echo "##vso[task.setvariable variable=BUILD_HELPER;isOutput=true]true"
121+
122+
Write-host "##[command] Building both solutions"
123+
}
124+
125+
if( ($files.where{$_.Contains('nanoFramework.Serialization.Helper')}).Count -gt 0)
126+
{
127+
# files at nanoFramework.Serialization.Helper folder
128+
echo "##vso[task.setvariable variable=BUILD_HELPER;isOutput=true]true"
129+
130+
Write-host "##[command] Build Helper"
131+
}
132+
133+
if( ($files.where{$_.Contains('nanoFramework.System.Runtime.Serialization')}).Count -gt 0)
134+
{
135+
# files at nanoFramework.System.Runtime.Serialization folder
136+
echo "##vso[task.setvariable variable=BUILD_LIBRARY;isOutput=true]true"
137+
138+
Write-host "##[command] Build Library"
139+
}
140+
}
141+
142+
- stage: BuildLibrary
143+
displayName: 'Build Library'
144+
condition: eq(dependencies.BuildPrep.outputs['RunPreChecks.CheckChanges.BUILD_LIBRARY'], 'true')
145+
dependsOn: BuildPrep
146+
147+
jobs:
148+
- job: BuildLibrary
149+
displayName: 'Building Library'
150+
151+
pool:
152+
vmImage: 'windows-latest'
153+
154+
steps:
155+
156+
# build library
157+
- template: azure-pipelines-templates/class-lib-build.yml@templates
158+
parameters:
159+
sonarCloudProject: 'nanoframework_System.Runtime.Serialization'
160+
runUnitTests: true
161+
unitTestRunsettings: '$(System.DefaultWorkingDirectory)\nano.runsettings'
162+
163+
# report error
164+
- template: azure-pipelines-templates/discord-webhook-task.yml@templates
165+
parameters:
166+
status: 'failure'
167+
webhookUrl: '$(DiscordWebhook)'
168+
message: ''
169+
170+
- stage: BuildHelper
171+
displayName: 'Build Helper'
172+
condition: eq(dependencies.BuildPrep.outputs['RunPreChecks.CheckChanges.BUILD_HELPER'], 'true')
173+
dependsOn: BuildPrep
174+
175+
jobs:
176+
- job: BuildHelper
177+
displayName: 'Building Helper'
178+
179+
pool:
180+
vmImage: 'windows-latest'
181+
182+
variables:
183+
- name: helperSolution
184+
value: 'nanoFramework.Serialization.Helper.sln'
185+
186+
steps:
187+
- checkout: self
188+
189+
- task: NuGetCommand@2
190+
displayName: NuGet restore
191+
inputs:
192+
restoreSolution: '$(helperSolution)'
193+
feedsToUse: config
194+
nugetConfigPath: 'NuGet.config'
195+
196+
- script: dotnet build $(helperSolution) -c Release -p:Platform="Any CPU" -p:PublicRelease=true --no-restore /t:build,pack
197+
displayName: Build and pack Helper
198+
condition: succeeded()
199+
200+
# run Unit Tests for helper class lib
201+
- template: azure-pipelines-templates/run-unit-tests.yml@templates
202+
parameters:
203+
skipInstall: false
204+
unitTestRunsettings: '$(System.DefaultWorkingDirectory)\helper.runsettings'
205+
206+
- task: CopyFiles@1
207+
condition: succeeded()
208+
displayName: Collecting deployable artifacts
209+
inputs:
210+
sourceFolder: $(Agent.BuildDirectory)
211+
Contents: |
212+
**\nanoFramework.Serialization.Helper*.nupkg
213+
**\nanoFramework.Serialization.Helper*.snupkg
214+
TargetFolder: '$(Build.ArtifactStagingDirectory)'
215+
flattenFolders: true
216+
217+
- task: PowerShell@2
218+
condition: succeeded()
219+
displayName: Check deployable artifacts
220+
inputs:
221+
targetType: 'inline'
222+
script: |
223+
$artifacts = (Get-ChildItem -Path "$env:Build_ArtifactStagingDirectory" -Recurse)
224+
225+
if ($artifacts.Count -eq 0)
226+
{
227+
Write-Error "No deployable artifacts found!"
228+
Exit 1
229+
}
230+
231+
- task: DotNetCoreCLI@2
232+
displayName: Install Sign Client CLI
233+
condition: succeeded()
234+
inputs:
235+
command: custom
236+
custom: tool
237+
arguments: install --tool-path . sign --version 0.9.1-beta.23530.1
238+
239+
- pwsh: |
240+
.\sign code azure-key-vault `
241+
"**/*.nupkg" `
242+
--base-directory "$(Build.ArtifactStagingDirectory)" `
243+
--description ".NET nanoFramework Serialization helper" `
244+
--description-url "https://github.com/$env:Build_Repository_Name" `
245+
--azure-key-vault-tenant-id "$(SignTenantId)" `
246+
--azure-key-vault-client-id "$(SignClientId)" `
247+
--azure-key-vault-client-secret "$(SignClientSecret)" `
248+
--azure-key-vault-certificate "$(SignKeyVaultCertificate)" `
249+
--azure-key-vault-url "$(SignKeyVaultUrl)" `
250+
--timestamp-url http://timestamp.digicert.com
251+
displayName: Sign packages
252+
continueOnError: true
253+
condition: succeeded()
254+
255+
# publish artifacts (only possible if this is not a PR originated on a fork)
256+
- task: PublishPipelineArtifact@1
257+
condition: succeeded()
258+
displayName: Publish helper artifacts
259+
inputs:
260+
targetPath: '$(Build.ArtifactStagingDirectory)'
261+
artifactName: helper-artifacts
262+
artifactType: pipeline
263+
264+
# push NuGet packages to NuGet
265+
- task: NuGetCommand@2
266+
displayName: Push NuGet packages to NuGet
267+
condition: >-
268+
and(
269+
succeeded(),
270+
eq(variables['System.PullRequest.PullRequestNumber'], '')
271+
)
272+
continueOnError: true
273+
inputs:
274+
command: push
275+
nuGetFeedType: external
276+
packagesToPush: '$(Build.ArtifactStagingDirectory)/*.nupkg'
277+
allowPackageConflicts: true
278+
includeSymbols: true
279+
publishFeedCredentials: 'NuGet-$(System.TeamProject)'
280+
281+
# report error
282+
- template: azure-pipelines-templates/discord-webhook-task.yml@templates
283+
parameters:
284+
status: 'failure'
285+
webhookUrl: '$(DiscordWebhook)'
286+
message: ''

0 commit comments

Comments
 (0)