Skip to content

Commit 56d6fae

Browse files
authored
ci: add Branch Helm E2E workflow with test:e2e-helm gate (#1162)
* feat: add kubernetes local-dev environment * Add support for grpcRoute from Kubernetes Gateway API spec * Add pkiInitJob to initialize mTLS resources * Add sshHandshake init job * Test integration with Envoy Gateway * Add keycloak integration testing with Skaffold * docs(helm-dev-environment): document TLS toggle and mTLS port-forward setup Add a TLS behaviour section explaining that values-skaffold.yaml disables TLS by default, and a port-forward connection guide covering both plaintext and mTLS modes with the exact commands to extract client certs from the cluster PKI secret. * chore(helm): clarify TLS toggle in values-skaffold.yaml * chore(helm): remove leftover cert-manager references * feat(helm): restore cert-manager PKI support alongside pkiInitJob Re-add the openshell.issuerSelfSigned helper, the mutual-exclusion guard in pki-hook.yaml, and the certManager condition in the statefulset volume mount. Add server.disableTls: false to values-cert-manager.yaml so the overlay correctly overrides the skaffold dev default. Tested end-to-end with cert-manager issuing mTLS certs and sandbox create over port-forward. * fix(helm): fix port-forward collision and pki idempotency check Use port 8090 for direct port-forward to avoid colliding with the k3d LB binding on 8080 when Envoy Gateway is active. Check both server and client TLS secrets before skipping PKI generation. Previously only the server secret was checked, which would silently skip generation if a partial cleanup left one half of the pair behind. Now emits a clear error with a recovery command when partial state is detected. * feat(helm): add lint matrix and Helm e2e test harness Consolidates values overlays into deploy/helm/openshell/ci/, adds a helm:lint matrix task that validates all configuration variants, and introduces a helm-e2e.sh script that creates a k3d cluster, builds images via docker buildx, deploys via Helm, and runs the Rust and Python e2e suites. Tests that require Docker-native host networking (host.openshell.internal SSRF) are skipped on the Kubernetes path. * ci: add helm lint workflow triggered on helm chart changes * ci: add helm lint workflow triggered on helm chart changes * chore: trigger helm lint CI test * Revert "chore: trigger helm lint CI test" This reverts commit 6b6b0a5. * ci: add Branch Helm E2E workflow with test:e2e-helm gate
1 parent 82f9730 commit 56d6fae

3 files changed

Lines changed: 114 additions & 2 deletions

File tree

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
name: Branch Helm E2E
5+
6+
on:
7+
push:
8+
branches:
9+
- "pull-request/[0-9]+"
10+
workflow_dispatch: {}
11+
12+
permissions: {}
13+
14+
jobs:
15+
pr_metadata:
16+
name: Resolve PR metadata
17+
runs-on: ubuntu-latest
18+
permissions:
19+
contents: read
20+
pull-requests: read
21+
outputs:
22+
should_run: ${{ steps.gate.outputs.should_run }}
23+
steps:
24+
- uses: actions/checkout@v6
25+
26+
- id: gate
27+
uses: ./.github/actions/pr-gate
28+
with:
29+
required_label: test:e2e-helm
30+
31+
helm-e2e-rust:
32+
name: Helm E2E (rust)
33+
needs: [pr_metadata]
34+
if: needs.pr_metadata.outputs.should_run == 'true'
35+
runs-on: linux-amd64-cpu8
36+
timeout-minutes: 60
37+
permissions:
38+
contents: read
39+
packages: read
40+
container:
41+
image: ghcr.io/nvidia/openshell/ci:latest
42+
credentials:
43+
username: ${{ github.actor }}
44+
password: ${{ secrets.GITHUB_TOKEN }}
45+
options: --privileged
46+
volumes:
47+
- /var/run/docker.sock:/var/run/docker.sock
48+
env:
49+
MISE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
50+
HELM_E2E_CLUSTER_NAME: openshell-helm-e2e-${{ github.run_id }}-rust
51+
steps:
52+
- uses: actions/checkout@v6
53+
54+
- name: Mark workspace safe for git
55+
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
56+
57+
- name: Install tools
58+
run: mise install --locked
59+
60+
- name: Run Helm E2E (Rust)
61+
run: mise run e2e:helm:rust
62+
63+
helm-e2e-python:
64+
name: Helm E2E (python)
65+
needs: [pr_metadata]
66+
if: needs.pr_metadata.outputs.should_run == 'true'
67+
runs-on: linux-amd64-cpu8
68+
timeout-minutes: 60
69+
permissions:
70+
contents: read
71+
packages: read
72+
container:
73+
image: ghcr.io/nvidia/openshell/ci:latest
74+
credentials:
75+
username: ${{ github.actor }}
76+
password: ${{ secrets.GITHUB_TOKEN }}
77+
options: --privileged
78+
volumes:
79+
- /var/run/docker.sock:/var/run/docker.sock
80+
env:
81+
MISE_GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
82+
HELM_E2E_CLUSTER_NAME: openshell-helm-e2e-${{ github.run_id }}-python
83+
steps:
84+
- uses: actions/checkout@v6
85+
86+
- name: Mark workspace safe for git
87+
run: git config --global --add safe.directory "$GITHUB_WORKSPACE"
88+
89+
- name: Install tools
90+
run: mise install --locked
91+
92+
- name: Install Python dependencies
93+
run: uv sync --frozen && mise run --no-deps python:proto
94+
95+
- name: Run Helm E2E (Python)
96+
run: mise run e2e:helm:python

.github/workflows/e2e-gate.yml

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ on:
44
pull_request:
55
types: [opened, synchronize, reopened, labeled, unlabeled, ready_for_review]
66
workflow_run:
7-
workflows: ["Branch E2E Checks", "GPU Test"]
7+
workflows: ["Branch E2E Checks", "GPU Test", "Branch Helm E2E"]
88
types: [completed]
99

1010
permissions: {}
@@ -36,6 +36,18 @@ jobs:
3636
required_label: test:e2e-gpu
3737
workflow_file: test-gpu.yml
3838

39+
helm-e2e:
40+
name: Helm E2E
41+
if: github.event_name == 'pull_request'
42+
permissions:
43+
contents: read
44+
pull-requests: read
45+
actions: read
46+
uses: ./.github/workflows/e2e-gate-check.yml
47+
with:
48+
required_label: test:e2e-helm
49+
workflow_file: branch-helm-e2e.yml
50+
3951
# When the guarded workflow finishes, GitHub fires `workflow_run` in the
4052
# default-branch context — any check posted from here would land on `main`,
4153
# not on the PR. Instead, find the latest `pull_request`-triggered gate run

.github/workflows/e2e-label-help.yml

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,10 @@ permissions: {}
1919
jobs:
2020
hint:
2121
name: Post next-step hint for E2E label
22-
if: github.event.label.name == 'test:e2e' || github.event.label.name == 'test:e2e-gpu'
22+
if: |
23+
github.event.label.name == 'test:e2e' ||
24+
github.event.label.name == 'test:e2e-gpu' ||
25+
github.event.label.name == 'test:e2e-helm'
2326
runs-on: ubuntu-latest
2427
permissions:
2528
pull-requests: write
@@ -40,6 +43,7 @@ jobs:
4043
case "$LABEL_NAME" in
4144
test:e2e) workflow_file=branch-e2e.yml; workflow_name="Branch E2E Checks" ;;
4245
test:e2e-gpu) workflow_file=test-gpu.yml; workflow_name="GPU Test" ;;
46+
test:e2e-helm) workflow_file=branch-helm-e2e.yml; workflow_name="Branch Helm E2E" ;;
4347
*) echo "Unrecognized label $LABEL_NAME"; exit 1 ;;
4448
esac
4549

0 commit comments

Comments
 (0)