Skip to content

Commit fae8569

Browse files
🚀 [Feature]: Support installing prerelease PowerShell versions (#16)
The action now supports installing prerelease PowerShell versions (e.g. `7.4.0-preview.5`, `7.5.0-rc.1`) on all platforms. You can install a specific prerelease version by passing the full version string, or install the latest prerelease by setting the new `Prerelease` input to `true`. - Fixes #15 ## New `Prerelease` input A new `Prerelease` boolean input has been added, following the same UX pattern as `Install-PSResource -Prerelease`. When set to `true` and `Version` is `latest`, the action resolves to the latest prerelease from the PowerShell/PowerShell GitHub releases. | Usage | `Version` | `Prerelease` | Result | |-------|-----------|-------------|--------| | Latest stable | `latest` (default) | `false` (default) | Resolves to latest stable via `/releases/latest` | | Latest prerelease | `latest` | `true` | Resolves to latest prerelease via `/releases` API | | Specific stable | `7.5.0` | — | Installs `7.5.0` directly | | Specific prerelease | `7.4.0-preview.5` | — | Installs `7.4.0-preview.5` directly (no flag needed) | ### Installing the latest prerelease ```yaml - uses: PSModule/Install-PowerShell@v1 with: Prerelease: true ``` ### Installing a specific prerelease version ```yaml - uses: PSModule/Install-PowerShell@v1 with: Version: 7.4.0-preview.5 ``` ## Linux package conflict handling On Linux, the PowerShell project publishes multiple `.deb` variants (`powershell`, `powershell-lts`, `powershell-preview`) that all provide `/usr/bin/pwsh` and conflict with each other. The action now: - Uses specific asset name filters (`powershell_` for stable, `powershell-preview_` for prerelease) instead of a broad regex that could match the wrong package variant (e.g. `powershell-lts` instead of `powershell`) - Removes all existing PowerShell packages before installing to avoid `dpkg` conflicts when switching versions - Verifies the installed version matches the requested version after install, failing early with a clear error if not - Applies the same fixes for RPM-based distributions ## Windows prerelease handling On Windows, preview builds install to `$env:ProgramFiles\PowerShell\7-preview\` instead of `$env:ProgramFiles\PowerShell\7\`. The action now correctly handles: - Downgrade detection by stripping the prerelease suffix before `[version]` comparison (Windows PowerShell 5.1 lacks `[semver]`) - Uninstall registry filtering to match Preview display names when the current version is a preview - Cross-prerelease version changes (same base version, different label) by forcing an uninstall-then-install cycle ## PATH management After installation, the action adds the PowerShell install directory to `GITHUB_PATH` on all platforms. This ensures subsequent workflow steps using `shell: pwsh` resolve to the newly installed version — including preview builds whose install directory is not on the runner's default PATH.
1 parent d8fbe1f commit fae8569

File tree

3 files changed

+306
-47
lines changed

3 files changed

+306
-47
lines changed

.github/workflows/Action-Test.yml

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ jobs:
2222
fail-fast: false
2323
matrix:
2424
os: [ubuntu-latest, windows-latest, macOS-latest]
25-
version: ['latest', '7.4.7', '7.5.0']
25+
version: ['latest', 'prerelease', '7.4.7', '7.5.0', '7.4.0-preview.5']
2626
runs-on: ${{ matrix.os }}
2727
name: '${{ matrix.os }} - [${{ matrix.version }}]'
2828
steps:
@@ -34,7 +34,8 @@ jobs:
3434
- name: Action-Test
3535
uses: ./
3636
with:
37-
Version: ${{ matrix.version }}
37+
Version: ${{ matrix.version == 'prerelease' && 'latest' || matrix.version }}
38+
Prerelease: ${{ matrix.version == 'prerelease' && 'true' || 'false' }}
3839

3940
- name: Verify installed version
4041
shell: pwsh
@@ -44,8 +45,23 @@ jobs:
4445
# Requested version that came from the matrix
4546
$requested = '${{ matrix.version }}'
4647
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+
}
4763
# When empty / 'null' / 'latest' → resolve to latest stable release
48-
if ([string]::IsNullOrWhiteSpace($requested) -or
64+
elseif ([string]::IsNullOrWhiteSpace($requested) -or
4965
$requested.Trim().ToLower() -in @('latest','null')) {
5066
5167
$requested = (
@@ -59,8 +75,24 @@ jobs:
5975
Write-Host "Resolved 'latest' → $requested"
6076
}
6177
62-
# Actual version installed by the action
63-
$installed = ($PSVersionTable.PSVersion).ToString()
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+
}
6496
Write-Host "Installed PowerShell version: $installed"
6597
Write-Host "Expected PowerShell version: $requested"
6698

README.md

Lines changed: 23 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

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

67
## Usage
78

@@ -25,11 +26,30 @@ jobs:
2526
Write-Host "Using PowerShell $($PSVersionTable.PSVersion)"
2627
```
2728
29+
### Installing a prerelease version
30+
31+
```yaml
32+
- name: Install PowerShell Preview
33+
uses: PSModule/install-powershell@v1
34+
with:
35+
Version: 7.6.0-preview.6
36+
```
37+
38+
### Installing the latest prerelease
39+
40+
```yaml
41+
- name: Install latest PowerShell Preview
42+
uses: PSModule/install-powershell@v1
43+
with:
44+
Prerelease: true
45+
```
46+
2847
## Inputs
2948
3049
| Input | Required | Default | Description |
3150
| ----- | -------- | ------- | ----------- |
32-
| `Version` | `false` | `latest` | Desired PowerShell Core version (e.g. `7.4.1`). Use `latest` to install the newest stable release. |
51+
| `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`). |
52+
| `Prerelease` | `false` | `false` | Install a prerelease version. When `true` and `Version` is `latest`, resolves to the latest prerelease. Similar to `-Prerelease` on `Install-PSResource`. |
3353

3454
## Secrets
3555

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

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

4869
* **Skip logic**
4970
Before installing, the action checks the current runner to see whether the requested version is already available

0 commit comments

Comments
 (0)