on: push: branches: [main] pull_request: types: [unlabeled, opened, synchronize, reopened] merge_group: # `workflow_dispatch` allows CodSpeed to trigger backtest # performance analysis in order to generate initial data. workflow_dispatch: name: CodSpeed permissions: contents: read concurrency: group: ${{ github.workflow }}-${{ github.ref_name }}-${{ github.event.pull_request.number || github.sha }} cancel-in-progress: true env: CARGO_INCREMENTAL: 0 CARGO_TERM_COLOR: always CI: true jobs: benchmarks: if: ${{ !contains(github.event.pull_request.labels.*.name, 'skip:ci') }} name: Run benchmarks runs-on: ubuntu-latest timeout-minutes: 90 permissions: contents: read id-token: write # for OpenID Connect authentication with CodSpeed env: CACHE_PATHS: | # https://doc.rust-lang.org/cargo/guide/cargo-home.html#caching-the-cargo-home-in-ci ~/.cargo/.crates2.json ~/.cargo/.crates.toml ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ steps: - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: persist-credentials: false - uses: dtolnay/rust-toolchain@stable # The benchmarks are linked against libpython through the pyo3 dev-dependency. - uses: actions/setup-python@5fda3b95a4ea91299a34e894583c3862153e4b97 # v7.0.0 - name: Restore the machine main last measured on # A recording that cannot be fetched is read as "none yet", which the step # below treats as nothing to disagree with. Failing here instead would # turn a cache outage into a red benchmark job. continue-on-error: true uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: build/codspeed-environment-reference.json key: codspeed-environment-${{ runner.os }}-${{ runner.arch }}-${{ github.run_id }} restore-keys: codspeed-environment-${{ runner.os }}-${{ runner.arch }}- - name: Name the machine this run drew id: environment shell: bash run: | reference=build/codspeed-environment-reference.json if [ "$GITHUB_REF" = refs/heads/main ]; then args=(--record "$reference") else args=(--record build/codspeed-environment.json --reference "$reference") fi python3 scripts/codspeed-environment.py "${args[@]}" --github-output - name: Restore cache if: ${{ steps.environment.outputs.match != 'false' }} uses: actions/cache/restore@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ${{ env.CACHE_PATHS }} key: codspeed-v2-${{ hashFiles('**/Cargo.lock') }} restore-keys: codspeed-v2- continue-on-error: true - name: Install cargo-codspeed if: ${{ steps.environment.outputs.match != 'false' }} run: cargo install cargo-codspeed --locked --version ^5 - name: Build the benchmark targets if: ${{ steps.environment.outputs.match != 'false' }} run: cargo codspeed build --locked --measurement-mode simulation -p rustpython -p rustpython-sre_engine - name: Save cache if: ${{ github.ref == 'refs/heads/main' }} # only save on main uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: ${{ env.CACHE_PATHS }} key: codspeed-v2-${{ hashFiles('**/Cargo.lock') }} continue-on-error: true - name: Run the benchmarks if: ${{ steps.environment.outputs.match != 'false' }} uses: CodSpeedHQ/action@373d6868929f444bc08d901fd0eb0ad52a8875ea # v5.2.1 with: mode: simulation run: cargo codspeed run -p rustpython -p rustpython-sre_engine - name: Record the machine this baseline was measured on if: ${{ success() && github.ref == 'refs/heads/main' }} uses: actions/cache/save@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 with: path: build/codspeed-environment-reference.json key: codspeed-environment-${{ runner.os }}-${{ runner.arch }}-${{ github.run_id }}