Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
18 commits
Select commit Hold shift + click to select a range
2d71a44
Use gh api for GitHub release metadata lookups
MariusStorhaug May 16, 2026
515e135
Add action tests for default, explicit, and anonymous token modes
MariusStorhaug May 16, 2026
560cd66
Move workflow verification scripts into reusable script file
MariusStorhaug May 16, 2026
5164cc1
Revert "Move workflow verification scripts into reusable script file"
MariusStorhaug May 16, 2026
e97f8e7
Move action runtime scripts into OS-specific script files
MariusStorhaug May 16, 2026
2407dde
Mark Linux and macOS install scripts as executable
MariusStorhaug May 16, 2026
2506744
Move workflow verification logic to test/scripts
MariusStorhaug May 16, 2026
38a2506
Move repeated workflow env values to job-level scope
MariusStorhaug May 16, 2026
9fc2f9e
Move repeated action env values to composite runs level
MariusStorhaug May 16, 2026
5aa9d1f
Move working-directory to defaults section in composite action
MariusStorhaug May 16, 2026
59e35d5
Remove unsupported defaults section, restore working-directory to steps
MariusStorhaug May 16, 2026
838b457
Move env block from runs level to individual steps
MariusStorhaug May 16, 2026
a5ef224
Format GitHub API headers for consistency
MariusStorhaug May 16, 2026
dc09e1f
Run token use cases in separate workflow jobs
MariusStorhaug May 16, 2026
2d3c379
Fix anonymous-mode and GHES token routing for all platforms
MariusStorhaug May 16, 2026
34c1617
Fix lint findings in shell/workflow/powershell checks
MariusStorhaug May 16, 2026
b13a335
Fix remaining lint and flaky prerelease download
MariusStorhaug May 16, 2026
0be829c
fix(windows): fall back to ZIP install when MSI is not available for …
Copilot May 17, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
147 changes: 78 additions & 69 deletions .github/workflows/Action-Test.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
name: Action-Test

run-name: "Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}"
run-name: 'Action-Test - [${{ github.event.pull_request.title }} #${{ github.event.pull_request.number }}] by @${{ github.actor }}'

on:
workflow_dispatch:
Expand All @@ -25,6 +25,8 @@ jobs:
version: ['latest', 'prerelease', '7.4.7', '7.5.0', '7.4.0-preview.5']
runs-on: ${{ matrix.os }}
name: '${{ matrix.os }} - [${{ matrix.version }}]'
env:
TestGitHubToken: ${{ github.token }}
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
Expand All @@ -40,72 +42,79 @@ jobs:
- name: Verify installed version
shell: pwsh
env:
GITHUB_TOKEN: ${{ github.token }}
RequestedVersion: ${{ matrix.version }}
run: |
# Requested version that came from the matrix
$requested = '${{ matrix.version }}'

# When 'prerelease' → resolve to latest prerelease
if ($requested.Trim().ToLower() -eq 'prerelease') {
$releases = Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases' `
-Headers @{
'Accept' = 'application/vnd.github+json'
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
'X-GitHub-Api-Version' = '2022-11-28'
}
$latestPrerelease = $releases | Where-Object { $_.prerelease -eq $true } | Select-Object -First 1
if (-not $latestPrerelease) {
throw "No prerelease releases found for PowerShell/PowerShell."
}
$requested = $latestPrerelease.tag_name.TrimStart('v')
Write-Host "Resolved 'prerelease' → $requested"
}
# When empty / 'null' / 'latest' → resolve to latest stable release
elseif ([string]::IsNullOrWhiteSpace($requested) -or
$requested.Trim().ToLower() -in @('latest','null')) {

$requested = (
Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest' `
-Headers @{
'Accept' = 'application/vnd.github+json'
'Authorization' = "Bearer $($env:GITHUB_TOKEN)"
'X-GitHub-Api-Version' = '2022-11-28'
}
).tag_name.TrimStart('v')
Write-Host "Resolved 'latest' → $requested"
}

