Skip to content

Phase 4D-C1: add guarded Direct/SBO control semantics #636

Phase 4D-C1: add guarded Direct/SBO control semantics

Phase 4D-C1: add guarded Direct/SBO control semantics #636

Workflow file for this run

name: C++ CI
on:
push:
branches: [main]
pull_request:
workflow_dispatch:
permissions:
contents: read
jobs:
linux:
name: Linux / ${{ matrix.compiler }}
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
compiler: [gcc, clang]
steps:
- uses: actions/checkout@v4
- name: Select compiler
shell: bash
run: |
if [[ "${{ matrix.compiler }}" == "gcc" ]]; then
echo "CC=gcc" >> "$GITHUB_ENV"
echo "CXX=g++" >> "$GITHUB_ENV"
else
echo "CC=clang" >> "$GITHUB_ENV"
echo "CXX=clang++" >> "$GITHUB_ENV"
fi
- name: Configure
run: cmake -S . -B build -DCMAKE_BUILD_TYPE=Release -DARIEC61850_WARNINGS_AS_ERRORS=ON
- name: Build
run: cmake --build build --parallel
- name: Test
run: ctest --test-dir build --output-on-failure
- name: Cross-language model parity tool self-test
run: python3 tools/compare_live_model_json.py --self-test
- name: Read-only evidence runner syntax and CLI smoke
run: |
python3 -m py_compile scripts/run-live-readonly-interop.py
python3 scripts/run-live-readonly-interop.py --help > /dev/null
python3 -m py_compile scripts/run-phase4c-physical-acceptance.py
python3 scripts/run-phase4c-physical-acceptance.py --help > /dev/null
python3 -m py_compile scripts/run-phase4c-timeout-recovery.py
python3 scripts/run-phase4c-timeout-recovery.py --help > /dev/null
windows:
name: Windows / MSVC
runs-on: windows-latest
steps:
- uses: actions/checkout@v4
- name: Configure
run: cmake -S . -B build -A x64 -DARIEC61850_WARNINGS_AS_ERRORS=ON
- name: Build
run: cmake --build build --config Release --parallel
- name: Test
run: ctest --test-dir build -C Release --output-on-failure
- name: Evidence tooling self-tests
run: |
python tools/compare_live_model_json.py --self-test
python -m py_compile scripts/run-live-readonly-interop.py
python scripts/run-live-readonly-interop.py --help | Out-Null
python -m py_compile scripts/run-phase4c-physical-acceptance.py
python scripts/run-phase4c-physical-acceptance.py --help | Out-Null
python -m py_compile scripts/run-phase4c-timeout-recovery.py
python scripts/run-phase4c-timeout-recovery.py --help | Out-Null
- name: Build deterministic SV injector evidence bundle
shell: pwsh
run: |
$ErrorActionPreference = 'Stop'
$out = 'sv-injector-artifact'
New-Item -ItemType Directory -Force -Path $out | Out-Null
$exe = 'build/Release/ariec61850_sv_injector.exe'
if (-not (Test-Path $exe)) { throw "Missing $exe" }
& $exe --capabilities | Out-File -Encoding utf8 "$out/capabilities.json"
& $exe --scenario normal --frames 8000 --pcap "$out/sv-loopback-normal-2s.pcap" --json |
Out-File -Encoding utf8 "$out/normal-2s-evidence.json"
if ($LASTEXITCODE -ne 0) { throw "Normal 8,000-frame injector evidence run failed: $LASTEXITCODE" }
& $exe --scenario protection-fault --json |
Out-File -Encoding utf8 "$out/protection-fault-evidence.json"
if ($LASTEXITCODE -ne 0) { throw "Protection-fault injector evidence run failed: $LASTEXITCODE" }
Copy-Item $exe "$out/ariec61850_sv_injector.exe"
Get-FileHash "$out/ariec61850_sv_injector.exe", "$out/sv-loopback-normal-2s.pcap", "$out/normal-2s-evidence.json", "$out/protection-fault-evidence.json", "$out/capabilities.json" -Algorithm SHA256 |
ForEach-Object { "{0} {1}" -f $_.Hash.ToLowerInvariant(), (Split-Path $_.Path -Leaf) } |
Out-File -Encoding ascii "$out/SHA256SUMS"
- name: Upload Windows SV injector
uses: actions/upload-artifact@v4
with:
name: windows-sv-injector-${{ github.event.pull_request.head.sha || github.sha }}
if-no-files-found: error
retention-days: 14
path: sv-injector-artifact/