Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
42 changes: 37 additions & 5 deletions .github/workflows/Action-Test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ jobs:
fail-fast: false
matrix:
os: [ubuntu-latest, windows-latest, macOS-latest]
version: ['latest', '7.4.7', '7.5.0']
version: ['latest', 'prerelease', '7.4.7', '7.5.0', '7.4.0-preview.5']
runs-on: ${{ matrix.os }}
name: '${{ matrix.os }} - [${{ matrix.version }}]'
steps:
Expand All @@ -34,7 +34,8 @@ jobs:
- name: Action-Test
uses: ./
with:
Version: ${{ matrix.version }}
Version: ${{ matrix.version == 'prerelease' && 'latest' || matrix.version }}
Prerelease: ${{ matrix.version == 'prerelease' && 'true' || 'false' }}

- name: Verify installed version
shell: pwsh
Expand All @@ -44,8 +45,23 @@ jobs:
# 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
if ([string]::IsNullOrWhiteSpace($requested) -or
elseif ([string]::IsNullOrWhiteSpace($requested) -or
$requested.Trim().ToLower() -in @('latest','null')) {

$requested = (
Expand All @@ -59,8 +75,24 @@ jobs:
Write-Host "Resolved 'latest' → $requested"
}

# Actual version installed by the action
$installed = ($PSVersionTable.PSVersion).ToString()
# 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"

Expand Down
25 changes: 23 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

A cross‑platform GitHub Action that installs a specific **PowerShell Core** version—or the latest stable release—on any GitHub‑hosted runner
(Linux, macOS, or Windows). The action automatically skips installation when the requested version is already present.
Prerelease versions (e.g. `7.6.0-preview.6`, `7.5.0-rc.1`) are also supported.

## Usage

Expand All @@ -25,11 +26,30 @@ jobs:
Write-Host "Using PowerShell $($PSVersionTable.PSVersion)"
```
### Installing a prerelease version
```yaml
- name: Install PowerShell Preview
uses: PSModule/install-powershell@v1
with:
Version: 7.6.0-preview.6
```
### Installing the latest prerelease
```yaml
- name: Install latest PowerShell Preview
uses: PSModule/install-powershell@v1
with:
Prerelease: true
```
## Inputs
| Input | Required | Default | Description |
| ----- | -------- | ------- | ----------- |
| `Version` | `false` | `latest` | Desired PowerShell Core version (e.g. `7.4.1`). Use `latest` to install the newest stable release. |
| `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`. |

## Secrets

Expand All @@ -43,7 +63,8 @@ This action does **not** generate any outputs.

* **Version resolution**
If `Version` is set to `latest` (case‑insensitive), the action queries the GitHub API for the newest stable release tag in the
`PowerShell/PowerShell` repository and substitutes that version.
`PowerShell/PowerShell` repository and substitutes that version. When `Prerelease` is `true`, it queries for the latest prerelease
instead. Explicit prerelease version strings (e.g. `7.6.0-preview.6`) are passed through directly.

* **Skip logic**
Before installing, the action checks the current runner to see whether the requested version is already available
Expand Down
Loading
Loading