Skip to content

Commit 9cf85f9

Browse files
ci(e2e): start Linux and tmachine jobs without waiting on macOS or package builds (#5270)
* ci(e2e): build macOS binaries without blocking Linux jobs Branch E2E built the macOS binaries in the same reusable workflow call as the Linux binaries, so every Linux consumer waited for the macOS runners. Add linux and macos inputs to build-binaries and build-vm-driver, and call them separately in Branch E2E. The result jobs still depend on the macOS builds, so a macOS build failure still fails them. Release workflows keep both inputs at their defaults. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com> * ci(e2e): build tmachine test inputs before packages finish Prepare tmachine inputs built the test archives, test workload images, and Helm chart after the DEB and RPM builds finished, which added about three minutes before any tmachine suite could start. None of them use the packages. Build them in a Branch E2E job that needs only PR metadata, and let prepare download the result through a new test-inputs-artifact-name input. Other callers of prepare-integration-inputs leave the input empty and still build in place with the same steps. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com> * ci(e2e): split binary builds into per-platform workflows Branch E2E used flags on the shared build workflows to keep Linux and macOS apart. Make each platform its own reusable workflow instead, with a plain matrix, so a consumer depends only on the platforms it needs and adding a platform means adding a workflow rather than another flag. Move the VM driver build steps shared by both platforms into a composite action. Release workflows call both platforms and keep their existing gating. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com> * ci(release): inline VM driver build steps in the platform workflows Release builds check out the release tag, so a local action used by the VM driver workflows must exist in that tag. A tag cut before the shared build-vm-driver action landed would not have it, which breaks promoting or re-qualifying that tag. Keep the steps inline in each platform workflow instead. Signed-off-by: Matthew Grossman <mgrossman@nvidia.com> --------- Signed-off-by: Matthew Grossman <mgrossman@nvidia.com>
1 parent 9e004a7 commit 9cf85f9

9 files changed

Lines changed: 342 additions & 83 deletions

‎.github/workflows/branch-e2e.yml‎

Lines changed: 93 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -101,11 +101,21 @@ jobs:
101101
echo "rpm_release=$rpm_release"
102102
} >> "$GITHUB_OUTPUT"
103103
104-
build-binaries:
104+
build-binaries-linux:
105105
needs: version
106106
permissions:
107107
contents: read
108-
uses: ./.github/workflows/build-binaries.yml
108+
uses: ./.github/workflows/build-binaries-linux.yml
109+
with:
110+
cargo-version: ${{ needs.version.outputs.cargo }}
111+
secrets:
112+
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
113+
114+
build-binaries-macos:
115+
needs: version
116+
permissions:
117+
contents: read
118+
uses: ./.github/workflows/build-binaries-macos.yml
109119
with:
110120
cargo-version: ${{ needs.version.outputs.cargo }}
111121
secrets:
@@ -146,7 +156,7 @@ jobs:
146156

147157
# The conformance program, built once per architecture for the host lanes.
148158
# It lives in its own workspace and is not released, so it is not part of
149-
# build-binaries.yml.
159+
# build-binaries-linux.yml.
150160
build-conformance:
151161
name: openshell-conformance (${{ matrix.triple }})
152162
needs: [pr_metadata]
@@ -237,19 +247,30 @@ jobs:
237247
triple: ${{ matrix.triple }}
238248
cargo-version: ${{ needs.version.outputs.cargo }}
239249

240-
build-vm-driver:
241-
needs: [pr_metadata, version, build-binaries]
250+
build-vm-driver-linux:
251+
needs: [pr_metadata, version, build-binaries-linux]
242252
if: needs.pr_metadata.outputs.run_core_e2e == 'true'
243253
permissions:
244254
contents: read
245-
uses: ./.github/workflows/build-vm-driver.yml
255+
uses: ./.github/workflows/build-vm-driver-linux.yml
256+
with:
257+
cargo-version: ${{ needs.version.outputs.cargo }}
258+
secrets:
259+
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
260+
261+
build-vm-driver-macos:
262+
needs: [pr_metadata, version, build-binaries-linux, build-binaries-macos]
263+
if: needs.pr_metadata.outputs.run_core_e2e == 'true'
264+
permissions:
265+
contents: read
266+
uses: ./.github/workflows/build-vm-driver-macos.yml
246267
with:
247268
cargo-version: ${{ needs.version.outputs.cargo }}
248269
secrets:
249270
CACHIX_AUTH_TOKEN: ${{ secrets.CACHIX_AUTH_TOKEN }}
250271

