name: Build - Verify Code & Build Binaries on: push: branches: [main, develop] pull_request: branches: [main, develop] env: CARGO_TERM_COLOR: always RUST_BACKTRACE: 1 jobs: format: name: Check Code Format runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable with: components: rustfmt - name: Check formatting run: cargo fmt --all -- --check lint: name: Lint with Clippy runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable with: components: clippy - name: Cache cargo registry uses: actions/cache@v3 with: path: ~/.cargo/registry key: cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v3 with: path: ~/.cargo/git key: cargo-git-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v3 with: path: target key: cargo-build-${{ hashFiles('**/Cargo.lock') }} - name: Run clippy run: cargo clippy --all-targets -- -D warnings test: name: Test Suite runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry uses: actions/cache@v3 with: path: ~/.cargo/registry key: cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v3 with: path: ~/.cargo/git key: cargo-git-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v3 with: path: target key: cargo-build-${{ hashFiles('**/Cargo.lock') }} - name: Run tests run: cargo test --lib --all --verbose check: name: Cargo Check runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry uses: actions/cache@v3 with: path: ~/.cargo/registry key: cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v3 with: path: ~/.cargo/git key: cargo-git-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v3 with: path: target key: cargo-build-${{ hashFiles('**/Cargo.lock') }} - name: Check build run: cargo check --all audit: name: Security Audit runs-on: ubuntu-latest steps: - name: Checkout code uses: actions/checkout@v4 - name: Run cargo audit uses: rustsec/audit-check-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} build-debug: name: Build (Debug) - ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry uses: actions/cache@v3 with: path: ~/.cargo/registry key: cargo-registry-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v3 with: path: ~/.cargo/git key: cargo-git-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v3 with: path: target key: cargo-build-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }} - name: Build debug run: cargo build --all build-release: name: Build (Release) - ${{ matrix.os }} runs-on: ${{ matrix.os }} strategy: fail-fast: false matrix: os: [ubuntu-latest, macos-latest, windows-latest] if: github.event_name == 'push' && github.ref == 'refs/heads/main' steps: - name: Checkout code uses: actions/checkout@v4 - name: Setup Rust uses: dtolnay/rust-toolchain@stable - name: Cache cargo registry uses: actions/cache@v3 with: path: ~/.cargo/registry key: cargo-registry-release-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v3 with: path: ~/.cargo/git key: cargo-git-release-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v3 with: path: target key: cargo-build-release-${{ matrix.os }}-${{ hashFiles('**/Cargo.lock') }} - name: Build release run: cargo build --release --all - name: Upload release binaries uses: actions/upload-artifact@v3 with: name: release-${{ matrix.os }} path: | target/release/syntaxis-cli* target/release/syntaxis-tui* target/release/syntaxis-api* retention-days: 7 all-checks: name: All Checks Passed runs-on: ubuntu-latest needs: [format, lint, test, check, audit, build-debug] if: always() steps: - name: Decide whether all checks passed run: | if [[ ${{ needs.format.result }} == 'success' && \ ${{ needs.lint.result }} == 'success' && \ ${{ needs.test.result }} == 'success' && \ ${{ needs.check.result }} == 'success' && \ ${{ needs.audit.result }} == 'success' && \ ${{ needs.build-debug.result }} == 'success' ]]; then echo "✅ All checks passed" exit 0 else echo "❌ Some checks failed" exit 1 fi