name: CI/CD Pipeline
on:
push:
branches: [ main, master ]
pull_request:
branches: [ main, master ]
env:
CARGO_TERM_COLOR: always
jobs:
test:
name: Test Suite
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Run tests
run: cargo test --verbose --all-features
- name: Run integration tests
run: cargo test --verbose --test integration_tests -- --test-threads=1
- name: Run end-to-end tests
run: cargo test --verbose --test e2e_tests
- name: Run config format tests
run: cargo test --verbose --test config_formats_test
- name: Cross-platform compatibility check
shell: bash
run: |
echo "=== Cross-Platform Compatibility Check ==="
echo "OS: ${{ matrix.os }}"
echo "Runner: ${{ runner.os }}"
echo "Architecture: ${{ runner.arch }}"
# Test basic CLI functionality
cargo build --release
# Test version command works
./target/release/pmdaemon${{ runner.os == 'Windows' && '.exe' || '' }} --version
# Test help command works
./target/release/pmdaemon${{ runner.os == 'Windows' && '.exe' || '' }} --help
echo "✅ Basic CLI functionality verified on ${{ runner.os }}"
lint:
name: Lint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
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-${{ hashFiles('**/Cargo.lock') }}
- name: Check formatting
run: cargo fmt --all -- --check
- name: Run clippy
run: cargo clippy --all-targets --all-features -- -D warnings
build:
name: Build
runs-on: ${{ matrix.os }}
strategy:
matrix:
os: [ubuntu-latest, windows-latest, macos-latest]
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Build
run: cargo build --verbose --release
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: pmdaemon-${{ runner.os }}-${{ runner.arch }}
path: |
target/release/pmdaemon${{ runner.os == 'Windows' && '.exe' || '' }}
retention-days: 7
security:
name: Security Audit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
- name: Install cargo-audit
run: cargo install cargo-audit
- name: Run security audit
run: cargo audit
release:
name: Release Build
runs-on: ${{ matrix.os }}
if: startsWith(github.ref, 'refs/tags/')
needs: [test, lint, build, security]
strategy:
matrix:
include:
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
artifact_name: pmdaemon
asset_name: pmdaemon-linux-x86_64
- os: windows-latest
target: x86_64-pc-windows-msvc
artifact_name: pmdaemon.exe
asset_name: pmdaemon-windows-x86_64.exe
- os: macos-latest
target: x86_64-apple-darwin
artifact_name: pmdaemon
asset_name: pmdaemon-macos-x86_64
- os: macos-latest
target: aarch64-apple-darwin
artifact_name: pmdaemon
asset_name: pmdaemon-macos-aarch64
steps:
- uses: actions/checkout@v4
- name: Install Rust
uses: dtolnay/rust-toolchain@stable
with:
targets: ${{ matrix.target }}
- name: Cache cargo
uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-${{ matrix.target }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- name: Build release binary
run: cargo build --release --target ${{ matrix.target }}
- name: Strip binary (Unix)
if: matrix.os != 'windows-latest'
run: strip target/${{ matrix.target }}/release/${{ matrix.artifact_name }}
- name: Upload release asset
uses: actions/upload-artifact@v4
with:
name: ${{ matrix.asset_name }}
path: target/${{ matrix.target }}/release/${{ matrix.artifact_name }}
retention-days: 30