Skip to content
Merged
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
200 changes: 194 additions & 6 deletions .github/workflows/e2e.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,9 @@ on:
permissions:
contents: read

env:
CONTAINER_TOOL: docker

jobs:
changes:
if: github.repository_owner == 'jumpstarter-dev'
Expand All @@ -33,14 +36,147 @@ jobs:
- '.github/workflows/e2e.yaml'
- 'Makefile'

e2e-tests:
# ===========================================================================
# Build jobs: container images and Python wheels built in parallel
# ===========================================================================

build-controller-image:
needs: changes
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && github.ref == 'refs/heads/main')
strategy:
matrix:
include:
- os: ubuntu-24.04
arch: amd64
- os: ubuntu-24.04-arm
arch: arm64
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install Go
uses: actions/setup-go@v5
with:
go-version: "1.22"

- name: Cache controller image
id: cache
uses: actions/cache@v4
with:
path: /tmp/controller-image.tar
key: controller-image-${{ matrix.arch }}-${{ hashFiles('controller/Makefile', 'controller/Dockerfile', 'controller/go.mod', 'controller/go.sum', 'controller/cmd/**', 'controller/api/**', 'controller/internal/**') }}

Comment thread
coderabbitai[bot] marked this conversation as resolved.
- name: Build controller image
if: steps.cache.outputs.cache-hit != 'true'
run: |
make -C controller docker-build
docker save quay.io/jumpstarter-dev/jumpstarter-controller:latest -o /tmp/controller-image.tar

- name: Upload controller image
uses: actions/upload-artifact@v4
with:
name: controller-image-${{ matrix.arch }}
path: /tmp/controller-image.tar
retention-days: 1

build-operator-image:
needs: changes
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && github.ref == 'refs/heads/main')
strategy:
matrix:
include:
- os: ubuntu-24.04
arch: amd64
- os: ubuntu-24.04-arm
arch: arm64
runs-on: ${{ matrix.os }}
timeout-minutes: 30
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install Go
uses: actions/setup-go@v5
with:
go-version: "1.22"

- name: Cache operator artifacts
id: cache
uses: actions/cache@v4
with:
path: |
/tmp/operator-image.tar
/tmp/operator-install.yaml
key: operator-image-${{ matrix.arch }}-${{ hashFiles('controller/Makefile', 'controller/Dockerfile.operator', 'controller/go.mod', 'controller/go.sum', 'controller/deploy/operator/**', 'controller/api/**', 'controller/internal/**') }}

- name: Build operator image and installer manifest
if: steps.cache.outputs.cache-hit != 'true'
run: |
make -C controller/deploy/operator docker-build build-installer VERSION=latest
docker save quay.io/jumpstarter-dev/jumpstarter-operator:latest -o /tmp/operator-image.tar
cp controller/deploy/operator/dist/install.yaml /tmp/operator-install.yaml

- name: Upload operator artifacts
uses: actions/upload-artifact@v4
with:
name: operator-image-${{ matrix.arch }}
path: |
/tmp/operator-image.tar
/tmp/operator-install.yaml
retention-days: 1

build-python-wheels:
needs: changes
if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && github.ref == 'refs/heads/main')
runs-on: ubuntu-24.04
timeout-minutes: 15
steps:
- name: Checkout repository
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Install uv
uses: astral-sh/setup-uv@v7

- name: Cache python wheels
id: cache
uses: actions/cache@v4
with:
path: python/dist
key: python-wheels-${{ hashFiles('python/**/*.py', 'python/**/pyproject.toml', 'python/uv.lock') }}

- name: Build python wheels
if: steps.cache.outputs.cache-hit != 'true'
working-directory: python
run: uv build --all --out-dir dist

- name: Upload python wheels
uses: actions/upload-artifact@v4
with:
name: python-wheels
path: python/dist/
retention-days: 1
Comment thread
mangelajo marked this conversation as resolved.

# ===========================================================================
# E2E test jobs: depend on pre-built artifacts
# ===========================================================================

e2e-tests:
needs: [build-controller-image, build-operator-image, build-python-wheels]
Comment thread
mangelajo marked this conversation as resolved.
strategy:
matrix:
os:
- ubuntu-24.04
- ubuntu-24.04-arm
include:
- os: ubuntu-24.04
arch: amd64
- os: ubuntu-24.04-arm
arch: arm64
runs-on: ${{ matrix.os }}
timeout-minutes: 60
steps:
Expand All @@ -55,11 +191,39 @@ jobs:
with:
go-version: "1.22"

- name: Download controller image
uses: actions/download-artifact@v4
with:
name: controller-image-${{ matrix.arch }}
path: /tmp/artifacts

- name: Download operator image
uses: actions/download-artifact@v4
with:
name: operator-image-${{ matrix.arch }}
path: /tmp/artifacts

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

- 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 e2e test environment
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

- name: Run e2e tests
run: make e2e-run
Expand All @@ -73,7 +237,7 @@ jobs:
# ============================================================================

e2e-compat-old-controller:
needs: changes
needs: [changes, 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 @@ -89,19 +253,26 @@ 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)
run: make e2e-compat-setup COMPAT_SCENARIO=old-controller
env:
CI: true
COMPAT_CONTROLLER_TAG: v0.7.0
PREBUILT_WHEELS_DIR: /tmp/python-wheels

- 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
needs: [changes, build-controller-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 @@ -117,11 +288,28 @@ jobs:
with:
go-version: "1.22"

- name: Download controller image
uses: actions/download-artifact@v4
with:
name: controller-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: Setup compat environment (old client v0.7.0)
run: make e2e-compat-setup COMPAT_SCENARIO=old-client
env:
CI: true
COMPAT_CLIENT_VERSION: "0.7.1"
SKIP_BUILD: "true"
PREBUILT_WHEELS_DIR: /tmp/python-wheels

- name: Run compat tests (new controller + old client/exporter)
run: make e2e-compat-run COMPAT_TEST=old-client
Expand Down
7 changes: 6 additions & 1 deletion controller/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -188,9 +188,14 @@ uninstall: manifests kustomize ## Uninstall CRDs from the K8s cluster specified
$(KUSTOMIZE) build config/crd | $(KUBECTL) delete --ignore-not-found=$(ignore-not-found) -f -

.PHONY: deploy
deploy: docker-build cluster grpcurl ## Deploy controller using METHOD (operator or helm). Set CLUSTER_TYPE=k3s for k3s.
deploy: cluster grpcurl ## Deploy controller using METHOD (operator or helm). Set SKIP_BUILD=1 to skip image builds.
ifeq ($(SKIP_BUILD),)
$(MAKE) docker-build
endif
ifeq ($(METHOD),operator)
ifeq ($(SKIP_BUILD),)
$(MAKE) build-operator
endif
Comment thread
coderabbitai[bot] marked this conversation as resolved.
./hack/deploy_with_operator.sh
else ifeq ($(METHOD),helm)
./hack/deploy_with_helm.sh
Expand Down
Loading
Loading