From feb60449c895f1b562497102664da6b3b1b14c37 Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 6 Aug 2026 23:37:09 +0300 Subject: [PATCH 1/2] Fix nightly installation on Windows --- docs/binaries-phar-docker.md | 10 +++++++++- install.ps1 | 18 ++++++++++++++++++ tests/Unit/Packaging/InstallerTest.php | 9 +++++++++ 3 files changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/binaries-phar-docker.md b/docs/binaries-phar-docker.md index c4ffcc3..af554ad 100644 --- a/docs/binaries-phar-docker.md +++ b/docs/binaries-phar-docker.md @@ -28,8 +28,16 @@ curl -fsSL https://raw.githubusercontent.com/yiipress/engine/master/install.sh | curl -fsSL https://raw.githubusercontent.com/yiipress/engine/master/install.sh | YIIPRESS_VERSION=nightly sh ``` +Or, with the PowerShell installer: + +```powershell +$env:YIIPRESS_VERSION = "nightly" +irm https://raw.githubusercontent.com/yiipress/engine/master/install.ps1 | iex +``` + `YIIPRESS_VERSION=nightly` resolves the newest immutable nightly prerelease through the GitHub releases API. It does not require -`jq` or GitHub CLI. Nightly builds contain unreleased changes and are intended for preview and testing. +`jq` or GitHub CLI. Both installers inspect up to ten release pages and use the first prerelease whose tag matches the immutable +`nightly---` format. Nightly builds contain unreleased changes and are intended for preview and testing. YiiPress can be packaged as reproducible artifacts: diff --git a/install.ps1 b/install.ps1 index 9b5c2a4..2aeb890 100644 --- a/install.ps1 +++ b/install.ps1 @@ -16,6 +16,24 @@ if ([Runtime.InteropServices.RuntimeInformation]::OSArchitecture -ne [Runtime.In } $Asset = "yiipress-windows-amd64.zip" +if ($Version -eq "nightly") { + $ResolvedVersion = $null + for ($Page = 1; -not $ResolvedVersion -and $Page -le 10; $Page++) { + $Releases = @( + Invoke-RestMethod -Uri "https://api.github.com/repos/$Repository/releases?per_page=100&page=$Page" + ) + $ResolvedVersion = $Releases | Where-Object { + $_.prerelease -eq $true -and $_.tag_name -match '^nightly-[0-9]+-[0-9]+-[0-9a-f]+$' + } | Select-Object -First 1 -ExpandProperty tag_name + if ($Releases.Count -eq 0) { + break + } + } + if (-not $ResolvedVersion) { + throw "Could not find a YiiPress nightly release for $Repository." + } + $Version = $ResolvedVersion +} $ReleaseUrl = if ($Version -eq "latest") { "https://github.com/$Repository/releases/latest/download" } else { diff --git a/tests/Unit/Packaging/InstallerTest.php b/tests/Unit/Packaging/InstallerTest.php index a98515a..29d2077 100644 --- a/tests/Unit/Packaging/InstallerTest.php +++ b/tests/Unit/Packaging/InstallerTest.php @@ -256,6 +256,15 @@ public function windowsInstallerDownloadsVerifiesAndAtomicallyReplacesTheExecuta self::assertStringContainsString('[Environment]::SetEnvironmentVariable("Path", $UpdatedPath, "User")', $script); self::assertStringContainsString('YIIPRESS_INSTALL_DIR', $script); self::assertStringContainsString('YIIPRESS_VERSION', $script); + self::assertStringContainsString('if ($Version -eq "nightly")', $script); + self::assertStringContainsString( + 'https://api.github.com/repos/$Repository/releases?per_page=100&page=$Page', + $script, + ); + self::assertStringContainsString("-match '^nightly-[0-9]+-[0-9]+-[0-9a-f]+$'", $script); + self::assertStringContainsString('Select-Object -First 1 -ExpandProperty tag_name', $script); + self::assertStringContainsString('$Page -le 10', $script); + self::assertStringContainsString('Could not find a YiiPress nightly release for $Repository.', $script); } private function createRelease( From 389d362a5d73f09ca3b573b8de4f68b4457db59e Mon Sep 17 00:00:00 2001 From: Alexander Makarov Date: Thu, 6 Aug 2026 23:53:29 +0300 Subject: [PATCH 2/2] Address PowerShell nightly review feedback --- install.ps1 | 20 ++++++++++++++++---- tests/Unit/Packaging/InstallerTest.php | 4 ++++ 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/install.ps1 b/install.ps1 index 2aeb890..76003e9 100644 --- a/install.ps1 +++ b/install.ps1 @@ -19,11 +19,23 @@ $Asset = "yiipress-windows-amd64.zip" if ($Version -eq "nightly") { $ResolvedVersion = $null for ($Page = 1; -not $ResolvedVersion -and $Page -le 10; $Page++) { - $Releases = @( - Invoke-RestMethod -Uri "https://api.github.com/repos/$Repository/releases?per_page=100&page=$Page" - ) + $Releases = $null + for ($Attempt = 1; $Attempt -le 3; $Attempt++) { + try { + $Releases = @( + Invoke-RestMethod -Uri "https://api.github.com/repos/$Repository/releases?per_page=100&page=$Page" + ) + break + } catch { + if ($Attempt -eq 3) { + throw + } + Start-Sleep -Seconds 2 + } + } $ResolvedVersion = $Releases | Where-Object { - $_.prerelease -eq $true -and $_.tag_name -match '^nightly-[0-9]+-[0-9]+-[0-9a-f]+$' + $_.prerelease -eq $true -and $_.draft -ne $true ` + -and $_.tag_name -match '^nightly-[0-9]+-[0-9]+-[0-9a-f]+$' } | Select-Object -First 1 -ExpandProperty tag_name if ($Releases.Count -eq 0) { break diff --git a/tests/Unit/Packaging/InstallerTest.php b/tests/Unit/Packaging/InstallerTest.php index 29d2077..6d72f75 100644 --- a/tests/Unit/Packaging/InstallerTest.php +++ b/tests/Unit/Packaging/InstallerTest.php @@ -262,8 +262,12 @@ public function windowsInstallerDownloadsVerifiesAndAtomicallyReplacesTheExecuta $script, ); self::assertStringContainsString("-match '^nightly-[0-9]+-[0-9]+-[0-9a-f]+$'", $script); + self::assertStringContainsString('$_.draft -ne $true', $script); self::assertStringContainsString('Select-Object -First 1 -ExpandProperty tag_name', $script); self::assertStringContainsString('$Page -le 10', $script); + self::assertStringContainsString('$Attempt -le 3', $script); + self::assertStringContainsString('Start-Sleep -Seconds 2', $script); + self::assertStringContainsString('if ($Attempt -eq 3)', $script); self::assertStringContainsString('Could not find a YiiPress nightly release for $Repository.', $script); }