diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 85e6152..1ea2eaa 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -4,6 +4,14 @@ name: ci # path: resolve, download, verify against SHA256SUMS, extract, PATH, install the # engine, wait for it, and run a container through it. The stage-only path # (install: false) and the GitLab-style script call are covered too. +# +# All of that needs a release to install, and the newest one may still predate +# the Skrog rename (#1) -- every release through v0.3.1 publishes +# hawser__windows_.zip, which this action deliberately no longer +# knows how to fetch. The probe below decides: the download jobs run once a +# release carries a skrog-named asset, and are skipped with a reason until then. +# It is not a temporary hack -- "there is nothing published to install" is a +# real state for an installer's CI, and this reports it instead of failing. on: push: @@ -14,52 +22,95 @@ permissions: contents: read jobs: + release-ready: + name: is there a skrog-named release to install? + runs-on: ubuntu-latest + outputs: + ready: ${{ steps.probe.outputs.ready }} + steps: + - id: probe + shell: bash + env: + GH_TOKEN: ${{ github.token }} + # set -e matters: an API or auth failure must fail this job, so a broken + # probe can never quietly skip the whole suite. gh's own --jq is used + # rather than piping to jq, so the same command is runnable anywhere gh + # is -- including a maintainer's laptop, which is how this was checked. + run: | + set -euo pipefail + out=$(gh api 'repos/wslkit/skrog/releases?per_page=50' --jq ' + [ .[] | select(.draft | not) + | select(.tag_name | test("^v[0-9]+[.][0-9]+[.][0-9]+$")) ] + | sort_by(.created_at) | reverse | .[0] // empty + | "\(.tag_name) \([.assets[].name | select(startswith("skrog_"))] | length)"') + if [ -z "$out" ]; then + echo "no published app release in wslkit/skrog yet; nothing to install" + echo "ready=false" >> "$GITHUB_OUTPUT" + exit 0 + fi + tag=${out% *} + n=${out##* } + if [ "$n" -gt 0 ]; then + echo "newest release $tag ships $n skrog-named asset(s); running the download jobs" + echo "ready=true" >> "$GITHUB_OUTPUT" + else + echo "newest release $tag predates the rename, so it has no skrog_* asset." + echo "Skipping the download jobs until v0.4.0 is published." + echo "ready=false" >> "$GITHUB_OUTPUT" + fi + install-via-action: name: action installs the engine and docker runs (windows-latest) + needs: release-ready + if: needs.release-ready.outputs.ready == 'true' runs-on: windows-latest steps: - uses: actions/checkout@v4 - - id: hawser + - id: skrog uses: ./ - - name: docker targets the Hawser engine + - name: docker targets the Skrog engine shell: pwsh run: | - if ($env:DOCKER_CONTEXT -ne 'hawser') { throw "DOCKER_CONTEXT is '$env:DOCKER_CONTEXT', expected 'hawser'" } - if ("${{ steps.hawser.outputs.docker-context }}" -ne 'hawser') { throw "docker-context output is not 'hawser'" } + if ($env:DOCKER_CONTEXT -ne 'skrog') { throw "DOCKER_CONTEXT is '$env:DOCKER_CONTEXT', expected 'skrog'" } + if ("${{ steps.skrog.outputs.docker-context }}" -ne 'skrog') { throw "docker-context output is not 'skrog'" } docker version if ($LASTEXITCODE -ne 0) { throw "docker version failed ($LASTEXITCODE)" } $name = docker info --format '{{.Name}}' Write-Host "engine host: $name" docker run --rm hello-world if ($LASTEXITCODE -ne 0) { throw "docker run hello-world failed ($LASTEXITCODE)" } - hawser status --json | Out-Host + skrog status --json | Out-Host exit 0 stage-via-action: - name: install=false only stages hawser.exe + name: install=false only stages skrog.exe + needs: release-ready + if: needs.release-ready.outputs.ready == 'true' runs-on: windows-latest steps: - uses: actions/checkout@v4 - - id: hawser + - id: skrog uses: ./ with: install: 'false' - - name: hawser.exe is on PATH and reports its version + - name: skrog.exe is on PATH and reports its version shell: pwsh run: | - $out = & hawser version 2>&1 | Out-String + $out = & skrog version 2>&1 | Out-String $code = $LASTEXITCODE Write-Host $out # 3 = no engine installed, which is exactly this runner's state. - if ($code -ne 0 -and $code -ne 3) { throw "hawser version exited $code" } - if (-not "${{ steps.hawser.outputs.version }}") { throw "action reported no version output" } - if ($env:HAWSER_HOME -ne "${{ steps.hawser.outputs.home }}") { throw "HAWSER_HOME and the home output disagree" } - Write-Host "staged hawser ${{ steps.hawser.outputs.version }} at ${{ steps.hawser.outputs.home }}" + if ($code -ne 0 -and $code -ne 3) { throw "skrog version exited $code" } + if (-not "${{ steps.skrog.outputs.version }}") { throw "action reported no version output" } + if ($env:SKROG_HOME -ne "${{ steps.skrog.outputs.home }}") { throw "SKROG_HOME and the home output disagree" } + Write-Host "staged skrog ${{ steps.skrog.outputs.version }} at ${{ steps.skrog.outputs.home }}" # The step's exit code is the last native command's; don't leak the 3. exit 0 stage-via-script: - name: script stages hawser.exe (GitLab-style) + name: script stages skrog.exe (GitLab-style) + needs: release-ready + if: needs.release-ready.outputs.ready == 'true' runs-on: windows-latest steps: - uses: actions/checkout@v4 @@ -68,9 +119,9 @@ jobs: env: GH_TOKEN: ${{ github.token }} run: | - pwsh -File scripts/install-hawser.ps1 -Install:$false -Dest "$env:RUNNER_TEMP\hawser-script" + pwsh -File scripts/install-skrog.ps1 -Install:$false -Dest "$env:RUNNER_TEMP\skrog-script" if ($LASTEXITCODE -ne 0) { throw "script exited $LASTEXITCODE" } - if (-not (Test-Path "$env:RUNNER_TEMP\hawser-script\bin\hawser.exe")) { throw "hawser.exe not staged" } + if (-not (Test-Path "$env:RUNNER_TEMP\skrog-script\bin\skrog.exe")) { throw "skrog.exe not staged" } exit 0 lint: diff --git a/README.md b/README.md index b798514..dc16030 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,27 @@ -# setup-hawser +# setup-skrog -Install a pinned [Hawser](https://github.com/hawserhq/hawser) — the upstream +Install a pinned [Skrog](https://github.com/wslkit/skrog) — the upstream open source Docker Engine on Windows via WSL2 — on a Windows runner, verified against the release's `SHA256SUMS`, and wait for the engine to answer. One line replaces Docker Desktop on the runner: no per-runner license, no auto-updates you did not schedule, and the same pinned engine your developers run. ```yaml -- uses: hawserhq/setup-hawser@v1 +- uses: wslkit/setup-skrog@v1 with: version: 0.3.0 # or omit: "latest" - run: docker run --rm hello-world ``` -After the step, `docker` targets the engine (the `hawser` docker context is +After the step, `docker` targets the engine (the `skrog` docker context is exported as `DOCKER_CONTEXT`), so compose, Testcontainers, Dev Containers and anything else that follows docker follow it too. ## Laptop == runner: the lockfile -Commit a `hawser.lock` (`hawser lock` writes one) and the action installs +Commit a `skrog.lock` (`skrog lock` writes one) and the action installs **exactly that engine** — dockerd, containerd, runc, BuildKit to the commit — -while `hawser install --locked hawser.lock` does the same on a laptop. "Works +while `skrog install --locked skrog.lock` does the same on a laptop. "Works locally, fails in CI" from engine drift stops being a category. The lock is auto-detected in the working directory, or pointed at with `lockfile:`. @@ -31,21 +31,21 @@ Installing the engine needs WSL2. **GitHub-hosted `windows-latest` runners have it** — this repo's own CI installs the engine and runs `docker run hello-world` on one — and so does any self-hosted Windows runner with WSL2 enabled. On a machine without WSL2 the action fails with a clear "WSL2 is not available" -message; use `install: false` there to stage `hawser.exe` on PATH only (useful -for `hawser bundle`, `hawser lock`, packaging steps). +message; use `install: false` there to stage `skrog.exe` on PATH only (useful +for `skrog bundle`, `skrog lock`, packaging steps). Self-hosted runners also need a logged-on session for WSL2 — see -[auto-logon-runner.md](https://github.com/hawserhq/hawser/blob/main/docs/auto-logon-runner.md); -`hawser runner check` verifies that setup. +[auto-logon-runner.md](https://github.com/wslkit/skrog/blob/main/docs/auto-logon-runner.md); +`skrog runner check` verifies that setup. ## Inputs | Input | Default | What it does | | --- | --- | --- | -| `version` | `latest` | Hawser release to install, e.g. `0.3.0` | -| `lockfile` | `` | Path to a `hawser.lock` (auto-detects `./hawser.lock`) | -| `install` | `true` | Install and start the engine; `false` stages `hawser.exe` only | -| `install-args` | `` | Extra `hawser install` arguments | +| `version` | `latest` | Skrog release to install, e.g. `0.3.0` | +| `lockfile` | `` | Path to a `skrog.lock` (auto-detects `./skrog.lock`) | +| `install` | `true` | Install and start the engine; `false` stages `skrog.exe` only | +| `install-args` | `` | Extra `skrog install` arguments | | `wait` | `3m` | How long to wait for the engine to answer | | `token` | `${{ github.token }}` | For the release API when resolving `latest` | @@ -53,9 +53,9 @@ Self-hosted runners also need a logged-on session for WSL2 — see | Output | Meaning | | --- | --- | -| `version` | Installed Hawser version | -| `home` | Directory holding `hawser.exe` (on PATH; also `HAWSER_HOME`) | -| `docker-context` | `hawser` — the docker context targeting the engine | +| `version` | Installed Skrog version | +| `home` | Directory holding `skrog.exe` (on PATH; also `SKROG_HOME`) | +| `docker-context` | `skrog` — the docker context targeting the engine | ## GitLab and other CI @@ -64,9 +64,9 @@ runs the same logic. In `.gitlab-ci.yml` on a Windows runner: ```yaml before_script: - - Invoke-WebRequest https://raw.githubusercontent.com/hawserhq/setup-hawser/v1/scripts/install-hawser.ps1 -OutFile install-hawser.ps1 - - pwsh -File install-hawser.ps1 -Version 0.3.0 - - $env:DOCKER_CONTEXT = 'hawser' + - Invoke-WebRequest https://raw.githubusercontent.com/wslkit/setup-skrog/v1/scripts/install-skrog.ps1 -OutFile install-skrog.ps1 + - pwsh -File install-skrog.ps1 -Version 0.3.0 + - $env:DOCKER_CONTEXT = 'skrog' ``` Pin the script by tag, exactly as you would pin the action. The script has the @@ -76,29 +76,29 @@ same parameters as the inputs above (`-Version`, `-Lockfile`, `-Install`, ## What the action does, precisely 1. Resolves the release (or uses the pinned version). -2. Downloads `hawser__windows_.zip` and `SHA256SUMS` from the +2. Downloads `skrog__windows_.zip` and `SHA256SUMS` from the GitHub release and **refuses on any checksum mismatch**. -3. Extracts, puts `hawser.exe` on `PATH`, exports `HAWSER_HOME`. +3. Extracts, puts `skrog.exe` on `PATH`, exports `SKROG_HOME`. 4. With `install: true`: checks WSL2 is available, runs - `hawser install --headless --no-autostart` (plus `--locked` when a lock is - present and the release supports it), `hawser start`, then waits with - `hawser healthcheck --wait` (or by polling `status --json` on releases that - predate `healthcheck`), and exports `DOCKER_CONTEXT=hawser`. + `skrog install --headless --no-autostart` (plus `--locked` when a lock is + present and the release supports it), `skrog start`, then waits with + `skrog healthcheck --wait` (or by polling `status --json` on releases that + predate `healthcheck`), and exports `DOCKER_CONTEXT=skrog`. -Nothing is fetched as "latest" inside Hawser itself: the release pins its engine +Nothing is fetched as "latest" inside Skrog itself: the release pins its engine rootfs by SHA-256, and the lockfile pins it to the commit. ## Runners without a docker CLI -`hawser cli install` installs the upstream docker CLI + compose + buildx on the +`skrog cli install` installs the upstream docker CLI + compose + buildx on the runner (checksum-pinned), if the runner image has none: ```yaml -- uses: hawserhq/setup-hawser@v1 -- run: hawser cli install --no-path +- uses: wslkit/setup-skrog@v1 +- run: skrog cli install --no-path ``` ## License -[Apache-2.0](LICENSE). Hawser is not affiliated with or endorsed by Docker, Inc.; +[Apache-2.0](LICENSE). Skrog is not affiliated with or endorsed by Docker, Inc.; Docker is a trademark of Docker, Inc. diff --git a/action.yml b/action.yml index 88090d2..917059d 100644 --- a/action.yml +++ b/action.yml @@ -1,31 +1,31 @@ -name: 'Setup Hawser' +name: 'Setup Skrog' description: >- - Install a pinned Hawser (upstream Docker Engine on Windows via WSL2) on a + Install a pinned Skrog (upstream Docker Engine on Windows via WSL2) on a Windows runner, verified against the release's SHA256SUMS, and wait for the engine to answer. One line replaces Docker Desktop on the runner. -author: 'hawserhq' +author: 'wslkit' branding: icon: 'anchor' color: 'blue' inputs: version: - description: 'Hawser release to install (e.g. 0.3.0). "latest" resolves the newest release.' + description: 'Skrog release to install (e.g. 0.3.0). "latest" resolves the newest release.' required: false default: 'latest' lockfile: - description: 'Path to a hawser.lock that pins the engine (install --locked). Empty auto-detects ./hawser.lock.' + description: 'Path to a skrog.lock that pins the engine (install --locked). Empty auto-detects ./skrog.lock.' required: false default: '' install: description: >- - Run `hawser install` and start the engine (needs WSL2 on the runner; - GitHub-hosted windows-latest has it). "false" only stages hawser.exe + Run `skrog install` and start the engine (needs WSL2 on the runner; + GitHub-hosted windows-latest has it). "false" only stages skrog.exe on PATH. required: false default: 'true' install-args: - description: 'Extra arguments appended to `hawser install` (e.g. --engine-version 29.8.0).' + description: 'Extra arguments appended to `skrog install` (e.g. --engine-version 29.8.0).' required: false default: '' wait: @@ -39,20 +39,20 @@ inputs: outputs: version: - description: 'The Hawser version that was installed.' + description: 'The Skrog version that was installed.' value: ${{ steps.run.outputs.version }} home: - description: 'Directory holding hawser.exe (also added to PATH and exported as HAWSER_HOME).' + description: 'Directory holding skrog.exe (also added to PATH and exported as SKROG_HOME).' value: ${{ steps.run.outputs.home }} docker-context: description: 'The docker context that targets the engine after install (also exported as DOCKER_CONTEXT).' - value: 'hawser' + value: 'skrog' runs: using: 'composite' steps: # One script does the work so GitLab and other CI systems run the exact same - # logic (scripts/install-hawser.ps1); the action only maps inputs onto it. + # logic (scripts/install-skrog.ps1); the action only maps inputs onto it. # Inputs reach the script through env, never spliced into the command line. - id: run shell: pwsh @@ -65,7 +65,7 @@ runs: GH_TOKEN: ${{ inputs.token }} run: | $install = $env:INPUT_INSTALL -ne 'false' - & "$env:GITHUB_ACTION_PATH/scripts/install-hawser.ps1" ` + & "$env:GITHUB_ACTION_PATH/scripts/install-skrog.ps1" ` -Version $env:INPUT_VERSION ` -Lockfile $env:INPUT_LOCKFILE ` -Install $install ` diff --git a/scripts/install-hawser.ps1 b/scripts/install-skrog.ps1 similarity index 73% rename from scripts/install-hawser.ps1 rename to scripts/install-skrog.ps1 index f98bbd3..ec8ff6b 100644 --- a/scripts/install-hawser.ps1 +++ b/scripts/install-skrog.ps1 @@ -1,27 +1,27 @@ <# .SYNOPSIS - Install a pinned Hawser release on Windows: download the zip for this - architecture, verify it against the release's SHA256SUMS, put hawser.exe on + Install a pinned Skrog release on Windows: download the zip for this + architecture, verify it against the release's SHA256SUMS, put skrog.exe on PATH, and (optionally) install + start the engine and wait until it answers. .DESCRIPTION - One script, two callers: the setup-hawser GitHub Action, and GitLab or any + One script, two callers: the setup-skrog GitHub Action, and GitLab or any other CI via before_script. Nothing is fetched as "latest" unless you ask for - it: -Version pins the Hawser release, and a hawser.lock (auto-detected in the + it: -Version pins the Skrog release, and a skrog.lock (auto-detected in the working directory, or -Lockfile) pins the engine it installs -- so a laptop and a runner converge on the same engine. Feature detection keeps it working with older releases: `--locked` and - `hawser healthcheck` are used only when the installed hawser supports them. + `skrog healthcheck` are used only when the installed skrog supports them. WSL2 is required to install the engine (GitHub-hosted windows-latest runners have it). On a machine without WSL2, run with -Install:$false to stage - hawser.exe only. + skrog.exe only. .EXAMPLE - pwsh -File install-hawser.ps1 -Version 0.3.0 + pwsh -File install-skrog.ps1 -Version 0.3.0 .EXAMPLE - pwsh -File install-hawser.ps1 -Install:$false # stage hawser.exe only + pwsh -File install-skrog.ps1 -Install:$false # stage skrog.exe only #> [CmdletBinding()] param( @@ -35,11 +35,11 @@ param( ) $ErrorActionPreference = 'Stop' # pwsh 7.4+ turns a native command's non-zero exit into a terminating error under -# ErrorActionPreference=Stop. This script inspects exit codes itself (`hawser +# ErrorActionPreference=Stop. This script inspects exit codes itself (`skrog # version` legitimately exits 3 with no engine; `wsl --status` fails where WSL2 # is absent), so keep native exit codes as data, not exceptions. $PSNativeCommandUseErrorActionPreference = $false -$repo = 'hawserhq/hawser' +$repo = 'wslkit/skrog' # Out-CI appends a line to a GitHub Actions command file when running there; # elsewhere (GitLab, a laptop) the variables are simply unset and nothing happens. @@ -50,30 +50,30 @@ function Out-CI([string]$file, [string]$line) { # --- 1. resolve the release -------------------------------------------------- $Version = $Version -replace '^v', '' if (-not $Version -or $Version -eq 'latest') { - # The hawser repo also publishes rootfs releases (tags rootfs-*), and + # The skrog repo also publishes rootfs releases (tags rootfs-*), and # GitHub's /releases/latest can return one of those. "Latest" here means the # newest published app release: a v tag that is not a draft. Every # pre-1.0 release is flagged prerelease, so a stable one is preferred when it # exists but a prerelease is not excluded. - $headers = @{ 'User-Agent' = 'setup-hawser' } + $headers = @{ 'User-Agent' = 'setup-skrog' } if ($Token) { $headers['Authorization'] = "Bearer $Token" } $rels = Invoke-RestMethod -Headers $headers "https://api.github.com/repos/$repo/releases?per_page=50" $apps = @($rels | Where-Object { $_.tag_name -match '^v\d+\.\d+\.\d+$' -and -not $_.draft } | Sort-Object { [version]($_.tag_name -replace '^v', '') } -Descending) $app = @($apps | Where-Object { -not $_.prerelease })[0] if (-not $app) { $app = $apps[0] } - if (-not $app) { throw "no published hawser release found in $repo" } + if (-not $app) { throw "no published skrog release found in $repo" } $Version = $app.tag_name -replace '^v', '' } -Write-Host "hawser $Version" +Write-Host "skrog $Version" # --- 2. download and verify -------------------------------------------------- $arch = if ([System.Runtime.InteropServices.RuntimeInformation]::OSArchitecture -eq 'Arm64') { 'arm64' } else { 'amd64' } -$zip = "hawser_${Version}_windows_$arch.zip" +$zip = "skrog_${Version}_windows_$arch.zip" $base = "https://github.com/$repo/releases/download/v$Version" if (-not $Dest) { $tmp = if ($env:RUNNER_TEMP) { $env:RUNNER_TEMP } else { $env:TEMP } - $Dest = Join-Path $tmp "hawser-$Version" + $Dest = Join-Path $tmp "skrog-$Version" } New-Item -ItemType Directory -Force $Dest | Out-Null $zipPath = Join-Path $Dest $zip @@ -91,19 +91,19 @@ Write-Host "verified $zip (sha256 $actual)" $bin = Join-Path $Dest 'bin' Expand-Archive $zipPath -DestinationPath $bin -Force -$hawser = Join-Path $bin 'hawser.exe' -if (-not (Test-Path $hawser)) { throw "hawser.exe not found after extracting $zip" } +$skrog = Join-Path $bin 'skrog.exe' +if (-not (Test-Path $skrog)) { throw "skrog.exe not found after extracting $zip" } # --- 3. expose --------------------------------------------------------------- $env:Path = "$bin;$env:Path" Out-CI $env:GITHUB_PATH $bin -Out-CI $env:GITHUB_ENV "HAWSER_HOME=$bin" +Out-CI $env:GITHUB_ENV "SKROG_HOME=$bin" Out-CI $env:GITHUB_OUTPUT "version=$Version" Out-CI $env:GITHUB_OUTPUT "home=$bin" -# `hawser version` exits 3 with no engine installed; that is expected here. -& $hawser version 2>$null | Out-Host +# `skrog version` exits 3 with no engine installed; that is expected here. +& $skrog version 2>$null | Out-Host if (-not $Install) { - Write-Host "hawser $Version staged at $bin (engine install skipped)" + Write-Host "skrog $Version staged at $bin (engine install skipped)" exit 0 } @@ -112,31 +112,31 @@ if (-not $Install) { if ($LASTEXITCODE -ne 0) { throw ("WSL2 is not available on this machine (`wsl --status` failed). Enable WSL2 on the runner " + "(wsl --install --no-distribution, then reboot), or run with -Install:`$false " + - "(action input install: false) to stage hawser.exe only.") + "(action input install: false) to stage skrog.exe only.") } # --- 5. install the engine (feature-detecting what this release supports) ---- -$installHelp = (& $hawser install --help 2>&1 | Out-String) +$installHelp = (& $skrog install --help 2>&1 | Out-String) # Not $args (an automatic variable this script also splats), and not # $installArgs either: PowerShell variable names are case-insensitive, so that # one IS the -InstallArgs parameter, and assigning to it fed the arguments back # into themselves. $cmdArgs = @('install', '--headless', '--no-autostart') -if (-not $Lockfile -and (Test-Path 'hawser.lock')) { $Lockfile = 'hawser.lock' } +if (-not $Lockfile -and (Test-Path 'skrog.lock')) { $Lockfile = 'skrog.lock' } if ($Lockfile) { if ($installHelp -match '--locked') { $cmdArgs += @('--locked', $Lockfile) } - else { Write-Warning "hawser $Version does not support --locked; ignoring $Lockfile" } + else { Write-Warning "skrog $Version does not support --locked; ignoring $Lockfile" } } if ($InstallArgs) { $cmdArgs += ($InstallArgs -split ' ' | Where-Object { $_ }) } -& $hawser @cmdArgs -if ($LASTEXITCODE -ne 0) { throw "hawser install failed (exit $LASTEXITCODE)" } -& $hawser start -if ($LASTEXITCODE -ne 0) { throw "hawser start failed (exit $LASTEXITCODE)" } +& $skrog @cmdArgs +if ($LASTEXITCODE -ne 0) { throw "skrog install failed (exit $LASTEXITCODE)" } +& $skrog start +if ($LASTEXITCODE -ne 0) { throw "skrog start failed (exit $LASTEXITCODE)" } # --- 6. wait until docker commands will succeed ------------------------------- -$topHelp = (& $hawser --help 2>&1 | Out-String) +$topHelp = (& $skrog --help 2>&1 | Out-String) if ($topHelp -match 'healthcheck') { - & $hawser healthcheck --wait $Wait + & $skrog healthcheck --wait $Wait if ($LASTEXITCODE -ne 0) { throw "engine not ready after $Wait" } } else { # Older release: poll status --json ourselves. @@ -148,15 +148,15 @@ if ($topHelp -match 'healthcheck') { } $deadline = (Get-Date).AddSeconds($secs) do { - $st = (& $hawser status --json 2>$null | Out-String | ConvertFrom-Json) + $st = (& $skrog status --json 2>$null | Out-String | ConvertFrom-Json) if ($st.supervisor -eq 'running' -and $st.engine -in @('running', 'idle')) { break } Start-Sleep -Seconds 2 } while ((Get-Date) -lt $deadline) if (-not ($st.supervisor -eq 'running' -and $st.engine -in @('running', 'idle'))) { throw "engine not ready after $Wait" } } -# docker follows the context Hawser wired at install; anything else in the job +# docker follows the context Skrog wired at install; anything else in the job # (compose, Testcontainers, Dev Containers) follows docker. -Out-CI $env:GITHUB_ENV 'DOCKER_CONTEXT=hawser' -Write-Host "engine ready; docker context 'hawser' targets it" -& $hawser status --json | Out-Host +Out-CI $env:GITHUB_ENV 'DOCKER_CONTEXT=skrog' +Write-Host "engine ready; docker context 'skrog' targets it" +& $skrog status --json | Out-Host