mirror of
https://github.com/uutils/coreutils.git
synced 2026-10-16 02:48:27 -07:00
Detects which crates to benchmark from the PR's git diff. A change to uucore/* or uucore_procs/* benchmarks every crate that has a benches/ directory and a change scoped to src/uu/<package> benchmarks only that package.
125 lines
3.7 KiB
YAML
125 lines
3.7 KiB
YAML
name: Benchmarks
|
|
|
|
# spell-checker:ignore (people) taiki-e
|
|
# spell-checker:ignore (misc) codspeed sccache
|
|
|
|
on:
|
|
pull_request:
|
|
paths: &bench_paths
|
|
- 'src/uu/**'
|
|
- 'src/uucore/**'
|
|
- 'src/uucore_procs/**'
|
|
- 'Cargo.toml'
|
|
- 'Cargo.lock'
|
|
push:
|
|
branches:
|
|
- main
|
|
paths: *bench_paths
|
|
|
|
permissions:
|
|
contents: read # to fetch code (actions/checkout)
|
|
|
|
# End the current execution if there is a new changeset in the PR.
|
|
concurrency:
|
|
group: ${{ github.workflow }}-${{ github.ref }}
|
|
cancel-in-progress: ${{ github.ref != 'refs/heads/main' }}
|
|
|
|
jobs:
|
|
detects-benchmarks:
|
|
name: Detect changes on crates
|
|
runs-on: ubuntu-latest
|
|
outputs:
|
|
package: ${{ steps.detect.outputs.package }}
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
fetch-depth: 0
|
|
|
|
- id: detect
|
|
shell: bash
|
|
run: |
|
|
if [ "${{ github.event_name }}" = "pull_request" ]; then
|
|
base="${{ github.event.pull_request.base.sha }}"
|
|
else
|
|
# for push diff of the previous
|
|
base="${{ github.event.before }}"
|
|
fi
|
|
|
|
changed=$(git diff --name-only "$base" "${{ github.sha }}")
|
|
|
|
if echo "$changed" | grep -qE '^(Cargo\.(toml|lock)|src/(uucore|uucore_procs)/)'; then
|
|
candidates=$(ls src/uu)
|
|
else
|
|
candidates=$(echo "$changed" | awk -F'/' '/^src\/uu\// {print $3}' | sort -u)
|
|
fi
|
|
|
|
package=$(for pkg in $candidates;
|
|
do
|
|
if [ -d "src/uu/$pkg/benches" ]; then
|
|
echo "uu_$pkg"
|
|
fi
|
|
done | sort -u | jq -R . | jq -sc .)
|
|
|
|
echo "package=$package" >> "$GITHUB_OUTPUT"
|
|
|
|
benchmarks:
|
|
needs: detects-benchmarks
|
|
if: needs.detects-benchmarks.outputs.package != '[]'
|
|
name: Run ${{ matrix.type }} benchmarks for ${{ matrix.package }} (CodSpeed)
|
|
runs-on: ubuntu-latest
|
|
timeout-minutes: 90
|
|
env:
|
|
CARGO_INCREMENTAL: 0
|
|
strategy:
|
|
# Stagger the jobs: 70 concurrent runners hitting the GitHub cache API
|
|
# (rust-cache + sccache + CodSpeed) at once triggers HTTP 429s.
|
|
max-parallel: 12
|
|
matrix:
|
|
type: [simulation, memory]
|
|
package: ${{ fromJson(needs.detects-benchmarks.outputs.package) }}
|
|
steps:
|
|
- uses: actions/checkout@v7.0.1
|
|
with:
|
|
persist-credentials: false
|
|
|
|
- uses: Swatinem/rust-cache@v2
|
|
|
|
- name: Run sccache-cache
|
|
id: sccache-setup
|
|
uses: mozilla-actions/sccache-action@v0.0.11
|
|
continue-on-error: true
|
|
- name: Export sccache
|
|
if: steps.sccache-setup.outcome == 'success'
|
|
run: |
|
|
echo "RUSTC_WRAPPER=sccache" >> $GITHUB_ENV
|
|
echo "SCCACHE_GHA_ENABLED=true" >> $GITHUB_ENV
|
|
|
|
- name: Install locales
|
|
shell: bash
|
|
run: |
|
|
sudo locale-gen fr_FR.UTF-8
|
|
sudo update-locale
|
|
|
|
- name: Install tools
|
|
uses: taiki-e/install-action@v2
|
|
with:
|
|
tool: cargo-codspeed
|
|
|
|
- name: Build benchmarks for ${{ matrix.package }} (${{ matrix.type }})
|
|
shell: bash
|
|
run: |
|
|
echo "Building ${{ matrix.type }} benchmarks for ${{ matrix.package }}"
|
|
cargo codspeed build -m ${{ matrix.type }} -p ${{ matrix.package }}
|
|
|
|
- name: Run ${{ matrix.type }} benchmarks for ${{ matrix.package }}
|
|
uses: CodSpeedHQ/action@v5
|
|
env:
|
|
CODSPEED_LOG: debug
|
|
with:
|
|
mode: ${{ matrix.type }}
|
|
run: |
|
|
echo "Running ${{ matrix.type }} benchmarks for ${{ matrix.package }}"
|
|
cargo codspeed run -p ${{ matrix.package }} > /dev/null
|
|
token: ${{ secrets.CODSPEED_TOKEN }}
|