Skip to content
Open
Show file tree
Hide file tree
Changes from 18 commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
0e0e885
feat: remove Helm charts and keep only operator-based deployment
raballew Apr 9, 2026
c0167d1
fix: propagate RuntimeError in check_jumpstarter_installation instead…
raballew Apr 9, 2026
664b064
fix: remove stale noqa C901 complexity suppression from check_jumpsta…
raballew Apr 9, 2026
e0900a8
fix: remove stale METHOD=helm references from root Makefile
raballew Apr 9, 2026
a18b972
fix: remove vestigial chart_name field from V1Alpha1JumpstarterInstance
raballew Apr 9, 2026
873f05e
fix: correct stale default version comment in compat setup script
raballew Apr 9, 2026
3527197
fix: update version discovery to query operator image repo instead of…
raballew Apr 9, 2026
6daae8f
fix: fail fast when Jumpstarter CR baseDomain is not found in compat …
raballew Apr 9, 2026
f5a0668
fix: remove vestigial METHOD variable from Makefiles
raballew Apr 9, 2026
a261859
fix: remove vestigial METHOD deployment abstraction
raballew Apr 9, 2026
6dc1270
fix: remove old-controller compat test (v0.7.0 has no operator instal…
raballew Apr 9, 2026
3897c96
Revert "fix: remove old-controller compat test (v0.7.0 has no operato…
raballew Apr 11, 2026
84d5b0f
fix: deploy old controller v0.8.1 via operator installer in compat tests
raballew Apr 11, 2026
cde706d
fix: remove stale bats test file re-added by revert
raballew Apr 11, 2026
3561af0
fix: address CodeRabbit review findings
raballew Apr 11, 2026
526bc7c
fix: fail fast when baseDomain is empty in e2e setup
raballew Apr 11, 2026
158be43
fix: load operator image in e2e-compat-old-client CI job
raballew Apr 11, 2026
bbfa5e8
fix: use client version 0.7.4 for old-client compat test
raballew Apr 11, 2026
df4f7ab
fix: use correct kustomize image name and require CR instances for in…
raballew Apr 13, 2026
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
1 change: 0 additions & 1 deletion .cursor/rules/working-with-operator.mdc
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,6 @@ controller/
│ │ ├── bundle/ # OLM bundle manifests
│ │ ├── test/e2e/ # E2E tests
│ │ └── Makefile # Operator-specific make targets
│ └── helm/ # Helm charts (alternative deployment)
├── api/ # Jumpstarter core CRDs (Client, Exporter, Lease, etc.)
├── internal/ # Controller business logic
│ └── config/ # Config structs used by controller
Expand Down
39 changes: 0 additions & 39 deletions .github/workflows/build-images.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -273,42 +273,3 @@ jobs:
});
}