# On Windows, always verify by launching pwsh from the known install directory.
# This avoids relying on PATH resolution, which may still point to the pre-installed
# version if the runner's environment hasn't refreshed after the MSI install.
if ($IsWindows) {
$isPrerelease = $requested -match '-'
$majorVersion = ($requested -split '[\.-]')[0]
$installDir = if ($isPrerelease) { "$majorVersion-preview" } else { $majorVersion }
$pwshPath = "$env:ProgramFiles\PowerShell\$installDir\pwsh.exe"
Write-Host "Windows: verifying via subprocess at $pwshPath"
if (Test-Path $pwshPath) {
$installed = (& $pwshPath -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
} else {
Write-Host "Warning: Expected pwsh not found at $pwshPath, falling back to `$PSVersionTable"
$installed = ($PSVersionTable.PSVersion).ToString()
}
} else {
$installed = ($PSVersionTable.PSVersion).ToString()
}
Write-Host "Installed PowerShell version: $installed"
Write-Host "Expected PowerShell version: $requested"

if ($installed -ne $requested) {
throw "Failed: expected $requested but got $installed"
}

# For prerelease matrix entries, additionally assert the version string
# contains a prerelease segment so we never silently fall back to stable.
$matrixVersion = '${{ matrix.version }}'
if ($matrixVersion.Trim().ToLower() -eq 'prerelease') {
if ($installed -notmatch '-') {
throw "Prerelease validation failed: installed version '$installed' does not contain a prerelease segment."
}
Write-Host "Prerelease check passed: '$installed' contains a prerelease segment."
}
./tests/scripts/Verify-InstalledVersion.ps1 -RequestedVersion "$env:RequestedVersion" -GitHubToken "$env:TestGitHubToken"

ActionTestTokenUseCaseDefault:
name: 'ubuntu-latest - [Token default behavior]'
runs-on: ubuntu-latest
env:
TestGitHubToken: ${{ github.token }}
TestLatestVersion: latest
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Action-Test (Default token behavior)
uses: ./
with:
Version: ${{ env.TestLatestVersion }}

- name: Verify default token behavior
shell: pwsh
env:
RequestedVersion: ${{ env.TestLatestVersion }}
run: |
./tests/scripts/Verify-InstalledVersion.ps1 -RequestedVersion "$env:RequestedVersion" -GitHubToken "$env:TestGitHubToken"

ActionTestTokenUseCaseExplicit:
name: 'ubuntu-latest - [Token explicit input]'
runs-on: ubuntu-latest
env:
TestGitHubToken: ${{ github.token }}
TestLatestVersion: latest
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Action-Test (Explicit token input)
uses: ./
with:
Version: ${{ env.TestLatestVersion }}
Token: ${{ env.TestGitHubToken }}

- name: Verify explicit token input behavior
shell: pwsh
env:
RequestedVersion: ${{ env.TestLatestVersion }}
run: |
./tests/scripts/Verify-InstalledVersion.ps1 -RequestedVersion "$env:RequestedVersion" -GitHubToken "$env:TestGitHubToken"

ActionTestTokenUseCaseAnonymous:
name: 'ubuntu-latest - [Token anonymous mode]'
runs-on: ubuntu-latest
env:
TestLatestVersion: latest
steps:
- name: Checkout repo
uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2
with:
persist-credentials: false

- name: Action-Test (Anonymous mode)
uses: ./
with:
Version: ${{ env.TestLatestVersion }}
Token: ''

- name: Verify anonymous mode behavior
shell: pwsh
env:
RequestedVersion: ${{ env.TestLatestVersion }}
run: |
./tests/scripts/Verify-InstalledVersion.ps1 -RequestedVersion "$env:RequestedVersion"
6 changes: 5 additions & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -50,10 +50,14 @@ jobs:
| ----- | -------- | ------- | ----------- |
| `Version` | `false` | `latest` | Desired PowerShell Core version (e.g. `7.4.1`, `7.6.0-preview.6`). Use `latest` to install the newest stable release (or newest prerelease when `Prerelease` is `true`). |
| `Prerelease` | `false` | `false` | Install a prerelease version. When `true` and `Version` is `latest`, resolves to the latest prerelease. Similar to `-Prerelease` on `Install-PSResource`. |
| `Token` | `false` | `${{ github.token }}` | Token used for GitHub API requests. Set to an empty string (`''`) for anonymous API calls. |
| `Host` | `false` | `github.com` | GitHub host used by the CLI/API path. Keep `github.com` for GitHub.com, or set your GHES hostname. |

## Secrets

This action does **not** require any secrets.
This action does **not** require custom secrets by default because it uses `${{ github.token }}`.

If needed, provide `Token` with a custom PAT. To force anonymous API access, set `Token: ''`.

## Outputs

Expand Down
Loading
Loading