251272
build-images:
252-
needs: [pr_metadata, build-binaries]
273+
needs: [pr_metadata, build-binaries-linux]
253274
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_any_e2e == 'true'
254275
permissions:
255276
contents: read
@@ -258,7 +279,7 @@ jobs:
258279

259280
build-deb:
260281
name: Build Debian packages
261-
needs: [pr_metadata, version, build-binaries, build-vm-driver]
282+
needs: [pr_metadata, version, build-binaries-linux, build-vm-driver-linux]
262283
if: needs.pr_metadata.outputs.run_integration == 'true'
263284
permissions:
264285
contents: read
@@ -270,7 +291,7 @@ jobs:
270291

271292
build-rpm:
272293
name: Build RPM packages
273-
needs: [pr_metadata, version, build-binaries]
294+
needs: [pr_metadata, version, build-binaries-linux]
274295
if: needs.pr_metadata.outputs.run_integration == 'true'
275296
permissions:
276297
actions: read
@@ -282,8 +303,48 @@ jobs:
282303
rpm-release: ${{ needs.version.outputs.rpm_release }}
283304
cargo-version: ${{ needs.version.outputs.cargo }}
284305

306+
# Test inputs don't depend on the packages, so build them while the packages
307+
# build instead of in prepare-integration.
308+
build-tmachine-test-inputs:
309+
name: Build tmachine test inputs
310+
needs: [pr_metadata]
311+
if: needs.pr_metadata.outputs.run_integration == 'true'
312+
permissions:
313+
contents: read
314+
runs-on: ubuntu-24.04
315+
timeout-minutes: 30
316+
steps:
317+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
318+
with:
319+
persist-credentials: false
320+
ref: ${{ github.sha }}
321+
- uses: ./.github/actions/setup-nix
322+
- name: Build test archives
323+
run: |
324+
# Retry dependency preparation, then generate artifacts once.
325+
nix build --no-link .#build-artifacts-test-archives || nix build --no-link .#build-artifacts-test-archives
326+
nix run .#build-artifacts-test-archives
327+
- name: Build test workload images
328+
run: |
329+
# Retry dependency preparation, then generate artifacts once.
330+
nix build --no-link .#build-artifacts-test-images || nix build --no-link .#build-artifacts-test-images
331+
nix run .#build-artifacts-test-images
332+
- name: Package Helm chart
333+
run: |
334+
# Retry dependency preparation, then generate artifacts once.
335+
nix build --no-link .#build-artifacts-helm || nix build --no-link .#build-artifacts-helm
336+
nix run .#build-artifacts-helm
337+
- name: Upload tmachine test inputs
338+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
339+
with:
340+
name: openshell-tmachine-test-inputs
341+
path: artifacts
342+
compression-level: 0
343+
retention-days: 5
344+
if-no-files-found: error
345+
285346
prepare-integration:
286-
needs: [pr_metadata, build-binaries, build-images, build-deb, build-rpm]
347+
needs: [pr_metadata, build-binaries-linux, build-images, build-deb, build-rpm, build-tmachine-test-inputs]
287348
if: needs.pr_metadata.outputs.run_integration == 'true'
288349
permissions:
289350
actions: read
@@ -293,6 +354,7 @@ jobs:
293354
with:
294355
deb-artifact-name: deb-linux-amd64
295356
rpm-artifact-name: rpm-linux-x86_64
357+
test-inputs-artifact-name: openshell-tmachine-test-inputs
296358

297359
# Run driver-independent conformance tests.
298360
conformance-integration:
@@ -361,7 +423,7 @@ jobs:
361423
]
362424
363425
docker-e2e:
364-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
426+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
365427
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
366428
permissions:
367429
actions: read
@@ -374,7 +436,7 @@ jobs:
374436
runner: linux-arm64-cpu8
375437

