# SPDX-FileCopyrightText: 2026 Stan Grams <sjg@haxx.space>
#
# SPDX-License-Identifier: GPL-2.0-or-later

# CI for the Docker-executor runner (VM). The lint, test and frontend jobs run
# inside the shared trx-rs SDK image (container/Containerfile), which bakes in
# the pinned Rust toolchain, Node.js, Chromium and all build dependencies. The
# reuse job uses the upstream Docker action, which the Docker executor launches
# as a sibling container.

name: CI

on:
  push:
    branches: [main]
  pull_request:

env:
  CARGO_TERM_COLOR: always
  # sccache: shared compilation cache persisted on the runner host (see the
  # -v mount in runner-config.example.yaml). CARGO_INCREMENTAL=0 because
  # sccache cannot cache incremental artifacts.
  RUSTC_WRAPPER: sccache
  CARGO_INCREMENTAL: "0"
  SCCACHE_DIR: /sccache
  SCCACHE_CACHE_SIZE: "20G"

jobs:
  lint:
    runs-on: ubuntu-latest
    container: git.haxx.space/sjg/trx-rs/sdk:latest
    steps:
      - uses: actions/checkout@v4
      - name: rustfmt
        run: cargo fmt --all -- --check
      - name: clippy
        run: cargo clippy --workspace --all-targets --all-features -- -D warnings
      - name: sccache stats
        if: always()
        run: sccache --show-stats

  test:
    runs-on: ubuntu-latest
    container: git.haxx.space/sjg/trx-rs/sdk:latest
    steps:
      - uses: actions/checkout@v4
      - name: Build
        run: cargo build --workspace --all-targets --locked
      - name: Test
        run: cargo test --workspace --locked
      - name: sccache stats
        if: always()
        run: sccache --show-stats

  frontend:
    runs-on: ubuntu-latest
    container: git.haxx.space/sjg/trx-rs/sdk:latest
    defaults:
      run:
        working-directory: src/trx-client/trx-frontend/trx-frontend-http/frontend
    steps:
      - uses: actions/checkout@v4
      - name: Cache npm downloads
        uses: actions/cache@v4
        with:
          path: ~/.npm
          key: npm-${{ runner.os }}-${{ hashFiles('src/trx-client/trx-frontend/trx-frontend-http/frontend/package-lock.json') }}
          restore-keys: |
            npm-${{ runner.os }}-
      - name: Install locked frontend dependencies
        run: npm ci
      - name: Type-check
        run: npm run typecheck
      - name: Lint
        run: npm run lint
      - name: Test
        run: npm test
      # Chromium comes from the SDK image at the path the smoke test defaults
      # to, so there is nothing to install here.
      - name: Browser smoke test
        run: npm run test:browser
      - name: Verify generated assets
        run: npm run verify-generated

  reuse:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: fsfe/reuse-action@v5
