CI #16
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| name: CI | |
| on: | |
| push: | |
| branches: [ main, develop ] | |
| pull_request: | |
| branches: [ main, develop ] | |
| schedule: | |
| # Run nightly at 2 AM UTC | |
| - cron: '0 2 * * *' | |
| env: | |
| # Use the latest stable Zig version | |
| ZIG_VERSION: 0.14.1 | |
| jobs: | |
| lint: | |
| name: Lint and Format | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Zig | |
| uses: goto-bus-stop/setup-zig@v2 | |
| with: | |
| version: ${{ env.ZIG_VERSION }} | |
| - name: Install system dependencies | |
| run: | | |
| echo "🔧 Installing system dependencies for ${{ runner.os }}..." | |
| case "${{ runner.os }}" in | |
| Linux) | |
| sudo apt-get update -qq | |
| sudo apt-get install -y \ | |
| build-essential \ | |
| cmake \ | |
| libboost-all-dev \ | |
| libssl-dev \ | |
| pkg-config \ | |
| git | |
| echo "✅ Linux dependencies installed" | |
| ;; | |
| macOS) | |
| brew update | |
| brew install boost openssl cmake | |
| echo "✅ macOS dependencies installed" | |
| ;; | |
| Windows) | |
| choco install boost-msvc-14.3 cmake openssl | |
| echo "✅ Windows dependencies installed" | |
| ;; | |
| esac | |
| - name: Cache Zig artifacts | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cache/zig | |
| .zig-cache | |
| key: ${{ runner.os }}-zig-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig', 'build.zig.zon') }} | |
| restore-keys: | | |
| ${{ runner.os }}-zig-${{ env.ZIG_VERSION }}- | |
| - name: Check formatting | |
| run: | | |
| echo "🔍 Checking code formatting..." | |
| zig fmt --check src/ || { | |
| echo "❌ Code formatting issues found. Run 'zig fmt src/' to fix." | |
| exit 1 | |
| } | |
| echo "✅ Code formatting is correct" | |
| - name: Lint code | |
| run: | | |
| echo "🔍 Running linter..." | |
| find src/ -name "*.zig" -exec zig ast-check {} \; || { | |
| echo "❌ Linting issues found" | |
| exit 1 | |
| } | |
| echo "✅ All files pass linting" | |
| test: | |
| name: Test | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| os: [ubuntu-latest, macos-latest, windows-latest] | |
| zig-version: [0.14.1, master] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Zig | |
| uses: goto-bus-stop/setup-zig@v2 | |
| with: | |
| version: ${{ matrix.zig-version }} | |
| - name: Install system dependencies | |
| run: | | |
| echo "🔧 Installing system dependencies for ${{ runner.os }}..." | |
| case "${{ runner.os }}" in | |
| Linux) | |
| sudo apt-get update -qq | |
| sudo apt-get install -y \ | |
| build-essential \ | |
| cmake \ | |
| libboost-all-dev \ | |
| libssl-dev \ | |
| pkg-config \ | |
| git | |
| echo "✅ Linux dependencies installed" | |
| ;; | |
| macOS) | |
| brew update | |
| brew install boost openssl cmake | |
| echo "✅ macOS dependencies installed" | |
| ;; | |
| Windows) | |
| choco install boost-msvc-14.3 cmake openssl | |
| echo "✅ Windows dependencies installed" | |
| ;; | |
| esac | |
| - name: Cache Zig artifacts | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cache/zig | |
| .zig-cache | |
| key: ${{ runner.os }}-zig-${{ matrix.zig-version }}-${{ hashFiles('build.zig', 'build.zig.zon') }} | |
| restore-keys: | | |
| ${{ runner.os }}-zig-${{ matrix.zig-version }}- | |
| - name: Build project | |
| run: | | |
| echo "🔨 Building Ora compiler..." | |
| zig build | |
| echo "✅ Build successful" | |
| - name: Run tests | |
| run: | | |
| echo "🧪 Running test suite..." | |
| zig test src/lexer.zig || echo "⚠️ Lexer tests failed" | |
| zig test src/parser.zig || echo "⚠️ Parser tests failed" | |
| zig test src/semantics.zig || echo "⚠️ Semantics tests failed" | |
| zig test src/typer.zig || echo "⚠️ Typer tests failed" | |
| zig test src/comptime_eval.zig || echo "⚠️ Comptime eval tests failed" | |
| zig test src/ir.zig || echo "⚠️ IR tests failed" | |
| zig test src/codegen_yul.zig || echo "⚠️ Codegen tests failed" | |
| zig test src/formal_verifier.zig || echo "⚠️ Formal verifier tests failed" | |
| echo "✅ Test suite completed" | |
| - name: Test individual components | |
| run: | | |
| echo "🔧 Testing individual components..." | |
| zig build-lib src/lexer.zig && echo "✅ Lexer compiles" | |
| zig build-lib src/parser.zig && echo "✅ Parser compiles" | |
| zig build-lib src/semantics.zig && echo "✅ Semantics compiles" | |
| zig build-lib src/typer.zig && echo "✅ Typer compiles" | |
| zig build-lib src/comptime_eval.zig && echo "✅ Comptime eval compiles" | |
| zig build-lib src/ir.zig && echo "✅ IR compiles" | |
| zig build-lib src/codegen_yul.zig && echo "✅ Codegen compiles" | |
| zig build-lib src/formal_verifier.zig && echo "✅ Formal verifier compiles" | |
| - name: Clean up build artifacts | |
| run: | | |
| rm -f lib*.a lib*.a.o | |
| examples: | |
| name: Build Examples | |
| runs-on: ubuntu-latest | |
| needs: [lint, test] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Zig | |
| uses: goto-bus-stop/setup-zig@v2 | |
| with: | |
| version: ${{ env.ZIG_VERSION }} | |
| - name: Install system dependencies | |
| run: | | |
| echo "🔧 Installing system dependencies for ${{ runner.os }}..." | |
| case "${{ runner.os }}" in | |
| Linux) | |
| sudo apt-get update -qq | |
| sudo apt-get install -y \ | |
| build-essential \ | |
| cmake \ | |
| libboost-all-dev \ | |
| libssl-dev \ | |
| pkg-config \ | |
| git | |
| echo "✅ Linux dependencies installed" | |
| ;; | |
| macOS) | |
| brew update | |
| brew install boost openssl cmake | |
| echo "✅ macOS dependencies installed" | |
| ;; | |
| Windows) | |
| choco install boost-msvc-14.3 cmake openssl | |
| echo "✅ Windows dependencies installed" | |
| ;; | |
| esac | |
| - name: Cache Zig artifacts | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cache/zig | |
| .zig-cache | |
| key: ${{ runner.os }}-zig-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig', 'build.zig.zon') }} | |
| restore-keys: | | |
| ${{ runner.os }}-zig-${{ env.ZIG_VERSION }}- | |
| - name: Build examples | |
| run: | | |
| echo "📚 Building examples..." | |
| zig build | |
| # Check if examples directory exists | |
| if [ -d "examples" ]; then | |
| echo "🔍 Found examples directory" | |
| find examples/ -name "*.ora" -exec echo "📄 Found example: {}" \; | |
| # Try to compile each .ora file (if we have a compiler binary) | |
| if [ -f "zig-out/bin/ora" ]; then | |
| echo "🚀 Testing compiler on examples..." | |
| find examples/ -name "*.ora" -exec echo "Compiling: {}" \; -exec ./zig-out/bin/ora {} \; || echo "⚠️ Some examples failed to compile" | |
| else | |
| echo "ℹ️ No compiler binary found, skipping example compilation" | |
| fi | |
| else | |
| echo "ℹ️ No examples directory found" | |
| fi | |
| echo "✅ Examples processing completed" | |
| - name: Upload build artifacts | |
| uses: actions/upload-artifact@v4 | |
| if: success() | |
| with: | |
| name: ora-compiler-${{ runner.os }} | |
| path: | | |
| zig-out/bin/ | |
| zig-out/lib/ | |
| retention-days: 7 | |
| security: | |
| name: Security Scan | |
| runs-on: ubuntu-latest | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Run security scan | |
| run: | | |
| echo "🔍 Running basic security scan..." | |
| # Basic security checks - more comprehensive scans in security.yml | |
| - name: Check for security issues | |
| run: | | |
| echo "🔒 Running security checks..." | |
| # Check for common security patterns | |
| echo "🔍 Checking for unsafe patterns..." | |
| if grep -r "unsafe" src/ 2>/dev/null; then | |
| echo "⚠️ Found unsafe code patterns" | |
| else | |
| echo "✅ No unsafe patterns found" | |
| fi | |
| # Check for TODO/FIXME security notes | |
| echo "🔍 Checking for security TODOs..." | |
| if grep -r -i "todo.*security\|fixme.*security" src/ 2>/dev/null; then | |
| echo "⚠️ Found security-related TODOs" | |
| else | |
| echo "✅ No security TODOs found" | |
| fi | |
| echo "✅ Security scan completed" | |
| performance: | |
| name: Performance Benchmarks | |
| runs-on: ubuntu-latest | |
| if: github.event_name == 'schedule' || contains(github.event.pull_request.labels.*.name, 'performance') | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Zig | |
| uses: goto-bus-stop/setup-zig@v2 | |
| with: | |
| version: ${{ env.ZIG_VERSION }} | |
| - name: Install system dependencies | |
| run: | | |
| echo "🔧 Installing system dependencies for ${{ runner.os }}..." | |
| case "${{ runner.os }}" in | |
| Linux) | |
| sudo apt-get update -qq | |
| sudo apt-get install -y \ | |
| build-essential \ | |
| cmake \ | |
| libboost-all-dev \ | |
| libssl-dev \ | |
| pkg-config \ | |
| git | |
| echo "✅ Linux dependencies installed" | |
| ;; | |
| macOS) | |
| brew update | |
| brew install boost openssl cmake | |
| echo "✅ macOS dependencies installed" | |
| ;; | |
| Windows) | |
| choco install boost-msvc-14.3 cmake openssl | |
| echo "✅ Windows dependencies installed" | |
| ;; | |
| esac | |
| - name: Cache Zig artifacts | |
| uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cache/zig | |
| .zig-cache | |
| key: ${{ runner.os }}-zig-${{ env.ZIG_VERSION }}-${{ hashFiles('build.zig', 'build.zig.zon') }} | |
| restore-keys: | | |
| ${{ runner.os }}-zig-${{ env.ZIG_VERSION }}- | |
| - name: Build with optimizations | |
| run: | | |
| echo "🚀 Building optimized version..." | |
| zig build -Doptimize=ReleaseFast | |
| - name: Run performance tests | |
| run: | | |
| echo "⚡ Running performance benchmarks..." | |
| # Time compilation of test files | |
| if [ -f "zig-out/bin/ora" ]; then | |
| echo "📊 Timing compilation performance..." | |
| time ./zig-out/bin/ora --version 2>/dev/null || echo "⚠️ Compiler version check failed" | |
| fi | |
| # Memory usage tests | |
| echo "💾 Checking memory usage..." | |
| /usr/bin/time -v zig build 2>&1 | grep -E "(Maximum resident set size|User time|System time)" || echo "⚠️ Memory profiling failed" | |
| echo "✅ Performance benchmarks completed" | |
| release: | |
| name: Release Check | |
| runs-on: ubuntu-latest | |
| if: github.ref == 'refs/heads/main' | |
| needs: [lint, test, examples, security] | |
| steps: | |
| - name: Checkout code | |
| uses: actions/checkout@v4 | |
| with: | |
| submodules: recursive | |
| - name: Setup Zig | |
| uses: goto-bus-stop/setup-zig@v2 | |
| with: | |
| version: ${{ env.ZIG_VERSION }} | |
| - name: Install system dependencies | |
| run: | | |
| echo "🔧 Installing system dependencies for ${{ runner.os }}..." | |
| case "${{ runner.os }}" in | |
| Linux) | |
| sudo apt-get update -qq | |
| sudo apt-get install -y \ | |
| build-essential \ | |
| cmake \ | |
| libboost-all-dev \ | |
| libssl-dev \ | |
| pkg-config \ | |
| git | |
| echo "✅ Linux dependencies installed" | |
| ;; | |
| macOS) | |
| brew update | |
| brew install boost openssl cmake | |
| echo "✅ macOS dependencies installed" | |
| ;; | |
| Windows) | |
| choco install boost-msvc-14.3 cmake openssl | |
| echo "✅ Windows dependencies installed" | |
| ;; | |
| esac | |
| - name: Build release version | |
| run: | | |
| echo "🎯 Building release version..." | |
| zig build -Doptimize=ReleaseFast -Dtarget=x86_64-linux | |
| zig build -Doptimize=ReleaseFast -Dtarget=x86_64-macos | |
| zig build -Doptimize=ReleaseFast -Dtarget=x86_64-windows | |
| echo "✅ Release builds completed" | |
| - name: Create release summary | |
| run: | | |
| echo "📋 Release Summary:" > release-summary.md | |
| echo "- Commit: ${{ github.sha }}" >> release-summary.md | |
| echo "- Date: $(date)" >> release-summary.md | |
| echo "- Tests: ✅ Passed" >> release-summary.md | |
| echo "- Examples: ✅ Built" >> release-summary.md | |
| echo "- Security: ✅ Scanned" >> release-summary.md | |
| echo "📋 Release summary created" | |
| cat release-summary.md | |
| - name: Upload release artifacts | |
| uses: actions/upload-artifact@v4 | |
| with: | |
| name: ora-release-${{ github.sha }} | |
| path: | | |
| zig-out/ | |
| release-summary.md | |
| retention-days: 30 | |
| notification: | |
| name: Notification | |
| runs-on: ubuntu-latest | |
| if: always() | |
| needs: [lint, test, examples, security] | |
| steps: | |
| - name: Notify on success | |
| if: needs.lint.result == 'success' && needs.test.result == 'success' && needs.examples.result == 'success' | |
| run: | | |
| echo "✅ 🎉 All CI checks passed successfully!" | |
| echo "📊 Results:" | |
| echo " - Lint: ✅" | |
| echo " - Test: ✅" | |
| echo " - Examples: ✅" | |
| echo " - Security: ✅" | |
| - name: Notify on failure | |
| if: needs.lint.result == 'failure' || needs.test.result == 'failure' || needs.examples.result == 'failure' | |
| run: | | |
| echo "❌ Some CI checks failed" | |
| echo "📊 Results:" | |
| echo " - Lint: ${{ needs.lint.result }}" | |
| echo " - Test: ${{ needs.test.result }}" | |
| echo " - Examples: ${{ needs.examples.result }}" | |
| echo " - Security: ${{ needs.security.result }}" |