376438
podman-e2e:
377-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
439+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
378440
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
379441
permissions:
380442
actions: read
@@ -388,7 +450,7 @@ jobs:
388450
[{"suite":"ci","runner":"ubuntu-26.04","podman_major":"5","podman_package_version":"5.7.0+ds2-3build1","conmon_package_version":"2.1.13+ds1-2","cmd":"mise run --no-deps --skip-deps e2e:podman:ci"}]
389451
390452
podman-additional-ca-e2e:
391-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
453+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
392454
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
393455
permissions:
394456
actions: read
@@ -402,7 +464,7 @@ jobs:
402464
[{"suite":"additional-ca","runner":"ubuntu-26.04","podman_major":"5","podman_package_version":"5.7.0+ds2-3build1","conmon_package_version":"2.1.13+ds1-2","cmd":"OPENSHELL_E2E_PODMAN_TEST=additional_ca mise run --no-deps --skip-deps e2e:podman"}]
403465
404466
vm-e2e:
405-
needs: [pr_metadata, build-binaries, build-conformance, build-vm-driver]
467+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-vm-driver-linux]
406468
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
407469
permissions:
408470
actions: read
@@ -413,7 +475,7 @@ jobs:
413475
prebuilt-conformance: true
414476

415477
vm-additional-ca-e2e:
416-
needs: [pr_metadata, build-binaries, build-conformance, build-vm-driver]
478+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-vm-driver-linux]
417479
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
418480
permissions:
419481
actions: read
@@ -426,7 +488,7 @@ jobs:
426488
test-name: additional_ca
427489

428490
docker-external-driver-e2e:
429-
needs: [pr_metadata, build-binaries, build-conformance, build-gateway-plain, build-external-drivers, build-images]
491+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-gateway-plain, build-external-drivers, build-images]
430492
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
431493
permissions:
432494
actions: read
@@ -443,7 +505,7 @@ jobs:
443505
[{"suite":"external-driver","cmd":"mise run --no-deps --skip-deps e2e:docker:external-driver","apt_packages":"openssh-client","python_proto":false,"mcp":false}]
444506
445507
podman-external-driver-e2e:
446-
needs: [pr_metadata, build-binaries, build-conformance, build-gateway-plain, build-external-drivers, build-images]
508+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-gateway-plain, build-external-drivers, build-images]
447509
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
448510
permissions:
449511
actions: read
@@ -459,7 +521,7 @@ jobs:
459521
[{"suite":"external-driver","runner":"ubuntu-26.04","podman_major":"5","podman_package_version":"5.7.0+ds2-3build1","conmon_package_version":"2.1.13+ds1-2","cmd":"mise run --no-deps --skip-deps e2e:podman:external-driver"}]
460522
461523
vm-external-driver-e2e:
462-
needs: [pr_metadata, build-binaries, build-conformance, build-gateway-plain, build-vm-driver]
524+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-gateway-plain, build-vm-driver-linux]
463525
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
464526
permissions:
465527
actions: read
@@ -473,7 +535,7 @@ jobs:
473535
e2e-task: e2e:vm:external-driver
474536

475537
gpu-e2e:
476-
needs: [pr_metadata, build-binaries, build-images]
538+
needs: [pr_metadata, build-binaries-linux, build-images]
477539
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_gpu_e2e == 'true'
478540
permissions:
479541
actions: read
@@ -484,7 +546,7 @@ jobs:
484546
image-tag: ${{ github.sha }}
485547

486548
kubernetes-e2e:
487-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
549+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
488550
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
489551
strategy:
490552
fail-fast: false
@@ -515,7 +577,7 @@ jobs:
515577
test-name: ${{ matrix.test_name }}
516578

517579
kubernetes-app-listener-e2e:
518-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
580+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
519581
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
520582
strategy:
521583
fail-fast: false
@@ -553,7 +615,7 @@ jobs:
553615
listener-takeover: ${{ matrix.takeover }}
554616

555617
kubernetes-workspace-managed-e2e:
556-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
618+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
557619
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
558620
permissions:
559621
actions: read
@@ -567,7 +629,7 @@ jobs:
567629
e2e-task: e2e:kubernetes:workspace-managed
568630

569631
kubernetes-external-driver-e2e:
570-
needs: [pr_metadata, build-binaries, build-conformance, build-gateway-plain, build-external-drivers, build-images]
632+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-gateway-plain, build-external-drivers, build-images]
571633
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
572634
permissions:
573635
actions: read
@@ -584,7 +646,7 @@ jobs:
584646
cluster-images: sandbox supervisor
585647

586648
kubernetes-workspace-operator-e2e:
587-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
649+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
588650
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_core_e2e == 'true'
589651
permissions:
590652
actions: read
@@ -598,7 +660,7 @@ jobs:
598660
e2e-task: e2e:kubernetes:workspace-operator
599661

