Skip to content

Commit 560cd66

Browse files
Move workflow verification scripts into reusable script file
1 parent 515e135 commit 560cd66

2 files changed

Lines changed: 97 additions & 120 deletions

File tree

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
[CmdletBinding()]
2+
param(
3+
[Parameter(Mandatory)]
4+
[string] $RequestedVersion,
5+
6+
[Parameter()]
7+
[string] $GitHubToken
8+
)
9+
10+
function Get-GitHubApiHeaders {
11+
[CmdletBinding()]
12+
param(
13+
[Parameter()]
14+
[string] $Token
15+
)
16+
17+
$headers = @{
18+
'Accept' = 'application/vnd.github+json'
19+
'X-GitHub-Api-Version' = '2022-11-28'
20+
}
21+
22+
if (-not [string]::IsNullOrWhiteSpace($Token)) {
23+
$headers['Authorization'] = "Bearer $Token"
24+
}
25+
26+
return $headers
27+
}
28+
29+
function Resolve-ExpectedVersion {
30+
[CmdletBinding()]
31+
param(
32+
[Parameter(Mandatory)]
33+
[string] $Version,
34+
35+
[Parameter()]
36+
[string] $Token
37+
)
38+
39+
$resolvedVersion = $Version
40+
$normalizedVersion = $Version.Trim().ToLower()
41+
$headers = Get-GitHubApiHeaders -Token $Token
42+
43+
if ($normalizedVersion -eq 'prerelease') {
44+
$releases = Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases?per_page=100' -Headers $headers
45+
$latestPrerelease = $releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1
46+
47+
if (-not $latestPrerelease) {
48+
throw 'No prerelease releases found for PowerShell/PowerShell.'
49+
}
50+
51+
$resolvedVersion = $latestPrerelease.tag_name.TrimStart('v')
52+
Write-Host "Resolved 'prerelease' -> $resolvedVersion"
53+
} elseif ([string]::IsNullOrWhiteSpace($normalizedVersion) -or $normalizedVersion -in @('latest', 'null')) {
54+
$resolvedVersion = (
55+
Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' -Headers $headers
56+
).tag_name.TrimStart('v')
57+
Write-Host "Resolved 'latest' -> $resolvedVersion"
58+
}
59+
60+
return $resolvedVersion
61+
}
62+
63+
$expectedVersion = Resolve-ExpectedVersion -Version $RequestedVersion -Token $GitHubToken
64+
65+
if ($IsWindows) {
66+
# On Windows, verify via the expected install directory to avoid stale PATH resolution.
67+
$isPrerelease = $expectedVersion -match '-'
68+
$majorVersion = ($expectedVersion -split '[\.-]')[0]
69+
$installDir = if ($isPrerelease) { "$majorVersion-preview" } else { $majorVersion }
70+
$pwshPath = "$env:ProgramFiles\PowerShell\$installDir\pwsh.exe"
71+
72+
Write-Host "Windows: verifying via subprocess at $pwshPath"
73+
74+
if (Test-Path $pwshPath) {
75+
$installedVersion = (& $pwshPath -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
76+
} else {
77+
Write-Host "Warning: Expected pwsh not found at $pwshPath, falling back to `$PSVersionTable"
78+
$installedVersion = ($PSVersionTable.PSVersion).ToString()
79+
}
80+
} else {
81+
$installedVersion = ($PSVersionTable.PSVersion).ToString()
82+
}
83+
84+
Write-Host "Installed PowerShell version: $installedVersion"
85+
Write-Host "Expected PowerShell version: $expectedVersion"
86+
87+
if ($installedVersion -ne $expectedVersion) {
88+
throw "Failed: expected $expectedVersion but got $installedVersion"
89+
}
90+
91+
if ($RequestedVersion.Trim().ToLower() -eq 'prerelease' -and $installedVersion -notmatch '-') {
92+
throw "Prerelease validation failed: installed version '$installedVersion' does not contain a prerelease segment."
93+
}

.github/workflows/Action-Test.yml

Lines changed: 4 additions & 120 deletions
Original file line numberDiff line numberDiff line change
@@ -39,76 +39,8 @@ jobs:
3939

4040
- name: Verify installed version
4141
shell: pwsh
42-
env:
43-
GITHUB_TOKEN: ${{ github.token }}
4442
run: |
45-
# Requested version that came from the matrix
46-
$requested = '${{ matrix.version }}'
47-
48-
# When 'prerelease' → resolve to latest prerelease
49-
if ($requested.Trim().ToLower() -eq 'prerelease') {
50-
$releases = Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases' `
51-
-Headers @{
52-
'Accept' = 'application/vnd.github+json'
53-
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
54-
'X-GitHub-Api-Version' = '2022-11-28'
55-
}
56-
$latestPrerelease = $releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1
57-
if (-not $latestPrerelease) {
58-
throw "No prerelease releases found for PowerShell/PowerShell."
59-
}
60-
$requested = $latestPrerelease.tag_name.TrimStart('v')
61-
Write-Host "Resolved 'prerelease' → $requested"
62-
}
63-
# When empty / 'null' / 'latest' → resolve to latest stable release
64-
elseif ([string]::IsNullOrWhiteSpace($requested) -or
65-
$requested.Trim().ToLower() -in @('latest','null')) {
66-
67-
$requested = (
68-
Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' `
69-
-Headers @{
70-
'Accept' = 'application/vnd.github+json'
71-
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
72-
'X-GitHub-Api-Version' = '2022-11-28'
73-
}
74-
).tag_name.TrimStart('v')
75-
Write-Host "Resolved 'latest' → $requested"
76-
}
77-
78-
# On Windows, always verify by launching pwsh from the known install directory.
79-
# This avoids relying on PATH resolution, which may still point to the pre-installed
80-
# version if the runner's environment hasn't refreshed after the MSI install.
81-
if ($IsWindows) {
82-
$isPrerelease = $requested -match '-'
83-
$majorVersion = ($requested -split '[\.-]')[0]
84-
$installDir = if ($isPrerelease) { "$majorVersion-preview" } else { $majorVersion }
85-
$pwshPath = "$env:ProgramFiles\PowerShell\$installDir\pwsh.exe"
86-
Write-Host "Windows: verifying via subprocess at $pwshPath"
87-
if (Test-Path $pwshPath) {
88-
$installed = (& $pwshPath -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
89-
} else {
90-
Write-Host "Warning: Expected pwsh not found at $pwshPath, falling back to `$PSVersionTable"
91-
$installed = ($PSVersionTable.PSVersion).ToString()
92-
}
93-
} else {
94-
$installed = ($PSVersionTable.PSVersion).ToString()
95-
}
96-
Write-Host "Installed PowerShell version: $installed"
97-
Write-Host "Expected PowerShell version: $requested"
98-
99-
if ($installed -ne $requested) {
100-
throw "Failed: expected $requested but got $installed"
101-
}
102-
103-
# For prerelease matrix entries, additionally assert the version string
104-
# contains a prerelease segment so we never silently fall back to stable.
105-
$matrixVersion = '${{ matrix.version }}'
106-
if ($matrixVersion.Trim().ToLower() -eq 'prerelease') {
107-
if ($installed -notmatch '-') {
108-
throw "Prerelease validation failed: installed version '$installed' does not contain a prerelease segment."
109-
}
110-
Write-Host "Prerelease check passed: '$installed' contains a prerelease segment."
111-
}
43+
./.github/scripts/Verify-InstalledVersion.ps1 -RequestedVersion '${{ matrix.version }}' -GitHubToken '${{ github.token }}'
11244
11345
ActionTestTokenUseCases:
11446
name: 'ubuntu-latest - [Token use cases]'
@@ -126,25 +58,8 @@ jobs:
12658

12759
- name: Verify default token behavior
12860
shell: pwsh
129-
env:
130-
GITHUB_TOKEN: ${{ github.token }}
13161
run: |
132-
$expected = (
133-
Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' `
134-
-Headers @{
135-
'Accept' = 'application/vnd.github+json'
136-
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
137-
'X-GitHub-Api-Version' = '2022-11-28'
138-
}
139-
).tag_name.TrimStart('v')
140-
141-
$installed = ($PSVersionTable.PSVersion).ToString()
142-
Write-Host "Installed: $installed"
143-
Write-Host "Expected : $expected"
144-
145-
if ($installed -ne $expected) {
146-
throw "Default token behavior failed: expected $expected but got $installed"
147-
}
62+
./.github/scripts/Verify-InstalledVersion.ps1 -RequestedVersion 'latest' -GitHubToken '${{ github.token }}'
14863
14964
- name: Action-Test (Explicit token input)
15065
uses: ./
@@ -154,25 +69,8 @@ jobs:
15469

15570
- name: Verify explicit token input behavior
15671
shell: pwsh
157-
env:
158-
GITHUB_TOKEN: ${{ github.token }}
15972
run: |
160-
$expected = (
161-
Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' `
162-
-Headers @{
163-
'Accept' = 'application/vnd.github+json'
164-
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
165-
'X-GitHub-Api-Version' = '2022-11-28'
166-
}
167-
).tag_name.TrimStart('v')
168-
169-
$installed = ($PSVersionTable.PSVersion).ToString()
170-
Write-Host "Installed: $installed"
171-
Write-Host "Expected : $expected"
172-
173-
if ($installed -ne $expected) {
174-
throw "Explicit token behavior failed: expected $expected but got $installed"
175-
}
73+
./.github/scripts/Verify-InstalledVersion.ps1 -RequestedVersion 'latest' -GitHubToken '${{ github.token }}'
17674
17775
- name: Action-Test (Anonymous mode)
17876
uses: ./
@@ -183,18 +81,4 @@ jobs:
18381
- name: Verify anonymous mode behavior
18482
shell: pwsh
18583
run: |
186-
$expected = (
187-
Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' `
188-
-Headers @{
189-
'Accept' = 'application/vnd.github+json'
190-
'X-GitHub-Api-Version' = '2022-11-28'
191-
}
192-
).tag_name.TrimStart('v')
193-
194-
$installed = ($PSVersionTable.PSVersion).ToString()
195-
Write-Host "Installed: $installed"
196-
Write-Host "Expected : $expected"
197-
198-
if ($installed -ne $expected) {
199-
throw "Anonymous mode failed: expected $expected but got $installed"
200-
}
84+
./.github/scripts/Verify-InstalledVersion.ps1 -RequestedVersion 'latest'

0 commit comments

Comments
 (0)