fix: accept plugin install options before the repository #3343
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| pull_request: | |
| types: [opened, synchronize, reopened] | |
| push: | |
| branches: [master, windows] | |
| permissions: | |
| contents: read | |
| env: | |
| RUST_TOOLCHAIN_VERSION: 1.96.1 | |
| # Keep file/line backtraces without generating type and variable debug information. | |
| CARGO_PROFILE_DEV_DEBUG: "1" | |
| CARGO_PROFILE_TEST_DEBUG: "1" | |
| # Persist both Zig caches; local build outputs otherwise stay in the uncached vendor tree. | |
| ZIG_GLOBAL_CACHE_DIR: ${{ github.workspace }}/.zig-cache | |
| ZIG_LOCAL_CACHE_DIR: ${{ github.workspace }}/.zig-cache | |
| concurrency: | |
| group: ci-${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} | |
| cancel-in-progress: true | |
| jobs: | |
| conventional-commits: | |
| if: github.event_name != 'push' || github.ref_name == 'master' | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 5 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 | |
| with: | |
| fetch-depth: 0 | |
| persist-credentials: false | |
| - name: Validate commit subjects | |
| if: github.event_name == 'push' | |
| run: python3 scripts/conventional_commits.py --range "${{ github.event.before }}..${{ github.event.after }}" | |
| - name: Validate PR title | |
| if: github.event_name == 'pull_request' | |
| env: | |
| PR_TITLE: ${{ github.event.pull_request.title }} | |
| run: python3 scripts/conventional_commits.py "$PR_TITLE" | |
| check: | |
| name: check (${{ matrix.os }}) | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| kind: unix | |
| nextest_filter: all() | |
| - os: macos-latest | |
| kind: unix | |
| nextest_filter: not binary(live_handoff) | |
| - os: windows-latest | |
| kind: windows | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 15 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 | |
| with: | |
| persist-credentials: false | |
| - name: Install Rust | |
| if: matrix.kind == 'unix' | |
| uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # v1 | |
| with: | |
| toolchain: ${{ env.RUST_TOOLCHAIN_VERSION }} | |
| components: rustfmt,clippy | |
| - name: Install Rust | |
| if: matrix.kind == 'windows' | |
| uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # v1 | |
| with: | |
| toolchain: ${{ env.RUST_TOOLCHAIN_VERSION }} | |
| components: rustfmt,clippy | |
| targets: x86_64-pc-windows-msvc | |
| - name: Install Rust tools | |
| uses: taiki-e/install-action@fd2f5e3d644b484055ebf4268f474c565f148f25 # v2.81.9 | |
| with: | |
| tool: just,cargo-nextest | |
| - name: Install Bun | |
| uses: oven-sh/setup-bun@0c5077e51419868618aeaa5fe8019c62421857d6 # v2 | |
| with: | |
| bun-version: 1.3.14 | |
| - name: Install Zig | |
| uses: vercel-labs/setup-zig@83c1594f26b86da8a9a8ddd9b5ee5f3af0f96943 # v1.0.2 | |
| with: | |
| version: 0.16.0 | |
| # Zig's C-header cache keys include the compiler installation path. | |
| - name: Stabilize Zig installation path on Unix | |
| if: matrix.kind == 'unix' | |
| run: | | |
| stable_zig="$RUNNER_TEMP/herdr-zig-0.16.0" | |
| mv "$(dirname "$(command -v zig)")" "$stable_zig" | |
| echo "$stable_zig" >> "$GITHUB_PATH" | |
| echo "ZIG=$stable_zig/zig" >> "$GITHUB_ENV" | |
| - name: Stabilize Zig installation path on Windows | |
| if: matrix.kind == 'windows' | |
| shell: pwsh | |
| run: | | |
| $source = Split-Path (Get-Command zig).Source | |
| $stable = Join-Path $env:RUNNER_TEMP "herdr-zig-0.16.0" | |
| Move-Item -LiteralPath $source -Destination $stable | |
| $stable | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
| "ZIG=$(Join-Path $stable 'zig.exe')" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
| - name: Restore Zig build cache | |
| uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: .zig-cache | |
| key: zig-build-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0-${{ github.run_id }}-${{ github.run_attempt }} | |
| restore-keys: | | |
| zig-build-v1-${{ runner.os }}-${{ runner.arch }}-0.16.0- | |
| - name: Restore cargo cache | |
| uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 | |
| with: | |
| cache-bin: false | |
| key: ${{ matrix.os }} | |
| # Save before rust-cache's post-step removes incremental state. Cargo still | |
| # rebuilds workspace targets; only rustc's validated query state is retained. | |
| - name: Restore Windows incremental compiler state | |
| if: matrix.kind == 'windows' | |
| uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: target/debug/incremental | |
| key: ci-incremental-v1-${{ runner.os }}-${{ runner.arch }}-${{ env.RUST_TOOLCHAIN_VERSION }}-${{ env.CARGO_PROFILE_DEV_DEBUG }}-${{ env.CARGO_PROFILE_TEST_DEBUG }}-${{ hashFiles('Cargo.lock', 'Cargo.toml', '.cargo/config.toml', 'build.rs') }}-${{ github.sha }} | |
| restore-keys: | | |
| ci-incremental-v1-${{ runner.os }}-${{ runner.arch }}-${{ env.RUST_TOOLCHAIN_VERSION }}-${{ env.CARGO_PROFILE_DEV_DEBUG }}-${{ env.CARGO_PROFILE_TEST_DEBUG }}-${{ hashFiles('Cargo.lock', 'Cargo.toml', '.cargo/config.toml', 'build.rs') }}- | |
| - name: Run Linux lint | |
| if: runner.os == 'Linux' | |
| run: just lint | |
| - name: Run Linux tests | |
| if: runner.os == 'Linux' | |
| run: CARGO_INCREMENTAL=1 just ci-tests '${{ matrix.nextest_filter }}' | |
| - name: Run macOS checks | |
| if: runner.os == 'macOS' | |
| run: just ci '${{ matrix.nextest_filter }}' | |
| - name: Check scalar libghostty with runtime safety | |
| if: runner.os == 'Linux' | |
| env: | |
| LIBGHOSTTY_VT_SIMD: "false" | |
| LIBGHOSTTY_VT_OPTIMIZE: ReleaseSafe | |
| run: CARGO_INCREMENTAL=1 just test-one ghostty | |
| - name: Run Windows checks | |
| if: matrix.kind == 'windows' | |
| shell: pwsh | |
| run: | | |
| $env:CARGO_INCREMENTAL = "1" | |
| just check | |
| - name: Smoke ConPTY pane | |
| if: matrix.kind == 'windows' | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = "Stop" | |
| $exe = Join-Path $PWD "target\debug\herdr.exe" | |
| .\scripts\windows_smoke_conpty_path.ps1 -ExePath $exe -Session "ci-windows-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" | |
| windows-conpty-package: | |
| name: Windows ConPTY package | |
| runs-on: windows-2022 | |
| timeout-minutes: 25 | |
| steps: | |
| - name: Checkout | |
| uses: actions/checkout@df4cb1c069e1874edd31b4311f1884172cec0e10 # v6 | |
| with: | |
| persist-credentials: false | |
| - name: Install Rust | |
| uses: dtolnay/rust-toolchain@29eef336d9b2848a0b548edc03f92a220660cdb8 # v1 | |
| with: | |
| toolchain: ${{ env.RUST_TOOLCHAIN_VERSION }} | |
| targets: x86_64-pc-windows-msvc | |
| - name: Install Zig | |
| uses: vercel-labs/setup-zig@83c1594f26b86da8a9a8ddd9b5ee5f3af0f96943 # v1.0.2 | |
| with: | |
| version: 0.16.0 | |
| - name: Stabilize Zig installation path | |
| shell: pwsh | |
| run: | | |
| $source = Split-Path (Get-Command zig).Source | |
| $stable = Join-Path $env:RUNNER_TEMP "herdr-zig-0.16.0" | |
| Move-Item -LiteralPath $source -Destination $stable | |
| $stable | Out-File -FilePath $env:GITHUB_PATH -Encoding utf8 -Append | |
| "ZIG=$(Join-Path $stable 'zig.exe')" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
| - name: Restore Zig build cache | |
| uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 | |
| with: | |
| path: .zig-cache | |
| key: zig-build-v1-conpty-package-windows-2022-${{ runner.arch }}-0.16.0-${{ github.run_id }}-${{ github.run_attempt }} | |
| restore-keys: | | |
| zig-build-v1-conpty-package-windows-2022-${{ runner.arch }}-0.16.0- | |
| - name: Restore Cargo cache | |
| uses: Swatinem/rust-cache@e18b497796c12c097a38f9edb9d0641fb99eee32 # v2 | |
| with: | |
| cache-bin: false | |
| key: conpty-package-windows-2022 | |
| - name: Build Herdr | |
| run: cargo build --locked --target x86_64-pc-windows-msvc | |
| - name: Verify invalid bundle is rejected and system override recovers | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = "Stop" | |
| Remove-Item Env:HERDR_SOCKET_PATH, Env:HERDR_CLIENT_SOCKET_PATH -ErrorAction SilentlyContinue | |
| $exe = Join-Path $PWD "target\x86_64-pc-windows-msvc\debug\herdr.exe" | |
| $bundle = Join-Path (Split-Path -Parent $exe) "conpty" | |
| New-Item -ItemType Directory -Force -Path (Join-Path $bundle "x64"), (Join-Path $bundle "arm64") | Out-Null | |
| Set-Content -LiteralPath (Join-Path $bundle "herdr-conpty.json") -Value "{}" -Encoding ascii | |
| [System.IO.File]::WriteAllBytes((Join-Path $bundle "conpty.dll"), [byte[]](0x48, 0x45, 0x52, 0x44, 0x52)) | |
| [System.IO.File]::WriteAllBytes((Join-Path $bundle "x64\OpenConsole.exe"), [byte[]](0x48, 0x45, 0x52, 0x44, 0x52)) | |
| [System.IO.File]::WriteAllBytes((Join-Path $bundle "arm64\OpenConsole.exe"), [byte[]](0x48, 0x45, 0x52, 0x44, 0x52)) | |
| try { | |
| $rejected = $false | |
| try { | |
| .\scripts\windows_smoke_conpty_path.ps1 ` | |
| -ExePath $exe ` | |
| -Session "ci-conpty-invalid-windows-2022-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" | |
| } catch { | |
| if ($_.Exception.Message -notlike "workspace create failed with exit code*") { | |
| throw | |
| } | |
| $rejected = $true | |
| } | |
| if (-not $rejected) { | |
| throw "Herdr accepted a tampered app-local ConPTY bundle" | |
| } | |
| $env:HERDR_WINDOWS_CONPTY = "system" | |
| .\scripts\windows_smoke_conpty_path.ps1 ` | |
| -ExePath $exe ` | |
| -Session "ci-conpty-system-windows-2022-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" | |
| } finally { | |
| Remove-Item Env:HERDR_WINDOWS_CONPTY -ErrorAction SilentlyContinue | |
| Remove-Item -LiteralPath $bundle -Recurse -Force -ErrorAction SilentlyContinue | |
| } | |
| - name: Build and verify official ConPTY package | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = "Stop" | |
| $package = Join-Path $env:RUNNER_TEMP "Microsoft.Windows.Console.ConPTY.nupkg" | |
| $stage = Join-Path $env:RUNNER_TEMP "herdr-windows-x86_64" | |
| New-Item -ItemType Directory -Force -Path artifacts | Out-Null | |
| .\scripts\package_windows_conpty.ps1 ` | |
| -HerdrExe target\x86_64-pc-windows-msvc\debug\herdr.exe ` | |
| -PackagePath $package ` | |
| -StageDir $stage ` | |
| -OutputPath artifacts\herdr-windows-x86_64.zip | |
| "HERDR_CONPTY_PACKAGE_DIR=$stage" | Out-File -FilePath $env:GITHUB_ENV -Encoding utf8 -Append | |
| - name: Probe enhanced pane input with bundled ConPTY | |
| shell: pwsh | |
| run: | | |
| $ErrorActionPreference = "Stop" | |
| $exe = Join-Path $env:HERDR_CONPTY_PACKAGE_DIR "herdr.exe" | |
| $consoleHost = Join-Path $env:HERDR_CONPTY_PACKAGE_DIR "conpty\x64\OpenConsole.exe" | |
| .\scripts\windows_conpty_enhanced_input_probe.ps1 ` | |
| -ExePath $exe ` | |
| -Session "ci-conpty-bundled-windows-2022-$env:GITHUB_RUN_ID-$env:GITHUB_RUN_ATTEMPT" ` | |
| -ExpectedConsoleHostPath $consoleHost | |
| - name: Test packaged installer and repair with Windows PowerShell 5.1 | |
| shell: pwsh | |
| run: | | |
| & powershell.exe -NoProfile -ExecutionPolicy Bypass -File ` | |
| .\scripts\windows_install_conpty_package_test.ps1 ` | |
| -ArchivePath artifacts\herdr-windows-x86_64.zip | |
| if ($LASTEXITCODE -ne 0) { | |
| throw "Windows PowerShell installer test failed with exit code $LASTEXITCODE" | |
| } |