name: CI Pipeline on: push: branches: [ main, develop ] pull_request: branches: [ main, develop ] env: CARGO_TERM_COLOR: always RUST_BACKTRACE: 1 jobs: test: name: Test Suite runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - name: Cache cargo registry uses: actions/cache@v3 with: path: ~/.cargo/registry key: ${{ runner.os }}-cargo-registry-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo index uses: actions/cache@v3 with: path: ~/.cargo/git key: ${{ runner.os }}-cargo-git-${{ hashFiles('**/Cargo.lock') }} - name: Cache cargo build uses: actions/cache@v3 with: path: target key: ${{ runner.os }}-cargo-build-target-${{ hashFiles('**/Cargo.lock') }} - name: Run tests run: cargo test --verbose clippy: name: Clippy Linting runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true components: clippy - name: Run clippy run: cargo clippy -- -D warnings fmt: name: Code Formatting runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true components: rustfmt - name: Check formatting run: cargo fmt -- --check build: name: Build Release runs-on: ubuntu-latest needs: [test, clippy, fmt] steps: - uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - name: Build release run: cargo build --release --verbose docker: name: Build Docker Images runs-on: ubuntu-latest needs: [test, clippy, fmt] if: github.event_name == 'push' && github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Login to Docker Hub uses: docker/login-action@v2 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - name: Build and push API image uses: docker/build-push-action@v4 with: context: . dockerfile: Dockerfile target: api-runtime push: true tags: | ${{ secrets.DOCKER_USERNAME }}/lifecycle-api:latest ${{ secrets.DOCKER_USERNAME }}/lifecycle-api:${{ github.sha }} - name: Build and push Dashboard image uses: docker/build-push-action@v4 with: context: . dockerfile: Dockerfile target: dashboard-runtime push: true tags: | ${{ secrets.DOCKER_USERNAME }}/lifecycle-dashboard:latest ${{ secrets.DOCKER_USERNAME }}/lifecycle-dashboard:${{ github.sha }} security-scan: name: Security Scanning runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Run cargo audit uses: rustsec/audit-check-action@v1 with: token: ${{ secrets.GITHUB_TOKEN }} coverage: name: Code Coverage runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: stable override: true - name: Install tarpaulin run: cargo install cargo-tarpaulin - name: Generate coverage run: cargo tarpaulin --out Xml --verbose - name: Upload to codecov uses: codecov/codecov-action@v3 with: files: ./cobertura.xml