Skip to content

Conversation

@shreeya-patel98
Copy link
Collaborator

Add automated kernel CI workflow with kselftest and PR creation
Implements a 5-stage GitHub Actions pipeline for automated kernel testing and PR creation.
Uses kernel-container-build automated-testing-v1 branch for build/test tooling.

Stage 1: Build (15-30 min)

  • Checkout kernel source + kernel-container-build repo (automated-testing-v1)
  • Build kernel in CIQ builder container with kABI checking
  • Convert built container to QCOW2 VM image
  • Upload: kernel-build.log, QCOW2 image

Stage 2: Boot Verification (2-5 min)

  • Download QCOW2 image
  • Boot kernel in QEMU (KVM or TCG) and validate login prompt appears
  • Upload: boot logs

Stage 3: Kernel Selftests (40-60 min)

  • Download QCOW2 image
  • Execute comprehensive kselftests in QEMU with dual serial consoles
  • Upload: kselftest TAP logs, dmesg output

Stage 4: Compare Results (1-2 min)
Purpose: Detect test regressions by comparing against base branch

Steps:

  1. Checkout with full history (fetch-depth: 0) for git merge-base ops
  2. Download current kselftest logs
  3. Smart base branch detection:
    • For PRs: Uses PR's target branch
    • For pushes: Sorts branches by commit date, checks 30 most recent,
      finds closest common ancestor via git merge-base
    • For force-pushes: Doesn't do the detection again, instead uses the
      same base branch as detected during the first PR creation and also
      compares the result against that base branch only
    • Outputs: base_branch (reused by PR stage)
  4. Download baseline logs from base branch (searches last 5 successful runs)
  5. Compare results:
    • Counts passing/failing tests (before/after)
    • Fails if >±3 tests changed
    • Outputs: comparison_status, comparison_message

Stage 5: Create Pull Request (1-2 min)
Purpose: Auto-create/update PR after all tests pass

Prerequisites: Only runs if build + boot + kselftest passed, no regressions detected

Steps:

  1. Check all stages passed and comparison_status != failed
  2. Checkout (shallow: fetch-depth: 50) for commit messages
  3. Download all artifacts (build/boot/test logs)
  4. Extract statistics (pass/fail counts, build times)
  5. Get commit info:
    • Single commit: Use commit message
    • Multiple commits: Create summary
  6. Create/Update PR:
    • Reuses base_branch from compare-results (no duplication!)
    • Generate PR body with test results via create-pr-body.sh
    • Creates new PR or updates existing one in case of force pushes

Note :-
To skip this github action workflow, add [ci skip] or [skip ci]
into the head commit when pushing the patches.

Implements a 5-stage GitHub Actions pipeline for automated kernel testing and PR creation.
Uses kernel-container-build automated-testing-v1 branch for build/test tooling.

Stage 1: Build (15-30 min)
- Checkout kernel source + kernel-container-build repo (automated-testing-v1)
- Build kernel in CIQ builder container with kABI checking
- Convert built container to QCOW2 VM image
- Upload: kernel-build.log, QCOW2 image

Stage 2: Boot Verification (2-5 min)
- Download QCOW2 image
- Boot kernel in QEMU (KVM or TCG) and validate login prompt appears
- Upload: boot logs

Stage 3: Kernel Selftests (40-60 min)
- Download QCOW2 image
- Execute comprehensive kselftests in QEMU with dual serial consoles
- Upload: kselftest TAP logs, dmesg output

Stage 4: Compare Results (1-2 min)
Purpose: Detect test regressions by comparing against base branch

Steps:
1. Checkout with full history (fetch-depth: 0) for git merge-base ops
2. Download current kselftest logs
3. Smart base branch detection:
   - For PRs: Uses PR's target branch
   - For pushes: Sorts branches by commit date, checks 30 most recent,
     finds closest common ancestor via git merge-base
   - For force-pushes: Doesn't do the detection again, instead uses the
     same base branch as detected during the first PR creation and also
     compares the result against that base branch only
   - Outputs: base_branch (reused by PR stage)
4. Download baseline logs from base branch (searches last 5 successful runs)
5. Compare results:
   - Counts passing/failing tests (before/after)
   - Fails if >±3 tests changed
   - Outputs: comparison_status, comparison_message

Stage 5: Create Pull Request (1-2 min)
Purpose: Auto-create/update PR after all tests pass

Prerequisites: Only runs if build + boot + kselftest passed, no regressions detected

Steps:
1. Check all stages passed and comparison_status != failed
2. Checkout (shallow: fetch-depth: 50) for commit messages
3. Download all artifacts (build/boot/test logs)
4. Extract statistics (pass/fail counts, build times)
5. Get commit info:
   - Single commit: Use commit message
   - Multiple commits: Create summary
6. Create/Update PR:
   - Reuses base_branch from compare-results (no duplication!)
   - Generate PR body with test results via create-pr-body.sh
   - Creates new PR or updates existing one in case of force pushes

Note :-
To skip this github action workflow, add [ci skip] or [skip ci]
into the head commit when pushing the patches.

Signed-off-by: Shreeya Patel <[email protected]>
Script to generate detailed PR descriptions with kselftest results.

Signed-off-by: Shreeya Patel <[email protected]>
build:
name: Build kernel
runs-on: kernel-build
if: "!contains(github.event.head_commit.message, '[skip ci]') && !contains(github.event.head_commit.message, '[ci skip]')"

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can we use a specific branch naming? I find that way easier than changing commit messages.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Something like {user}_<original_branch> should be fine. The others are just experiments.

Copy link
Collaborator Author

@shreeya-patel98 shreeya-patel98 Nov 11, 2025

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@roxanan1996 Yes we are doing it both way. I have added support for using specific branch name as well as kept this skip CI tag support
See line 392

I will also update the commit msg to reflect this

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

3 participants