600662
kubernetes-ha-e2e:
601-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
663+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
602664
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_kubernetes_ha_e2e == 'true'
603665
permissions:
604666
actions: read
@@ -616,7 +678,7 @@ jobs:
616678
use-envoy-gateway: true
617679

618680
kubernetes-credential-drivers-e2e:
619-
needs: [pr_metadata, build-binaries, build-conformance, build-images]
681+
needs: [pr_metadata, build-binaries-linux, build-conformance, build-images]
620682
if: needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_kubernetes_credential_drivers_e2e == 'true'
621683
permissions:
622684
actions: read
@@ -633,6 +695,8 @@ jobs:
633695
name: Core E2E result
634696
needs:
635697
- pr_metadata
698+
- build-binaries-macos
699+
- build-vm-driver-macos
636700
- conformance-integration
637701
- feature-specific-integration
638702
- driver-specific-integration
@@ -662,7 +726,7 @@ jobs:
662726

663727
gpu-e2e-result:
664728
name: GPU E2E result
665-
needs: [pr_metadata, gpu-e2e]
729+
needs: [pr_metadata, build-binaries-macos, gpu-e2e]
666730
if: always() && needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_gpu_e2e == 'true'
667731
runs-on: ubuntu-latest
668732
steps:
@@ -675,7 +739,7 @@ jobs:
675739

676740
kubernetes-ha-e2e-result:
677741
name: Kubernetes HA E2E result
678-
needs: [pr_metadata, kubernetes-ha-e2e]
742+
needs: [pr_metadata, build-binaries-macos, kubernetes-ha-e2e]
679743
if: always() && needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_kubernetes_ha_e2e == 'true'
680744
runs-on: ubuntu-latest
681745
steps:
@@ -688,7 +752,7 @@ jobs:
688752

689753
kubernetes-credential-drivers-e2e-result:
690754
name: Kubernetes Credential Drivers E2E result
691-
needs: [pr_metadata, kubernetes-credential-drivers-e2e]
755+
needs: [pr_metadata, build-binaries-macos, kubernetes-credential-drivers-e2e]
692756
if: always() && needs.pr_metadata.outputs.should_run == 'true' && needs.pr_metadata.outputs.run_kubernetes_credential_drivers_e2e == 'true'
693757
runs-on: ubuntu-latest
694758
steps:

.github/workflows/build-binaries.yml renamed to .github/workflows/build-binaries-linux.yml

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved.
22
# SPDX-License-Identifier: Apache-2.0
33

4-
name: Build Binaries
4+
name: Build Linux Binaries
55

66
on:
77
workflow_call:
@@ -40,8 +40,6 @@ jobs:
4040
runner: linux-amd64-cpu8
4141
- triple: aarch64-unknown-linux-musl
4242
runner: linux-arm64-cpu8
43-
- triple: aarch64-apple-darwin
44-
runner: macos-15-xlarge
4543
runs-on: ${{ matrix.runner }}
4644
timeout-minutes: 60
4745
steps: &build_steps
@@ -74,8 +72,6 @@ jobs:
7472
runner: linux-amd64-cpu8
7573
- triple: aarch64-unknown-linux-musl
7674
runner: linux-arm64-cpu8
77-
- triple: aarch64-apple-darwin
78-
runner: macos-15-xlarge
7975
runs-on: ${{ matrix.runner }}
8076
timeout-minutes: 60
8177
steps: *build_steps
@@ -92,8 +88,6 @@ jobs:
9288
runner: linux-amd64-cpu8
9389
- triple: aarch64-unknown-linux-gnu
9490
runner: linux-arm64-cpu8
95-
- triple: aarch64-apple-darwin
96-
runner: macos-15-xlarge
9791
runs-on: ${{ matrix.runner }}
9892
timeout-minutes: 60
9993
steps: *build_steps
@@ -122,10 +116,6 @@ jobs:
122116
binary: openshell-supervisor
123117
triple: aarch64-unknown-linux-gnu
124118
runner: linux-arm64-cpu8
125-
- package: openshell-supervisor
126-
binary: openshell-supervisor
127-
triple: aarch64-apple-darwin
128-
runner: macos-15-xlarge
129119
runs-on: ${{ matrix.runner }}
130120
timeout-minutes: 60
131121
steps: *build_steps

0 commit comments

Comments
 (0)