Skip to content

fix(infra): default manage_apex/www_records to true (prevent DNS dest… #2598

fix(infra): default manage_apex/www_records to true (prevent DNS dest…

fix(infra): default manage_apex/www_records to true (prevent DNS dest… #2598

Workflow file for this run

name: CI
on:
push:
branches: [main]
paths-ignore:
- "docs/**"
- "skills/**"
- "website/**"
- "blog/**"
- "engine/src/workers/**/*.md"
- "**/*.md"
- "**/*.mdx"
- ".cursor/**"
pull_request:
branches: [main]
paths-ignore:
- "docs/**"
- "skills/**"
- "website/**"
- "blog/**"
- "engine/src/workers/**/*.md"
- "**/*.md"
- "**/*.mdx"
- ".cursor/**"
workflow_dispatch:
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
env:
CARGO_TERM_COLOR: always
III_TELEMETRY_ENABLED: "false"
jobs:
# ──────────────────────────────────────────────────────────────
# Change detection (used to scope expensive jobs like coverage)
# ──────────────────────────────────────────────────────────────
changes:
name: Detect changes
runs-on: ubuntu-latest
outputs:
engine: ${{ steps.filter.outputs.engine }}
benches: ${{ steps.filter.outputs.benches }}
steps:
- uses: actions/checkout@v4
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
engine:
- 'engine/**'
- 'crates/**'
- 'Cargo.toml'
- 'Cargo.lock'
- '.github/workflows/ci.yml'
benches:
- 'engine/benches/**'
- 'engine/Cargo.toml'
# ──────────────────────────────────────────────────────────────
# Engine Build — critical path, produces iii binary for downstream
# ──────────────────────────────────────────────────────────────
engine-build:
name: Engine Build (artifact)
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
shared-key: engine
- name: Install system dependencies
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Build iii (debug, all-features)
run: cargo build -p iii --all-features
- uses: actions/upload-artifact@v4
with:
name: iii-binary
path: target/debug/iii
retention-days: 1
# ──────────────────────────────────────────────────────────────
# Engine Coverage — runs the full engine + crate test suite under
# llvm-cov instrumentation. This is the single test gate (it supersedes
# the old separate "Engine Tests" job, which re-ran the same tests
# uninstrumented). Scoped: always on push/dispatch, and on PRs only when
# engine/crates/Cargo paths change. Parallel, does not gate downstream.
# ──────────────────────────────────────────────────────────────
engine-coverage:
name: Engine Coverage
needs: changes
if: >-
github.event_name != 'pull_request' || needs.changes.outputs.engine == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
# Free up disk space to avoid "No space left on device" — the
# coverage-instrumented build is large.
- name: Free disk space
run: |
sudo rm -rf /opt/hostedtoolcache/CodeQL
sudo rm -rf /usr/share/dotnet
sudo rm -rf /usr/local/lib/android
sudo rm -rf /opt/ghc
sudo rm -rf /opt/microsoft
df -h /
- uses: dtolnay/rust-toolchain@stable
with:
components: llvm-tools-preview
- uses: Swatinem/rust-cache@v2
with:
shared-key: engine-coverage
- uses: taiki-e/install-action@cargo-llvm-cov
- name: Install system dependencies
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev lld \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev lld; }
- name: Build and install iii-worker (needed by iii integration tests)
run: |
cargo build -p iii-worker
mkdir -p ~/.local/bin
cp target/debug/iii-worker ~/.local/bin/iii-worker
chmod +x ~/.local/bin/iii-worker
- name: Run tests with coverage
run: |
eval "$(cargo llvm-cov show-env --export-prefix)"
# The coverage-instrumented `iii` test binary is large enough that the
# default GNU bfd linker exhausts the runner's memory and crashes
# ("ld terminated with signal 7 / Bus error, core dumped"). Link with
# lld, which links large binaries with far less peak memory. Appended
# so the `-C instrument-coverage` RUSTFLAGS exported above are kept.
export RUSTFLAGS="${RUSTFLAGS:-} -C link-arg=-fuse-ld=lld"
# cargo test runs the crate's tests (incl. doctests) parallel within
# each binary in one process. The VM crates run with default features
# only (--all-features would enable integration-vm/-oci, which need KVM
# and have their own jobs); iii runs with --all-features. (Process-per-
# test runners like nextest aren't used here: several engine tests rely
# on shared in-process global state — tracing/metrics singletons,
# ports — and aren't isolation-safe.)
cargo test -p iii-worker -p iii-filesystem -p iii-network -p iii-init
cargo test -p iii --all-features
# Reports re-read the merged profdata (no recompile), so emitting the
# terminal summary, an lcov file, and a browsable HTML tree is cheap.
IGNORE='engine/src/main\.rs|(cron|pubsub|queue|state|stream)/adapters/(redis_adapter|bridge)\.rs|queue/adapters/rabbitmq/|^sdk/'
cargo llvm-cov report --ignore-filename-regex "$IGNORE"
cargo llvm-cov report --ignore-filename-regex "$IGNORE" --lcov --output-path coverage.lcov
cargo llvm-cov report --ignore-filename-regex "$IGNORE" --html
- name: Upload coverage report
if: always()
uses: actions/upload-artifact@v4
with:
name: engine-coverage-report
path: |
coverage.lcov
target/llvm-cov/html
if-no-files-found: ignore
retention-days: 7
# ──────────────────────────────────────────────────────────────
# Engine Benches — compile-only check, parallel, does not gate.
# ──────────────────────────────────────────────────────────────
engine-benches:
name: Engine Benches Compile
# Bench compile (~20m cold) is redundant with bench-release.yml, which
# compiles and runs benches on every release tag. On PRs/pushes only run it
# when bench sources actually change, so the common path skips it entirely.
needs: changes
if: needs.changes.outputs.benches == 'true'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
shared-key: engine-benches
- name: Install system dependencies
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Check benches compile
run: cargo bench --benches --no-run
# ──────────────────────────────────────────────────────────────
# Engine Formatting — fast, parallel
# ──────────────────────────────────────────────────────────────
engine-fmt:
name: Engine Formatting
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt
- name: Check formatting
run: cargo fmt --all -- --check
# - name: Run clippy
# run: cargo clippy -p iii -p function-macros -p iii-sdk --all-targets --all-features -- -D warnings
# ──────────────────────────────────────────────────────────────
# CLI Docs Built — regenerate docs/next/cli-reference/ from the
# clap definitions (hidden `gen-cli-docs` subcommands) and fail when
# the committed pages don't match. Guarantees the published CLI
# reference can never go stale relative to the CLI source.
# ──────────────────────────────────────────────────────────────
cli-docs-built:
name: CLI Docs Built
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
shared-key: engine
- name: Install system dependencies
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Regenerate CLI reference pages
run: ./scripts/generate-cli-docs.sh
- name: Verify committed pages match
run: |
if [[ -n "$(git status --porcelain -- docs/next/cli-reference)" ]]; then
git status --porcelain -- docs/next/cli-reference
git diff -- docs/next/cli-reference | head -200
echo "::error::docs/next/cli-reference is stale. Run scripts/generate-cli-docs.sh (or 'make cli-docs') and commit the result."
exit 1
fi
# ──────────────────────────────────────────────────────────────
# Engine RabbitMQ Integration Tests
# ──────────────────────────────────────────────────────────────
engine-rabbitmq-tests:
name: Engine RabbitMQ Integration Tests
runs-on: ubuntu-latest
services:
rabbitmq:
image: rabbitmq:3-management-alpine
ports:
- 5672:5672
- 15672:15672
options: >-
--health-cmd "rabbitmq-diagnostics check_running" --health-interval 10s --health-timeout
5s --health-retries 5
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
shared-key: engine
- name: Run RabbitMQ integration tests
env:
RABBITMQ_URL: amqp://localhost:5672
RUST_LOG: info
run: cargo test -p iii --test rabbitmq_queue_integration -- --nocapture
engine-build-matrix:
name: Engine Build - ${{ matrix.target }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- target: x86_64-apple-darwin
os: macos-latest
- target: x86_64-pc-windows-msvc
os: windows-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
- target: x86_64-unknown-linux-musl
os: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: ${{ matrix.target }}
- name: Install musl tools
if: matrix.target == 'x86_64-unknown-linux-musl'
run: |
# Fast path: install directly; the slow `apt-get update` only runs as
# a fallback if the runner image's apt index is stale.
sudo apt-get install -y musl-tools \
|| { sudo apt-get update && sudo apt-get install -y musl-tools; }
- name: Add target
run: rustup target add ${{ matrix.target }}
# Debug build: this matrix only validates that iii compiles on every
# target. Optimized release builds are produced separately at tag time by
# release-iii.yml (which always uses --release).
- name: Build for target
run: cargo build -p iii --target ${{ matrix.target }}
# ──────────────────────────────────────────────────────────────
# Worker Build Matrix (matches release targets)
# ──────────────────────────────────────────────────────────────
worker-build-matrix:
name: Worker Build - ${{ matrix.target }}
runs-on: ${{ matrix.os }}
env:
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER: aarch64-linux-gnu-gcc
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_PKG_CONFIG_ALLOW_CROSS: "1"
PKG_CONFIG_SYSROOT_DIR_aarch64_unknown_linux_gnu: /usr/aarch64-linux-gnu
PKG_CONFIG_PATH_aarch64_unknown_linux_gnu: /usr/lib/aarch64-linux-gnu/pkgconfig
CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_RUSTFLAGS: "-C link-arg=-L/usr/lib/aarch64-linux-gnu"
strategy:
fail-fast: false
matrix:
include:
- target: aarch64-apple-darwin
os: macos-latest
- target: x86_64-unknown-linux-gnu
os: ubuntu-latest
- target: aarch64-unknown-linux-gnu
os: ubuntu-22.04
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: worker-${{ matrix.target }}
- name: Install system dependencies (x86_64 Linux)
if: matrix.target == 'x86_64-unknown-linux-gnu'
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Install cross-compilation tools (aarch64 Linux)
if: matrix.target == 'aarch64-unknown-linux-gnu'
run: |
sudo dpkg --add-architecture arm64
sudo sed -i 's/^deb /deb [arch=amd64] /' /etc/apt/sources.list
MIRROR=http://azure.ports.ubuntu.com/ubuntu-ports/
echo "deb [arch=arm64] $MIRROR $(lsb_release -cs) main restricted universe" | sudo tee /etc/apt/sources.list.d/arm64.list
echo "deb [arch=arm64] $MIRROR $(lsb_release -cs)-updates main restricted universe" | sudo tee -a /etc/apt/sources.list.d/arm64.list
# The amd64 cross toolchain is already indexed on the runner image, so
# install it directly (full `apt-get update` only as a fallback).
sudo apt-get install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross \
|| { sudo apt-get update && sudo apt-get install -y gcc-aarch64-linux-gnu libc6-dev-arm64-cross; }
# The arm64 runtime lib needs the freshly-added arm64 source indexed.
# Scope the update to just that list so we don't refresh every index.
sudo apt-get update \
-o Dir::Etc::sourcelist="sources.list.d/arm64.list" \
-o Dir::Etc::sourceparts="-" \
-o APT::Get::List-Cleanup="0"
sudo apt-get install -y libcap-ng-dev:arm64
- name: Add target
run: rustup target add ${{ matrix.target }}
- name: Build iii-worker for target
run: cargo build -p iii-worker --target ${{ matrix.target }}
# ──────────────────────────────────────────────────────────────
# Worker Test Matrix (cross-platform integration tests)
# ──────────────────────────────────────────────────────────────
worker-test-matrix:
name: Worker Tests - ${{ matrix.os }}
runs-on: ${{ matrix.os }}
strategy:
fail-fast: false
matrix:
include:
- os: ubuntu-latest
- os: macos-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: worker-test-${{ matrix.os }}
- uses: taiki-e/install-action@cargo-nextest
- name: Install system dependencies (Linux only)
if: matrix.os == 'ubuntu-latest'
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Run iii-worker tests
run: cargo nextest run -p iii-worker --profile ci
- uses: actions/upload-artifact@v4
if: always()
with:
name: junit-worker-test-${{ matrix.os }}
path: target/nextest/ci/junit.xml
retention-days: 7
# ──────────────────────────────────────────────────────────────
# Worker Feature-Gated Tests
# ──────────────────────────────────────────────────────────────
worker-test-vm-linux:
name: Worker Tests (VM) - linux
runs-on: ubuntu-24.04
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: worker-test-vm-linux
- uses: taiki-e/install-action@cargo-nextest
# Public GitHub-hosted Linux runners expose /dev/kvm as of April 2024
# (github.blog/changelog/2024-04-02-github-actions-hardware-accelerated-android-virtualization-now-available).
# The udev rule below grants the runner user direct access — required for
# libkrun-backed sandbox tests that boot a real microVM. Cheap no-op for
# any feature-gated tests that don't actually launch a guest.
- name: Enable KVM
run: |
if [ -e /dev/kvm ]; then
echo 'KERNEL=="kvm", GROUP="kvm", MODE="0666", OPTIONS+="static_node=kvm"' \
| sudo tee /etc/udev/rules.d/99-kvm4all.rules
sudo udevadm control --reload-rules
sudo udevadm trigger --name-match=kvm
ls -l /dev/kvm
else
echo "::warning::/dev/kvm missing on this runner image; libkrun guest boot will be unavailable"
fi
- name: Install system dependencies
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Run VM feature-gated tests
run: cargo nextest run -p iii-worker --features integration-vm --profile ci
- uses: actions/upload-artifact@v4
if: always()
with:
name: junit-worker-test-vm-linux
path: target/nextest/ci/junit.xml
retention-days: 7
worker-test-vm-macos:
name: Worker Tests (VM) - macos
runs-on: macos-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: worker-test-vm-macos
- uses: taiki-e/install-action@cargo-nextest
- name: Run VM feature-gated tests
run: cargo nextest run -p iii-worker --features integration-vm --profile ci
- uses: actions/upload-artifact@v4
if: always()
with:
name: junit-worker-test-vm-macos
path: target/nextest/ci/junit.xml
retention-days: 7
worker-test-oci-linux:
name: Worker Tests (OCI) - linux
runs-on: ubuntu-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: worker-test-oci-linux
- uses: taiki-e/install-action@cargo-nextest
- name: Install system dependencies
run: |
# Fast path: GitHub runner images ship with fresh apt lists, so
# install directly (the slow `apt-get update` refreshes every index).
# Fall back to a full update only if the cached index misses.
sudo apt-get install -y libcap-ng-dev \
|| { sudo apt-get update && sudo apt-get install -y libcap-ng-dev; }
- name: Run OCI feature-gated tests
run: cargo nextest run -p iii-worker --features integration-oci --profile ci
- uses: actions/upload-artifact@v4
if: always()
with:
name: junit-worker-test-oci-linux
path: target/nextest/ci/junit.xml
retention-days: 7
worker-test-oci-macos:
name: Worker Tests (OCI) - macos
runs-on: macos-latest
continue-on-error: true
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
key: worker-test-oci-macos
- uses: taiki-e/install-action@cargo-nextest
- name: Run OCI feature-gated tests
run: cargo nextest run -p iii-worker --features integration-oci --profile ci
- uses: actions/upload-artifact@v4
if: always()
with:
name: junit-worker-test-oci-macos
path: target/nextest/ci/junit.xml
retention-days: 7
# ──────────────────────────────────────────────────────────────
# SDK Node
# ──────────────────────────────────────────────────────────────
sdk-node-ci:
name: SDK Node Tests
needs: engine-build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
run_install: false
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
#- name: Lint
# run: npx @biomejs/biome check sdk/packages/node
- name: Build helper packages (prerequisite for type check)
run: pnpm --filter @iii-dev/observability build && pnpm --filter @iii-dev/helpers build
- name: Type check
run: pnpm --filter iii-sdk exec tsc --noEmit
- name: Build
run: pnpm --filter iii-sdk build
- name: Download III binary
uses: actions/download-artifact@v4
with:
name: iii-binary
- name: Start III Engines
run: |
chmod +x ./iii
bash scripts/start-iii.sh \
--config sdk/fixtures/config-test.yaml \
--port 49199
bash scripts/start-iii.sh \
--config sdk/fixtures/config-bridge-backend.yaml \
--port 49198 \
--pid-file /tmp/iii-backend.pid \
--log-file /tmp/iii-backend.log
bash scripts/start-iii.sh \
--config sdk/fixtures/config-bridge.yaml \
--port 49197 \
--pid-file /tmp/iii-bridge.pid \
--log-file /tmp/iii-bridge.log
- name: Run tests with coverage
env:
III_URL: ws://localhost:49199
III_HTTP_URL: http://localhost:3199
run: pnpm --filter iii-sdk test:coverage
- name: Stop III Engines
if: always()
run: bash scripts/stop-iii.sh /tmp/iii-engine.pid /tmp/iii-backend.pid /tmp/iii-bridge.pid
# ──────────────────────────────────────────────────────────────
# SDK Node Browser
# ──────────────────────────────────────────────────────────────
sdk-node-browser-ci:
name: SDK Browser Tests
needs: engine-build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
run_install: false
- uses: actions/setup-node@v4
with:
node-version: "20"
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Type check
run: pnpm --filter iii-browser-sdk exec tsc --noEmit
- name: Build
run: pnpm --filter iii-browser-sdk build
- name: Run unit tests
run: pnpm --filter iii-browser-sdk test
- name: Download III binary
uses: actions/download-artifact@v4
with:
name: iii-binary
- name: Start III Engine
run: |
chmod +x ./iii
bash scripts/start-iii.sh \
--config sdk/fixtures/config-test.yaml \
--port 49199
- name: Run integration tests
env:
III_URL: ws://localhost:49199
III_HTTP_URL: http://localhost:3199
run: pnpm --filter iii-browser-sdk test:integration
- name: Stop III Engine
if: always()
run: bash scripts/stop-iii.sh /tmp/iii-engine.pid
# ──────────────────────────────────────────────────────────────
# SDK Python
# ──────────────────────────────────────────────────────────────
sdk-python-ci:
name: SDK Python (${{ matrix.python-version }})
needs: engine-build
runs-on: ubuntu-latest
strategy:
fail-fast: false
matrix:
python-version: ["3.10", "3.11", "3.12"]
steps:
- uses: actions/checkout@v4
- uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- uses: astral-sh/setup-uv@v5
with:
enable-cache: true
cache-dependency-glob: "sdk/packages/python/iii/uv.lock"
- name: Install dependencies
working-directory: sdk/packages/python/iii
run: uv sync --extra dev
- name: Lint
working-directory: sdk/packages/python/iii
run: uv run ruff check src
- name: Type check
working-directory: sdk/packages/python/iii
run: uv run mypy src
- name: Download III binary
uses: actions/download-artifact@v4
with:
name: iii-binary
- name: Start III Engine
run: |
chmod +x ./iii
bash scripts/start-iii.sh \
--config sdk/fixtures/config-test.yaml \
--port 49199
- name: Run tests with coverage
working-directory: sdk/packages/python/iii
env:
III_URL: ws://localhost:49199
III_HTTP_URL: http://localhost:3199
run: uv run pytest -q
- name: Stop III Engine
if: always()
run: bash scripts/stop-iii.sh /tmp/iii-engine.pid
# ──────────────────────────────────────────────────────────────
# SDK Rust
# ──────────────────────────────────────────────────────────────
sdk-rust-ci:
name: SDK Rust Tests
needs: engine-build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
with:
components: rustfmt, clippy
- uses: Swatinem/rust-cache@v2
with:
shared-key: sdk-rust
- name: Check formatting
run: cargo fmt -p iii-sdk -- --check
- name: Run clippy
run: cargo clippy -p iii-sdk --all-targets --all-features -- -D warnings
- name: Download III binary
uses: actions/download-artifact@v4
with:
name: iii-binary
- name: Start III Engine
run: |
chmod +x ./iii
bash scripts/start-iii.sh \
--config sdk/fixtures/config-test.yaml \
--port 49199
- name: Run tests
env:
III_URL: ws://localhost:49199
III_HTTP_URL: http://localhost:3199
run: cargo test -p iii-sdk --all-features
- name: Stop III Engine
if: always()
run: bash scripts/stop-iii.sh /tmp/iii-engine.pid
sdk-go-ci:
name: SDK Go Tests
needs: engine-build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: "1.24"
cache-dependency-path: sdk/packages/go/iii/go.sum
- name: Check formatting
run: test -z "$(gofmt -l sdk/packages/go/iii)" || { gofmt -l sdk/packages/go/iii; exit 1; }
- name: Vet
working-directory: sdk/packages/go/iii
run: go vet ./...
- name: Unit tests (race)
working-directory: sdk/packages/go/iii
run: go test -race ./...
- name: Download III binary
uses: actions/download-artifact@v4
with:
name: iii-binary
- name: Start III Engine
run: |
chmod +x ./iii
bash scripts/start-iii.sh \
--config sdk/fixtures/config-test.yaml \
--port 49199
- name: Integration tests
working-directory: sdk/packages/go/iii
env:
III_URL: ws://localhost:49199
III_HTTP_URL: http://localhost:3199
run: go test -tags integration ./tests/...
- name: Stop III Engine
if: always()
run: bash scripts/stop-iii.sh /tmp/iii-engine.pid
# ──────────────────────────────────────────────────────────────
# Console
# ──────────────────────────────────────────────────────────────
console-ci:
name: Console Build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: pnpm/action-setup@v4
with:
run_install: false
- uses: actions/setup-node@v4
with:
node-version: "22"
cache: "pnpm"
- name: Install dependencies
run: pnpm install --frozen-lockfile
- name: Lint frontend
run: pnpm --filter console-frontend lint
- name: Build frontend
run: pnpm --filter console-frontend build
- uses: dtolnay/rust-toolchain@stable
- uses: Swatinem/rust-cache@v2
with:
shared-key: console
- name: Build console binary
run: cargo build -p iii-console --release