ci: collect controller, router and exporter logs from e2e runs #1656
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: End-to-end tests | |
| on: | |
| workflow_dispatch: | |
| push: | |
| branches: | |
| - main | |
| pull_request: | |
| merge_group: | |
| permissions: | |
| contents: read | |
| env: | |
| CONTAINER_TOOL: docker | |
| jobs: | |
| changes: | |
| if: github.repository_owner == 'jumpstarter-dev' | |
| runs-on: ubuntu-latest | |
| outputs: | |
| should_run: ${{ steps.filter.outputs.e2e }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| with: | |
| fetch-depth: 0 | |
| - uses: dorny/paths-filter@v3 | |
| id: filter | |
| with: | |
| base: ${{ github.base_ref || github.event.merge_group.base_ref || github.ref }} | |
| filters: | | |
| e2e: | |
| - 'controller/**' | |
| - 'e2e/**' | |
| - 'python/**' | |
| - '!python/docs/**' | |
| - '!python/**/*.md' | |
| - '.github/workflows/e2e.yaml' | |
| - 'Makefile' | |
| # =========================================================================== | |
| # 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.24" | |
| - name: Cache controller image | |
| id: cache | |
| uses: actions/cache@v5 | |
| 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/**') }} | |
| - 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.24" | |
| - name: Cache operator artifacts | |
| id: cache | |
| uses: actions/cache@v5 | |
| 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@v5 | |
| 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 | |
| # =========================================================================== | |
| # E2E test jobs: depend on pre-built artifacts | |
| # =========================================================================== | |
| e2e-tests: | |
| needs: [build-controller-image, build-operator-image, build-python-wheels] | |
| strategy: | |
| matrix: | |
| include: | |
| - os: ubuntu-24.04 | |
| arch: amd64 | |
| - os: ubuntu-24.04-arm | |
| arch: arm64 | |
| runs-on: ${{ matrix.os }} | |
| timeout-minutes: 60 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| - name: Install Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.24" | |
| - 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: Install nftables and dnsmasq for dut-network E2E | |
| run: | | |
| sudo apt-get update | |
| sudo apt-get install -y nftables dnsmasq-base | |
| - name: Load kernel modules for DUT network tests | |
| run: | | |
| for mod in veth bridge nf_nat nf_conntrack nft_masq nft_nat nft_chain_nat; do | |
| sudo modprobe "$mod" 2>/dev/null || true | |
| done | |
| - name: Setup e2e test environment | |
| run: make e2e-setup | |
| env: | |
| CI: true | |
| 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 | |
| env: | |
| CI: true | |
| - name: Collect and upload e2e logs | |
| if: always() | |
| uses: ./.github/actions/collect-e2e-logs | |
| with: | |
| artifact-name: e2e-logs-${{ matrix.arch }} | |
| # ============================================================================ | |
| # Compatibility tests: cross-version interop between controller and client/exporter | |
| # ============================================================================ | |
| e2e-compat-old-controller: | |
| needs: changes | |
| if: needs.changes.outputs.should_run == 'true' || github.event_name == 'workflow_dispatch' | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 60 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| - name: Install Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.24" | |
| - 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.8.1 | |
| - name: Run compat tests (old controller + new client/exporter) | |
| run: make e2e-compat-run COMPAT_TEST=old-controller | |
| env: | |
| CI: true | |
| - name: Collect and upload e2e logs | |
| if: always() | |
| uses: ./.github/actions/collect-e2e-logs | |
| with: | |
| artifact-name: e2e-logs-compat-old-controller | |
| e2e-compat-old-client: | |
| 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 | |
| steps: | |
| - name: Checkout repository | |
| uses: actions/checkout@v4 | |
| - name: Install uv | |
| uses: astral-sh/setup-uv@v7 | |
| - name: Install Go | |
| uses: actions/setup-go@v5 | |
| with: | |
| go-version: "1.24" | |
| - name: Download controller image | |
| uses: actions/download-artifact@v4 | |
| with: | |
| 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 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.4) | |
| run: make e2e-compat-setup COMPAT_SCENARIO=old-client | |
| env: | |
| CI: true | |
| 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 | |
| env: | |
| CI: true | |
| - name: Collect and upload e2e logs | |
| if: always() | |
| uses: ./.github/actions/collect-e2e-logs | |
| with: | |
| artifact-name: e2e-logs-compat-old-client |