When you push changes to the main or develop branch, GitHub
automatically starts the pipeline. Only files inside frontend/ trigger
frontend builds — backend changes run their own pipeline.
git push origin main
Triggers pipeline automatically
Makes sure all the critical files are present before any further steps. If something is missing, the pipeline stops here and you'll get an alert.
index.html — main entry pointcss/main.css — stylesheet orchestratorjs/config-endpoints.js — service configurationjs/ui-core.js — main application logicassets/lu-lo.png — application logoScans all .html files for common mistakes: unclosed tags, duplicate IDs,
invalid attributes, and accessibility issues.
This catches problems before they reach users — broken layouts, missing elements, or malformed markup.
npm run lint:html from the
frontend/ directory.
Checks all CSS files for issues: undefined variables, duplicate selectors, invalid property values, and style inconsistencies.
Keeps the design system clean and predictable — no broken styles, no orphaned classes.
npm run lint:css from the
frontend/ directory.
Analyzes all JavaScript files for: syntax errors, unused variables, missing semicolons, potential bugs, and anti-patterns.
Catches runtime errors before they happen — undefined references, type mismatches, and logic issues.
npm run lint:js from the
frontend/ directory.
Scans index.html for every src and href
attribute pointing to local files. If any file is missing or the path is broken,
this stage fails.
Prevents 404 errors in production — all CDN links are skipped (only local paths are checked).
All validated frontend files are packaged into a downloadable archive (artifact) and stored for 3 days. This artifact is used by the deploy stage.
You can download this artifact from the GitHub Actions run page if you need to manually deploy.
Only runs on main / master branch pushes. Two deployment
methods are available:
If DEPLOY_HOST is configured, files are securely copied via SSH to your
production server. Old files are deleted, new ones take their place.
If no remote host is configured, files are staged for a local Docker build with Caddy as
the web server. Run docker compose up to serve.
DEPLOY_KEY (SSH private key),
DEPLOY_HOST, DEPLOY_USER, DEPLOY_PATH
npm run lint
Run all linters
npm run validate
Check assets + lint
npm run ci
Full CI check
.github/workflows/frontend-ci.yml
CI/CD definition
frontend/package.json
Linting scripts
frontend/scripts/validate.js
Asset validation
main / master → full CI + deploydevelop → CI onlyname: Frontend CI/CD
on:
push:
branches: [main, master, develop]
paths: ["frontend/**", ".github/workflows/frontend-ci.yml"]
pull_request:
branches: [main, master]
paths: ["frontend/**"]
workflow_dispatch:
inputs:
deploy:
description: "Deploy to production"
type: boolean
default: false
jobs:
validate:
name: Validate
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with: { node-version: "20" }
- run: npm ci # Install linters
- run: npm run lint:html # Check HTML
- run: npm run lint:css # Check CSS
- run: npm run lint:js # Check JS
- run: npm run validate # Check assets
- uses: actions/upload-artifact@v4 # Package files
deploy:
needs: validate
if: github.ref == 'refs/heads/main'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/download-artifact@v4
- run: rsync -avz frontend/ user@server:/path/