Skip to content

Commit 7af59fa

Browse files
authored
Merge pull request #1 from SkillsFundingAgency/congfig_task
Environment Configuration task
2 parents 5f2e2ab + 767cf29 commit 7af59fa

38 files changed

+1694
-1
lines changed

.editorconfig

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# Default .editorconfig
2+
# https://gds-way.cloudapps.digital/manuals/programming-languages/editorconfig
3+
# https://github.com/PowerShell/PowerShellEditorServices/blob/master/.editorconfig
4+
5+
root = true
6+
7+
[*]
8+
indent_style = space
9+
trim_trailing_whitespace = true
10+
charset = utf-8
11+
insert_final_newline = true
12+
end_of_line = lf
13+
14+
[*.{json,yml}]
15+
indent_size = 2
16+
17+
[*.{ps1,psm1,psd1}]
18+
indent_size = 4
19+
20+
[*.{cs}]
21+
indent_size = 4

.github/CODEOWNERS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
# Assign the following team as codeowners for this repository
2+
* @chelnak @EwanNoble @smneal @NickGraham101 @rivoric @jack-education @mwevill @adam230594 @dalemorson

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Release/

.vscode/settings.json

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
{
2+
"powershell.codeFormatting.openBraceOnSameLine": true,
3+
"powershell.codeFormatting.newLineAfterOpenBrace": true,
4+
"powershell.codeFormatting.newLineAfterCloseBrace": true,
5+
"powershell.codeFormatting.whitespaceBeforeOpenBrace": true,
6+
"powershell.codeFormatting.whitespaceBeforeOpenParen": true,
7+
"powershell.codeFormatting.whitespaceAroundOperator": true,
8+
"powershell.codeFormatting.whitespaceAfterSeparator": true,
9+
"powershell.codeFormatting.ignoreOneLineBlock": false,
10+
"powershell.codeFormatting.useCorrectCasing": true,
11+
"powershell.codeFormatting.preset": "Custom",
12+
"powershell.codeFormatting.alignPropertyValuePairs": true,
13+
"powershell.codeFormatting.whitespaceAroundPipe": true,
14+
"files.eol": "\n"
15+
}

Build-Task.ps1

