diff --git a/.github/workflows/README.md b/.github/workflows/README.md new file mode 100644 index 0000000..482cb51 --- /dev/null +++ b/.github/workflows/README.md @@ -0,0 +1,74 @@ +# GitHub Actions Workflows + +This directory contains the CI/CD workflows for the g3 project. + +## Workflows + +### 1. CI (`ci.yml`) +**Triggers:** Push to `main` or `develop` branches, Pull Requests + +**Jobs:** +- **Test**: Runs tests on Ubuntu, macOS, and Windows + - Format checking (`cargo fmt`) + - Linting with Clippy (`cargo clippy`) + - Build verification + - Unit and integration tests + - Documentation tests + +- **Build**: Creates release builds for all platforms + - Uploads build artifacts for download + +- **Coverage**: Generates code coverage reports + - Uses `cargo-tarpaulin` + - Uploads to Codecov (optional) + +### 2. Quick Check (`quick-check.yml`) +**Triggers:** Push to any branch except `main`, Pull Requests + +**Jobs:** +- **Quick Check**: Fast verification on Ubuntu only + - Format checking + - Clippy linting + - Build check + - Run tests + +This workflow is designed for rapid feedback during development. + +## System Dependencies + +The workflows automatically install required system dependencies: + +**Ubuntu:** +- `libx11-dev` +- `libxdo-dev` +- `libxcb-shape0-dev` +- `libxcb-xfixes0-dev` + +**macOS:** No additional dependencies required + +**Windows:** No additional dependencies required + +## Caching + +All workflows use GitHub Actions cache to speed up builds: +- Cargo registry +- Cargo git index +- Build artifacts (`target/` directory) + +## Artifacts + +The CI workflow produces downloadable artifacts: +- `g3-ubuntu-latest`: Linux binaries +- `g3-macos-latest`: macOS binaries +- `g3-windows-latest`: Windows binaries + +## Adding Badges to README + +Add these badges to your main README.md: + +```markdown +[![CI](https://github.com/YOUR_USERNAME/g3/actions/workflows/ci.yml/badge.svg)](https://github.com/YOUR_USERNAME/g3/actions/workflows/ci.yml) +[![Quick Check](https://github.com/YOUR_USERNAME/g3/actions/workflows/quick-check.yml/badge.svg)](https://github.com/YOUR_USERNAME/g3/actions/workflows/quick-check.yml) +``` + +Replace `YOUR_USERNAME` with your GitHub username or organization name. diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..98d9f26 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,151 @@ +name: CI + +on: + push: + branches: [ main, develop ] + pull_request: + branches: [ main, develop ] + +env: + CARGO_TERM_COLOR: always + RUST_BACKTRACE: 1 + +jobs: + test: + name: Test + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + rust: [stable] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + toolchain: ${{ matrix.rust }} + components: rustfmt, clippy + + - name: Cache cargo registry + uses: actions/cache@v4 + with: + path: ~/.cargo/registry + key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-registry- + + - name: Cache cargo index + uses: actions/cache@v4 + with: + path: ~/.cargo/git + key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-git- + + - name: Cache cargo build + uses: actions/cache@v4 + with: + path: target + key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-build-target- + + - name: Install system dependencies (Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxdo-dev libxcb-shape0-dev libxcb-xfixes0-dev + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run clippy + run: cargo clippy --all-targets --all-features -- -D warnings + continue-on-error: true + + - name: Build + run: cargo build --workspace --verbose + + - name: Run tests + run: cargo test --workspace --lib --tests --verbose + + - name: Run doc tests + run: cargo test --workspace --doc --verbose + continue-on-error: true + + build: + name: Build Release + runs-on: ${{ matrix.os }} + strategy: + matrix: + os: [ubuntu-latest, macos-latest, windows-latest] + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Cache cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-release-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-release- + + - name: Install system dependencies (Ubuntu) + if: runner.os == 'Linux' + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxdo-dev libxcb-shape0-dev libxcb-xfixes0-dev + + - name: Build release + run: cargo build --workspace --release --verbose + + - name: Upload artifacts + uses: actions/upload-artifact@v4 + with: + name: g3-${{ matrix.os }} + path: | + target/release/g3${{ runner.os == 'Windows' && '.exe' || '' }} + target/release/g3-console${{ runner.os == 'Windows' && '.exe' || '' }} + if-no-files-found: ignore + + coverage: + name: Code Coverage + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxdo-dev libxcb-shape0-dev libxcb-xfixes0-dev + + - name: Install tarpaulin + run: cargo install cargo-tarpaulin + + - name: Generate coverage + run: cargo tarpaulin --workspace --out xml --output-dir coverage --verbose + continue-on-error: true + + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4 + with: + files: ./coverage/cobertura.xml + flags: unittests + name: codecov-umbrella + fail_ci_if_error: false diff --git a/.github/workflows/quick-check.yml b/.github/workflows/quick-check.yml new file mode 100644 index 0000000..14e5b02 --- /dev/null +++ b/.github/workflows/quick-check.yml @@ -0,0 +1,53 @@ +name: Quick Check + +on: + push: + branches-ignore: + - main + pull_request: + +env: + CARGO_TERM_COLOR: always + +jobs: + quick-check: + name: Quick Check + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: Install Rust toolchain + uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt, clippy + + - name: Cache cargo + uses: actions/cache@v4 + with: + path: | + ~/.cargo/registry + ~/.cargo/git + target + key: ${{ runner.os }}-cargo-quick-${{ hashFiles('**/Cargo.lock') }} + restore-keys: | + ${{ runner.os }}-cargo-quick- + + - name: Install system dependencies + run: | + sudo apt-get update + sudo apt-get install -y libx11-dev libxdo-dev libxcb-shape0-dev libxcb-xfixes0-dev + + - name: Check formatting + run: cargo fmt --all -- --check + + - name: Run clippy + run: cargo clippy --workspace --all-targets -- -D warnings + continue-on-error: true + + - name: Check build + run: cargo check --workspace --all-targets + + - name: Run tests + run: cargo test --workspace --lib --tests