241 lines
5.6 KiB
Markdown
241 lines
5.6 KiB
Markdown
# Breenix CI/CD Patterns Reference
|
|
|
|
## Core Requirements
|
|
|
|
### Rust Toolchain
|
|
- **Nightly version**: `nightly-2025-06-24` (pinned for consistency)
|
|
- **Components**: `rust-src`, `llvm-tools-preview`
|
|
- **Optional**: `clippy` for code quality checks
|
|
- **Target**: `x86_64-unknown-none` for kernel builds
|
|
|
|
### System Dependencies
|
|
```bash
|
|
sudo apt-get update
|
|
sudo apt-get install -y \
|
|
qemu-system-x86 \
|
|
qemu-utils \
|
|
ovmf \
|
|
mtools \
|
|
dosfstools \
|
|
xorriso \
|
|
nasm \
|
|
lld
|
|
```
|
|
|
|
### Build Tools
|
|
- **llvm-tools**: Add to PATH: `$(rustc --print sysroot)/lib/rustlib/x86_64-unknown-linux-gnu/bin`
|
|
- **ld.lld**: Required for linking userspace binaries
|
|
|
|
## Breenix-Specific Build Patterns
|
|
|
|
### Userspace Binary Building
|
|
Must be done before kernel tests that execute userspace code:
|
|
|
|
```bash
|
|
export PATH="$PATH:$(rustc --print sysroot)/lib/rustlib/x86_64-unknown-linux-gnu/bin"
|
|
cd userspace/tests
|
|
./build.sh
|
|
```
|
|
|
|
### Kernel Build with Testing Features
|
|
```bash
|
|
cargo run --release --features testing --bin qemu-uefi -- -serial stdio -display none
|
|
```
|
|
|
|
### Using xtask for Tests
|
|
Breenix uses the `xtask` pattern for complex test workflows:
|
|
|
|
```bash
|
|
cargo run -p xtask -- ring3-smoke
|
|
cargo run -p xtask -- ring3-enosys
|
|
```
|
|
|
|
## Timeout Strategies
|
|
|
|
### Typical Timeouts
|
|
- **Code quality checks**: 10-15 minutes
|
|
- **Build + simple tests**: 20 minutes
|
|
- **Full integration tests**: 45 minutes
|
|
- **CI environment**: Add 2-3x overhead for slower runners
|
|
|
|
### QEMU Execution Timeouts
|
|
- **Local**: 30 seconds for smoke tests
|
|
- **CI**: 60 seconds (logs are verbose, builds are slower)
|
|
- **File creation**: 30s local, 300s (5 min) CI
|
|
|
|
## Caching Strategies
|
|
|
|
### Cargo Cache
|
|
```yaml
|
|
- uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.cargo/registry
|
|
~/.cargo/git
|
|
target
|
|
key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
|
|
```
|
|
|
|
### Benefits
|
|
- Reduces build time from ~10 minutes to ~2 minutes
|
|
- Especially important for dependency-heavy builds
|
|
- Invalidates on Cargo.lock changes
|
|
|
|
## Test Execution Patterns
|
|
|
|
### Serial Output to File
|
|
```yaml
|
|
- name: Run test
|
|
run: cargo run -p xtask -- ring3-smoke
|
|
```
|
|
|
|
Internally, xtask uses:
|
|
```rust
|
|
-serial file:target/xtask_ring3_smoke_output.txt
|
|
```
|
|
|
|
### Log Artifact Upload
|
|
```yaml
|
|
- name: Upload logs
|
|
if: always() # Run even on failure
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: breenix-logs
|
|
path: |
|
|
logs/*.log
|
|
target/xtask_ring3_smoke_output.txt
|
|
if-no-files-found: ignore
|
|
retention-days: 7
|
|
```
|
|
|
|
## Success Detection Patterns
|
|
|
|
### Looking for Signals in Output
|
|
```rust
|
|
// Check for userspace execution evidence
|
|
if contents.contains("USERSPACE OUTPUT: Hello from userspace") ||
|
|
(contents.contains("Context switch: from_userspace=true, CS=0x33") &&
|
|
contents.contains("restore_userspace_thread_context: Restoring thread"))
|
|
```
|
|
|
|
### Common Success Signals
|
|
- `USERSPACE OUTPUT: Hello from userspace`
|
|
- `🎯 KERNEL_POST_TESTS_COMPLETE 🎯`
|
|
- `Context switch: from_userspace=true, CS=0x33`
|
|
- `✅ SUCCESS: Userspace syscall completed`
|
|
|
|
### Common Failure Patterns
|
|
- `DOUBLE FAULT` - Page table or stack issues
|
|
- `PAGE FAULT` - Memory mapping problems
|
|
- `Timeout` - Test hung or infinite loop
|
|
- Build errors - Missing dependencies or wrong toolchain
|
|
|
|
## Workflow Triggers
|
|
|
|
### Current Patterns
|
|
```yaml
|
|
# Run on all branches
|
|
on:
|
|
push:
|
|
branches: [ "**" ]
|
|
pull_request:
|
|
|
|
# Run only manually (for expensive tests)
|
|
on:
|
|
workflow_dispatch:
|
|
|
|
# Run on specific paths
|
|
on:
|
|
push:
|
|
paths:
|
|
- 'kernel/**'
|
|
- '.github/workflows/code-quality.yml'
|
|
```
|
|
|
|
## Environment Variables
|
|
|
|
### Useful Vars
|
|
```yaml
|
|
env:
|
|
RUST_BACKTRACE: full
|
|
CARGO_UNSTABLE_BINDEPS: true # For build dependencies
|
|
CI: true # Detection for different timeouts
|
|
```
|
|
|
|
## Common Workflow Structure
|
|
|
|
```yaml
|
|
name: Test Name
|
|
on: [push, pull_request]
|
|
|
|
jobs:
|
|
test:
|
|
runs-on: ubuntu-22.04
|
|
timeout-minutes: 20
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Install Rust
|
|
uses: actions-rs/toolchain@v1
|
|
with:
|
|
toolchain: nightly-2025-06-24
|
|
override: true
|
|
target: x86_64-unknown-none
|
|
components: rust-src, llvm-tools-preview
|
|
|
|
- name: Cache cargo
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: |
|
|
~/.cargo/registry
|
|
~/.cargo/git
|
|
target
|
|
key: cargo-${{ runner.os }}-${{ hashFiles('**/Cargo.lock') }}
|
|
|
|
- name: Install system dependencies
|
|
run: |
|
|
sudo apt-get update
|
|
sudo apt-get install -y qemu-system-x86 ovmf nasm
|
|
|
|
- name: Build userspace tests
|
|
run: |
|
|
export PATH="$PATH:$(rustc --print sysroot)/lib/rustlib/x86_64-unknown-linux-gnu/bin"
|
|
cd userspace/tests
|
|
./build.sh
|
|
|
|
- name: Run test
|
|
run: cargo run -p xtask -- ring3-smoke
|
|
|
|
- name: Upload logs
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: test-logs
|
|
path: |
|
|
logs/*.log
|
|
target/xtask_*_output.txt
|
|
retention-days: 7
|
|
```
|
|
|
|
## Debugging Failed CI
|
|
|
|
### Step 1: Check Logs
|
|
Download artifacts from the Actions run, look for:
|
|
- Compilation errors (wrong Rust version, missing components)
|
|
- Missing system dependencies (QEMU, OVMF, etc.)
|
|
- Timeout vs actual kernel panic
|
|
|
|
### Step 2: Reproduce Locally
|
|
```bash
|
|
# Use exact same commands as CI
|
|
cargo run -p xtask -- ring3-smoke
|
|
```
|
|
|
|
### Step 3: Common Fixes
|
|
- **Rust version mismatch**: Update toolchain specification
|
|
- **Missing QEMU**: Add to system dependencies
|
|
- **Timeout**: Increase timeout or optimize test
|
|
- **Userspace not built**: Add userspace build step before kernel test
|
|
- **Cache corruption**: Clear cache or change cache key
|