Initial commit

This commit is contained in:
Zhongwei Li
2025-11-30 08:53:24 +08:00
commit a4d116219f
7 changed files with 1489 additions and 0 deletions

View File

@@ -0,0 +1,240 @@
# 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