Frontend CI workflow (GACWR/OpenUBA)
The Frontend CI workflow from GACWR/OpenUBA, explained and optimized by Latchkey.
CI health: C - fair
Point runs-on at Latchkey and get run de-duplication, job timeouts, self-healing for flaky steps, and up to 58% lower cost, applied automatically.
What it does
This is the Frontend CI workflow from the GACWR/OpenUBA repository, a real project running GitHub Actions. It is shown here with attribution under its Apache-2.0 license.
Below, Latchkey shows a faster, safer version produced by its optimization engine.
The workflow
name: Frontend CI
on:
push:
branches: [master, dev/**]
paths:
- "interface/**"
- "docker/frontend.dockerfile"
pull_request:
branches: [master]
jobs:
lint:
name: Lint
runs-on: ubuntu-latest
defaults:
run:
working-directory: interface
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
cache: npm
cache-dependency-path: interface/package-lock.json
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Run ESLint
run: npx next lint --quiet
build:
name: Build
runs-on: ubuntu-latest
defaults:
run:
working-directory: interface
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
cache: npm
cache-dependency-path: interface/package-lock.json
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Build Next.js app
run: npm run build
env:
NEXT_PUBLIC_API_URL: http://localhost:8000
NEXT_PUBLIC_GRAPHQL_URL: /graphql
typecheck:
name: TypeScript check
runs-on: ubuntu-latest
defaults:
run:
working-directory: interface
steps:
- uses: actions/checkout@v4
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
cache: npm
cache-dependency-path: interface/package-lock.json
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Run TypeScript compiler check
run: npx tsc --noEmit
The same workflow, on Latchkey
Removes redundant runs and caps runaway jobs. Added and changed lines are highlighted.
name: Frontend CI on: push: branches: [master, dev/**] paths: - "interface/**" - "docker/frontend.dockerfile" pull_request: branches: [master] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true jobs: lint: timeout-minutes: 30 name: Lint runs-on: latchkey-small defaults: run: working-directory: interface steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: "18" cache: npm cache-dependency-path: interface/package-lock.json - name: Install dependencies run: npm install --legacy-peer-deps - name: Run ESLint run: npx next lint --quiet build: timeout-minutes: 30 name: Build runs-on: latchkey-small defaults: run: working-directory: interface steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: "18" cache: npm cache-dependency-path: interface/package-lock.json - name: Install dependencies run: npm install --legacy-peer-deps - name: Build Next.js app run: npm run build env: NEXT_PUBLIC_API_URL: http://localhost:8000 NEXT_PUBLIC_GRAPHQL_URL: /graphql typecheck: timeout-minutes: 30 name: TypeScript check runs-on: latchkey-small defaults: run: working-directory: interface steps: - uses: actions/checkout@v4 - name: Set up Node.js uses: actions/setup-node@v4 with: node-version: "18" cache: npm cache-dependency-path: interface/package-lock.json - name: Install dependencies run: npm install --legacy-peer-deps - name: Run TypeScript compiler check run: npx tsc --noEmit
What changed
- Run on Latchkey managed runners with one line (
runs-on), which apply the fixes below automatically and self-heal transient failures. This example useslatchkey-small; pick the runner size that fits the job. - Cancel superseded runs when a branch or PR gets a newer push.
- Add a job timeout so a hung step cannot burn hours of runner time.
What Latchkey heals here
This workflow has steps that commonly fail on transient issues (network, registries, flaky browsers). On Latchkey managed runners they are detected, retried, and self-healed instead of failing your build:
- Dependency installs
This workflow runs 3 jobs per trigger. On Latchkey the same minutes cost up to 58% less than GitHub-hosted, with zero queue time.