* feat: automate yiacad pr review lane * fix: stabilize yiacad review and spec gates * fix: scope kicad exports to repo hardware * fix: ignore kicad block library sources in exports * feat: Add infra VPS monitoring runbook and healthcheck scripts - Created INFRA_VPS_RUNBOOK_2026.md detailing operational procedures for monitoring VPS services. - Added infra_vps_healthcheck.sh script for automated health checks on DNS, TLS, TCP, and HTTP for VPS services. - Introduced infra_vps_security_audit.sh for non-intrusive security checks on external VPS services. - Established JSON schema for infra VPS inventory in infra_vps.schema.json. - Developed integration for runtime status reporting in the Next.js API route. - Implemented Playwright tests for smoke testing the application and ensuring core functionalities. - Updated Makefile for development dependencies and testing commands. - Created various test files for unit and end-to-end testing across different components. * feat(agentics): update mesh agents, gates, prompts, and workflows
224 lines
6.1 KiB
YAML
224 lines
6.1 KiB
YAML
name: CI
|
|
|
|
on:
|
|
push:
|
|
branches:
|
|
- main
|
|
pull_request:
|
|
workflow_dispatch:
|
|
|
|
permissions:
|
|
contents: read
|
|
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: true
|
|
|
|
jobs:
|
|
python-stable:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Python
|
|
uses: actions/setup-python@v5
|
|
with:
|
|
python-version: "3.11"
|
|
|
|
- name: Bootstrap repo-local venv
|
|
run: bash tools/bootstrap_python_env.sh
|
|
|
|
- name: Run stable Python suite
|
|
run: bash tools/test_python.sh --suite stable
|
|
|
|
firmware-lint:
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install clang-format
|
|
run: sudo apt-get update && sudo apt-get install -y clang-format
|
|
|
|
- name: Lint firmware (clang-format)
|
|
run: bash tools/ci/lint_firmware.sh
|
|
|
|
firmware-native:
|
|
name: Firmware — Unity tests (native)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install PlatformIO
|
|
run: |
|
|
pip install platformio
|
|
pio --version
|
|
|
|
- name: Run Unity tests (native env)
|
|
working-directory: firmware
|
|
run: pio test -e native
|
|
|
|
firmware-build:
|
|
name: Firmware — ESP32-S3 build
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 30
|
|
needs: firmware-native
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install PlatformIO
|
|
run: pip install platformio
|
|
|
|
- name: Cache PlatformIO packages
|
|
uses: actions/cache@v4
|
|
with:
|
|
path: ~/.platformio
|
|
key: pio-esp32s3-${{ hashFiles('firmware/platformio.ini') }}
|
|
restore-keys: pio-esp32s3-
|
|
|
|
- name: Build esp32s3_waveshare
|
|
working-directory: firmware
|
|
run: pio run -e esp32s3_waveshare
|
|
|
|
- name: Upload firmware artifact
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: firmware-bin
|
|
path: /tmp/kl_pio_build/esp32s3_waveshare/firmware.bin
|
|
retention-days: 30
|
|
|
|
firmware-sim:
|
|
name: Firmware — Wokwi simulation
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 10
|
|
needs: firmware-build
|
|
if: ${{ vars.WOKWI_CLI_TOKEN != '' }}
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install PlatformIO & build ELF
|
|
run: |
|
|
pip install platformio
|
|
cd firmware && pio run -e esp32s3_waveshare
|
|
# pio uses build_dir=/tmp/kl_pio_build; copy artifacts to where wokwi.toml expects them
|
|
mkdir -p .pio/build/esp32s3_waveshare
|
|
cp /tmp/kl_pio_build/esp32s3_waveshare/firmware.bin .pio/build/esp32s3_waveshare/
|
|
cp /tmp/kl_pio_build/esp32s3_waveshare/firmware.elf .pio/build/esp32s3_waveshare/
|
|
|
|
- name: Wokwi CI simulation
|
|
continue-on-error: true
|
|
uses: wokwi/wokwi-ci-action@v1
|
|
with:
|
|
token: ${{ vars.WOKWI_CLI_TOKEN }}
|
|
path: firmware
|
|
timeout: 15000
|
|
scenario: scenario.yaml
|
|
|
|
hardware-export:
|
|
name: Hardware — KiCad ERC + exports
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 15
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Install KiCad 10
|
|
run: |
|
|
sudo add-apt-repository -y ppa:kicad/kicad-10.0-releases
|
|
sudo apt-get update
|
|
sudo apt-get install -y kicad
|
|
kicad-cli version
|
|
|
|
- name: Run ERC
|
|
run: |
|
|
mkdir -p artifacts/hw
|
|
kicad-cli sch erc hardware/esp32_minimal/esp32_minimal.kicad_sch \
|
|
--format json --output artifacts/hw/erc_report.json
|
|
python3 -c "
|
|
import json, sys
|
|
d = json.load(open('artifacts/hw/erc_report.json'))
|
|
v = d['sheets'][0]['violations']
|
|
errs = [x for x in v if x['severity'] == 'error']
|
|
print(f'ERC: {len(errs)} errors, {len(v)-len(errs)} warnings')
|
|
if errs: sys.exit(1)
|
|
"
|
|
|
|
- name: Export SVG + PDF + netlist
|
|
run: |
|
|
mkdir -p artifacts/hw
|
|
kicad-cli sch export svg hardware/esp32_minimal/esp32_minimal.kicad_sch \
|
|
--output artifacts/hw/
|
|
kicad-cli sch export pdf hardware/esp32_minimal/esp32_minimal.kicad_sch \
|
|
--output artifacts/hw/schematic.pdf
|
|
kicad-cli sch export netlist hardware/esp32_minimal/esp32_minimal.kicad_sch \
|
|
--output artifacts/hw/netlist.xml
|
|
|
|
- name: Install KiBot
|
|
run: pip install kibot
|
|
|
|
- name: KiBot exports (SVG, PDF, BOM, netlist)
|
|
working-directory: hardware/esp32_minimal
|
|
continue-on-error: true
|
|
run: |
|
|
mkdir -p ../../artifacts/hw/kibot
|
|
kibot -c .kibot.yaml -e esp32_minimal.kicad_sch \
|
|
-d ../../artifacts/hw/kibot/ 2>&1 || echo "[kibot] non-zero exit (KiCad 10 compat)"
|
|
|
|
- name: Compliance validation (prototype profile)
|
|
run: |
|
|
python3 tools/compliance/validate.py --strict
|
|
|
|
- name: Upload hardware artifacts
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: hardware-exports
|
|
path: artifacts/hw/
|
|
retention-days: 30
|
|
|
|
playwright-e2e:
|
|
name: Playwright E2E
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 20
|
|
defaults:
|
|
run:
|
|
working-directory: web
|
|
steps:
|
|
- name: Checkout
|
|
uses: actions/checkout@v4
|
|
|
|
- name: Setup Node
|
|
uses: actions/setup-node@v4
|
|
with:
|
|
node-version: "20"
|
|
cache: "npm"
|
|
cache-dependency-path: web/package-lock.json
|
|
|
|
- name: Install web dependencies
|
|
run: npm ci
|
|
|
|
- name: Install Chromium
|
|
run: npx playwright install --with-deps chromium
|
|
|
|
- name: Run smoke E2E
|
|
env:
|
|
CI: "true"
|
|
run: npx playwright test e2e/smoke.spec.ts
|
|
|
|
- name: Upload Playwright artifacts
|
|
if: always()
|
|
uses: actions/upload-artifact@v4
|
|
with:
|
|
name: playwright-e2e-artifacts
|
|
if-no-files-found: ignore
|
|
path: |
|
|
web/playwright-report/
|
|
web/test-results/
|
|
retention-days: 14
|