Dev to prod #2
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: Build Backend and Frontend | |
| on: | |
| push: | |
| branches: | |
| - production | |
| pull_request: | |
| branches: | |
| - production | |
| workflow_dispatch: | |
| inputs: | |
| rebuild-backend: | |
| description: Force rebuild backend | |
| type: boolean | |
| default: false | |
| rebuild-testing-view: | |
| description: Force rebuild testing-view | |
| type: boolean | |
| default: false | |
| rebuild-competition-view: | |
| description: Force rebuild competition-view | |
| type: boolean | |
| default: false | |
| # workflow_call: | |
| # inputs: | |
| # build-backend: | |
| # description: Build backend binaries | |
| # type: boolean | |
| # default: false | |
| # required: false | |
| # build-testing-view: | |
| # description: Build testing-view | |
| # type: boolean | |
| # default: false | |
| # required: false | |
| # build-competition-view: | |
| # description: Build competition-view | |
| # type: boolean | |
| # default: false | |
| # required: false | |
| jobs: | |
| # ------------------------------------------------------------------ | |
| # 1. DETECT CHANGES | |
| # Checks which parts of the codebase changed to avoid unnecessary builds | |
| # ------------------------------------------------------------------ | |
| detect-changes: | |
| name: Detect Changes | |
| runs-on: ubuntu-latest | |
| outputs: | |
| backend: ${{ steps.filter.outputs.backend == 'true' || github.event.inputs.rebuild-backend == 'true' || inputs.build-backend == true }} | |
| testing-view: ${{ steps.filter.outputs.testing-view == 'true' || github.event.inputs.rebuild-testing-view == 'true' || inputs.build-testing-view == true }} | |
| competition-view: ${{ steps.filter.outputs.competition-view == 'true' || github.event.inputs.rebuild-competition-view == 'true' || inputs.build-competition-view == true }} | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: dorny/paths-filter@v3 | |
| id: filter | |
| with: | |
| ref: "production" | |
| filters: | | |
| backend: | |
| - 'backend/**/*' | |
| - 'go.work' | |
| - 'go.work.sum' | |
| testing-view: | |
| - 'frontend/testing-view/**/*' | |
| - 'frontend/frontend-kit/**/*' # Shared lib dependency | |
| - 'pnpm-lock.yaml' | |
| - 'pnpm-workspace.yaml' | |
| competition-view: | |
| - 'frontend/competition-view/**/*' | |
| - 'frontend/frontend-kit/**/*' # Shared lib dependency | |
| - 'pnpm-lock.yaml' | |
| - 'pnpm-workspace.yaml' | |
| # ------------------------------------------------------------------ | |
| # 2. BUILD BACKEND (MATRIX) | |
| # Builds Go binaries for Linux, Windows, and macOS (Intel & Arm) | |
| # ------------------------------------------------------------------ | |
| build-backend: | |
| name: Backend - ${{ matrix.platform }} | |
| needs: detect-changes | |
| runs-on: ${{ matrix.os }} | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| include: | |
| - os: ubuntu-latest | |
| platform: linux | |
| binary: backend-linux-amd64 | |
| goarch: amd64 | |
| - os: windows-latest | |
| platform: windows | |
| binary: backend-windows-amd64.exe | |
| goarch: amd64 | |
| - os: macos-latest | |
| platform: macos-intel | |
| binary: backend-darwin-amd64 | |
| goarch: amd64 | |
| - os: macos-latest | |
| platform: macos-arm64 | |
| binary: backend-darwin-arm64 | |
| goarch: arm64 | |
| steps: | |
| # OPTIMIZATION: Try to download existing artifact first | |
| # Only runs if NO changes were detected and NO rebuild was forced | |
| - name: Try Download Cache | |
| if: needs.detect-changes.outputs.backend != 'true' | |
| id: download | |
| uses: dawidd6/action-download-artifact@v3 | |
| continue-on-error: true | |
| with: | |
| workflow: build.yaml | |
| branch: production | |
| workflow_conclusion: success | |
| name: backend-${{ matrix.platform }} | |
| path: backend/cmd | |
| # BUILD: Only runs if download failed OR changes detected | |
| - uses: actions/checkout@v4 | |
| if: steps.download.outcome != 'success' | |
| - uses: actions/setup-go@v5 | |
| if: steps.download.outcome != 'success' | |
| with: | |
| go-version: "1.23" | |
| - name: Install Linux Deps | |
| if: runner.os == 'Linux' && steps.download.outcome != 'success' | |
| run: sudo apt-get update && sudo apt-get install -y libpcap-dev gcc | |
| - name: Install macOS Deps | |
| if: runner.os == 'macOS' && steps.download.outcome != 'success' | |
| run: brew install libpcap | |
| - name: Build Binary | |
| if: steps.download.outcome != 'success' | |
| working-directory: backend/cmd | |
| shell: bash | |
| run: | | |
| go build -o ${{ matrix.binary }} . | |
| env: | |
| CGO_ENABLED: 1 | |
| GOARCH: ${{ matrix.goarch }} | |
| # UPLOAD: Always runs to ensure artifact availability for release | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: backend-${{ matrix.platform }} | |
| path: backend/cmd/${{ matrix.binary }} | |
| retention-days: 30 | |
| # ------------------------------------------------------------------ | |
| # 3. BUILD FRONTEND (MATRIX) | |
| # Builds Testing View and Competition View using pnpm & turbo | |
| # ------------------------------------------------------------------ | |
| build-frontend: | |
| name: Build ${{ matrix.view }} | |
| needs: detect-changes | |
| runs-on: ubuntu-latest | |
| strategy: | |
| fail-fast: false | |
| matrix: | |
| view: [testing-view, | |
| # competition-view] # TODO: Uncomment when competition view is ready | |
| ] | |
| steps: | |
| # OPTIMIZATION: Try to download existing artifact first | |
| # Only runs if NO changes were detected and NO rebuild was forced | |
| - name: Try Download Cache | |
| if: needs.detect-changes.outputs[matrix.view] != 'true' | |
| id: download | |
| uses: dawidd6/action-download-artifact@v3 | |
| continue-on-error: true | |
| with: | |
| workflow: build.yaml | |
| branch: production | |
| workflow_conclusion: success | |
| name: ${{ matrix.view }} | |
| path: frontend/${{ matrix.view }}/dist | |
| # BUILD: Only runs if download failed OR changes detected | |
| - uses: actions/checkout@v4 | |
| if: steps.download.outcome != 'success' | |
| - uses: pnpm/action-setup@v4 | |
| if: steps.download.outcome != 'success' | |
| with: | |
| version: 10.26.0 | |
| - uses: actions/setup-node@v4 | |
| if: steps.download.outcome != 'success' | |
| with: | |
| node-version: 20 | |
| cache: "pnpm" | |
| - name: Install Dependencies | |
| if: steps.download.outcome != 'success' | |
| run: pnpm install --frozen-lockfile | |
| - name: Build with Turbo | |
| if: steps.download.outcome != 'success' | |
| run: pnpm turbo build --filter=${{ matrix.view }} | |
| # UPLOAD: Always runs to ensure artifact availability for release | |
| - uses: actions/upload-artifact@v4 | |
| with: | |
| name: ${{ matrix.view }} | |
| path: frontend/${{ matrix.view }}/dist/** | |
| retention-days: 30 |