Files
komorebi/.github/workflows/_vm-attempt.yaml
T
LGUG2Z 996330f19b fix(ci): draw the host of a VM suite again when it has no KVM, in the same run
A hosted runner of the ubuntu-24.04 pool is not promised nested virtualization, and
3 of the 16 suites of run 42182554717 failed the check of /dev/kvm. rerun-no-kvm.yaml
could not help: a workflow_run workflow runs only from the default branch, where the
file is not, and a run cannot rerun its own failed jobs while it is in progress.

The step "Enable KVM" of the nix action is now the only one that enables KVM
(enable_kvm of install-nix-action is off), runs before the disk and the install,
waits for udev to settle and polls /dev/kvm for 30 seconds instead of testing it
once, 42 ms after an asynchronous udevadm trigger, and prints what tells a missing
device from a rule that was not applied yet. With defer-no-kvm a host without KVM
is an output, not a failure.

_vm.yaml calls _vm-attempt.yaml up to three times: the suites that found no KVM are
listed through the artifacts of the run and run again on new machines, and the last
attempt fails them. vm-fast and vm-slow are calls of it. rerun-no-kvm.yaml is
removed.
2026-11-06 09:18:43 -08:00

106 lines
4.0 KiB
YAML

# One attempt at a list of VM suites, one machine each. Called by _vm.yaml, which calls it up to three
# times: a hosted runner may land on a host with no KVM, and the host cannot be chosen, only drawn again.
#
# With `defer-no-kvm` a leg that lands on such a host does not fail: it uploads the artifact
# `kvm-missing-<run attempt>-<attempt>-<suite>` and succeeds without having run the suite, and the next
# attempt reads the artifacts to find the suites it has to run. The last attempt does not defer: a suite
# that found no KVM in every attempt fails.
name: vm-attempt
on:
workflow_call:
inputs:
suites:
description: The suites to run, as a JSON list (the first attempt); later attempts find theirs
type: string
default: "[]"
attempt:
description: 1, 2 or 3
type: number
required: true
slow:
description: The slow tier (the driver is run by hand, and its output kept), not the sandboxed `nix build`
type: boolean
default: false
defer-no-kvm:
type: boolean
required: true
permissions:
contents: read
jobs:
# the suites that the attempt before found no KVM for
plan:
if: ${{ inputs.attempt > 1 }}
runs-on: ubuntu-24.04
timeout-minutes: 5
permissions:
actions: read
outputs:
suites: ${{ steps.plan.outputs.suites }}
steps:
- id: plan
env:
GH_TOKEN: ${{ github.token }}
RUN_ATTEMPT: ${{ github.run_attempt }}
ATTEMPT: ${{ inputs.attempt }}
run: |
# GitHub expressions cannot subtract: the attempt before is computed here
PREFIX="kvm-missing-$RUN_ATTEMPT-$((ATTEMPT - 1))-"
suites=$(gh api --paginate "repos/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID/artifacts" \
--jq '.artifacts[].name' |
jq -R --arg prefix "$PREFIX" 'select(startswith($prefix)) | ltrimstr($prefix)' |
jq -sc .)
echo "suites to run again: $suites"
echo "suites=$suites" >> "$GITHUB_OUTPUT"
suite:
needs: [plan]
if: ${{ !cancelled() && needs.plan.result != 'failure' && (inputs.attempt == 1 || needs.plan.outputs.suites != '[]') }}
runs-on: ubuntu-24.04
timeout-minutes: ${{ inputs.slow && 60 || 45 }}
strategy:
fail-fast: false
max-parallel: 8
matrix:
suite: ${{ fromJson(inputs.attempt == 1 && inputs.suites || needs.plan.outputs.suites) }}
steps:
- uses: actions/checkout@v6
- id: nix
uses: ./.github/actions/nix
with:
kvm: "true"
defer-no-kvm: ${{ inputs.defer-no-kvm }}
cachix-cache: ${{ vars.CACHIX_CACHE }}
cachix-auth-token: ${{ secrets.CACHIX_AUTH_TOKEN }}
- name: Remember that this host had no KVM
if: steps.nix.outputs.kvm == 'missing'
run: echo "${{ matrix.suite }}" > kvm-missing
- if: steps.nix.outputs.kvm == 'missing'
uses: actions/upload-artifact@v7
with:
name: kvm-missing-${{ github.run_attempt }}-${{ inputs.attempt }}-${{ matrix.suite }}
path: kvm-missing
retention-days: 1
# each suite in its own machine, in a sandboxed `nix build` like any other check
- if: steps.nix.outputs.kvm == 'ready' && !inputs.slow
run: nix build -L --no-link .#legacyPackages.x86_64-linux.vm.${{ matrix.suite }}
# the driver is run by hand, outside the sandbox, so that the screenshots and the journals of a
# failed run can be uploaded
- if: steps.nix.outputs.kvm == 'ready' && inputs.slow
run: nix build -L .#legacyPackages.x86_64-linux.vm.${{ matrix.suite }}.driver -o driver
- if: steps.nix.outputs.kvm == 'ready' && inputs.slow
run: mkdir -p out && cd out && ../driver/bin/nixos-test-driver -o .
- if: ${{ always() && steps.nix.outputs.kvm == 'ready' && inputs.slow }}
uses: actions/upload-artifact@v7
with:
name: ci-vm-${{ matrix.suite }}-${{ github.sha }}
path: out/
if-no-files-found: ignore
retention-days: 7