Lines changed: 241 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,241 @@
1+
<#
2+
.SYNOPSIS
3+
Install common task modules at build time
4+
5+
.DESCRIPTION
6+
Install common task modules at build time
7+
8+
.PARAMETER TaskRoot
9+
The root of the task to be built
10+
11+
.PARAMETER Clean
12+
Clean package directories before building
13+
14+
.PARAMETER Build
15+
Package an extension package
16+
17+
.PARAMETER Publish
18+
Packge and publish an extension package to the marketplace
19+
20+
.PARAMETER AccessToken
21+
A personal access token with enough privileges to publish the package
22+
23+
.PARAMETER SkipRestore
24+
Don't restore dependencies listed in dependency.json
25+
26+
.EXAMPLE
27+
./Build-Task.ps1 -TaskRoot ./MyTask
28+
29+
.EXAMPLE
30+
./Build-Task.ps1 -TaskRoot ./MyTask -Clean
31+
32+
.EXAMPLE
33+
./Build-Task.ps1 -TaskRoot ./MyTask -Clean -Build
34+
35+
.EXAMPLE
36+
./Build-Task.ps1 -TaskRoot ./MyTask -Clean -Publish
37+
38+
.EXAMPLE
39+
./Build-Task.ps1 -TaskRoot ./MyTask -Publish -SkipRestore
40+
41+
.NOTES
42+
Requirements:
43+
The following applications must be installed an available in your PATH
44+
- git
45+
- tfx-cli
46+
#>
47+
[CmdletBinding(DefaultParameterSetName = "Build")]
48+
Param(
49+
[Parameter(Mandatory = $true)]
50+
[System.Io.FileInfo]$TaskRoot,
51+
[Parameter(Mandatory = $false)]
52+
[switch]$Clean,
53+
[Parameter(Mandatory = $false)]
54+
[Parameter(Mandatory = $true, ParameterSetName = "Build")]
55+
[switch]$Build,
56+
[Parameter(Mandatory = $false, ParameterSetName = "Publish")]
57+
[switch]$Publish,
58+
[Parameter(Mandatory = $true, ParameterSetName = "Publish")]
59+
[string]$AccessToken,
60+
[Parameter(Mandatory = $false)]
61+
[switch]$SkipRestore
62+
)
63+
64+
# Default error action to stop
65+
$ErrorActionPreference = "Stop"
66+
67+
function Set-Version {
68+
Param (
69+
[Parameter(Mandatory = $true)]
70+
[String]$TaskRoot
71+
)
72+
73+
try {
74+
$Manifest = "$TaskRoot/vss-extension.json"
75+
$Task = "$TaskRoot/task/task.json"
76+
77+
$NewVersion = $ENV:BUILD_BUILDNUMBER
78+
[Version]$Version = $NewVersion
79+
80+
$ManifestObject = Get-Content -Path $Manifest -Raw | ConvertFrom-Json
81+
$TaskObject = Get-Content -Path $Task -Raw | ConvertFrom-Json
82+
83+
$ManifestObject.Version = $Version.ToString()
84+
85+
$TaskObject.Version.Major = $Version.Major
86+
$TaskObject.Version.Minor = $Version.Minor
87+
$TaskObject.Version.Patch = $Version.Build
88+
Write-Verbose -Message "Version set to $NewVersion"
89+
90+
$ManifestObject | ConvertTo-Json -Depth 10 | Set-Content -Path $Manifest
91+
$TaskObject | ConvertTo-Json -Depth 10 | Set-Content -Path $Task
92+
}
93+
catch {
94+
Write-Error -Message "Failed to update task version number: $_" -ErrorAction Stop
95+
}
96+
}
97+
98+
try {
99+
100+
# --- Ensure that nuget is available
101+
$null = Register-PackageSource -ProviderName Nuget -Name nuget.org -Location https://www.nuget.org/api/v2 -Trusted:$true -Force
102+
103+
Write-Verbose -Message "Resolving common paths.."
104+
$ResolvedTaskRoot = (Resolve-Path -Path "$TaskRoot").Path
105+
$ConfigPath = "$($ResolvedTaskRoot)/dependency.json"
106+
$PackageTemp = "$($ENV:Temp)/$((New-Guid).ToString())"
107+
$TaskName = (Get-Item -Path "$ResolvedTaskRoot").Name
108+
$ReleaseTaskRoot = "$PSScriptRoot/Release/$TaskName"
109+
110+
$null = New-Item -Path $PackageTemp -ItemType Directory -Force
111+
Write-Verbose -Message "ResolvedTaskRoot: $ResolvedTaskRoot"
112+
Write-Verbose -Message "ReleaseTaskRoot: $ReleaseTaskRoot"
113+
Write-Verbose -Message "ConfigPath: $ConfigPath"
114+
115+
if (!$ConfigPath) {
116+
throw "Could not find dependency.json at $ConfigPath"
117+
}
118+
119+
Write-Verbose -Message "Retrieving config definition from $ConfigPath"
120+
$Config = (Get-Content -Path $ConfigPath -Raw) | ConvertFrom-Json
121+
122+
if ($Clean.IsPresent -and $SkipRestore.IsPresent) {
123+
Write-Warning -Message "Don't use Clean and SkipRestore together. Clean task will now be skipped!"
124+
}
125+
126+
if ($Clean.IsPresent -and !$SkipRestore.IsPresent) {
127+
Write-Host "Cleaning package directories:"
128+
$Config.Include | Select-Object -Property Path -Unique | ForEach-Object {
129+
if ($_.Path) {
130+
Write-Host " - $($_.Path)"
131+
Get-ChildItem -Path "$($ReleaseTaskRoot)/$($_.Path)" -Recurse | Remove-Item -Recurse -Force
132+
}
133+
}
134+
135+
Remove-Item -Path "$PSScriptRoot/Release" -Force -Recurse -ErrorAction SilentlyContinue
136+
}
137+
138+
if ($Build.IsPresent -and $ENV:BUILD_BUILDNUMBER) {
139+
Set-Version -TaskRoot $ResolvedTaskRoot
140+
}
141+
142+
$null = New-Item -Path $ReleaseTaskRoot -ItemType Directory -Force -ErrorAction SilentlyContinue
143+
Copy-Item -Path $ResolvedTaskRoot -Destination "$PSScriptRoot/Release" -Recurse -Force
144+
145+
if (!$SkipRestore.IsPresent) {
146+
147+
foreach ($Package in $Config.Include | Sort-Object -Property Type) {
148+
Write-Verbose -Message "Processing package dependency $($Package.Name)"
149+
Write-Verbose -Message "Clean package directories: $($Clean.IsPresent)"
150+
151+
Write-Verbose -Message "Resolving package path"
152+
[System.IO.FileInfo]$ResolvedPackagePath = "$($ReleaseTaskRoot)/$($Package.Path)"
153+
Write-Verbose -Message "ResolvedPackagePath: $ReleaseTaskRoot"
154+
155+
switch ($Package.Type) {
156+
'PSGallery' {
157+
$PackageInstallDirectory = "$PackageTemp/$($Package.Name)"
158+
159+
$SaveModuleParameters = @{
160+
Name = $Package.Name
161+
Path = $PackageTemp
162+
RequiredVersion = $Package.Version
163+
Force = $true
164+
}
165+
166+
Write-Host "[PSGallery] Saving module $($Package.Name) to $PackageTemp "
167+
Save-Module @SaveModuleParameters
168+
169+
if ($Package.Copy) {
170+
$Package.Copy | ForEach-Object {
171+
Write-Host "[PSGallery] Copying module $($Package.Name) to $($Package.Path)"
172+
Copy-Item -Path $PackageInstallDirectory/$_ -Destination "$ResolvedPackagePath/$($Package.Name)" -Recurse -Force
173+
}
174+
}
175+
176+
break
177+
}
178+
'Nuget' {
179+
$PackageSources = @(Get-PackageSource | Where-Object { $_.Name -like "*nuget*" })
180+
$PackageDestination = "$PackageTemp/$($Package.Name).$($Package.Version)"
181+
182+
$InstallPackageParameters = @{
183+
Name = $Package.Name
184+
Destination = $PackageTemp
185+
SkipDependencies = $true
186+
ForceBootstrap = $true
187+
RequiredVersion = $Package.Version
188+
Force = $true
189+
Source = $PackageSources[0].Name
190+
}
191+
192+
Write-Host "[NuGet] Installing package $($Package.Name) to $($PackageTemp)"
193+
$null = Install-Package @InstallPackageParameters
194+
195+
if ($Package.Copy) {
196+
$null = New-Item -Path $ResolvedPackagePath -ItemType Directory -ErrorAction SilentlyContinue
197+
$Package.Copy | ForEach-Object {
198+
Write-Host "[NuGet] Copying dependency $_ to $ResolvedPackagePath"
199+
Copy-Item -Path $PackageDestination/$_ -Destination $ResolvedPackagePath -Recurse -Force
200+
}
201+
}
202+
203+
break
204+
}
205+
'GitHub' {
206+
$RepositoryUrl = "https://github.com/$($Package.Name).git"
207+
$RepositoryDestination = "$PackageTemp/$($Package.Name.Split("/")[1])"
208+
Write-Host "[GitHub] Processing $($RepositoryUrl)"
209+
& git.exe clone $RepositoryUrl $RepositoryDestination | Out-Null
210+
211+
if ($Package.Copy) {
212+
$Package.Copy | ForEach-Object {
213+
Write-Host "[GitHub] Copying dependency $_ to $($Package.Path)"
214+
Copy-Item -Path $RepositoryDestination/$_ -Destination $ResolvedPackagePath -Recurse -Force
215+
}
216+
}
217+
218+
break
219+
}
220+
'Local' {
221+
if ($Package.Copy) {
222+
$Package.Copy | ForEach-Object {
223+
Write-Host "[Local] Copying dependency $_ to $($Package.Path)"
224+
Copy-Item -Path $ResolvedTaskRoot/$_ -Destination $ResolvedPackagePath -Recurse -Force
225+
}
226+
}
227+
}
228+
'Default' {
229+
throw "Unknown package type: $($Package.Type). Supported package types are [GitHub, NuGet, PowerShellGallery]"
230+
}
231+
}
232+
}
233+
}
234+
}
235+
catch {
236+
$PSCmdlet.ThrowTerminatingError($_)
237+
}
238+
finally {
239+
Write-Verbose -Message "Cleaning temp directory $PackageTemp"
240+
Remove-Item -Path $PackageTemp -Recurse -Force
241+
}

