diff --git a/.github/workflows/scripts/generate-ci-type.py b/.github/workflows/scripts/generate-ci-type.py index 059d6ad38..b1910ab63 100755 --- a/.github/workflows/scripts/generate-ci-type.py +++ b/.github/workflows/scripts/generate-ci-type.py @@ -3,13 +3,16 @@ """ Determine the CI type based on the change list and commit message. -Prints "quick" if (explicity required by user): +Output format: " " where source is "manual" (from +ZFS-CI-Type commit tag) or "auto" (from file change heuristics). + +Prints "quick manual" if: - the *last* commit message contains 'ZFS-CI-Type: quick' -or if (heuristics): +or "quick auto" if (heuristics): - the files changed are not in the list of specified directories, and - all commit messages do not contain 'ZFS-CI-Type: (full|linux|freebsd)' -Otherwise prints "full". +Otherwise prints "full auto" (or " manual" if explicitly requested). """ import sys @@ -58,9 +61,10 @@ if __name__ == '__main__': head, base = sys.argv[1:3] - def output_type(type, reason): - print(f'{prog}: will run {type} CI: {reason}', file=sys.stderr) - print(type) + def output_type(type, source, reason): + print(f'{prog}: will run {type} CI ({source}): {reason}', + file=sys.stderr) + print(f'{type} {source}') sys.exit(0) # check last (HEAD) commit message @@ -70,7 +74,8 @@ if __name__ == '__main__': for line in last_commit_message_raw.stdout.decode().splitlines(): if line.strip().lower() == 'zfs-ci-type: quick': - output_type('quick', f'requested by HEAD commit {head}') + output_type('quick', 'manual', + f'requested by HEAD commit {head}') # check all commit messages all_commit_message_raw = subprocess.run([ @@ -84,11 +89,14 @@ if __name__ == '__main__': if line.startswith('ZFS-CI-Commit:'): commit_ref = line.lstrip('ZFS-CI-Commit:').rstrip() if line.strip().lower() == 'zfs-ci-type: freebsd': - output_type('freebsd', f'requested by commit {commit_ref}') + output_type('freebsd', 'manual', + f'requested by commit {commit_ref}') if line.strip().lower() == 'zfs-ci-type: linux': - output_type('linux', f'requested by commit {commit_ref}') + output_type('linux', 'manual', + f'requested by commit {commit_ref}') if line.strip().lower() == 'zfs-ci-type: full': - output_type('full', f'requested by commit {commit_ref}') + output_type('full', 'manual', + f'requested by commit {commit_ref}') # check changed files changed_files_raw = subprocess.run([ @@ -104,9 +112,10 @@ if __name__ == '__main__': for r in FULL_RUN_REGEX: if r.match(f): output_type( - 'full', + 'full', 'auto', f'changed file "{f}" matches pattern "{r.pattern}"' ) # catch-all - output_type('quick', 'no changed file matches full CI patterns') + output_type('quick', 'auto', + 'no changed file matches full CI patterns') diff --git a/.github/workflows/zfs-qemu.yml b/.github/workflows/zfs-qemu.yml index a9615abb6..08ac889d3 100644 --- a/.github/workflows/zfs-qemu.yml +++ b/.github/workflows/zfs-qemu.yml @@ -35,12 +35,13 @@ jobs: id: os run: | ci_type="default" + ci_source="auto" # determine CI type when running on PR if ${{ github.event_name == 'pull_request' }}; then head=${{ github.event.pull_request.head.sha }} base=${{ github.event.pull_request.base.sha }} - ci_type=$(python3 .github/workflows/scripts/generate-ci-type.py $head $base) + read ci_type ci_source <<< "$(python3 .github/workflows/scripts/generate-ci-type.py $head $base)" fi case "$ci_type" in @@ -59,6 +60,19 @@ jobs: ;; esac + # Repository-level override for OS selection. + # Set vars.ZTS_OS_OVERRIDE in repo settings to restrict targets + # (e.g. '["debian13"]' or '["debian13", "fedora42"]'). + # Manual ZFS-CI-Type in commit messages bypasses the override. + if [ -n "${{ vars.ZTS_OS_OVERRIDE }}" ] && [ "$ci_source" != "manual" ]; then + override='${{ vars.ZTS_OS_OVERRIDE }}' + if echo "$override" | jq -e 'type == "array"' >/dev/null 2>&1; then + os_selection="$override" + else + echo "::warning::Invalid ZTS_OS_OVERRIDE, using default" + fi + fi + if ${{ github.event.inputs.fedora_kernel_ver != '' }}; then # They specified a custom kernel version for Fedora. # Use only Fedora runners.