Skip to content

Dev to prod

Dev to prod #2

Workflow file for this run

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