-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlist_tasks.ps1
181 lines (161 loc) · 7.33 KB
/
list_tasks.ps1
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
180
181
#!/usr/bin/env pwsh
<#
.SYNOPSIS
Get Azure Pipeline task data from the Azure Pipelines task repo
#>
#Requires -Version 7.2
param (
[parameter(Mandatory=$false)]
[string]
$RepoDirectory,
[parameter(Mandatory=$false)]
[switch]
$AzureTasksOnly,
[parameter(Mandatory=$false, HelpMessage="Return only tasks that are using a Node runner")]
[switch]
$NodeTasksOnly,
[parameter(Mandatory=$false)]
[switch]
$DeprecatedTasksOnly,
[parameter(Mandatory=$false)]
[string]
[ValidateSet("Csv","Ids","Table")]
$Format="Table",
[parameter(Mandatory=$false)]
[string[]]
#$Property=@("directoryName","id","name","friendlyName","author","helpUrl","category","visibility","runsOn","version","preview","instanceNameFormat","groups","inputs","dataSourceBindings","execution","fullName","majorVersion","isAzureTask","usesNode","usesNode10","usesNode16","usesNode20")
$Property=@("fullName","id","name","friendlyName","version","majorVersion")
)
if (!$RepoDirectory) {
# Try to find task repo directory
$directoryElements = $PSScriptRoot.Split([IO.Path]::DirectorySeparatorChar)
$directoryElements[0..($directoryElements.Length-5)] -join [IO.Path]::DirectorySeparatorChar `
| Set-Variable RepoBaseDirectory
Join-Path $RepoBaseDirectory "microsoft" "azure-pipelines-tasks" | Set-Variable RepoDirectory
if (!(Test-Path $RepoDirectory)) {
Write-Warning "No RepoDirectory specifed"
exit
}
}
Get-ChildItem -Path $RepoDirectory `
-Filter task.json `
-Recurse -Force `
-ErrorAction SilentlyContinue `
| Where-Object DirectoryName -notmatch _generated `
| Select-Object -ExpandProperty FullName `
| Set-Variable taskJsonLocations
if (!$taskJsonLocations) {
Write-Error "No task.json files found in ${RepoDirectory}, specify -RepoDirectory"
exit 1
}
[System.Collections.ArrayList]$tasks = @()
foreach ($taskJson in $taskJsonLocations) {
Write-Debug $taskJson
Split-Path $taskJson -Parent | Split-Path -Leaf | Set-Variable taskJsonDirectoryName
Write-Verbose "Testing whether generated task.json file(s) exist(s)"
$generatedTaskJson = $null
Get-ChildItem -Path $RepoDirectory/_generated/${taskJsonDirectoryName}_Node*/task.json `
| Sort-Object -Property FullName `
-Descending `
| Select-Object -ExpandProperty FullName `
-First 1
| Set-Variable generatedTaskJson
if ($generatedTaskJson) {
Write-Verbose "Found generated configuration at ${generatedTaskJson}"
$taskJson = $generatedTaskJson
}
Write-Debug $taskJson
Get-Content $taskJson | ConvertFrom-Json -AsHashtable | Set-Variable task
$task.Add("directoryName", $taskJsonDirectoryName) | Out-Null
$task | Format-Table | Out-String | Write-Debug
$tasks.Add($task) | Out-Null
}
# Filter tasks
$tasks | ForEach-Object {[PSCustomObject]$_} `
| ForEach-Object {
# Azure
$_ | Select-Object -ExpandProperty inputs -ErrorAction SilentlyContinue `
| Where-Object -Property type -ieq 'connectedService:AzureRM' `
| Set-Variable azureRmProperty
$_ | Select-Object -ExpandProperty inputs -ErrorAction SilentlyContinue `
| Where-Object -Property type -match 'connectedService' `
| Select-Object -ExpandProperty type `
| Set-Variable serviceConnections
$_ | Add-Member -MemberType NoteProperty -Name serviceConnections -Value ($serviceConnections -join ",")
if ($_ | Select-Object -ExpandProperty inputs -ErrorAction SilentlyContinue `
| Where-Object {($_.type -ieq 'connectedService:azurerm') -or ($_.type -ieq 'connectedService:dockerregistry') -or ($_.type -ieq 'connectedService:kubernetes') -or ($_.type -ieq 'connectedService:azureservicebus')} `
) {
$_ | Add-Member -MemberType NoteProperty -Name isAzureTask -Value $true
} else {
$_ | Add-Member -MemberType NoteProperty -Name isAzureTask -Value $false
}
# Runner
$_ | Add-Member -MemberType NoteProperty -Name usesNode6 -Value ($_.execution.Node6 -ne $null)
$_ | Add-Member -MemberType NoteProperty -Name usesNode10 -Value ($_.execution.Node10 -ne $null)
$_ | Add-Member -MemberType NoteProperty -Name usesNode16 -Value ($_.execution.Node16 -ne $null)
$_ | Add-Member -MemberType NoteProperty -Name usesNode20 -Value ($_.execution.Node20 -ne $null)
$_ | Add-Member -MemberType NoteProperty -Name usesNode -Value ($_.usesNode6 -or $_.usesNode10 -or $_.usesNode16 -or $_.usesNode20)
$_
} `
| Where-Object {!$AzureTasksOnly -or $_.isAzureTask} `
| Where-Object {!$DeprecatedTasksOnly -or $_.deprecated} `
| Where-Object {!$NodeTasksOnly -or $_.usesNode} `
| Set-Variable tasks
# Add properties based on other parameters
if ($NodeTasksOnly) {
[System.Collections.Generic.List[string]]$PropertyList = $Property
$nodeProperties = @("usesNode","usesNode6","usesNode10","usesNode16","usesNode20")
foreach ($nodeProperty in $nodeProperties) {
if ($PropertyList -notcontains $nodeProperty) {
$PropertyList.Add($nodeProperty)
}
}
$Property = $PropertyList.ToArray()
}
# Format results
if ($Format -eq "Ids") {
$tasks | ForEach-Object {
$_.id.ToUpper()
} `
| Sort-Object `
| Get-Unique `
| Set-Variable tasks
$tasks
($tasks -replace "^|$","`"") -join ","
} else {
$tasks | ForEach-Object {
"{0}@{1}" -f $_.name, $_.version.Major | Set-Variable fullName
$_ | Add-Member -MemberType NoteProperty -Name fullName -Value $fullName
$_ | Add-Member -MemberType NoteProperty -Name majorVersion -Value $_.version.Major
$_.version = ("{0}.{1}.{2}" -f $_.version.Major, $_.version.Minor, $_.version.Patch)
if ($_.deprecated -ne $true) {
$_ | Add-Member -MemberType NoteProperty -Name deprecated -Value $false
}
$_
} `
| Sort-Object -Property fullName `
| Select-Object -Property $Property `
| Set-Variable tasks
# Display results
$tasks | Format-Table
}
if ($NodeTasksOnly) {
foreach ($nodeProperty in $nodeProperties) {
$tasks | Group-Object -Property $nodeProperty `
| Where-Object {$_.Name -eq 'True'} `
| Select-Object -Property Count `
| Add-Member -MemberType NoteProperty -Name NodeProperty -Value $nodeProperty -PassThru
}
} else {
$tasks | Measure-Object `
| Select-Object -ExpandProperty Count `
| Set-Variable taskCount
Write-Host "${taskCount} tasks"
}
# Export results
if ($Format -eq "Csv") {
$csvFullName = "$((New-TemporaryFile).FullName).csv"
$tasks | Select-Object -ExcludeProperty description, helpMarkDown, releaseNotes `
| Export-Csv -Path $csvFullName -UseQuotes Always
Write-Host "Results exported to ${csvFullName}"
}