README.md

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,6 @@
1-
# das-azure-pipelines-tasks
1+
# Azure Pipelines tasks
2+
3+
TODO:
4+
* Update readme
5+
* Yaml build
6+
* Test runner

azure-pipelines.template.yml

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
parameters:
2+
name: ""
3+
4+
steps:
5+
- powershell: |
6+
./Build-Task.ps1 -Build -TaskRoot $(System.DefaultWorkingDirectory)/tasks/${{ parameters.name }}
7+
displayName: "Build"
8+
failOnStderr: "false"
9+
workingDirectory: $(System.DefaultWorkingDirectory)
10+
- powershell: |
11+
$(System.DefaultWorkingDirectory)/release/${{ parameters.name }}/tests/Start-UnitTest.ps1
12+
displayName: "Test"
13+
failOnStderr: "true"
14+
workingDirectory: $(System.DefaultWorkingDirectory)
15+
- task: PublishTestResults@2
16+
inputs:
17+
testResultsFormat: "NUnit"
18+
testResultsFiles: $(System.DefaultWorkingDirectory)/release/${{ parameters.name }}/tests/Test-Pester.XML
19+
displayName: "Publish results"
20+
condition: succeededOrFailed()
21+
- task: PackageVSTSExtension@1
22+
inputs:
23+
rootFolder: $(System.DefaultWorkingDirectory)/release/${{ parameters.name }}
24+
outputPath: $(System.DefaultWorkingDirectory)/release/bin
25+
updateTasksVersion: false
26+
displayName: "Package vsix"
27+
- task: CopyFiles@2
28+
inputs:
29+
Contents: |
30+
release/bin/*.vsix
31+
release/$(name)/**
32+
TargetFolder: "$(build.artifactstagingdirectory)/publish"
33+
OverWrite: true
34+
displayName: "Copy Files to: $(build.artifactstagingdirectory)"
35+
- task: PublishBuildArtifacts@1
36+
inputs:
37+
PathtoPublish: "$(build.artifactstagingdirectory)/publish"
38+
displayName: "Publish Artifact"
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
name: "3.1.$(rev:r)"
2+
3+
trigger:
4+
batch: true
5+
branches:
6+
include:
7+
- "*"
8+
paths:
9+
include:
10+
- /tasks/EnvironmentConfiguration
11+
12+
pr: none
13+
14+
workspace:
15+
clean: all
16+
17+
pool:
18+
name: "DAS - Continuous Deployment"
19+
20+
steps:
21+
- template: /azure-pipelines.template.yml
22+
parameters:
23+
name: 'EnvironmentConfiguration'
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
{
2+
"include": [
3+
{
4+
"type": "PSGallery",
5+
"name": "VstsTaskSdk",
6+
"version": "0.11.0",
7+
"copy": [
8+
"0.11.0"
9+
],
10+
"path": "task/ps_modules"
11+
},
12+
{
13+
"type": "Nuget",
14+
"name": "Newtonsoft.Json",
15+
"version": "9.0.1",
16+
"copy": [
17+
"lib/netstandard1.0/*.dll"
18+
],
19+
"path": "task/lib"
20+
},
21+
{
22+
"type": "Nuget",
23+
"name": "Newtonsoft.Json.Schema",
24+
"version": "2.0.8",
25+
"copy": [
26+
"lib/netstandard1.3/*.dll"
27+
],
28+
"path": "task/lib"
29+
},
30+
{
31+
"type": "GitHub",
32+
"name": "Microsoft/azure-pipelines-tasks",
33+
"copy": [
34+
"Tasks/Common/VstsAzureHelpers_",
35+
"Tasks/Common/TlsHelper_"
36+
],
37+
"path": "task/ps_modules"
38+
}
39+
]
40+
}
3.43 KB
Loading

0 commit comments

Comments
 (0)