42b40bc099
ci / gate (push) Successful in 3m30s
The in-box Windows shell (5.1, .NET Framework) is the baseline we must support; PowerShell 7 is an opt-in install most users don't have. - arch detection: read PROCESSOR_ARCHITECTURE/ARCHITEW6432 from the environment instead of RuntimeInformation::OSArchitecture, which resolves from a .NET Framework facade lacking that property under 5.1 and throws under StrictMode (the reported failure). - force TLS 1.2 before any web request (5.1 may default to TLS 1.0/1.1). - pass -UseBasicParsing to Invoke-WebRequest (5.1 otherwise uses the IE engine and can fail when it is absent). All three are no-ops on PowerShell 7. Relates to ADR-0055.
113 lines
4.7 KiB
PowerShell
113 lines
4.7 KiB
PowerShell
<#
|
|
.SYNOPSIS
|
|
Download and install a prebuilt rdbms-playground binary (Windows).
|
|
|
|
.DESCRIPTION
|
|
The Windows counterpart of scripts/install.sh. Detects the CPU
|
|
architecture, downloads the matching release .exe from the Gitea
|
|
releases, verifies its SHA-256 checksum, installs it to
|
|
%LOCALAPPDATA%\Programs\rdbms-playground, and adds that directory to
|
|
your user PATH.
|
|
|
|
Quick start:
|
|
irm https://git.lazyeval.net/oli/rdbms-playground/raw/branch/main/scripts/install.ps1 | iex
|
|
|
|
We ship gnu / gnullvm Windows builds (x86_64 / aarch64); this maps the
|
|
host architecture to the right asset.
|
|
|
|
.PARAMETER Version
|
|
Install a specific tag (e.g. v0.2.0) instead of the latest release.
|
|
Defaults to $env:RDBMS_VERSION, else the latest release.
|
|
|
|
.PARAMETER InstallDir
|
|
Install directory. Defaults to $env:RDBMS_INSTALL_DIR, else
|
|
%LOCALAPPDATA%\Programs\rdbms-playground.
|
|
|
|
.NOTES
|
|
Written but NOT tested on Windows from this environment (no PowerShell
|
|
here) — validate on a real Windows host. The verified sibling is
|
|
install.sh (Linux/macOS).
|
|
#>
|
|
[CmdletBinding()]
|
|
param(
|
|
[string]$Version = $env:RDBMS_VERSION,
|
|
[string]$InstallDir = $(if ($env:RDBMS_INSTALL_DIR) { $env:RDBMS_INSTALL_DIR } else { "$env:LOCALAPPDATA\Programs\rdbms-playground" })
|
|
)
|
|
|
|
Set-StrictMode -Version Latest
|
|
$ErrorActionPreference = 'Stop'
|
|
|
|
# Windows PowerShell 5.1 (the in-box shell) can negotiate only TLS 1.0/1.1 by
|
|
# default, which modern hosts reject. Opt into TLS 1.2 without disturbing any
|
|
# protocols already enabled. (No-op on PowerShell 7.)
|
|
[Net.ServicePointManager]::SecurityProtocol =
|
|
[Net.ServicePointManager]::SecurityProtocol -bor [Net.SecurityProtocolType]::Tls12
|
|
|
|
$Repo = 'https://git.lazyeval.net/oli/rdbms-playground'
|
|
$Api = 'https://git.lazyeval.net/api/v1/repos/oli/rdbms-playground'
|
|
$Bin = 'rdbms-playground'
|
|
|
|
# Map the host CPU to the target triple we publish for Windows.
|
|
# Read the architecture from the environment rather than
|
|
# RuntimeInformation::OSArchitecture: under Windows PowerShell 5.1 that type
|
|
# resolves from a .NET Framework facade that lacks OSArchitecture, which (with
|
|
# StrictMode) throws "property cannot be found". PROCESSOR_ARCHITECTURE is set
|
|
# on every PowerShell version; PROCESSOR_ARCHITEW6432 reports the true OS
|
|
# architecture when a 32-bit shell runs under WOW64.
|
|
$osArch = [Environment]::GetEnvironmentVariable('PROCESSOR_ARCHITEW6432')
|
|
if (-not $osArch) {
|
|
$osArch = [Environment]::GetEnvironmentVariable('PROCESSOR_ARCHITECTURE')
|
|
}
|
|
switch ($osArch) {
|
|
'AMD64' { $target = 'x86_64-pc-windows-gnu' }
|
|
'ARM64' { $target = 'aarch64-pc-windows-gnullvm' }
|
|
default { throw "install: unsupported CPU architecture: $osArch" }
|
|
}
|
|
|
|
# Resolve the release tag (explicit -Version, else the latest release).
|
|
if (-not $Version) {
|
|
$Version = (Invoke-RestMethod -Uri "$Api/releases/latest").tag_name
|
|
if (-not $Version) { throw 'install: could not determine the latest release tag' }
|
|
}
|
|
|
|
$asset = "$Bin-$Version-$target.exe"
|
|
$url = "$Repo/releases/download/$Version/$asset"
|
|
|
|
$tmp = Join-Path $env:TEMP ([System.Guid]::NewGuid().ToString())
|
|
New-Item -ItemType Directory -Path $tmp -Force | Out-Null
|
|
try {
|
|
$exe = Join-Path $tmp "$Bin.exe"
|
|
$shaFile = "$exe.sha256"
|
|
|
|
Write-Host "downloading $asset ..."
|
|
# -UseBasicParsing: Windows PowerShell 5.1's Invoke-WebRequest otherwise
|
|
# tries to use the Internet Explorer engine and can fail when it is absent.
|
|
# (No-op on PowerShell 7.)
|
|
Invoke-WebRequest -UseBasicParsing -Uri $url -OutFile $exe
|
|
Invoke-WebRequest -UseBasicParsing -Uri "$url.sha256" -OutFile $shaFile
|
|
|
|
# The sidecar is "<hash> <name>"; compare just the hash.
|
|
$expected = ((Get-Content -Raw $shaFile) -split '\s+')[0].ToLower()
|
|
$actual = (Get-FileHash -Algorithm SHA256 -Path $exe).Hash.ToLower()
|
|
if ($expected -ne $actual) {
|
|
throw "install: checksum mismatch (expected $expected, got $actual) — refusing to install"
|
|
}
|
|
|
|
New-Item -ItemType Directory -Path $InstallDir -Force | Out-Null
|
|
$dest = Join-Path $InstallDir "$Bin.exe"
|
|
Move-Item -Path $exe -Destination $dest -Force
|
|
Write-Host "installed $Bin $Version -> $dest"
|
|
|
|
# Add the install dir to the user PATH (persistent) if it's not there.
|
|
$userPath = [Environment]::GetEnvironmentVariable('Path', 'User')
|
|
if (-not $userPath) { $userPath = '' }
|
|
if (($userPath -split ';') -notcontains $InstallDir) {
|
|
$newPath = if ($userPath) { "$userPath;$InstallDir" } else { $InstallDir }
|
|
[Environment]::SetEnvironmentVariable('Path', $newPath, 'User')
|
|
Write-Host "added $InstallDir to your user PATH — restart your shell to pick it up"
|
|
}
|
|
}
|
|
finally {
|
|
Remove-Item -Path $tmp -Recurse -Force -ErrorAction SilentlyContinue
|
|
}
|