diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ed45902..61d0c00 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -88,6 +88,21 @@ jobs: $errors | ForEach-Object { Write-Error $_ } exit 1 } + - name: cmd installer smoke check + shell: pwsh + run: | + $stub = Join-Path $PWD "dosh-install-smoke.ps1" + @' + param([string]$SmokeArg) + if ($SmokeArg -ne "ok") { throw "missing forwarded argument" } + $bindir = Join-Path $env:TEMP "dosh-smoke-bin" + if ($env:DOSH_INSTALL_BINDIR_FILE) { + [System.IO.File]::WriteAllText($env:DOSH_INSTALL_BINDIR_FILE, $bindir, [System.Text.Encoding]::ASCII) + } + '@ | Set-Content -Encoding ascii -NoNewline $stub + $cmd = 'set "DOSH_INSTALL_PS1={0}"&& call install.cmd ok&& echo ;!PATH!; | find /I ";{1}\dosh-smoke-bin;"' -f $stub, $env:TEMP + cmd /d /v:on /c $cmd + if ($LASTEXITCODE -ne 0) { exit $LASTEXITCODE } - name: Build Windows client run: cargo build --release --bin dosh-client --bin dosh-bench - name: Test Windows client diff --git a/install.cmd b/install.cmd index 7e3c592..7ec7a33 100644 --- a/install.cmd +++ b/install.cmd @@ -22,7 +22,11 @@ set "DOSH_INSTALL_PS1_URL=%SCRIPT_URL%" set "DOSH_INSTALL_PS1_PATH=%TMP_PS%" set "DOSH_INSTALL_BINDIR_FILE=%TMP_BINDIR%" -"%PS%" -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri $env:DOSH_INSTALL_PS1_URL -OutFile $env:DOSH_INSTALL_PS1_PATH" +if exist "%SCRIPT_URL%" ( + copy /Y "%SCRIPT_URL%" "%TMP_PS%" >nul +) else ( + "%PS%" -NoProfile -ExecutionPolicy Bypass -Command "$ErrorActionPreference='Stop'; $ProgressPreference='SilentlyContinue'; Invoke-WebRequest -UseBasicParsing -Uri $env:DOSH_INSTALL_PS1_URL -OutFile $env:DOSH_INSTALL_PS1_PATH" +) if errorlevel 1 ( del "%TMP_PS%" >nul 2>nul del "%TMP_BINDIR%" >nul 2>nul diff --git a/tests/release_scripts.rs b/tests/release_scripts.rs index 3d3f6bd..7856b63 100644 --- a/tests/release_scripts.rs +++ b/tests/release_scripts.rs @@ -100,6 +100,13 @@ fn release_gates_test_all_targets() { .contains("[System.Management.Automation.Language.Parser]::ParseFile(\"install.ps1\""), "Windows CI must parse the installer with PowerShell" ); + assert!( + windows_client.contains("name: cmd installer smoke check") + && windows_client.contains("DOSH_INSTALL_PS1=") + && windows_client.contains("call install.cmd ok") + && windows_client.contains("find /I \";{1}\\dosh-smoke-bin;\""), + "Windows CI must execute the cmd wrapper against a local installer stub" + ); assert!( windows_client.contains("run: cargo test --all-targets"), "Windows CI must run Rust tests, not only build/package" @@ -259,6 +266,8 @@ fn windows_cmd_installer_wraps_native_powershell_installer() { assert!(cmd.contains("for %%P in (powershell.exe pwsh.exe powershell pwsh) do")); assert!(cmd.contains("set \"TMP_BINDIR=%TEMP%\\dosh-install-%RANDOM%-%RANDOM%.bindir\"")); assert!(cmd.contains("set \"DOSH_INSTALL_BINDIR_FILE=%TMP_BINDIR%\"")); + assert!(cmd.contains("if exist \"%SCRIPT_URL%\" (")); + assert!(cmd.contains("copy /Y \"%SCRIPT_URL%\" \"%TMP_PS%\"")); assert!(cmd.contains("Invoke-WebRequest -UseBasicParsing")); assert!(cmd.contains("-ExecutionPolicy Bypass -File \"%TMP_PS%\" %*")); assert!(cmd.contains(