Skip to content

Refactor the CI system #13

Refactor the CI system

Refactor the CI system #13

Workflow file for this run

name: CI
on:
push:
branches: ["main"]
pull_request:
branches: ["main"]
workflow_dispatch:
concurrency:
cancel-in-progress: true
group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }}
env:
CARGO_TERM_COLOR: always
jobs:
format:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- run: .github/ci/format.sh
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-check
- run: .github/ci/check.sh
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-test
- run: .github/ci/test.sh
# Discover buildable examples for the matrix
discover:
runs-on: ubuntu-latest
outputs:
stable: ${{ steps.discover.outputs.stable }}
esp: ${{ steps.discover.outputs.esp }}
steps:
- uses: actions/checkout@v6
- id: discover
run: .github/ci/discover.sh
# Build each stable-toolchain example in parallel.
# Entries with bloat==true also compare binary sizes against the base branch.
build:
needs: discover
runs-on: ubuntu-latest
strategy:
fail-fast: false
# Leave runner slots for format/check/test/build-esp.
max-parallel: 15
matrix:
include: ${{ fromJson(needs.discover.outputs.stable) }}
steps:
- uses: actions/checkout@v6
with:
# Bloat entries need full history for git worktree to base revision.
# Shallow clone is fast for this repo, so always fetch full history.
fetch-depth: 0
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-build-${{ matrix.target }}
- name: Install target and tools
run: |
rustup target add ${{ matrix.target }}
cargo install flip-link 2>/dev/null || true
- name: Build
working-directory: ${{ matrix.dir }}
run: cargo build --release
# ── Bloat: size HEAD, build+size BASE, upload comparison ──
- name: Install cargo-size
if: github.event_name == 'pull_request' && matrix.bloat
run: |
rustup component add llvm-tools
cargo install cargo-binutils 2>/dev/null || true
- name: Measure sizes and compare with base
if: github.event_name == 'pull_request' && matrix.bloat
working-directory: ${{ matrix.dir }}
env:
BLOAT_BINS: ${{ matrix.bloat_bins }}
run: |
set -euo pipefail
# Determine which binaries to size (empty = default single binary).
if [[ -n "$BLOAT_BINS" ]]; then
IFS=',' read -ra bins <<< "$BLOAT_BINS"
else
bins=(default)
fi
# ── Build BASE ──
base_sha=$(git -C "$GITHUB_WORKSPACE" merge-base HEAD origin/main)
worktree=$(mktemp -d)
git -C "$GITHUB_WORKSPACE" worktree add --detach "$worktree" "$base_sha"
trap 'git -C "$GITHUB_WORKSPACE" worktree remove --force "$worktree" 2>/dev/null; rm -rf "$worktree"' EXIT
base_dir="$worktree/${{ matrix.dir }}"
if [[ -d "$base_dir" ]]; then
(cd "$base_dir" && cargo build --release --target ${{ matrix.target }})
fi
# ── Measure HEAD vs BASE for each binary ──
safe_name=$(echo "${{ matrix.dir }}" | tr '/' '_')
outfile="$GITHUB_WORKSPACE/.bloat-data/$safe_name/size-data.txt"
mkdir -p "$(dirname "$outfile")"
for bin in "${bins[@]}"; do
bin_flag=""
bin_label=""
if [[ "$bin" != "default" ]]; then
bin_flag="--bin $bin"
bin_label="$bin"
fi
head_size=$(cargo size --release $bin_flag 2>/dev/null | awk 'NR==2 {print $4}')
if [[ -d "$base_dir" ]]; then
base_size=$( (cd "$base_dir" && cargo size --release $bin_flag 2>/dev/null) | awk 'NR==2 {print $4}')
else
base_size=0
fi
echo "${{ matrix.dir }}|${bin_label}|${base_size}|${head_size}" >> "$outfile"
done
echo "Size data written:"
cat "$outfile"
- name: Upload size data
if: github.event_name == 'pull_request' && matrix.bloat
uses: actions/upload-artifact@v4
with:
name: bloat-${{ hashFiles('.bloat-data/*/size-data.txt') }}
path: .bloat-data/*/size-data.txt
retention-days: 1
# Assemble bloat report from matrix artifacts
bloat-report:
if: github.event_name == 'pull_request'
needs: build
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/download-artifact@v4
with:
path: .bloat-artifacts
pattern: bloat-*
merge-multiple: true
- name: Generate report
run: .github/ci/bloat-report.sh .bloat-artifacts
# Build ESP/xtensa examples (separate toolchain)
build-esp:
needs: discover
if: fromJson(needs.discover.outputs.esp)[0] != null
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: Swatinem/rust-cache@v2
with:
shared-key: ci-build-esp
- run: .github/ci/build.sh