publish-helm-charts:
needs: build-and-push-image
if: ${{ github.repository_owner == 'jumpstarter-dev' && (github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/') || startsWith(github.ref, 'refs/heads/release-')) }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Get version
run: |
VERSION=$(git describe --tags)
VERSION=${VERSION#v} # remove the leading v prefix for version
echo "VERSION=${VERSION}" >> $GITHUB_ENV
echo "VERSION=${VERSION}"

- name: Build helm charts
run: |
echo packaging ${VERSION}
# patch the sub-chart app-version, because helm package won't do it
sed -i "s/^appVersion:.*/appVersion: $VERSION/" controller/deploy/helm/jumpstarter/charts/jumpstarter-controller/Chart.yaml
helm package ./controller/deploy/helm/jumpstarter --version "${VERSION}" --app-version "${VERSION}"

- name: Login helm
env:
PASSWORD: ${{ secrets.QUAY_TOKEN }}
USER: jumpstarter-dev+jumpstarter_ci
run:
helm registry login quay.io -u ${USER} -p ${PASSWORD}

- name: Push helm charts
run: |
helm push jumpstarter-*.tgz oci://${{ env.QUAY_ORG }}/helm

if [[ "${{ github.ref }}" == "refs/heads/release-*" ]]; then
RELEASE_BRANCH_NAME=$(basename "${{ github.ref }}")
helm chart save jumpstarter-*.tgz ${{ env.QUAY_ORG }}/helm:${RELEASE_BRANCH_NAME}
helm chart push ${{ env.QUAY_ORG }}/helm:${RELEASE_BRANCH_NAME}
fi
9 changes: 1 addition & 8 deletions .github/workflows/controller-kind.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,16 @@ on:

jobs:
deploy-kind:
strategy:
matrix:
method:
- helm
- operator
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Run make deploy (${{ matrix.method }})
- name: Run make deploy
working-directory: controller
run: make deploy
env:
METHOD: ${{ matrix.method }}

e2e-test-operator:
runs-on: ubuntu-latest
Expand Down
37 changes: 19 additions & 18 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,6 @@ jobs:
run: make e2e-setup
env:
CI: true
METHOD: operator
SKIP_BUILD: "true"
PREBUILT_WHEELS_DIR: /tmp/python-wheels
OPERATOR_IMG: quay.io/jumpstarter-dev/jumpstarter-operator:latest
Expand All @@ -229,15 +228,13 @@ jobs:
run: make e2e-run
env:
CI: true
METHOD: operator

# ============================================================================
# Compatibility tests: cross-version interop between controller and client/exporter
# These jobs can be removed once 0.7.x controller support is no longer needed.
# ============================================================================

e2e-compat-old-controller:
needs: [changes, build-python-wheels]
needs: changes
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-24.04
timeout-minutes: 60
Expand All @@ -253,26 +250,19 @@ jobs:
with:
go-version: "1.22"

- name: Download python wheels
uses: actions/download-artifact@v4
with:
name: python-wheels
path: /tmp/python-wheels

- name: Setup compat environment (old controller v0.7.0)
- name: Setup compat environment (old controller v0.8.1)
run: make e2e-compat-setup COMPAT_SCENARIO=old-controller
env:
CI: true
COMPAT_CONTROLLER_TAG: v0.7.0
PREBUILT_WHEELS_DIR: /tmp/python-wheels
COMPAT_CONTROLLER_TAG: v0.8.1

- name: Run compat tests (old controller + new client/exporter)
run: make e2e-compat-run COMPAT_TEST=old-controller
env:
CI: true

e2e-compat-old-client:
needs: [changes, build-controller-image, build-python-wheels]
needs: [changes, build-controller-image, build-operator-image, build-python-wheels]
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch'
runs-on: ubuntu-24.04
timeout-minutes: 60
Expand All @@ -294,22 +284,33 @@ jobs:
name: controller-image-amd64
path: /tmp/artifacts

- name: Download operator image
uses: actions/download-artifact@v4
with:
name: operator-image-amd64
path: /tmp/artifacts

- name: Download python wheels
uses: actions/download-artifact@v4
with:
name: python-wheels
path: /tmp/python-wheels

- name: Load controller image
run: docker load < /tmp/artifacts/controller-image.tar
- name: Load container images and operator manifest
run: |
docker load < /tmp/artifacts/controller-image.tar
docker load < /tmp/artifacts/operator-image.tar
mkdir -p controller/deploy/operator/dist
cp /tmp/artifacts/operator-install.yaml controller/deploy/operator/dist/install.yaml

- name: Setup compat environment (old client v0.7.0)
- name: Setup compat environment (old client v0.7.4)
run: make e2e-compat-setup COMPAT_SCENARIO=old-client
env:
CI: true
COMPAT_CLIENT_VERSION: "0.7.1"
COMPAT_CLIENT_VERSION: "0.7.4"
SKIP_BUILD: "true"
PREBUILT_WHEELS_DIR: /tmp/python-wheels
OPERATOR_IMG: quay.io/jumpstarter-dev/jumpstarter-operator:latest

- name: Run compat tests (new controller + old client/exporter)
run: make e2e-compat-run COMPAT_TEST=old-client
Expand Down
18 changes: 0 additions & 18 deletions .github/workflows/lint.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ jobs:
runs-on: ubuntu-latest
outputs:
controller: ${{ steps.filter.outputs.controller }}
helm: ${{ steps.filter.outputs.helm }}
protocol: ${{ steps.filter.outputs.protocol }}
python: ${{ steps.filter.outputs.python }}
steps:
Expand All @@ -31,9 +30,6 @@ jobs:
controller:
- 'controller/**'
- '.github/workflows/lint.yaml'
helm:
- 'controller/deploy/helm/**'
- '.github/workflow/lint.yaml'
protocol:
- 'protocol/**'
- '.github/workflows/lint.yaml'
Expand All @@ -60,20 +56,6 @@ jobs:
working-directory: controller
run: make lint

lint-helm:
needs: changes
if: needs.changes.outputs.helm == 'true'
runs-on: ubuntu-latest
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Run helm linter
working-directory: controller
run: make lint-helm

lint-protobuf:
needs: changes
if: needs.changes.outputs.protocol == 'true'
Expand Down
20 changes: 7 additions & 13 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,6 @@
# Subdirectories containing projects
SUBDIRS := python protocol controller e2e

# Deployment method for e2e tests: operator (default) or helm
METHOD ?= operator

# Default target
.PHONY: all
all: build
Expand All @@ -33,9 +30,6 @@ help:
@echo " make e2e-full - Full setup + run (for CI or first time)"
@echo " make e2e-clean - Clean up e2e test environment (delete cluster, certs, etc.)"
@echo ""
@echo " Use METHOD=operator (default) or METHOD=helm to select deployment method"
@echo " Example: make e2e-setup METHOD=helm"
@echo ""
@echo "Per-project targets:"
@echo " make build-<project> - Build specific project"
@echo " make test-<project> - Test specific project"
Expand Down Expand Up @@ -121,14 +115,14 @@ test-controller:
# Setup e2e testing environment (one-time)
.PHONY: e2e-setup
e2e-setup:
@echo "Setting up e2e test environment (method: $(METHOD))..."
@METHOD=$(METHOD) bash e2e/setup-e2e.sh
@echo "Setting up e2e test environment..."
@bash e2e/setup-e2e.sh

# Run e2e tests
.PHONY: e2e-run
e2e-run:
@echo "Running e2e tests (method: $(METHOD))..."
@METHOD=$(METHOD) bash e2e/run-e2e.sh
@echo "Running e2e tests..."
@bash e2e/run-e2e.sh

# Convenience alias for running e2e tests
.PHONY: e2e
Expand All @@ -137,7 +131,7 @@ e2e: e2e-run
# Full e2e setup + run
.PHONY: e2e-full
e2e-full:
@METHOD=$(METHOD) bash e2e/run-e2e.sh --full
@bash e2e/run-e2e.sh --full

# Clean up e2e test environment
.PHONY: e2e-clean
Expand Down Expand Up @@ -172,8 +166,8 @@ test-e2e: e2e-run
# Compatibility E2E testing (cross-version tests, separate from main e2e)
COMPAT_SCENARIO ?= old-controller
COMPAT_TEST ?= old-controller
COMPAT_CONTROLLER_TAG ?= v0.7.0
COMPAT_CLIENT_VERSION ?= 0.7.1
COMPAT_CONTROLLER_TAG ?= v0.8.1
COMPAT_CLIENT_VERSION ?= 0.7.4

.PHONY: e2e-compat-setup
e2e-compat-setup:
Expand Down
47 changes: 9 additions & 38 deletions controller/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,6 @@ endif
# tools. (i.e. podman)
CONTAINER_TOOL ?= podman

# Deployment method: operator (default) or helm
METHOD ?= operator

# Cluster type: kind (default) or k3s
CLUSTER_TYPE ?= kind
export CLUSTER_TYPE
Expand Down Expand Up @@ -67,17 +64,8 @@ help: ## Display this help.
.PHONY: manifests
manifests: controller-gen ## Generate WebhookConfiguration, ClusterRole and CustomResourceDefinition objects.
$(CONTROLLER_GEN) rbac:roleName=jumpstarter-manager-role crd webhook paths="./api/..." paths="./internal/..." \
output:crd:artifacts:config=deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/crds/ \
output:rbac:artifacts:config=deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/

# Add ArgoCD sync-wave annotation to RBAC role for proper deployment ordering (PR #207)
@awk '/^ name: jumpstarter-manager-role$$/{print; print " annotations:"; print " argocd.argoproj.io/sync-wave: \"-1\""; next}1' \
deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml > \
deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml.tmp && \
mv deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml.tmp \
deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/rbac/role.yaml

cp deploy/helm/jumpstarter/charts/jumpstarter-controller/templates/crds/* deploy/operator/config/crd/bases/
output:crd:artifacts:config=deploy/operator/config/crd/bases/ \
output:rbac:artifacts:config=deploy/operator/config/rbac/

# Regenerate operator install.yaml to include updated CRDs
$(MAKE) -C deploy/operator build-installer
Expand Down Expand Up @@ -170,8 +158,8 @@ docker-buildx: ## Build and push docker image for the manager for cross-platform
.PHONY: build-installer
build-installer: manifests generate kustomize ## Generate a consolidated YAML with CRDs and deployment.
mkdir -p dist
cd config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
$(KUSTOMIZE) build config/default > dist/install.yaml
cd deploy/operator/config/manager && $(KUSTOMIZE) edit set image controller=${IMG}
$(KUSTOMIZE) build deploy/operator/config/default > dist/install.yaml

##@ Deployment

Expand All @@ -181,32 +169,20 @@ endif

.PHONY: install
install: manifests kustomize ## Install CRDs into the K8s cluster specified in ~/.kube/config.
$(KUSTOMIZE) build config/crd | $(KUBECTL) apply -f -
$(KUSTOMIZE) build deploy/operator/config/crd | $(KUBECTL) apply -f -

.PHONY: uninstall
uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
$(KUSTOMIZE) build config/crd | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -
$(KUSTOMIZE) build deploy/operator/config/crd | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -

.PHONY: deploy
deploy: cluster grpcurl ## Deploy controller using METHOD (operator or helm). Set SKIP_BUILD=1 to skip image builds.
deploy: cluster grpcurl ## Deploy controller using the operator. Set SKIP_BUILD=1 to skip image builds. Set CLUSTER_TYPE=k3s for k3s.
ifeq ($(SKIP_BUILD),)
$(MAKE) docker-build
endif
ifeq ($(METHOD),operator)
ifeq ($(SKIP_BUILD),)
$(MAKE) build-operator
endif
./hack/deploy_with_operator.sh
else ifeq ($(METHOD),helm)
./hack/deploy_with_helm.sh
else
$(error Unknown METHOD=$(METHOD). Use 'operator' or 'helm')
endif

# Backward compatibility alias
.PHONY: deploy-with-operator
deploy-with-operator:
$(MAKE) deploy METHOD=operator

.PHONY: deploy-operator
deploy-operator: docker-build build-operator cluster grpcurl ## Deploy only the operator (without Jumpstarter CR)
Expand All @@ -221,20 +197,15 @@ operator-logs:

.PHONY: deploy-with-operator-parallel
deploy-with-operator-parallel:
make deploy METHOD=operator -j5 --output-sync=target
make deploy -j5 --output-sync=target

.PHONY: deploy-exporters
deploy-exporters:
./hack/demoenv/prepare_exporters.sh

.PHONY: lint-helm
lint-helm:
helm lint deploy/helm/jumpstarter


.PHONY: undeploy
undeploy: kustomize ## Undeploy controller from the K8s cluster specified in ~/.kube/config. Call with ignore-not-found=true to ignore resource not found errors during deletion.
$(KUSTOMIZE) build config/default | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -
$(KUSTOMIZE) build deploy/operator/config/default | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -

##@ Dependencies

Expand Down
23 changes: 0 additions & 23 deletions controller/deploy/helm/jumpstarter/.helmignore

This file was deleted.

Loading
Loading