GitHub ActionsでBencherを使用する方法


利用ケースに応じて、GitHub Actionsで継続的ベンチマークを次のためにセットアップできます。

続行する前に、プロジェクトAPIキーを作成したうえで、リポジトリのシークレットとしてBENCHER_API_KEYという名前で設定してください。Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secretに移動します。シークレット名をBENCHER_API_KEYとして、シークレットの値にプロジェクトAPIキーを設定します。

GitHub Actionsでは、フォークされたリポジトリからワークフローがトリガーされた場合、シークレットはランナーに渡されません。したがって、以下のいずれかのワークフローをプルリクエストでリポジトリに追加する際には、_同じ_リポジトリのブランチを使用する必要があります。フォークからのプルリクエストでBencherを追加しようとすると、BENCHER_API_KEYシークレットは利用できません。${{ secrets.BENCHER_API_KEY }}は空の文字列になります。

ベースブランチ

統計的継続的ベンチマーキングの基礎は、ベースブランチの履歴ベースラインを持つことです。 この履歴ベースラインを使用して、プルリクエストにおけるパフォーマンスの退行を検出することができます。

.github/workflows/base_benchmarks.yml
name: Base Branch Benchmarks with Bencher
on:
push:
branches: main
jobs:
benchmark_base_branch:
name: Continuous Benchmarking with Bencher
permissions:
checks: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: bencherdev/bencher@main
- name: Track base branch benchmarks with Bencher
run: |
bencher run \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--branch main \
--testbed ubuntu-latest \
--threshold-measure latency \
--threshold-test t_test \
--threshold-max-sample-size 64 \
--threshold-upper-boundary 0.99 \
--thresholds-reset \
--error-on-alert \
--adapter json \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
bencher mock
  1. GitHub Actionsのworkflowファイルを作成します。 (例: .github/workflows/base_benchmarks.yml)
  2. このワークフローに名前を付けます。 (例: name: Base Branch Benchmarks with Bencher)
  3. mainブランチへのpushイベントで実行します。 詳細については、GitHub ActionsのonドキュメントおよびGitHub Actionsのpushドキュメントを参照してください。 (例: on: push: branches: main)
  4. GitHub Actionsのjobを作成します。 (例: jobs: benchmark_base_branch)
  5. GITHUB_TOKENの権限を設定します checksに対してwriteを設定してください。 (例:permissions: checks: write)
  6. ジョブを実行するマシンのタイプを設定します。 詳細については、GitHub Actionsのruns-onドキュメントを参照してください。 (例: runs-on: ubuntu-latest)
  7. ベースブランチのソースコードをチェックアウトします。 (例: uses: actions/checkout@v6)
  8. GitHub Actionを使用してBencher CLIをインストールします。 (例: uses: bencherdev/bencher@main)
  9. bencher run CLIサブコマンドを使用してmainブランチのベンチマークを実行します。 詳細については、bencher run CLIサブコマンドを参照してください。 (例: bencher run)
  10. --projectオプションをプロジェクトスラッグに設定します。 詳細については、--project ドキュメントを参照してください。 (例: --project project-abc4567-wxyz123456789)
  11. --keyオプションをBENCHER_API_KEY リポジトリシークレットに設定します。 詳細については、--key ドキュメントを参照してください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')
  12. --branchオプションをベースブランチ名に設定します。 詳細については、--branch ドキュメントを参照してください。 (例: --branch main)
  13. --testbedオプションをテストベッド名に設定します。 これは、runs-onで選択されたマシンと一致する必要があります。 詳細については、--testbed ドキュメントを参照してください。 (例: --testbed ubuntu-latest)
  14. mainブランチ、ubuntu-latestテストベッド、latency測定のしきい値を設定します:
    1. --threshold-measureオプションをbencher mockによって生成される組み込みのlatency測定に設定します。 詳細については、--threshold-measure ドキュメントを参照してください。 (例: --threshold-measure latency)
    2. --threshold-testオプションをスチューデントのt検定(t_test)に設定します。 詳細については、--threshold-test ドキュメントを参照してください。 (例: --threshold-test t_test)
    3. --threshold-max-sample-sizeオプションを最大サンプルサイズである64に設定します。 詳細については、--threshold-max-sample-size ドキュメントを参照してください。 (例: --threshold-max-sample-size 64)
    4. --threshold-upper-boundaryオプションを上限の0.99に設定します。 詳細については、--threshold-upper-boundary ドキュメントを参照してください。 (例: --threshold-upper-boundary 0.99)
    5. 指定されたしきい値のみをアクティブにするために--thresholds-resetフラグを設定します。 詳細については、--thresholds-reset ドキュメントを参照してください。 (例: --thresholds-reset)
  15. 警告が生成された場合にコマンドを失敗させるように--error-on-alertフラグを設定します。 詳細については、--error-on-alert ドキュメントを参照してください。 (例: --error-on-alert)
  16. bencher mockによって生成されるBencher Metric Format JSON(json)を--adapterオプションに設定します。 詳細については、ベンチマークハーネスアダプタを参照してください。 (例: --adapter json)
  17. 結果をGitHub Checksコメントとして投稿するために、GitHub Actions GITHUB_TOKEN 環境変数を使用して、--github-actionsオプションをGitHub API認証トークンに設定します。 詳細については、--github-actions ドキュメントを参照してください。 (例: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  18. ベンチマークコマンド引数を指定します。 詳細については、ベンチマークコマンドを参照してください。 (例: bencher mock)

プルリクエスト

プルリクエスト(PR)でパフォーマンスの退行をキャッチするためには、PRでベンチマークを実行する必要があります。 同じリポジトリ内のブランチからのみPRが期待される場合は、 同じリポジトリからのpull_requestイベントで実行される別のワークフローを作成すれば簡単です。

⚠️ このソリューションは、すべてのPRが同じリポジトリからの場合にのみ機能します! 以下のフォークからのプルリクエストを参照してください。

.github/workflows/pr_benchmarks.yml
name: PR Benchmarks with Bencher
on:
pull_request:
types: [opened, reopened, edited, synchronize]
jobs:
benchmark_pr_branch:
name: Continuous Benchmarking PRs with Bencher
# DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
permissions:
checks: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: bencherdev/bencher@main
- name: Track PR Benchmarks with Bencher
run: |
bencher run \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--branch "$GITHUB_HEAD_REF" \
--hash '${{ github.event.pull_request.head.sha }}' \
--start-point "$GITHUB_BASE_REF" \
--start-point-hash '${{ github.event.pull_request.base.sha }}' \
--start-point-clone-thresholds \
--start-point-reset \
--testbed ubuntu-latest \
--error-on-alert \
--adapter json \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
bencher mock
  1. GitHub Actionsのworkflowファイルを作成します。 (例: .github/workflows/pr_benchmarks.yml)

  2. このワークフローに名前を付けます。 (例: name: PR Benchmarks with Bencher)

  3. pull_requestイベントに応じて実行します:

    • opened - プルリクエストが作成されました。
    • reopened - 以前にクローズしたプルリクエストが再オープンされました。
    • edited - プルリクエストのタイトルまたは本文が編集されたり、ベースブランチが変更されました。
    • synchronize - プルリクエストのヘッドブランチが更新されました。 例えば、ベースブランチからヘッドブランチが更新されたり、新しいコミットがヘッドブランチにプッシュされたりしました。

    GitHub Actionsのonドキュメント およびGitHub Actionsのpull_requestドキュメントを参照し、全体を把握してください。 (例: on: pull_request: types: [opened, reopened, edited, synchronize])

  4. GitHub Actionsのjobを作成します。 (例: jobs: benchmark_pr_branch)

  5. プルリクエストが同じリポジトリからの場合にのみpull_requestイベントを実行します。 ⚠️この行を削除しないでください! フォークからのPRの処理については、以下のフォークからのプルリクエストを参照してください。 (例: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)

  6. GITHUB_TOKENの権限をchecksとpull-requestsに対してwriteに設定します。 GitHubの設定により、これは必要ないかもしれません。 しかし、2023年2月2日以降に作成されたすべての組織および個人リポジトリでは、 これはデフォルトの動作です。 GitHubのドキュメントを参照し、全体を把握してください。 (例: permissions: checks: write pull-requests: write)

  7. ジョブが実行されるマシンタイプを設定します。 GitHub Actionsのruns-onドキュメントを参照し、全体を把握してください。 (例: runs-on: ubuntu-latest)

  8. PRブランチのソースコードをチェックアウトします。 (例: uses: actions/checkout@v6)

  9. GitHub ActionからBencher CLIをインストールします。 (例: uses: bencherdev/bencher@main)

  10. プルリクエストブランチのベンチマークを実行するために、bencher run CLIサブコマンドを使用します。 bencher run CLIサブコマンドを参照し、全体を把握してください。 (例: bencher run)

  11. --projectオプションをプロジェクトのスラッグに設定します。 詳細は--projectドキュメントを参照してください。 (例: --project project-abc4567-wxyz123456789)

  12. --keyオプションをBENCHER_API_KEY リポジトリシークレットに設定します。 詳細は--keyドキュメントを参照してください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')

  13. GITHUB_HEAD_REFのGitHub Actionsデフォルト環境変数を使用して、--branchオプションをPRブランチ名に設定します。 全体を把握するために--branchドキュメントを参照してください。 (例: --branch "$GITHUB_HEAD_REF")

  14. pull_requestイベントのGitHub Actionsを使用して、--hashオプションをPRブランチのgitハッシュに設定します。 pull_requestイベントでは、actions/checkoutはPRのコミットではないマージコミットをチェックアウトします。 全体を把握するために--hashドキュメントを参照してください。 (例: --hash '${{ github.event.pull_request.head.sha }}')

  15. PRブランチの開始ポイントを設定します:

    1. GITHUB_BASE_REFのGitHub Actionsデフォルト環境変数を使用して、--start-pointオプションをPRブランチの開始ポイントに設定します。 全体を把握するために--start-pointドキュメントを参照してください。 (例: --start-point "$GITHUB_BASE_REF")
    2. pull_requestイベントのGitHub Actionsを使用して、--start-point-hashオプションをPRブランチの開始ポイントgitハッシュに設定します。 全体を把握するために--start-point-hashドキュメントを参照してください。 (例: --start-point-hash '${{ github.event.pull_request.base.sha }}')
    3. 開始ポイントからしきい値をクローンするために、--start-point-clone-thresholdsフラグを設定します。 全体を把握するために--start-point-clone-thresholdsドキュメントを参照してください。 (例: --start-point-clone-thresholds)
    4. ベンチマークデータのドリフトを防ぐために、PRブランチを開始ポイントに常にリセットする--start-point-resetフラグを設定します。 全体を把握するために--start-point-resetドキュメントを参照してください。 (例: --start-point-reset)
  16. --testbedオプションをテストベッド名に設定します。 これはruns-onで選択したマシンと一致する可能性があります。 詳細は--testedドキュメントを参照してください。 (例: --testbed ubuntu-latest)

  17. アラートが生成された場合にコマンドを失敗させるために、--error-on-alertフラグを設定します。 全体を把握するために--error-on-alertドキュメントを参照してください。 (例: --error-on-alert)

  18. Bencher Metric Format JSON (json)を生成するbencher mockを使用して、Bencher Metric Format JSON(json)に--adapterオプションを設定します。 ベンチマークハーネスアダプタを参照し、全体を把握してください。 (例: --adapter json)

  19. GITHUB_TOKEN環境変数を使用してGitHub API認証トークンを使ってGitHubチェックおよびプルリクエストへのコメントとして結果を投稿するために、--github-actionsオプションを設定します。 詳細は--github-actionsドキュメントを参照してください。 (例: --github-actions '${{ secrets.GITHUB_TOKEN }}')

  20. ベンチマークコマンドの引数を指定します。 全体を把握するためにベンチマークコマンドを参照してください。 (例: bencher mock)

PRがクローズされた後にPRブランチをクリーンアップするためには、closedタイプのpull_requestイベントで実行される別のワークフローを作成できます。このワークフローはbencher archiveコマンドを使用してPRブランチをアーカイブします。

.github/workflows/pr_benchmarks_closed.yml
name: Archive Closed PR Branch with Bencher
on:
pull_request:
types: [closed]
jobs:
archive_pr_branch:
name: Archive closed PR branch with Bencher
# DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: bencherdev/bencher@main
- name: Archive closed PR branch with Bencher
run: |
bencher archive \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--branch "$GITHUB_HEAD_REF"
  1. GitHub Actionsのworkflowファイルを作成します。 (例: .github/workflows/pr_benchmarks_closed.yml)

  2. このワークフローに名前を付けます。 (例: name: Archive Closed PR Branch with Bencher)

  3. pull_requestイベントで実行:

    • closed - プルリクエストがクローズされた。

    完全な概要についてはGitHub ActionsのonドキュメントとGitHub Actionsのpull_requestドキュメントをご覧ください。 (例: on: pull_request: types: [closed])

  4. GitHub Actionsのjobを作成します。 (例: jobs: archive_pr_branch)

  5. プルリクエストが同じリポジトリからのものである場合にのみ、pull_requestイベントで実行します。 ⚠️ この行を削除しないでください! Fork PRの処理については、以下のフォークからのプルリクエストを参照してください。 (例: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)

  6. ジョブを実行するマシンのタイプを設定します。 完全な概要についてはGitHub Actionsのruns-onドキュメントをご覧ください。 (例: runs-on: ubuntu-latest)

  7. PRブランチのソースコードをチェックアウトします。 (例: uses: actions/checkout@v6)

  8. GitHub Actionを使用してBencher CLIをインストールします。 (例: uses: bencherdev/bencher@main)

  9. bencher archive CLIサブコマンドを使用してPRブランチをアーカイブします。 (例: bencher archive)

  10. --projectオプションをプロジェクトスラッグに設定します。 詳細はプロジェクトの--projectドキュメントを参照してください。 (例: --project project-abc4567-wxyz123456789)

  11. --keyオプションをBENCHER_API_KEY リポジトリシークレットに設定します。 詳細はトークンの--keyドキュメントを参照してください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')

  12. GitHub ActionsのGITHUB_HEAD_REFデフォルト環境変数を使用して、PRブランチ名を--branchオプションに設定します。 (例: --branch "$GITHUB_HEAD_REF")


フォークからのプルリクエスト

公開のオープンソースプロジェクトでよくあるようにフォークからのプルリクエストを受け入れる予定の場合、少し異なる方法で処理する必要があります。 セキュリティ上の理由から、フォークのプルリクエストでは BENCHER_API_KEY や GITHUB_TOKEN などのシークレットは GitHub Actions で利用できません。 つまり、外部のコントリビューターがフォークから PR を作成すると、上記の例は 動作しません。 完全な概要については、この GitHub Security Lab の説明 と、 この ブログ記事 を参照してください。

これはフォークからのプルリクエストに 継続的ベンチマーク を追加するための安全で推奨される方法です。 これには2つの別々のワークフローが必要です。 最初のワークフローは pull_request コンテキストでベンチマーク結果を実行し、キャッシュします。 そこでは BENCHER_API_KEY や GITHUB_TOKEN のようなシークレットは利用できません。 次に、2番目のワークフローが workflow_run コンテキストでキャッシュされたベンチマーク結果をダウンロードし、それを Bencher にアップロードします。 これは、workflow_run がシークレットである BENCHER_API_KEY や GITHUB_TOKEN が利用可能なリポジトリのデフォルトブランチのコンテキストで実行されるためです。 元の pull_request ワークフローで使用されたプルリクエスト番号、ヘッドブランチ、ベースブランチも、workflow_run ワークフローに明示的に渡される必要があります。 これらのワークフローは、デフォルト ブランチに存在する場合にのみ実行されます。 完全な概要については、トリガーワークフローのデータの使用 を参照してください。

.github/workflows/fork_pr_benchmarks_run.yml
name: Run Benchmarks
on:
pull_request:
types: [opened, reopened, edited, synchronize]
jobs:
benchmark_fork_pr_branch:
name: Run Fork PR Benchmarks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Mock Benchmarking
run: |
/bin/echo '{ "bencher::mock_0": { "latency": { "value": 1.0 } } }' > benchmark_results.json
- name: Upload Benchmark Results
uses: actions/upload-artifact@v4
with:
name: benchmark_results.json
path: ./benchmark_results.json
- name: Upload GitHub Pull Request Event
uses: actions/upload-artifact@v4
with:
name: event.json
path: ${{ github.event_path }}
  1. 最初のGitHub Actionsのworkflowファイルを作成します。 (例: .github/workflows/fork_pr_benchmarks_run.yml)

  2. このワークフローに名前を付けて、2番目のワークフローから参照できるようにします。 (例: name: Run Benchmarks)

  3. pull_requestイベントで実行します:

    • opened - プルリクエストが作成されました。
    • reopened - 閉じられていたプルリクエストが再度開かれました。
    • edited - プルリクエストのタイトルや本文が編集されたり、ベースブランチが変更されました。
    • synchronize - プルリクエストのヘッドブランチが更新されました。 例えば、ベースブランチからヘッドブランチが更新されたり、新しいコミットがヘッドブランチにプッシュされました。

    GitHub Actionsのonドキュメンテーションと GitHub Actionsのpull_requestドキュメンテーションを 参照して、詳細を確認してください。 (例: on: pull_request: types: [opened, reopened, edited, synchronize])

  4. GitHub Actionsのjobを作成します。 (例: jobs: benchmark_fork_pr_branch)

  5. ジョブを実行する機械のタイプを設定します。 GitHub Actionsのruns-onドキュメンテーションを参照して、 詳細を確認してください。 (例: runs-on: ubuntu-latest)

  6. フォークされたPRブランチのソースコードをチェックアウトします。 (例: uses: actions/checkout@v6)

  7. ベンチマークを実行し、結果をファイルに保存します。 (例: /bin/echo '{ ... }' > benchmark_results.json)

  8. ベンチマークの結果ファイルをアーティファクトとしてアップロードします。 (例: uses: actions/upload-artifact@v4)

  9. pull_requestイベントオブジェクトをアーティファクトとしてアップロードします。 (例: uses: actions/upload-artifact@v4)

.github/workflows/fork_pr_benchmarks_track.yml
name: Track Benchmarks with Bencher
on:
workflow_run:
workflows: [Run Benchmarks]
types: [completed]
jobs:
track_fork_pr_branch:
if: github.event.workflow_run.conclusion == 'success'
permissions:
checks: write
pull-requests: write
runs-on: ubuntu-latest
env:
BENCHMARK_RESULTS: benchmark_results.json
PR_EVENT: event.json
steps:
- name: Download Benchmark Results
uses: dawidd6/action-download-artifact@v6
with:
name: ${{ env.BENCHMARK_RESULTS }}
run_id: ${{ github.event.workflow_run.id }}
- name: Download PR Event
uses: dawidd6/action-download-artifact@v6
with:
name: ${{ env.PR_EVENT }}
run_id: ${{ github.event.workflow_run.id }}
- name: Export PR Event Data
uses: actions/github-script@v9
with:
script: |
let fs = require('fs');
let prEvent = JSON.parse(fs.readFileSync(process.env.PR_EVENT, {encoding: 'utf8'}));
core.exportVariable("PR_HEAD", prEvent.pull_request.head.ref);
core.exportVariable("PR_HEAD_SHA", prEvent.pull_request.head.sha);
core.exportVariable("PR_BASE", prEvent.pull_request.base.ref);
core.exportVariable("PR_BASE_SHA", prEvent.pull_request.base.sha);
core.exportVariable("PR_NUMBER", prEvent.number);
- uses: bencherdev/bencher@main
- name: Track Benchmarks with Bencher
run: |
bencher run \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--branch "$PR_HEAD" \
--hash "$PR_HEAD_SHA" \
--start-point "$PR_BASE" \
--start-point-hash "$PR_BASE_SHA" \
--start-point-clone-thresholds \
--start-point-reset \
--testbed ubuntu-latest \
--error-on-alert \
--adapter json \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
--ci-number "$PR_NUMBER" \
--file "$BENCHMARK_RESULTS"
  1. 2つ目の GitHub Actions workflow ファイルを作成します。 (例: .github/workflows/fork_pr_benchmarks_track.yml)
  2. この2つ目のワークフローに名前を付けます。 (例: name: Track Benchmarks with Bencher)
  3. workflow_run イベントを使って2つのワークフローを連鎖させます。 (例: on: workflow_run: ...)
  4. GitHub Actions jobを作成します。 (例: jobs: track_fork_pr_branch)
  5. 前のワークフローの結論が成功した場合にのみこのジョブを実行します。 GitHub Actions の workflow_run イベントを使用して検証します。 (例: if: github.event.workflow_run.conclusion == 'success')
  6. GITHUB_TOKEN の権限を設定し、checks と pull-requests 用に write に設定します。 GitHub の設定によっては、これが必要ない場合もあります。 しかし、2023年2月2日以降に作成されたすべての組織と個人リポジトリでは、 これはデフォルトの動作です。 完全な概要については、GitHub のドキュメントを参照してください。 (例: permissions: checks: write pull-requests: write)
  7. ジョブが実行されるマシンのタイプを設定します。 完全な概要については、GitHub Actions runs-on ドキュメントを参照してください。 (例: runs-on: ubuntu-latest)
  8. ベンチマーク結果および pull_request イベントのオブジェクトファイル名を環境変数として設定します。 (例: env: ...)
  9. GitHub Action action-download-artifactを使用して、キャッシュされたベンチマーク結果と pull_request イベントをダウンロードします。 (例: uses: dawidd6/action-download-artifact@v6)
  10. pull_request イベントから必要なデータをエクスポートし、中間環境変数として使用します。 (例: core.exportVariable(...))
  11. GitHub Actionを使用して Bencher CLI をインストールします。 (例: uses: bencherdev/bencher@main)
  12. bencher run CLI サブコマンドを使用して、 プルフォークブランチのベンチマークをトラックします。 完全な概要については、bencher run CLI サブコマンドを参照してください。 (例: bencher run)
  13. --project オプションをプロジェクトスラッグに設定します。 詳細は、--project ドキュメントをご覧ください。 (例: --project project-abc4567-wxyz123456789)
  14. --key オプションを BENCHER_API_KEY リポジトリシークレットに設定します。 詳細は、--key ドキュメントをご覧ください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')
  15. 中間環境変数を使用して、フォーク PR ブランチ名に --branch オプションを設定します。 完全な概要については、--branch ドキュメントを参照してください。 (例: --branch "$PR_HEAD")
  16. 中間環境変数を使用して、フォーク PR ブランチの git ハッシュに --hash オプションを設定します。 完全な概要については、--hash ドキュメントを参照してください。 (例: --hash "$PR_HEAD_SHA")
  17. フォーク PR ブランチの開始地点を設定します:
    1. 中間環境変数を使用して、フォーク PR ブランチの開始地点に --start-point オプションを設定します。 完全な概要については、--start-point ドキュメントを参照してください。 (例: --start-point "$PR_BASE")
    2. 中間環境変数を使用して、フォーク PR ブランチの開始地点 git ハッシュに --start-point-hash オプションを設定します。 完全な概要については、--start-point-hash ドキュメントを参照してください。 (例: --start-point-hash "$PR_BASE_SHA")
    3. 開始地点からしきい値をクローンするために --start-point-clone-thresholds フラグを設定します。 完全な概要については、--start-point-clone-thresholds ドキュメントを参照してください。 (例: --start-point-clone-thresholds)
    4. ベンチマークのデータドリフトを防ぐために、フォーク PR ブランチを開始地点に常にリセットする --start-point-reset フラグを設定します。 完全な概要については、--start-point-reset ドキュメントを参照してください。 (例: --start-point-reset)
  18. --testbed オプションをテストベッド名に設定します。 これは runs-on で選択したマシンに一致する必要があります。 詳細は、--tested ドキュメントをご覧ください。 (例: --testbed ubuntu-latest)
  19. アラートが生成された場合にコマンドを失敗させる --error-on-alert フラグを設定します。 完全な概要については、--error-on-alert ドキュメントを参照してください。 (例: --error-on-alert)
  20. bencher mockによって生成されたBencher Metric Format JSON (json) に --adapter オプションを設定します。 完全な概要については、ベンチマークハーネスアダプタを参照してください。 (例: --adapter json)
  21. GitHub Actions GITHUB_TOKEN 環境変数を使用して GitHub チェックおよびプルリクエストへのコメントとして結果を投稿するために、GitHub API 認証トークンに --github-actions オプションを設定します。 詳細は、--github-actions ドキュメントをご覧ください。 (例: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  22. 中間環境変数を使用して、プルリクエスト番号に --ci-number オプションを設定します。 詳細は、--ci-number ドキュメントをご覧ください。 (例: --ci-number "$PR_NUMBER")
  23. ベンチマーク結果のファイルパスに --file オプションを設定します。 完全な概要については、ベンチマークコマンドを参照してください。 (例: --file "$BENCHMARK_RESULTS")

フォークPRのブランチをクリーンアップするために、そのPRがクローズされた後、 pull_request_targetイベントのclosedタイプで実行される別のワークフローを作成できます。 このワークフローは、bencher archiveコマンドを使用してフォークPRのブランチをアーカイブします。

.github/workflows/fork_pr_benchmarks_closed.yml
name: Archive Closed Fork PR Branch with Bencher
on:
pull_request_target:
types: [closed]
jobs:
archive_fork_pr_branch:
name: Archive closed fork PR branch with Bencher
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: bencherdev/bencher@main
- name: Archive closed fork PR branch with Bencher
run: |
bencher archive \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--branch "$GITHUB_HEAD_REF"
  1. GitHub Actionsのworkflowファイルを作成します。 (例: .github/workflows/fork_pr_benchmarks_closed.yml)

  2. このワークフローに名前を付けます。 (例: name: Archive Closed Fork PR Branch with Bencher)

  3. pull_request_targetイベントで実行します:

    • closed - プルリクエストがクローズされた。

    詳細はGitHub Actions onドキュメントと GitHub Actions pull_request_targetドキュメントを参照してください。 (例: on: pull_request_target: types: [closed])

  4. GitHub Actionsのjobを作成します。 (例: jobs: archive_pr_branch)

  5. ジョブが実行されるマシンの種類を設定します。 詳細はGitHub Actions runs-onドキュメントを参照してください。 (例: runs-on: ubuntu-latest)

  6. PRブランチのソースコードをチェックアウトします。 (例: uses: actions/checkout@v6)

  7. GitHub Actionを使用してBencher CLIをインストールします。 (例: uses: bencherdev/bencher@main)

  8. bencher archive CLIサブコマンドを使用してPRブランチをアーカイブします。 (例: bencher archive)

  9. --projectオプションをプロジェクトスラッグに設定します。 詳細は--projectドキュメントを参照してください。 (例: --project project-abc4567-wxyz123456789)

  10. --keyオプションをBENCHER_API_KEY リポジトリシークレットに設定します。 詳細は--keyドキュメントを参照してください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')

  11. PRブランチ名を指定して--branchオプションを設定します。 GitHub Actions GITHUB_HEAD_REF デフォルト環境変数を使用してください。 (例: --branch "$GITHUB_HEAD_REF")


ベアメタル上のプルリクエスト

GitHub Actionsにはセルフホストランナーがありますが、 GitHubのノイズの多いGitHub Actions Runnerバイナリを使用する必要があります。 Bencher Bare Metalは、専用のベアメタルハードウェアのフリート上で、 目的に特化した低ノイズのベンチマークランナーを使用してベンチマークを実行します。 さらに、Bencher Bare MetalはフォークからのPRをサポートしていますが、 GitHub Actions Runnerはサポートしていません。

Bencher Bare Metalに切り替えたら、 Bencherを待っている間ずっとGitHub Actionsのジョブを実行させておきたくはないはずです。 これを解決するために、Bencherは分割したワークフローを使用し、 GitHub ActionsがBencher Bare MetalのJobを非同期に待機できるようにします。

次の例は、同じリポジトリ内のブランチで使用するためのものです。 フォークからのPRでベアメタルのベンチマークを行うには、 このパターンを上記のフォークからのプルリクエストのワークフローと組み合わせて使用してください。

まず、リポジトリをプロジェクトに一度だけリンクします。

  1. Bencher Consoleで、プロジェクトのSettingsを開き、次にConnectionsを開きます。
  2. GitHubカードでLink repositoryをクリックします。 GitHubからConnectionsに戻ると、カードにはプッシュできる各リポジトリが一覧表示されます。
  3. リポジトリの横にあるLinkをクリックします。 一覧にない場合は、Install on GitHubをクリックし、そのリポジトリへのアクセスをアプリに許可します。 Approval requiredと表示されている場合は、Approve on GitHubをクリックしてアプリの新しい権限を承認し、Connectionsを開き直してLink repositoryをクリックします。

リンクするには、プロジェクトのMaintainerロール(組織のLeaderとサーバー管理者が持つロール)と、リポジトリへのプッシュアクセスが必要です。 repository_dispatchはそれ未満を受け付けないため、BencherのGitHub Appにはリポジトリのコンテンツへの読み取りと書き込みのアクセスが必要です。 Jobが終了すると、Bencherはリンクされたリポジトリ用のトークンを作成し、そのトークンでrepository_dispatchイベントを送信します。 GitHubカードにDisconnectedと表示されている場合は、Install on GitHubをクリックしてリポジトリへのアクセスをアプリに再び許可するか、アプリのインストールの一時停止を解除すると、リンクが再接続されます。 Bencher Self-Hostedの場合、サーバーには独自のGitHub Appとv0.6.16以降のバージョンが必要です。

.github/workflows/pr_bare_metal_benchmarks.yml
name: Bare Metal PR Benchmarks with Bencher
on:
pull_request:
types: [opened, reopened, edited, synchronize]
jobs:
submit_pr_benchmarks:
name: Submit PR Benchmarks to Bencher Bare Metal
# DO NOT REMOVE: For handling Fork PRs see Pull Requests from Forks
if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
permissions:
checks: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: bencherdev/bencher@main
- name: Submit PR Benchmarks with Bencher
run: |
bencher run \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--branch "$GITHUB_HEAD_REF" \
--hash '${{ github.event.pull_request.head.sha }}' \
--start-point "$GITHUB_BASE_REF" \
--start-point-hash '${{ github.event.pull_request.base.sha }}' \
--start-point-clone-thresholds \
--start-point-reset \
--adapter json \
--image project-abc4567-wxyz123456789:latest \
--detach \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
bencher mock
  1. 1つ目のGitHub Actionsのworkflowファイルを作成します。 (例: .github/workflows/pr_bare_metal_benchmarks.yml)
  2. このワークフローに名前を付けます。 (例: name: Bare Metal PR Benchmarks with Bencher)
  3. 上記のプルリクエストと同じように、pull_requestイベントに応じて実行します。 (例: on: pull_request: types: [opened, reopened, edited, synchronize])
  4. GitHub Actionsのjobを作成します。 (例: jobs: submit_pr_benchmarks)
  5. プルリクエストが同じリポジトリからの場合にのみpull_requestイベントを実行します。 ⚠️この行を削除しないでください! フォークからのPRの処理については、上記のフォークからのプルリクエストを参照してください。 (例: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
  6. GITHUB_TOKENの権限をchecksに対してwriteに設定します。 1つ目のワークフローはGitHubチェックを開始し、コメントは投稿しません。 (例: permissions: checks: write)
  7. ジョブが実行されるマシンタイプを設定します。 Jobを送信するだけなので、小さなマシンで十分です。 (例: runs-on: ubuntu-latest)
  8. PRブランチのソースコードをチェックアウトします。 (例: uses: actions/checkout@v6)
  9. GitHub ActionからBencher CLIをインストールします。 (例: uses: bencherdev/bencher@main)
  10. プルリクエストブランチのベンチマークを送信するために、bencher run CLIサブコマンドを使用します。 bencher run CLIサブコマンドを参照し、全体を把握してください。 (例: bencher run)
  11. --projectオプションをプロジェクトのスラッグに設定します。 詳細は--projectドキュメントを参照してください。 (例: --project project-abc4567-wxyz123456789)
  12. --keyオプションをBENCHER_API_KEY リポジトリシークレットに設定します。 詳細は--keyドキュメントを参照してください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')
  13. GITHUB_HEAD_REFのGitHub Actionsデフォルト環境変数を使用して、--branchオプションをPRブランチ名に設定します。 全体を把握するために--branchドキュメントを参照してください。 (例: --branch "$GITHUB_HEAD_REF")
  14. 上記のプルリクエストと同じように、--hashオプションをPRブランチのgitハッシュに設定します。 全体を把握するために--hashドキュメントを参照してください。 (例: --hash '${{ github.event.pull_request.head.sha }}')
  15. 上記のプルリクエストと同じように、PRブランチの開始ポイントを設定します。 全体を把握するために--start-pointドキュメントを参照してください。 (例: --start-point "$GITHUB_BASE_REF")
  16. --adapterオプションを、bencher mockが生成するBencher Metric Format JSON (json)に設定します。 全体を把握するためにベンチマークハーネスアダプターを参照してください。 (例: --adapter json)
  17. --imageオプションをベアメタル用のイメージに設定します。 全体を把握するために--imageドキュメントを参照してください。 (例: --image project-abc4567-wxyz123456789:latest)
  18. Jobを送信したらすぐに終了するように--detachフラグを設定します。 詳細は--detachドキュメントを参照してください。 (例: --detach)
  19. GitHub ActionsのGITHUB_TOKEN環境変数を使用して、GitHubチェックを開始するためのGitHub API認証トークンを--github-actionsオプションに設定します。 詳細は--github-actionsドキュメントを参照してください。 (例: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  20. イメージ内で実行するベンチマークコマンドを指定します。 コマンドは、イメージにエントリポイントがある場合はそのエントリポイントに渡されます(--entrypointオプションを参照)。 全体を把握するためにベンチマークコマンドを参照してください。 (例: bencher mock)

GitHub Enterprise Serverの場合、または独自のトークンを使い続ける場合は、--ci-callback-tokenオプションを、リポジトリのコンテンツへの読み取りと書き込みのアクセスを持つFine-grained personal access tokenに設定し、BENCHER_CALLBACK_TOKEN リポジトリシークレットとして保存します。 Bencherは、プロジェクトにリンクされたリポジトリがあるかどうかにかかわらず、そのトークンでrepository_dispatchイベントを送信します。 詳細は--ci-callback-tokenドキュメントを参照してください。 (例: --ci-callback-token '${{ secrets.BENCHER_CALLBACK_TOKEN }}')

.github/workflows/pr_bare_metal_benchmarks_attach.yml
name: Attach Bare Metal PR Benchmarks with Bencher
on:
repository_dispatch:
types: [bencher_run]
jobs:
attach_pr_benchmarks:
name: Post PR Benchmark Results from Bencher Bare Metal
permissions:
checks: write
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: bencherdev/bencher@main
- name: Post PR Benchmark Results with Bencher
env:
JOB_UUID: ${{ github.event.client_payload.bencher.job }}
run: |
bencher run \
--project project-abc4567-wxyz123456789 \
--key '${{ secrets.BENCHER_API_KEY }}' \
--job "$JOB_UUID" \
--error-on-alert \
--github-actions '${{ secrets.GITHUB_TOKEN }}'
  1. デフォルトブランチに2つ目のGitHub Actionsのworkflowファイルを作成します。 GitHubはrepository_dispatchワークフローをデフォルトブランチからのみ実行するため、 このファイルがそこに置かれるまで、1つ目のワークフローが開始したGitHubチェックは実行中のままになります。 (例: .github/workflows/pr_bare_metal_benchmarks_attach.yml)
  2. このワークフローに名前を付けます。 (例: name: Attach Bare Metal PR Benchmarks with Bencher)
  3. bencher_runタイプのrepository_dispatchイベントに応じて実行します。 GitHub Actionsのonドキュメント およびGitHub Actionsのrepository_dispatchドキュメントを参照し、全体を把握してください。 (例: on: repository_dispatch: types: [bencher_run])
  4. GitHub Actionsのjobを作成します。 (例: jobs: attach_pr_benchmarks)
  5. GITHUB_TOKENの権限をchecksとpull-requestsに対してwriteに設定します。 (例: permissions: checks: write pull-requests: write)
  6. ジョブが実行されるマシンタイプを設定します。 Jobはすでに終了しているため、このジョブは結果を投稿するだけです。 (例: runs-on: ubuntu-latest)
  7. GitHub ActionからBencher CLIをインストールします。 チェックアウトは不要です。 (例: uses: bencherdev/bencher@main)
  8. GitHubのスクリプトインジェクションに関するガイダンスに従い、イベントのJobのUUIDはrun:に直接書かず、中間環境変数を通して渡します。 (例: env: JOB_UUID: ${{ github.event.client_payload.bencher.job }})
  9. Jobにアタッチするために、bencher run CLIサブコマンドを使用します。 bencher run CLIサブコマンドを参照し、全体を把握してください。 (例: bencher run)
  10. --projectオプションをプロジェクトのスラッグに設定します。 リポジトリに複数のプロジェクトがある場合は、github.event.client_payload.bencher.projectも同じように環境変数を通して渡し、引用符で囲んでください(例: --project "$PROJECT_SLUG")。 詳細は--projectドキュメントを参照してください。 (例: --project project-abc4567-wxyz123456789)
  11. --keyオプションをBENCHER_API_KEY リポジトリシークレットに設定します。 詳細は--keyドキュメントを参照してください。 (例: --key '${{ secrets.BENCHER_API_KEY }}')
  12. --jobオプションを引用符で囲んだJobのUUIDに設定します。 全体を把握するために--jobドキュメントを参照してください。 (例: --job "$JOB_UUID")
  13. アラートが生成された場合にコマンドを失敗させるために、--error-on-alertフラグを設定します。 イベントが運ぶのはデータだけなので、--ci-only-on-alertや--ci-public-linksなど、結果の投稿方法を決めるオプションも、2つ目のワークフローのここに指定します。 全体を把握するために--error-on-alertドキュメントを参照してください。 (例: --error-on-alert)
  14. GitHub ActionsのGITHUB_TOKEN環境変数を使用して、結果をGitHubチェックとプルリクエストのコメントとして投稿するためのGitHub API認証トークンを--github-actionsオプションに設定します。 ここで明示的に指定した--ci-numberまたは--ci-idはイベントより優先されます。 詳細は--github-actionsドキュメントを参照してください。 (例: --github-actions '${{ secrets.GITHUB_TOKEN }}')


🐰 おめでとうございます!GitHub ActionsでBencherを使用する方法を学びました!🎉


続ける: ベンチマーキングの概要 ➡

🤖 このドキュメントは AI によって自動的に翻訳されました。 正確ではない可能性があり、間違いが含まれている可能性があります。 エラーを見つけた場合は、GitHub で問題を開いてください。.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Wed, October 28, 2026 at 5:53:42 AM UTC