Skip to content

Commit 4d59103

Browse files
Refactor PowerShell installation: improve version resolution logic for Linux, macOS, and Windows; enhance handling of empty and 'null' inputs for requested version.
1 parent a772963 commit 4d59103

File tree

1 file changed

+126
-115
lines changed

1 file changed

+126
-115
lines changed

action.yml

Lines changed: 126 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
name: Install PowerShell
2-
description: >-
2+
description: >
33
Install a specific version —or the latest stable version— of PowerShell Core
44
on any GitHub runner (Linux, macOS, Windows).
55
Skips the install if the requested version is already present.
@@ -10,129 +10,140 @@ branding:
1010

1111
inputs:
1212
Version:
13-
description: >-
14-
PowerShell version to install (`7.4.1`, `7.3.10`, or `latest` for the
15-
newest stable release).
16-
Defaults to **latest**.
13+
description: >
14+
PowerShell version to install (e.g. `7.4.1`).
15+
Use `latest`, `null`, leave it **empty**, or omit the input entirely
16+
to grab the newest stable release automatically.
1717
required: false
18-
default: latest
18+
default: '' # Empty string → newest release
1919

2020
runs:
2121
using: composite
2222
steps:
23-
- name: Install PowerShell (Linux)
24-
if: runner.os == 'Linux'
25-
shell: bash
26-
env:
27-
REQUESTED_VERSION: ${{ inputs.Version }}
28-
run: |
29-
set -e
30-
31-
# Resolve "latest" to a concrete version number (e.g. 7.4.1)
32-
if [[ -z "$REQUESTED_VERSION" || "$REQUESTED_VERSION" == "latest" ]]; then
33-
REQUESTED_VERSION=$(curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
34-
| grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//')
35-
echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
36-
fi
37-
38-
DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
39-
if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
40-
echo "PowerShell $DETECTED_VERSION already installed. Skipping."
41-
exit 0
42-
fi
43-
44-
if command -v apt-get >/dev/null; then
45-
echo "Using APT package manager (Debian/Ubuntu)…"
46-
47-
if ! grep -q "packages.microsoft.com" /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null; then
48-
wget -qO- https://packages.microsoft.com/keys/microsoft.asc \
49-
| sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
50-
DIST_CODENAME=$(lsb_release -cs)
51-
sudo add-apt-repository \
52-
"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/ubuntu/$DIST_CODENAME/prod $DIST_CODENAME main"
23+
- name: Install PowerShell (Linux)
24+
if: runner.os == 'Linux'
25+
shell: bash
26+
env:
27+
REQUESTED_VERSION: ${{ inputs.Version }}
28+
run: |
29+
set -e
30+
31+
# Resolve empty / 'null' / 'latest' to a concrete version number
32+
if [[ -z "$REQUESTED_VERSION" || \
33+
"${REQUESTED_VERSION,,}" == "latest" || \
34+
"${REQUESTED_VERSION,,}" == "null" ]]; then
35+
REQUESTED_VERSION=$(
36+
curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
37+
| grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//'
38+
)
39+
echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
5340
fi
5441
55-
sudo apt-get update -y
56-
EXACT_PKG=$(apt-cache madison powershell | awk '{print $3}' \
57-
| grep -E "^${REQUESTED_VERSION}(-|$)" | head -n1 || true)
42+
DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
43+
if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
44+
echo "PowerShell $DETECTED_VERSION already installed. Skipping."
45+
exit 0
46+
fi
5847
59-
if [[ -n "$EXACT_PKG" ]]; then
60-
sudo apt-get install -y powershell=$EXACT_PKG
48+
if command -v apt-get >/dev/null; then
49+
echo "Using APT package manager (Debian/Ubuntu)…"
50+
51+
if ! grep -q "packages.microsoft.com" /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null; then
52+
wget -qO- https://packages.microsoft.com/keys/microsoft.asc \
53+
| sudo tee /etc/apt/trusted.gpg.d/microsoft.asc > /dev/null
54+
DIST_CODENAME=$(lsb_release -cs)
55+
sudo add-apt-repository \
56+
"deb [arch=$(dpkg --print-architecture)] https://packages.microsoft.com/ubuntu/$DIST_CODENAME/prod $DIST_CODENAME main"
57+
fi
58+
59+
sudo apt-get update -y
60+
EXACT_PKG=$(apt-cache madison powershell | awk '{print $3}' \
61+
| grep -E "^${REQUESTED_VERSION}(-|$)" | head -n1 || true)
62+
63+
if [[ -n "$EXACT_PKG" ]]; then
64+
sudo apt-get install -y powershell=$EXACT_PKG
65+
else
66+
ARCH=$(dpkg --print-architecture)
67+
DEB_NAME="powershell_${REQUESTED_VERSION}-1.deb_${ARCH}.deb"
68+
URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${DEB_NAME}"
69+
wget -q "$URL" -O "$DEB_NAME"
70+
sudo dpkg -i "$DEB_NAME" || sudo apt-get -f install -y
71+
fi
6172
else
62-
ARCH=$(dpkg --print-architecture)
63-
DEB_NAME="powershell_${REQUESTED_VERSION}-1.deb_${ARCH}.deb"
64-
URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${DEB_NAME}"
65-
wget -q "$URL" -O "$DEB_NAME"
66-
sudo dpkg -i "$DEB_NAME" || sudo apt-get -f install -y
73+
echo "Unsupported Linux distribution (no apt-get)."
74+
exit 1
75+
fi
76+
77+
- name: Install PowerShell (macOS)
78+
if: runner.os == 'macOS'
79+
shell: bash
80+
env:
81+
REQUESTED_VERSION: ${{ inputs.Version }}
82+
run: |
83+
set -e
84+
85+
# Resolve empty / 'null' / 'latest' to a concrete version number
86+
if [[ -z "$REQUESTED_VERSION" || \
87+
"${REQUESTED_VERSION,,}" == "latest" || \
88+
"${REQUESTED_VERSION,,}" == "null" ]]; then
89+
REQUESTED_VERSION=$(
90+
curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
91+
| grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//'
92+
)
93+
echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
6794
fi
68-
else
69-
echo "Unsupported Linux distribution (no apt-get)."
70-
exit 1
71-
fi
72-
73-
- name: Install PowerShell (macOS)
74-
if: runner.os == 'macOS'
75-
shell: bash
76-
env:
77-
REQUESTED_VERSION: ${{ inputs.Version }}
78-
run: |
79-
set -e
80-
81-
# Resolve "latest" to concrete version number
82-
if [[ -z "$REQUESTED_VERSION" || "$REQUESTED_VERSION" == "latest" ]]; then
83-
REQUESTED_VERSION=$(curl -s https://api.github.com/repos/PowerShell/PowerShell/releases/latest \
84-
| grep -oP '"tag_name":\s*"\K([^"]+)' | sed 's/^v//')
85-
echo "Latest stable PowerShell release detected: $REQUESTED_VERSION"
86-
fi
87-
88-
DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
89-
if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
90-
echo "PowerShell $DETECTED_VERSION already installed. Skipping."
91-
exit 0
92-
fi
93-
94-
if brew info --cask powershell@$REQUESTED_VERSION >/dev/null 2>&1; then
95-
brew install --cask powershell@$REQUESTED_VERSION
96-
else
97-
ARCH=$(uname -m)
98-
if [[ "$ARCH" == "arm64" ]]; then
99-
PKG_NAME="powershell-${REQUESTED_VERSION}-osx-arm64.pkg"
95+
96+
DETECTED_VERSION=$(pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()' 2>/dev/null || true)
97+
if [[ "$DETECTED_VERSION" == "$REQUESTED_VERSION" ]]; then
98+
echo "PowerShell $DETECTED_VERSION already installed. Skipping."
99+
exit 0
100+
fi
101+
102+
if brew info --cask powershell@$REQUESTED_VERSION >/dev/null 2>&1; then
103+
brew install --cask powershell@$REQUESTED_VERSION
100104
else
101-
PKG_NAME="powershell-${REQUESTED_VERSION}-osx-x64.pkg"
105+
ARCH=$(uname -m)
106+
if [[ "$ARCH" == "arm64" ]]; then
107+
PKG_NAME="powershell-${REQUESTED_VERSION}-osx-arm64.pkg"
108+
else
109+
PKG_NAME="powershell-${REQUESTED_VERSION}-osx-x64.pkg"
110+
fi
111+
URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${PKG_NAME}"
112+
curl -sSL "$URL" -o "$PKG_NAME"
113+
sudo installer -pkg "$PKG_NAME" -target /
102114
fi
103-
URL="https://github.com/PowerShell/PowerShell/releases/download/v${REQUESTED_VERSION}/${PKG_NAME}"
104-
curl -sSL "$URL" -o "$PKG_NAME"
105-
sudo installer -pkg "$PKG_NAME" -target /
106-
fi
107-
108-
- name: Install PowerShell (Windows)
109-
if: runner.os == 'Windows'
110-
shell: powershell
111-
env:
112-
REQUESTED_VERSION: ${{ inputs.Version }}
113-
run: |
114-
# Resolve "latest" to concrete version number
115-
if (-not $env:REQUESTED_VERSION -or $env:REQUESTED_VERSION -eq 'latest') {
116-
$latest = (Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest').tag_name.TrimStart('v')
117-
Write-Host "Latest stable PowerShell release detected: $latest"
118-
$env:REQUESTED_VERSION = $latest
119-
}
120-
121-
try {
122-
$detected = (pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
123-
} catch {
124-
$detected = $null
125-
}
126-
127-
Write-Host "Detected PowerShell version: $detected"
128-
Write-Host "Requested PowerShell version: $env:REQUESTED_VERSION"
129-
130-
if ($detected -eq $env:REQUESTED_VERSION) {
131-
Write-Host "PowerShell $detected already installed. Skipping."
132-
exit 0
133-
}
134-
135-
$msi = "PowerShell-$($env:REQUESTED_VERSION)-win-x64.msi"
136-
$url = "https://github.com/PowerShell/PowerShell/releases/download/v$($env:REQUESTED_VERSION)/$msi"
137-
Invoke-WebRequest -Uri $url -OutFile $msi -UseBasicParsing
138-
Start-Process msiexec.exe -ArgumentList '/i', $msi, '/quiet', '/norestart' -Wait
115+
116+
- name: Install PowerShell (Windows)
117+
if: runner.os == 'Windows'
118+
shell: powershell
119+
env:
120+
REQUESTED_VERSION: ${{ inputs.Version }}
121+
run: |
122+
# Resolve empty / 'null' / 'latest' to a concrete version number
123+
$req = $env:REQUESTED_VERSION
124+
if ([string]::IsNullOrWhiteSpace($req) -or
125+
($req.Trim().ToLower() -in @('latest','null'))) {
126+
127+
$latest = (Invoke-RestMethod -Uri 'https://api.github.com/repos/PowerShell/PowerShell/releases/latest').tag_name.TrimStart('v')
128+
Write-Host "Latest stable PowerShell release detected: $latest"
129+
$env:REQUESTED_VERSION = $latest
130+
}
131+
132+
try {
133+
$detected = (pwsh -NoLogo -NoProfile -Command '$PSVersionTable.PSVersion.ToString()')
134+
} catch {
135+
$detected = $null
136+
}
137+
138+
Write-Host "Detected PowerShell version: $detected"
139+
Write-Host "Requested PowerShell version: $env:REQUESTED_VERSION"
140+
141+
if ($detected -eq $env:REQUESTED_VERSION) {
142+
Write-Host "PowerShell $detected already installed. Skipping."
143+
exit 0
144+
}
145+
146+
$msi = "PowerShell-$($env:REQUESTED_VERSION)-win-x64.msi"
147+
$url = "https://github.com/PowerShell/PowerShell/releases/download/v$($env:REQUESTED_VERSION)/$msi"
148+
Invoke-WebRequest -Uri $url -OutFile $msi -UseBasicParsing
149+
Start-Process msiexec.exe -ArgumentList '/i', $msi, '/quiet', '/norestart' -Wait

0 commit comments

Comments
 (0)