GitHub ActionsでBencherを使用する方法
利用ケースに応じて、GitHub Actionsで継続的ベンチマークを次のためにセットアップできます。
続行する前に、APIトークンを作成したうえで、リポジトリのシークレットとしてBENCHER_API_TOKEN
という名前で設定してください。Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secret
に移動します。シークレット名をBENCHER_API_TOKEN
として、シークレットの値にAPIトークンを設定します。
GitHub Actionsでは、フォークされたリポジトリからワークフローがトリガーされた場合、シークレットはランナーに渡されません。したがって、以下のいずれかのワークフローをプルリクエストでリポジトリに追加する際には、_同じ_リポジトリのブランチを使用する必要があります。フォークからのプルリクエストでBencherを追加しようとすると、BENCHER_API_TOKEN
シークレットは利用できません。${{ secrets.BENCHER_API_TOKEN }}
は空の文字列になります。
ベースブランチ
統計的継続的ベンチマーキングの基礎は、ベースブランチの履歴ベースラインを持つことです。 この履歴ベースラインを使用して、プルリクエストにおけるパフォーマンスの退行を検出することができます。
- GitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/base_benchmarks.yml
) main
ブランチへのpush
イベントで実行します。 詳細については、GitHub Actionsのon
ドキュメントおよびGitHub Actionsのpush
ドキュメントを参照してください。 (例:on: push: branches: main
)- GitHub Actionsの
job
を作成します。 (例:jobs: benchmark_base_branch
) GITHUB_TOKEN
の権限を設定しますchecks
に対してwrite
を設定してください。 (例:permissions: checks: write
)- ジョブを実行するマシンのタイプを設定します。
詳細については、GitHub Actionsの
runs-on
ドキュメントを参照してください。 (例:runs-on: ubuntu-latest
) - ベースブランチのソースコードをチェックアウトします。
(例:
uses: actions/checkout@v4
) - GitHub Actionを使用してBencher CLIをインストールします。
(例:
uses: bencherdev/bencher@main
) bencher run
CLIサブコマンドを使用してmain
ブランチのベンチマークを実行します。 詳細については、bencher run
CLIサブコマンドを参照してください。 (例:bencher run
)--project
オプションをプロジェクトスラッグに設定します。 詳細については、--project
ドキュメントを参照してください。 (例:--project save-walter-white-1234abcd
)--token
オプションをBENCHER_API_TOKEN
リポジトリシークレットに設定します。 詳細については、--token
ドキュメントを参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
)--branch
オプションをベースブランチ名に設定します。 詳細については、--branch
ドキュメントを参照してください。 (例:--branch main
)--testbed
オプションをテストベッド名に設定します。 これは、runs-on
で選択されたマシンと一致する必要があります。 詳細については、--testbed
ドキュメントを参照してください。 (例:--testbed ubuntu-latest
)main
ブランチ、ubuntu-latest
テストベッド、latency
測定のしきい値を設定します:--threshold-measure
オプションをbencher mock
によって生成される組み込みのlatency
測定に設定します。 詳細については、--threshold-measure
ドキュメントを参照してください。 (例:--threshold-measure latency
)--threshold-test
オプションをスチューデントのt検定(t_test
)に設定します。 詳細については、--threshold-test
ドキュメントを参照してください。 (例:--threshold-test t_test
)--threshold-max-sample-size
オプションを最大サンプルサイズである64
に設定します。 詳細については、--threshold-max-sample-size
ドキュメントを参照してください。 (例:--threshold-max-sample-size 64
)--threshold-upper-boundary
オプションを上限の0.99
に設定します。 詳細については、--threshold-upper-boundary
ドキュメントを参照してください。 (例:--threshold-upper-boundary 0.99
)- 指定されたしきい値のみをアクティブにするために
--thresholds-reset
フラグを設定します。 詳細については、--thresholds-reset
ドキュメントを参照してください。 (例:--thresholds-reset
)
- 警告が生成された場合にコマンドを失敗させるように
--err
フラグを設定します。 詳細については、--err
ドキュメントを参照してください。 (例:--err
) bencher mock
によって生成されるBencher Metric Format JSON(json
)を--adapter
オプションに設定します。 詳細については、ベンチマークハーネスアダプタを参照してください。 (例:--adapter json
)- 結果をGitHub Checksコメントとして投稿するために、GitHub Actions
GITHUB_TOKEN
環境変数を使用して、--github-actions
オプションをGitHub API認証トークンに設定します。 詳細については、--github-actions
ドキュメントを参照してください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) - ベンチマークコマンド引数を指定します。
詳細については、ベンチマークコマンドを参照してください。
(例:
bencher mock
)
プルリクエスト
プルリクエスト(PR)でパフォーマンスの退行をキャッチするためには、PRでベンチマークを実行する必要があります。
同じリポジトリ内のブランチからのみPRが期待される場合は、
同じリポジトリからのpull_request
イベントで実行される別のワークフローを作成すれば簡単です。
⚠️ このソリューションは、すべてのPRが同じリポジトリからの場合にのみ機能します! 以下のフォークからのプルリクエストを参照してください。
-
GitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/pr_benchmarks.yml
) -
pull_request
イベントに応じて実行します:opened
- プルリクエストが作成されました。reopened
- 以前にクローズしたプルリクエストが再オープンされました。edited
- プルリクエストのタイトルまたは本文が編集されたり、ベースブランチが変更されました。synchronize
- プルリクエストのヘッドブランチが更新されました。 例えば、ベースブランチからヘッドブランチが更新されたり、新しいコミットがヘッドブランチにプッシュされたりしました。
GitHub Actionsの
on
ドキュメント およびGitHub Actionsのpull_request
ドキュメントを参照し、全体を把握してください。 (例:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
GitHub Actionsの
job
を作成します。 (例:jobs: benchmark_pr_branch
) -
プルリクエストが同じリポジトリからの場合にのみ
pull_request
イベントを実行します。 ⚠️この行を削除しないでください! フォークからのPRの処理については、以下のフォークからのプルリクエストを参照してください。 (例:if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
) -
GITHUB_TOKEN
の権限をpull-requests
に対してwrite
に設定します。 GitHubの設定により、これは必要ないかもしれません。 しかし、2023年2月2日以降に作成されたすべての組織および個人リポジトリでは、 これはデフォルトの動作です。 GitHubのドキュメントを参照し、全体を把握してください。 (例:permissions: pull-requests: write
) -
ジョブが実行されるマシンタイプを設定します。 GitHub Actionsの
runs-on
ドキュメントを参照し、全体を把握してください。 (例:runs-on: ubuntu-latest
) -
PRブランチのソースコードをチェックアウトします。 (例:
uses: actions/checkout@v4
) -
GitHub ActionからBencher CLIをインストールします。 (例:
uses: bencherdev/bencher@main
) -
プルリクエストブランチのベンチマークを実行するために、
bencher run
CLIサブコマンドを使用します。bencher run
CLIサブコマンドを参照し、全体を把握してください。 (例:bencher run
) -
--project
オプションをプロジェクトのスラッグに設定します。 詳細は--project
ドキュメントを参照してください。 (例:--project save-walter-white-1234abcd
) -
--token
オプションをBENCHER_API_TOKEN
リポジトリシークレットに設定します。 詳細は--token
ドキュメントを参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
GITHUB_HEAD_REF
のGitHub Actionsデフォルト環境変数を使用して、--branch
オプションをPRブランチ名に設定します。 全体を把握するために--branch
ドキュメントを参照してください。 (例:--branch "$GITHUB_HEAD_REF"
) -
PRブランチの開始ポイントを設定します:
GITHUB_BASE_REF
のGitHub Actionsデフォルト環境変数を使用して、--start-point
オプションをPRブランチの開始ポイントに設定します。 全体を把握するために--start-point
ドキュメントを参照してください。 (例:--start-point "$GITHUB_BASE_REF"
)pull_request
イベントのGitHub Actionsを使用して、--start-point-hash
オプションをPRブランチの開始ポイントgit
ハッシュに設定します。 全体を把握するために--start-point-hash
ドキュメントを参照してください。 (例:--start-point-hash '${{ github.event.pull_request.base.sha }}'
)- 開始ポイントからしきい値をクローンするために、
--start-point-clone-thresholds
フラグを設定します。 全体を把握するために--start-point-clone-thresholds
ドキュメントを参照してください。 (例:--start-point-clone-thresholds
) - ベンチマークデータのドリフトを防ぐために、PRブランチを開始ポイントに常にリセットする
--start-point-reset
フラグを設定します。 全体を把握するために--start-point-reset
ドキュメントを参照してください。 (例:--start-point-reset
)
-
--testbed
オプションをテストベッド名に設定します。 これはruns-on
で選択したマシンと一致する可能性があります。 詳細は--tested
ドキュメントを参照してください。 (例:--testbed ubuntu-latest
) -
アラートが生成された場合にコマンドを失敗させるために、
--err
フラグを設定します。 全体を把握するために--err
ドキュメントを参照してください。 (例:--err
) -
Bencher Metric Format JSON (
json
)を生成するbencher mock
を使用して、Bencher Metric Format JSON
(json
)に--adapter
オプションを設定します。 ベンチマークハーネスアダプタを参照し、全体を把握してください。 (例:--adapter json
) -
GITHUB_TOKEN
環境変数を使用してGitHub API認証トークンを使ってプルリクエストにコメントとして結果を投稿するために、--github-actions
オプションを設定します。 詳細は--github-actions
ドキュメントを参照してください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
ベンチマークコマンドの引数を指定します。 全体を把握するためにベンチマークコマンドを参照してください。 (例:
bencher mock
)
PRがクローズされた後にPRブランチをクリーンアップするためには、closed
タイプのpull_request
イベントで実行される別のワークフローを作成できます。このワークフローはbencher archive
コマンドを使用してPRブランチをアーカイブします。
-
GitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/pr_benchmarks_closed.yml
) -
pull_request
イベントで実行:closed
- プルリクエストがクローズされた。
完全な概要についてはGitHub Actionsの
on
ドキュメントとGitHub Actionsのpull_request
ドキュメントをご覧ください。 (例:on: pull_request: types: [closed]
) -
GitHub Actionsの
job
を作成します。 (例:jobs: archive_pr_branch
) -
プルリクエストが同じリポジトリからのものである場合にのみ、
pull_request
イベントで実行します。 ⚠️ この行を削除しないでください! Fork PRの処理については、以下のフォークからのプルリクエストを参照してください。 (例:if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
) -
ジョブを実行するマシンのタイプを設定します。 完全な概要についてはGitHub Actionsの
runs-on
ドキュメントをご覧ください。 (例:runs-on: ubuntu-latest
) -
PRブランチのソースコードをチェックアウトします。 (例:
uses: actions/checkout@v4
) -
GitHub Actionを使用してBencher CLIをインストールします。 (例:
uses: bencherdev/bencher@main
) -
bencher archive
CLIサブコマンドを使用してPRブランチをアーカイブします。 (例:bencher archive
) -
--project
オプションをプロジェクトスラッグに設定します。 詳細はプロジェクトの--project
ドキュメントを参照してください。 (例:--project save-walter-white-1234abcd
) -
--token
オプションをBENCHER_API_TOKEN
リポジトリシークレットに設定します。 詳細はトークンの--token
ドキュメントを参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
GitHub Actionsの
GITHUB_HEAD_REF
デフォルト環境変数を使用して、PRブランチ名を--branch
オプションに設定します。 (例:--branch "$GITHUB_HEAD_REF"
)
フォークからのプルリクエスト
公開のオープンソースプロジェクトでよくあるようにフォークからのプルリクエストを受け入れる予定の場合、少し異なる方法で処理する必要があります。
セキュリティ上の理由から、フォークのプルリクエストでは BENCHER_API_TOKEN
や GITHUB_TOKEN
などのシークレットは GitHub Actions で利用できません。
つまり、外部のコントリビューターがフォークから PR を作成すると、上記の例は 動作しません。
完全な概要については、この GitHub Security Lab の説明 と、
この ブログ記事 を参照してください。
これはフォークからのプルリクエストに 継続的ベンチマーク を追加するための安全で推奨される方法です。
これには2つの別々のワークフローが必要です。
最初のワークフローは pull_request
コンテキストでベンチマーク結果を実行し、キャッシュします。
そこでは BENCHER_API_TOKEN
や GITHUB_TOKEN
のようなシークレットは利用できません。
次に、2番目のワークフローが workflow_run
コンテキストでキャッシュされたベンチマーク結果をダウンロードし、それを Bencher にアップロードします。
これは、workflow_run
がシークレットである BENCHER_API_TOKEN
や GITHUB_TOKEN
が利用可能なリポジトリのデフォルトブランチのコンテキストで実行されるためです。
元の pull_request
ワークフローで使用されたプルリクエスト番号、ヘッドブランチ、ベースブランチも、workflow_run
ワークフローに明示的に渡される必要があります。
これらのワークフローは、デフォルト ブランチに存在する場合にのみ実行されます。
完全な概要については、トリガーワークフローのデータの使用 を参照してください。
-
最初のGitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/fork_pr_benchmarks_run.yml
) -
このワークフローに名前を付けて、2番目のワークフローから参照できるようにします。 (例:
name: Run Benchmarks
) -
pull_request
イベントで実行します:opened
- プルリクエストが作成されました。reopened
- 閉じられていたプルリクエストが再度開かれました。edited
- プルリクエストのタイトルや本文が編集されたり、ベースブランチが変更されました。synchronize
- プルリクエストのヘッドブランチが更新されました。 例えば、ベースブランチからヘッドブランチが更新されたり、新しいコミットがヘッドブランチにプッシュされました。
GitHub Actionsの
on
ドキュメンテーションと GitHub Actionsのpull_request
ドキュメンテーションを 参照して、詳細を確認してください。 (例:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
GitHub Actionsの
job
を作成します。 (例:jobs: benchmark_fork_pr_branch
) -
ジョブを実行する機械のタイプを設定します。 GitHub Actionsの
runs-on
ドキュメンテーションを参照して、 詳細を確認してください。 (例:runs-on: ubuntu-latest
) -
フォークされたPRブランチのソースコードをチェックアウトします。 (例:
uses: actions/checkout@v4
) -
ベンチマークを実行し、結果をファイルに保存します。 (例:
/bin/echo '{ ... }' > benchmark_results.json
) -
ベンチマークの結果ファイルをアーティファクトとしてアップロードします。 (例:
uses: actions/upload-artifact@v4
) -
pull_request
イベントオブジェクトをアーティファクトとしてアップロードします。 (例:uses: actions/upload-artifact@v4
)
- 最初のGitHub Actions
workflow
ファイルを作成します。 (例:.github/workflows/fork_pr_benchmarks_track.yml
) - このワークフローに名前を付けます。
(例:
name: Track Benchmarks with Bencher
) - 2つのワークフローを
workflow_run
イベントで連鎖させます。 (例:on: workflow_run: ...
) - GitHub Actions
job
を作成します。 (例:jobs: track_fork_pr_branch
) - 前のワークフローの結論が成功した場合のみこのジョブを実行します。
workflow_run
イベント を使用します。 (例:if: github.event.workflow_run.conclusion == 'success'
) - ジョブが実行されるマシンのタイプを設定します。GitHub Actions
runs-on
ドキュメント を参照してください。 (例:runs-on: ubuntu-latest
) - ベンチマーク結果と
pull_request
イベントのオブジェクトファイル名を環境変数として設定します。 (例:env: ...
) - キャッシュされたベンチマーク結果と
pull_request
イベントをaction-download-artifact
GitHub Action を使用してダウンロードします。 (例:uses: dawidd6/action-download-artifact@v6
) - 必要なデータを
pull_request
イベントから環境変数としてエクスポートします。 (例:core.exportVariable(...)
) - GitHub Action を使用してBencher CLIをインストールします。
(例:
uses: bencherdev/bencher@main
) bencher run
CLIサブコマンドを使用してフォークプルブランチのベンチマークを追跡します。bencher run
CLIサブコマンドの全体的な概要を参照してください。 (例:bencher run
)--project
オプションをプロジェクトスラッグに設定します。 詳細は--project
ドキュメントを参照してください。 (例:--project save-walter-white-1234abcd
)--token
オプションをBENCHER_API_TOKEN
リポジトリシークレットに設定します。 詳細は--token
ドキュメントを参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
)--branch
オプションをフォークPRブランチ名に 仲介環境変数 を使用して設定します。--branch
ドキュメント を参照して全体像を確認してください。 (例:--branch "$PR_HEAD"
)- フォークPRブランチの開始ポイントを設定します:
--start-point
オプションをフォークPRブランチの開始ポイントに 仲介環境変数 を使用して設定します。--start-point
ドキュメント を参照して全体像を確認してください。 (例:--start-point "$PR_BASE"
)--start-point-hash
オプションをフォークPRブランチ開始ポイントのgit
ハッシュに 仲介環境変数 を使用して設定します。--start-point-hash
ドキュメント を参照して全体像を確認してください。 (例:--start-point-hash "$PR_BASE_SHA"
)--start-point-clone-thresholds
フラグを設定して開始ポイントからしきい値をクローンします。--start-point-clone-thresholds
ドキュメント を参照して全体像を確認してください。 (例:--start-point-clone-thresholds
)--start-point-reset
フラグを設定してフォークPRブランチを常に開始ポイントにリセットします。 これはベンチマークデータのドリフトを防ぎます。--start-point-reset
ドキュメント を参照してください。 (例:--start-point-reset
)
--testbed
オプションをテストベッド名に設定します。 これはおそらくruns-on
で選択されたマシンと一致しているべきです。 詳細は--tested
ドキュメントを参照してください。 (例:--testbed ubuntu-latest
)- アラートが生成された場合にコマンドが失敗するように
--err
フラグを設定します。--err
ドキュメント を参照して全体像を確認してください。 (例:--err
) - Bencher Metric Format JSON (
json
) にオプションを設定してbencher mock
によって生成された形式を指定します。 ベンチマークハーネスアダプタ を参照して全体像を確認してください。 (例:--adapter json
) --github-actions
オプションをGitHub API認証トークンに設定して、 プルリクエストにコメントとして結果を投稿します。 GitHub ActionsGITHUB_TOKEN
環境変数 を使用して設定します。 詳細は--github-actions
ドキュメント を参照してください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
)--ci-number
オプションをプルリクエスト番号に設定します。 仲介環境変数 を使用します。 詳細は--ci-number
ドキュメント を参照してください。 (例:--ci-number "$PR_NUMBER"
)--file
オプションをベンチマーク結果のファイルパスに設定します。 ベンチマークコマンド を参照して全体像を確認してください。 (例:--file "$BENCHMARK_RESULTS"
)
フォークPRのブランチをクリーンアップするために、そのPRがクローズされた後、
pull_request_target
イベントのclosed
タイプで実行される別のワークフローを作成できます。
このワークフローは、bencher archive
コマンドを使用してフォークPRのブランチをアーカイブします。
-
GitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/fork_pr_benchmarks_closed.yml
) -
pull_request_target
イベントで実行します:closed
- プルリクエストがクローズされた。
詳細はGitHub Actions
on
ドキュメントと GitHub Actionspull_request_target
ドキュメントを参照してください。 (例:on: pull_request_target: types: [closed]
) -
GitHub Actionsの
job
を作成します。 (例:jobs: archive_pr_branch
) -
ジョブが実行されるマシンの種類を設定します。 詳細はGitHub Actions
runs-on
ドキュメントを参照してください。 (例:runs-on: ubuntu-latest
) -
PRブランチのソースコードをチェックアウトします。 (例:
uses: actions/checkout@v4
) -
GitHub Actionを使用してBencher CLIをインストールします。 (例:
uses: bencherdev/bencher@main
) -
bencher archive
CLIサブコマンドを使用してPRブランチをアーカイブします。 (例:bencher archive
) -
--project
オプションをプロジェクトスラッグに設定します。 詳細は--project
ドキュメントを参照してください。 (例:--project save-walter-white-1234abcd
) -
--token
オプションをBENCHER_API_TOKEN
リポジトリシークレットに設定します。 詳細は--token
ドキュメントを参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
PRブランチ名を指定して
--branch
オプションを設定します。 GitHub ActionsGITHUB_HEAD_REF
デフォルト環境変数を使用してください。 (例:--branch "$GITHUB_HEAD_REF"
)
🐰 おめでとうございます!GitHub ActionsでBencherを使用する方法を学びました!🎉