Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 29 additions & 0 deletions .github/actions/setup-e2e-sandbox/action.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
name: Setup E2E Sandbox
description: Download an architecture-matched prebuilt OpenShell sandbox binary for E2E tests

inputs:
artifact-prefix:
description: Artifact name prefix; linux-<arch> is appended automatically
required: true

runs:
using: composite
steps:
- name: Download prebuilt sandbox
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
with:
name: ${{ format('{0}-linux-{1}', inputs.artifact-prefix, runner.arch == 'X64' && 'amd64' || 'arm64') }}
path: .e2e/prebuilt-sandbox

- name: Configure prebuilt sandbox
shell: bash
run: |
set -euo pipefail
sandbox="$GITHUB_WORKSPACE/.e2e/prebuilt-sandbox/openshell-sandbox"
if [[ ! -f "$sandbox" ]]; then
echo "downloaded artifact is missing $sandbox" >&2
exit 1
fi
chmod +x "$sandbox"
"$sandbox" --version
echo "OPENSHELL_SANDBOX_BIN=$sandbox" >> "$GITHUB_ENV"
2 changes: 2 additions & 0 deletions .github/workflows/branch-e2e.yml
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,8 @@ jobs:
runner: linux-arm64-cpu8
cli-artifact-prefix: rust-binary-cli
gateway-artifact-prefix: rust-binary-gateway
# The supervisor build uploads the openshell-sandbox binary artifact.
sandbox-artifact-prefix: rust-binary-supervisor
vm-driver-artifact-name: driver-vm-linux-amd64

gpu-e2e:
Expand Down
78 changes: 78 additions & 0 deletions .github/workflows/e2e-test.yml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ on:
required: false
type: string
default: ""
sandbox-artifact-prefix:
description: "Optional prebuilt sandbox artifact prefix (artifact suffix is linux-<arch>)"
required: false
type: string
default: ""
vm-driver-artifact-name:
description: "Optional prebuilt VM driver artifact name"
required: false
Expand Down Expand Up @@ -129,6 +134,79 @@ jobs:
OPENSHELL_MCP_CONFORMANCE_CLIENT_IMAGE: ${{ format('openshell-mcp-conformance-client:{0}', inputs.image-tag) }}
run: ${{ matrix.cmd }}

e2e-podman-rootless:
name: E2E (rust-podman-rootless, Ubuntu 26.04 Nix VM)
# Run rootless Podman inside a Nix-managed Ubuntu guest so Podman, pasta,
# and user-namespace setup are provisioned by versioned repository tooling
# rather than mutable hosted-runner packages.
runs-on: ubuntu-26.04
timeout-minutes: 60
env:
MISE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
steps:
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
with:
ref: ${{ inputs['checkout-ref'] || github.sha }}
persist-credentials: false

- name: Use prebuilt OpenShell CLI
uses: ./.github/actions/setup-e2e-cli
with:
artifact-prefix: ${{ inputs.cli-artifact-prefix }}

- name: Use prebuilt OpenShell gateway
uses: ./.github/actions/setup-e2e-gateway
with:
artifact-prefix: ${{ inputs.gateway-artifact-prefix }}

- name: Use prebuilt OpenShell sandbox
uses: ./.github/actions/setup-e2e-sandbox
with:
artifact-prefix: ${{ inputs.sandbox-artifact-prefix }}

- uses: cachix/install-nix-action@13d8dd58da0234aa297dedd986986ccb8e7f3e24 # v31.11.1
with:
github_access_token: ${{ secrets.GITHUB_TOKEN }}

- uses: cachix/cachix-action@5f2d7c5294214f71b873db4b969586b980625e71 # v17
with:
name: openshell

- name: Install mise
run: |
curl https://mise.run | MISE_VERSION=v2026.4.25 sh
echo "$HOME/.local/bin" >> "$GITHUB_PATH"
echo "$HOME/.local/share/mise/shims" >> "$GITHUB_PATH"

- name: Install tools
run: mise install --locked

- name: Install system dependencies
run: |
sudo apt-get update
sudo apt-get install -y --no-install-recommends \
build-essential \
clang \
cmake \
libclang-dev \
libssl-dev \
libz3-dev \
openssh-client \
pkg-config

- name: Run rootless Podman E2E
run: |
set -euo pipefail

mise x -- e2e/run.sh \
--vm ubuntu-26-04 \
--with podman-rootless \
--host-cli-bin "$OPENSHELL_BIN" \
--gateway-bin "$OPENSHELL_GATEWAY_BIN" \
--sandbox-bin "$OPENSHELL_SANDBOX_BIN" \
--gateway-config e2e/configs/gateway/podman.toml \
--suite smoke

e2e-vm:
name: E2E (rust-vm-${{ matrix.suite }})
# libkrun needs KVM, so this job must run directly on a GitHub-hosted
Expand Down
14 changes: 13 additions & 1 deletion .github/workflows/release-dev.yml
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,16 @@ jobs:
cargo-version: ${{ needs.compute-versions.outputs.cargo_version }}
auditable: true

build-cli:
needs: [compute-versions]
uses: ./.github/workflows/docker-build.yml
with:
component: cli
cargo-version: ${{ needs.compute-versions.outputs.cargo_version }}
auditable: true

e2e:
needs: [build-gateway, build-supervisor]
needs: [build-gateway, build-supervisor, build-cli]
permissions:
actions: read
contents: read
Expand All @@ -79,6 +87,10 @@ jobs:
with:
image-tag: ${{ github.sha }}
runner: linux-arm64-cpu8
cli-artifact-prefix: rust-binary-cli
gateway-artifact-prefix: rust-binary-gateway
# The supervisor build uploads the openshell-sandbox binary artifact.
sandbox-artifact-prefix: rust-binary-supervisor

tag-ghcr-dev:
name: Tag GHCR Images as Dev
Expand Down
16 changes: 15 additions & 1 deletion .github/workflows/release-tag.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,18 @@ jobs:
checkout-ref: ${{ inputs.tag || github.ref }}
auditable: true

build-cli:
needs: [compute-versions]
uses: ./.github/workflows/docker-build.yml
with:
component: cli
cargo-version: ${{ needs.compute-versions.outputs.cargo_version }}
image-tag: ${{ needs.compute-versions.outputs.source_sha }}
checkout-ref: ${{ inputs.tag || github.ref }}
auditable: true

e2e:
needs: [compute-versions, build-gateway, build-supervisor]
needs: [compute-versions, build-gateway, build-supervisor, build-cli]
permissions:
actions: read
contents: read
Expand All @@ -104,6 +114,10 @@ jobs:
image-tag: ${{ needs.compute-versions.outputs.source_sha }}
checkout-ref: ${{ inputs.tag || github.ref }}
runner: linux-arm64-cpu8
cli-artifact-prefix: rust-binary-cli
gateway-artifact-prefix: rust-binary-gateway
# The supervisor build uploads the openshell-sandbox binary artifact.
sandbox-artifact-prefix: rust-binary-supervisor

tag-ghcr-release:
name: Tag GHCR Images for Release
Expand Down
6 changes: 6 additions & 0 deletions TESTING.md
Original file line number Diff line number Diff line change
Expand Up @@ -175,6 +175,12 @@ Run the Podman-backed Rust CLI e2e suite:
mise run e2e:podman
```

Run the rootless Podman suite in an Ubuntu 26.04 Nix test guest:

```shell
mise run e2e:podman:rootless
```

Run the VM-backed Rust CLI e2e suite:

```shell
Expand Down
Loading
Loading