mirror of
https://github.com/NVIDIA/OpenShell.git
synced 2026-10-21 06:11:31 +08:00
* feat(isolation): add RFC 0012 backend contract Signed-off-by: Drew Newberry <385+drew@users.noreply.github.com> * refactor(isolation): name the interface crate explicitly Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): expose trusted host gateway Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(agents): inventory the MXC driver Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): add mediated DNS transport Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): tighten interface error and digest contracts Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(isolation): remove unrelated driver inventory Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): define capability-free launch contract Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): seal confirmed boundary state Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): validate confirmation for external backend implementations Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): clarify mediated DNS identity Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(isolation): generalize loopback connector Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(isolation): unify typed network mediation Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): bind launches to sandbox sessions Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(mxc): initialize extended sandbox status Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): add boundary protocol and Linux primitives Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): harden signals and separate process status from transport Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): validate remote confirmation through public contract Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): validate wire state and propagate snapshot failures Signed-off-by: Drew Newberry <anewberry@nvidia.com> * test(isolation): import owned agent specification explicitly Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(isolation): describe mediated DNS channel Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): bound mediation attach without nested retries Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(isolation): generalize loopback protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): add transport-neutral session authentication Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(isolation): separate sandbox backend protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): harden runtime boundary controls Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): add terminal boundary operation Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): split supervisor and sandbox runtimes Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): harden boundary isolation and lifecycle ownership Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): reject private root redirects and adopt typed errors Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): preserve accept thread ownership on musl Signed-off-by: Drew Newberry <anewberry@nvidia.com> * test(sandbox): isolate credential probes from filtered threads Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): return retained exec exit status to independent waiters Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): bound network mediation and preserve socket authorization Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): bound control admission and retire stale mediation Signed-off-by: Drew Newberry <anewberry@nvidia.com> * ci(e2e): select migrated drivers per stack layer Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(sandbox): implement loopback connector Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(isolation): authenticate the Sandbox Protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(supervisor): rotate launch-scoped authentication Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(sandbox): consume dedicated backend crate Signed-off-by: Drew Newberry <anewberry@nvidia.com> * test(sandbox): align topology session fixture Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): align projected bootstrap bundle Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(auth): validate refreshed credentials before rotation Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): fail closed across supervisor disconnects Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): repair rebased sandbox CI Signed-off-by: Drew Newberry <anewberry@nvidia.com> * build(runtime): publish separate sandbox and supervisor images Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(config): configure the sandbox runtime image Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(ci): validate sandbox binary linkage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(isolation): use backend and runtime terminology Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(sandbox): use a scratch runtime image Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(ci): refresh schema and dependency policy Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(sandbox): bind reconnects to supervisor process Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs: align runtime split operational guidance Signed-off-by: Drew Newberry <anewberry@nvidia.com> * chore(security): document Kubernetes runtime RBAC Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): enforce runtime lifecycle invariants Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(compute): identify sandbox start generations Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(server): restore sandbox launch sessions Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): support authenticated runtime replacement Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(auth): bind sandbox session successors Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(auth): retry pending sandbox successors Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(vm): run the supervisor outside the guest workload Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(vm): use sandbox backend protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): repair rebase integration Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): use unified build toolchain Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(vm): use sandbox runtime terminology Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(vm): own guest network bootstrap Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): expose guest init version Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): select native supervisor artifacts Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): guard guest init Linux symbols Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): scope Linux test imports Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): avoid guest interface casts Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): reconcile admitted sandbox identity Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): share resolved sandbox identity Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): surface host supervisor failures Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): include guest logs on supervisor exit Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): rotate and clean runtime generations Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): make sandbox starts generation-aware Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): rotate restored sandbox sessions Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(vm): keep shared paths in the base layer Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): bind sandbox session lineage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(docker): isolate workloads behind the host supervisor Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(docker): rotate launch-scoped authentication Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(docker): use sandbox backend protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(docker): use host networking for supervisor Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): preserve host gateway alias resolution Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(docker): use separate sandbox and supervisor images Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): restore startup validation after rebase Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(docker): name the sandbox runtime directly Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): narrow supervisor CA runtime storage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): close companion isolation gaps Signed-off-by: Drew Newberry <anewberry@nvidia.com> * test(docker): align mediated network expectations Signed-off-by: Drew Newberry <anewberry@nvidia.com> * test(docker): exercise mediated network paths Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): attach supervisor to managed network Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): defer supervisor recovery until gateway is ready Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): make sandbox starts generation-aware Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): rotate restored sandbox sessions Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): preserve workloads during session rotation Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(docker): remove unrelated configuration RFC changes Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): bind sandbox session lineage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(kubernetes): add proxy-pod isolation topology Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(kubernetes): use sandbox backend protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): use stable sandbox service authority Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(kubernetes): split sandbox and supervisor images Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): adapt proxy pods to current runtime APIs Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(kubernetes): describe the single runtime placement Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(kubernetes): simplify sandbox orchestration Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): validate deployment prerequisites Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): update Trivy Helm profile inventory Signed-off-by: Drew Newberry <anewberry@nvidia.com> * test(kubernetes): update Trivy scan inventory count Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): reuse preloaded runtime images in e2e Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): type and clean runtime resources Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): make sandbox restarts recoverable Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): rotate restored sandbox sessions Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): preserve supervisor egress Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): bind sandbox session lineage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(podman): adopt isolated sandbox and supervisor containers Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): stage bootstrap archives at named volume destinations Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(podman): rotate launch-scoped authentication Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(podman): use sandbox backend protocol Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(podman): use host networking for supervisor Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(podman): split sandbox and supervisor images Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): repair rebase integration Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(podman): name the sandbox runtime directly Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): provision supervisor CA runtime storage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): address isolation review findings Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): inspect Debian supervisor provenance Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): use libpod-compatible tmpfs options Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): bind verified sandbox runtime binary Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): provide external driver data directory Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): start sandbox before joining user namespace Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): separate supervisor user namespace Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): make sandbox starts generation-aware Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): rotate restored sandbox sessions Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): bind sandbox session lineage Signed-off-by: Drew Newberry <anewberry@nvidia.com> * perf(isolation): add TCP and DNS benchmark harnesses Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(perf): align benchmark timing and supported protocols Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(perf): report TCP benchmark metrics accurately Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(perf): cancel failed worker startup Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(docker): build matching local supervisor image Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(podman): make local sandbox smoke test runnable Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): wire local sandbox runtime image Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(kubernetes): narrow sandbox service RBAC Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(ci): validate split runtime artifacts Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): harden runtime session handling Signed-off-by: Drew Newberry <anewberry@nvidia.com> * feat(supervisor): add standalone network proxy role Signed-off-by: Drew Newberry <anewberry@nvidia.com> * docs(rfc): remove implementation companion notes Signed-off-by: Drew Newberry <anewberry@nvidia.com> * refactor(vm): standardize runtime release name Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(vm): pin renamed runtime artifacts Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(auth): persist sandbox runtime identity Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(runtime): restore branch validation Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(isolation): reconcile main after rebase Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(network): close unframed HTTP 1.0 responses Signed-off-by: Drew Newberry <anewberry@nvidia.com> * chore(isolation): preserve upstream OCSF updates Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(security): close credential and TLS replay paths Signed-off-by: Drew Newberry <anewberry@nvidia.com> * fix(auth): make sandbox refresh retries idempotent Signed-off-by: Drew Newberry <anewberry@nvidia.com> --------- Signed-off-by: Drew Newberry <385+drew@users.noreply.github.com> Signed-off-by: Drew Newberry <anewberry@nvidia.com>
363 lines
14 KiB
YAML
363 lines
14 KiB
YAML
name: Release Canary
|
|
|
|
on:
|
|
workflow_dispatch:
|
|
inputs:
|
|
release-dev-run-id:
|
|
description: "Successful Release Dev run ID whose Snap artifact to test"
|
|
required: false
|
|
type: string
|
|
workflow_run:
|
|
workflows: ["Release Dev"]
|
|
types: [completed]
|
|
|
|
permissions:
|
|
actions: read
|
|
contents: read
|
|
|
|
defaults:
|
|
run:
|
|
shell: bash
|
|
|
|
env:
|
|
OPENSHELL_VERSION: dev
|
|
OPENSHELL_TELEMETRY_ENABLED: "false"
|
|
|
|
jobs:
|
|
macos:
|
|
name: macOS Homebrew
|
|
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
|
|
runs-on: macos-latest-xlarge
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Ensure VM driver
|
|
run: |
|
|
launchctl setenv OPENSHELL_COMPUTE_DRIVER vm
|
|
launchctl setenv OPENSHELL_TELEMETRY_ENABLED "$OPENSHELL_TELEMETRY_ENABLED"
|
|
|
|
- name: Install and check status
|
|
run: |
|
|
set -euo pipefail
|
|
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/${{ github.event.workflow_run.head_sha || github.sha }}/install.sh | sh
|
|
openshell status
|
|
sandbox="release-canary-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
openshell sandbox create --name "$sandbox" --detach
|
|
openshell sandbox exec --name "$sandbox" --no-tty -- true
|
|
openshell sandbox delete "$sandbox"
|
|
|
|
ubuntu:
|
|
name: Ubuntu Docker
|
|
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Ensure Docker
|
|
run: |
|
|
if ! command -v docker >/dev/null 2>&1; then
|
|
sudo apt-get update
|
|
sudo apt-get install -y docker.io
|
|
fi
|
|
sudo systemctl start docker || sudo service docker start
|
|
mkdir -p "${HOME}/.config/openshell"
|
|
printf 'OPENSHELL_COMPUTE_DRIVER=docker\nOPENSHELL_TELEMETRY_ENABLED=%s\n' \
|
|
"$OPENSHELL_TELEMETRY_ENABLED" > "${HOME}/.config/openshell/gateway.env"
|
|
docker info
|
|
|
|
- name: Install and check status
|
|
run: |
|
|
set -euo pipefail
|
|
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/${{ github.event.workflow_run.head_sha || github.sha }}/install.sh | sh
|
|
openshell status
|
|
sandbox="release-canary-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
openshell sandbox create --name "$sandbox" --detach
|
|
openshell sandbox exec --name "$sandbox" --no-tty -- true
|
|
openshell sandbox delete "$sandbox"
|
|
|
|
fedora:
|
|
name: Fedora RPM
|
|
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
|
|
runs-on: linux-amd64-cpu8
|
|
timeout-minutes: 20
|
|
env:
|
|
FEDORA_CANARY_CONTAINER: openshell-fedora-canary-${{ github.run_id }}-${{ github.run_attempt }}
|
|
steps:
|
|
- name: Start Fedora systemd container and root user manager
|
|
run: |
|
|
set -euo pipefail
|
|
|
|
docker run --detach \
|
|
--name "${FEDORA_CANARY_CONTAINER}" \
|
|
--privileged \
|
|
--cgroupns=host \
|
|
--tmpfs /run \
|
|
--tmpfs /tmp \
|
|
--volume /sys/fs/cgroup:/sys/fs/cgroup:rw \
|
|
fedora:latest \
|
|
bash -lc 'dnf install -y curl dbus-daemon podman systemd && exec /usr/sbin/init'
|
|
|
|
for _ in $(seq 1 120); do
|
|
if docker exec "${FEDORA_CANARY_CONTAINER}" systemctl list-units --no-pager >/dev/null 2>&1; then
|
|
break
|
|
fi
|
|
if [ "$(docker inspect -f '{{.State.Running}}' "${FEDORA_CANARY_CONTAINER}")" != "true" ]; then
|
|
echo "::error::Fedora systemd container exited before systemd became reachable"
|
|
docker logs "${FEDORA_CANARY_CONTAINER}" >&2 || true
|
|
exit 1
|
|
fi
|
|
sleep 1
|
|
done
|
|
|
|
if ! docker exec "${FEDORA_CANARY_CONTAINER}" systemctl list-units --no-pager >/dev/null 2>&1; then
|
|
echo "::error::Fedora systemd container did not become reachable within 120s"
|
|
docker logs "${FEDORA_CANARY_CONTAINER}" >&2 || true
|
|
exit 1
|
|
fi
|
|
|
|
docker exec --interactive "${FEDORA_CANARY_CONTAINER}" env \
|
|
HOME=/root \
|
|
XDG_RUNTIME_DIR=/run/user/0 \
|
|
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus \
|
|
bash -s <<'EOF'
|
|
set -euo pipefail
|
|
# install.sh manages the RPM gateway as a systemd user unit. This
|
|
# container is booted with systemd as PID 1, but it still has no
|
|
# login session. Start root's user manager explicitly so the
|
|
# installer can test service restart and gateway registration
|
|
# instead of its "restart later" fallback.
|
|
mkdir -p "${XDG_RUNTIME_DIR}"
|
|
chmod 700 "${XDG_RUNTIME_DIR}"
|
|
systemctl start user-runtime-dir@0.service || true
|
|
systemctl start user@0.service
|
|
|
|
for _ in $(seq 1 30); do
|
|
if systemctl --user daemon-reload; then
|
|
break
|
|
fi
|
|
sleep 1
|
|
done
|
|
if ! systemctl --user daemon-reload; then
|
|
systemctl status user@0.service --no-pager >&2 || true
|
|
journalctl -u user@0.service --no-pager -n 80 >&2 || true
|
|
systemctl --user status --no-pager >&2 || true
|
|
exit 1
|
|
fi
|
|
EOF
|
|
|
|
- name: Install and check status
|
|
run: |
|
|
set -euo pipefail
|
|
|
|
docker exec --interactive "${FEDORA_CANARY_CONTAINER}" env \
|
|
HOME=/root \
|
|
XDG_RUNTIME_DIR=/run/user/0 \
|
|
DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/0/bus \
|
|
OPENSHELL_VERSION="$OPENSHELL_VERSION" \
|
|
OPENSHELL_TELEMETRY_ENABLED="$OPENSHELL_TELEMETRY_ENABLED" \
|
|
CANARY_SANDBOX="release-canary-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}" \
|
|
INSTALL_SH_URL="https://raw.githubusercontent.com/NVIDIA/OpenShell/${{ github.event.workflow_run.head_sha || github.sha }}/install.sh" \
|
|
bash -s <<'EOF'
|
|
set -euo pipefail
|
|
mkdir -p "${HOME}/.config/openshell"
|
|
printf 'OPENSHELL_COMPUTE_DRIVER=podman\nOPENSHELL_TELEMETRY_ENABLED=%s\n' \
|
|
"$OPENSHELL_TELEMETRY_ENABLED" > "${HOME}/.config/openshell/gateway.env"
|
|
podman info
|
|
curl -LsSf "${INSTALL_SH_URL}" | sh
|
|
openshell status
|
|
openshell sandbox create --name "$CANARY_SANDBOX" --detach
|
|
openshell sandbox exec --name "$CANARY_SANDBOX" --no-tty -- true
|
|
openshell sandbox delete "$CANARY_SANDBOX"
|
|
EOF
|
|
|
|
- name: Stop Fedora systemd container
|
|
if: always()
|
|
run: |
|
|
docker rm -f "${FEDORA_CANARY_CONTAINER}" >/dev/null 2>&1 || true
|
|
|
|
ubuntu-snap:
|
|
name: Ubuntu Snap
|
|
if: ${{ github.event.workflow_run.conclusion == 'success' || inputs.release-dev-run-id != '' }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Install snapd
|
|
run: |
|
|
set -euo pipefail
|
|
sudo apt-get update
|
|
sudo apt-get install -y snapd
|
|
sudo systemctl enable --now snapd.socket
|
|
sudo systemctl start snapd
|
|
sudo snap wait system seed.loaded
|
|
|
|
- name: Install Docker snap
|
|
run: |
|
|
set -euo pipefail
|
|
sudo snap install docker
|
|
|
|
- name: Download snap from release-dev artifacts
|
|
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
|
|
with:
|
|
github-token: ${{ github.token }}
|
|
run-id: ${{ inputs.release-dev-run-id || github.event.workflow_run.id }}
|
|
pattern: snap-linux-amd64
|
|
path: release/
|
|
merge-multiple: true
|
|
|
|
- name: Install snap (dangerous — from release, not store)
|
|
run: |
|
|
set -euo pipefail
|
|
sudo systemctl set-environment \
|
|
"OPENSHELL_TELEMETRY_ENABLED=${OPENSHELL_TELEMETRY_ENABLED}"
|
|
sudo snap install ./release/*.snap --dangerous
|
|
|
|
- name: Connect interfaces
|
|
run: |
|
|
set -euo pipefail
|
|
sudo snap connect openshell:docker docker:docker-daemon
|
|
sudo snap connect openshell:log-observe
|
|
sudo snap connect openshell:system-observe
|
|
|
|
- name: Register snap gateway and check status
|
|
run: |
|
|
set -euo pipefail
|
|
openshell --version
|
|
sudo snap services openshell
|
|
openshell gateway add http://127.0.0.1:17670 --local --name snap-docker
|
|
openshell gateway select snap-docker
|
|
for _ in $(seq 1 30); do
|
|
if openshell status; then
|
|
exit 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
echo "Gateway did not become ready within 30 seconds" >&2
|
|
exit 1
|
|
|
|
- name: Create and exercise a sandbox
|
|
run: |
|
|
set -euo pipefail
|
|
sandbox="release-canary-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
openshell sandbox create --name "$sandbox" --detach
|
|
openshell sandbox exec --name "$sandbox" --no-tty -- true
|
|
openshell sandbox delete "$sandbox"
|
|
|
|
- name: Collect Snap diagnostics
|
|
if: failure()
|
|
run: |
|
|
set +e
|
|
sudo snap services openshell
|
|
sudo snap connections openshell
|
|
sudo snap changes
|
|
sudo systemctl status snap.openshell.gateway.service --no-pager
|
|
sudo journalctl -b -u snap.openshell.gateway.service --no-pager -n 300
|
|
sudo journalctl -b -u snapd.service --no-pager -n 300
|
|
sudo snap logs openshell.gateway -n=300
|
|
sudo ss -ltnp '( sport = :17670 )'
|
|
|
|
kubernetes:
|
|
name: Kubernetes Helm (kind)
|
|
if: ${{ github.event_name == 'workflow_dispatch' || github.event.workflow_run.conclusion == 'success' }}
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
env:
|
|
KIND_CLUSTER_NAME: release-canary-${{ github.run_id }}
|
|
RELEASE_NAME: openshell
|
|
RELEASE_NAMESPACE: openshell
|
|
KIND_GATEWAY_NAME: kind
|
|
AGENT_SANDBOX_VERSION: v0.5.0
|
|
steps:
|
|
- name: Checkout Agent Sandbox helper
|
|
uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
with:
|
|
sparse-checkout: |
|
|
e2e/support/install-agent-sandbox.sh
|
|
sparse-checkout-cone-mode: false
|
|
persist-credentials: false
|
|
|
|
- name: Install Helm
|
|
uses: azure/setup-helm@9bc31f4ebc9c6b171d7bfbaa5d006ae7abdb4310 # v5.0.1
|
|
|
|
- name: Create kind cluster
|
|
uses: helm/kind-action@ef37e7f390d99f746eb8b610417061a60e82a6cc # v1.14.0
|
|
with:
|
|
cluster_name: ${{ env.KIND_CLUSTER_NAME }}
|
|
wait: 120s
|
|
|
|
- name: Install Agent Sandbox controller
|
|
run: bash e2e/support/install-agent-sandbox.sh
|
|
|
|
- name: Install OpenShell Helm chart from GHCR OCI
|
|
run: |
|
|
set -euo pipefail
|
|
helm install "$RELEASE_NAME" oci://ghcr.io/nvidia/openshell/helm-chart \
|
|
--version 0.0.0-dev \
|
|
--namespace "$RELEASE_NAMESPACE" --create-namespace \
|
|
--set server.disableTls=true \
|
|
--set "server.telemetryEnabled=${OPENSHELL_TELEMETRY_ENABLED}" \
|
|
--wait --timeout 5m
|
|
|
|
- name: Verify gateway pod is Ready
|
|
run: |
|
|
set -euo pipefail
|
|
kubectl wait --namespace "$RELEASE_NAMESPACE" \
|
|
--for=condition=Ready pod \
|
|
--selector="app.kubernetes.io/name=openshell,app.kubernetes.io/instance=${RELEASE_NAME}" \
|
|
--timeout=300s
|
|
|
|
- name: Port-forward gateway service
|
|
run: |
|
|
set -euo pipefail
|
|
nohup kubectl port-forward --namespace "$RELEASE_NAMESPACE" \
|
|
"svc/${RELEASE_NAME}" 8080:8080 \
|
|
> port-forward.log 2>&1 &
|
|
echo $! > port-forward.pid
|
|
for _ in $(seq 1 30); do
|
|
if (echo > /dev/tcp/127.0.0.1/8080) >/dev/null 2>&1; then
|
|
echo "port-forward is reachable"
|
|
exit 0
|
|
fi
|
|
sleep 1
|
|
done
|
|
echo "port-forward did not become reachable" >&2
|
|
cat port-forward.log >&2
|
|
exit 1
|
|
|
|
- name: Install OpenShell CLI
|
|
run: |
|
|
set -euo pipefail
|
|
mkdir -p "${HOME}/.config/openshell"
|
|
printf 'OPENSHELL_COMPUTE_DRIVER=docker\n' > "${HOME}/.config/openshell/gateway.env"
|
|
curl -LsSf https://raw.githubusercontent.com/NVIDIA/OpenShell/${{ github.event.workflow_run.head_sha || github.sha }}/install.sh | sh
|
|
|
|
- name: Register kind gateway and check status
|
|
run: |
|
|
set -euo pipefail
|
|
openshell gateway add http://127.0.0.1:8080 --local --name "$KIND_GATEWAY_NAME"
|
|
openshell status
|
|
sandbox="release-canary-${GITHUB_RUN_ID}-${GITHUB_RUN_ATTEMPT}"
|
|
openshell sandbox create --name "$sandbox" --detach
|
|
openshell sandbox exec --name "$sandbox" --no-tty -- true
|
|
openshell sandbox delete "$sandbox"
|
|
|
|
- name: Diagnostics on failure
|
|
if: failure()
|
|
run: |
|
|
set +e
|
|
echo "--- helm status ---"
|
|
helm status "$RELEASE_NAME" --namespace "$RELEASE_NAMESPACE"
|
|
echo "--- helm get manifest ---"
|
|
helm get manifest "$RELEASE_NAME" --namespace "$RELEASE_NAMESPACE"
|
|
echo "--- get all ---"
|
|
kubectl get all --namespace "$RELEASE_NAMESPACE"
|
|
echo "--- describe pods ---"
|
|
kubectl describe pods --namespace "$RELEASE_NAMESPACE"
|
|
echo "--- pod logs ---"
|
|
kubectl logs --namespace "$RELEASE_NAMESPACE" \
|
|
--selector="app.kubernetes.io/name=openshell,app.kubernetes.io/instance=${RELEASE_NAME}" \
|
|
--tail=200 --all-containers --prefix
|
|
echo "--- port-forward log ---"
|
|
cat port-forward.log 2>/dev/null
|
|
echo "--- openshell gateway list ---"
|
|
openshell gateway list 2>/dev/null
|
|
echo "--- openshell version ---"
|
|
openshell --version 2>/dev/null
|