ci: add continuous benchmark report #9
Workflow file for this run
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # TODO(template) this workflow requires a `gh-pages` branch to exist. | |
| # Create it once with: | |
| # git checkout --orphan gh-pages | |
| # git reset --hard | |
| # git commit --allow-empty -m "init gh-pages" | |
| # git push origin gh-pages | |
| # | |
| # The benchmark dashboard will be available at: | |
| # https://<org>.github.io/<repo>/dev/bench/ | |
| name: Benchmarks | |
| on: | |
| push: | |
| branches: ["main"] | |
| pull_request: | |
| branches: ["main"] | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.ref }} | |
| cancel-in-progress: ${{ github.event_name == 'pull_request' }} | |
| permissions: | |
| contents: write | |
| deployments: write | |
| pull-requests: write | |
| env: | |
| CARGO_TERM_COLOR: always | |
| CARGO_INCREMENTAL: 0 | |
| CARGO_NET_RETRY: 10 | |
| RUSTUP_MAX_RETRIES: 10 | |
| jobs: | |
| benchmark: | |
| name: Continuous benchmarking | |
| runs-on: ubuntu-latest | |
| timeout-minutes: 30 | |
| steps: | |
| - uses: actions/checkout@v4 | |
| - uses: actions/cache@v4 | |
| with: | |
| path: | | |
| ~/.cargo/bin/ | |
| ~/.cargo/registry/index/ | |
| ~/.cargo/registry/cache/ | |
| ~/.cargo/git/db/ | |
| target/ | |
| key: ${{ runner.os }}-bench-${{ hashFiles('**/Cargo.lock') }} | |
| restore-keys: | | |
| ${{ runner.os }}-bench- | |
| # TODO(template) update the bench command if you use a different | |
| # benchmark harness or need to pass extra flags | |
| - name: Run benchmarks | |
| run: cargo bench -p template_crate --bench benchmark -- --output-format bencher 2>&1 | tee benchmark-output.txt | |
| # On PRs: restore the most-recent baseline written by a main-branch run. | |
| # Using only restore-keys (no matching primary key) guarantees we always | |
| # get the latest entry; the primary key includes the run ID so each main | |
| # run saves a fresh entry and PRs never hit a stale one. | |
| - name: Restore benchmark baseline | |
| if: github.event_name == 'pull_request' | |
| uses: actions/cache/restore@v4 | |
| with: | |
| path: ./cache | |
| key: ${{ runner.os }}-benchmark-baseline-${{ github.run_id }} | |
| restore-keys: | | |
| ${{ runner.os }}-benchmark-baseline- | |
| - name: Store benchmark result (PR) | |
| if: github.event_name == 'pull_request' | |
| uses: benchmark-action/github-action-benchmark@v1 | |
| with: | |
| # TODO(template) update the name to match your project | |
| name: Benchmark | |
| tool: "cargo" | |
| output-file-path: benchmark-output.txt | |
| external-data-json-path: ./cache/benchmark-data.json | |
| alert-threshold: "130%" | |
| comment-on-alert: true | |
| fail-on-alert: true | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| # On main: push results to gh-pages for the historical dashboard, then | |
| # save the updated baseline so future PRs compare against current main. | |
| - name: Store benchmark result (main) | |
| if: github.event_name == 'push' | |
| uses: benchmark-action/github-action-benchmark@v1 | |
| with: | |
| # TODO(template) update the name to match your project | |
| name: Rust Template Benchmark | |
| tool: "cargo" | |
| output-file-path: benchmark-output.txt | |
| gh-pages-branch: gh-pages | |
| benchmark-data-dir-path: dev/bench | |
| alert-threshold: "130%" | |
| comment-on-alert: true | |
| github-token: ${{ secrets.GITHUB_TOKEN }} | |
| auto-push: true | |
| # Save the freshly-updated benchmark data as the new baseline. | |
| # The key embeds the run ID so every main run creates a new cache entry; | |
| # actions/cache would skip saving if the key already existed. | |
| - name: Save benchmark baseline | |
| if: github.event_name == 'push' | |
| uses: actions/cache/save@v4 | |
| with: | |
| path: ./cache | |
| key: ${{ runner.os }}-benchmark-baseline-${{ github.run_id }} |