mirror of
https://github.com/LGUG2Z/komorebi.git
synced 2026-11-14 12:53:43 +01:00
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.
106 lines
4.0 KiB
YAML
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
|