GitHub ActionsでBencherを使用する方法
GitHub Actionsであなたのユースケースに応じて、以下のために継続的ベンチマーキングを設定できます:
- ベースブランチ
- プルリクエスト
- フォークからのプルリクエスト
- ⛑️ 安全: デフォルトブランチからフォークPRをベンチマークしてアップロード
- ⚠️ リスキー: ターゲットブランチからフォークPRをベンチマークしてレビュアーが必要
🐰 APIトークンを作成したことを 確認し、それを
BENCHER_API_TOKEN
という名前のリポジトリシークレットとして設定する前に進むこと!Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secret
に移動します。 シークレットの名前をBENCHER_API_TOKEN
に設定し、シークレットの値にあなたのAPIトークンを設定してください。
基本ブランチ
統計的連続ベンチマーキング の基本は、基本ブランチのための歴史的なベースラインを持つことです。 この歴史的なベースラインを利用して、プルリクエスト中のパフォーマンスの退行を検出できます。
- GitHub Actions
workflow
ファイルを作成します。 (例:.github/workflows/base_benchmarks.yml
) main
ブランチへのpush
イベントで実行します。 GitHub Actionson
documentation および GitHub Actionspush
documentation を参照して全体を理解してください。 (例:on: push: branches: main
)- GitHub Actions
job
を作成します。 (例:jobs: benchmark_base_branch
) - ジョブが実行されるマシンのタイプを設定します。
GitHub Actions
runs-on
documentation を参照して全体を理解してください。 (例:runs-on: ubuntu-latest
) - 基本ブランチのソースコードをチェックアウトします。
(例:
uses: actions/checkout@v4
) - GitHub Action を使用して Bencher CLI をインストールします。
(例:
uses: bencherdev/bencher@main
) main
ブランチのベンチマークを実行するためにbencher run
CLI サブコマンドを使用してください。 thebencher run
CLI サブコマンド を参照して全体を理解してください。 (例:bencher run
)--project
オプションをプロジェクトスラグに設定します。 the--project
docs を詳しく読んでください。 (例:--project save-walter-white-1234abcd
)--token
オプションをBENCHER_API_TOKEN
リポジトリー シークレットに設定します。 the--token
docs を詳しく読んでください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
)--branch
オプションをブランチ名に設定します。 branch selection を参照して全体を理解してください。 (例:--branch main
)--testbed
オプションをテストベッド名に設定します。 これはruns-on
で選択したマシンと一致するべきです。 the--tested
docs を詳しく読んでください。 (例:--testbed ubuntu-latest
)--adapter
オプションを希望のベンチマークハーネスアダプターに設定します。 benchmark harness adapters を参照して全体を理解してください。 (例:--adapter json
)- アラートが生成された場合にコマンドを失敗させる
--err
フラグを設定します。 Threshold & Alerts を参照して全体を理解してください。 (例:--err
) - ベンチマークコマンド引数を指定します。
benchmark command を参照して全体を理解してください。
(例:
bencher mock
)
プルリクエスト
プルリクエストでパフォーマンスの回帰を検出するためには、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サブコマンドを使用して プルリクエストブランチのベンチマークを実行します。 thebencher run
CLIサブコマンドをご覧ください。 (例:bencher run
) -
--project
オプションをプロジェクトスラッグに設定します。 the--project
ドキュメントをご覧ください。 (例:--project save-walter-white-1234abcd
) -
--token
オプションをBENCHER_API_TOKEN
リポジトリシークレットに設定します。 the--token
ドキュメントをご覧ください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
GitHub Actionsの
github
コンテキストを使用してPRブランチ名を--branch
オプションに設定します。 ブランチの選択をご覧ください。 (例:--branch '${{ github.head_ref }}'
) -
GitHub Actionsの
github
コンテキストを使用してPRベースブランチの開始点を--branch-start-point
オプションに設定します。 ブランチの選択開始点をご覧ください。 (例:--branch-start-point '${{ github.base_ref }}'
) -
GitHub Actionsの
pull_request
イベントを使用してPRベースブランチの開始点ハッシュを--branch-start-point-hash
オプションに設定します。 ブランチの選択開始点ハッシュをご覧ください。 (例:--branch-start-point-hash '${{ github.event.pull_request.base.sha }}'
) -
--testbed
オプションをテストベッド名に設定します。 これは、runs-on
で選択したマシンと一致するべきです。 the--tested
ドキュメントをご覧ください。 (例:--testbed ubuntu-latest
) -
希望するベンチマークハーネスアダプターを
--adapter
オプションに設定します。 ベンチマークハーネスアダプターをご覧ください。 (例:--adapter json
) -
アラートが生成された場合にコマンドを失敗させるために
--err
フラグを設定します。 しきい値とアラートをご覧ください。 (例:--err
) -
GitHub Actionsの
GITHUB_TOKEN
環境変数を使用してGitHub API認証トークンを--github-actions
オプションに設定し、プルリクエストにコメントとして結果を投稿します。 the--github-actions
ドキュメントをご覧ください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
ベンチマークコマンドの引数を指定します。 ベンチマークコマンドをご覧ください。 (例:
bencher mock
)
フォークからのプルリクエスト
公開されたオープンソースプロジェクトではよくあることですが、フォークからプルリクエストを受け付ける予定の場合、少し異なる扱いが必要になります。
セキュリティ上の理由から、BENCHER_API_TOKEN
やGITHUB_TOKEN
などの秘密情報は、フォークのPRでGitHub Actionsでは利用できません。
つまり、外部のコントリビュータがフォークからPRを開いた場合、上記の例は動作しません。
フォークのPRには2つの選択肢があります:
- ⛑️ より安全:フォークPRをベンチマークしてデフォルトブランチからアップロードする
- ⚠️ よりリスク:ターゲットブランチから必須レビュアー付きでフォークPRをベンチマークする
pwnリクエストを防ぐためのフルオーバービューについては、このGitHub Security Labの記事とこのブログ投稿を参照してください。
デフォルトブランチからのフォークPRのベンチマークとアップロード
これは、フォークプルリクエストに継続的ベンチマーキングを追加するための安全で推奨される方法です。
これには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/run_fork_pr_benchmarks.yml
) -
このワークフローに名前を付けて、2番目のワークフローから参照できるようにします。 (例:
name: Run and Cache Benchmarks
) -
pull_request
イベントで実行します:opened
- プルリクエストが作成されました。reopened
- 以前に閉じられたプルリクエストが再開されました。edited
- プルリクエストのタイトルまたはボディが編集されたか、プルリクエストのベースブランチが変更されました。synchronize
- プルリクエストのヘッドブランチが更新されました。 例えば、ヘッドブランチがベースブランチから更新されたか、ヘッドブランチに新しいコミットがプッシュされました。
詳細については、GitHub Actions
on
ドキュメント と GitHub Actionspull_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/track_fork_pr_benchmarks.yml
) - このワークフローに名前を付けて、2番目のワークフローとして名付けます。
(例:
name: Track Benchmarks with Bencher
) - the
workflow_run
イベントで2つのワークフローを連鎖させます。 (例:on: workflow_run: ...
) - GitHub Actions
job
を作成します。 (例:jobs: track_fork_pr_branch
) - 前のワークフローの結論が成功だった場合のみこのジョブを実行します。
GitHub Actions
workflow_run
イベントを使用します。 (例:if: github.event.workflow_run.conclusion == 'success'
) - ジョブが実行されるマシンのタイプを設定します。
詳紀については、GitHub Actions
runs-on
ドキュメント をご覧ください。 (例:runs-on: ubuntu-latest
) - ベンチマーク結果と
pull_request
イベントオブジェクトファイル名を環境変数として設定します。 (例:env: ...
) - キャッシュされたベンチマーク結果と
pull_request
イベントをダウンロードします。 (例:uses: actions/github-script@v6
) - キャッシュされたベンチマーク結果と
pull_request
イベントを展開します。 (例:unzip ...
) pull_request
イベントから必要なデータを環境変数としてエクスポートします。 (例:core.exportVariable(...)
)- GitHub Actionを使用してBencher CLIをインストールします。
(例:
uses: bencherdev/bencher@main
) bencher run
CLIサブコマンドを使用して、フォークプルブランチのベンチマークを追跡します。 詳細については、thebencher run
CLIサブコマンドをご覧ください。 (例:bencher run
)--project
オプションをプロジェクトのスラグに設定します。 詳細については、the--project
ドキュメントをご覧ください。 (例:--project save-walter-white-1234abcd
)--token
オプションをBENCHER_API_TOKEN
リポジトリ シークレットに設定します。 詳細については、the--token
ドキュメントをご覧ください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
)--branch
オプションを、GitHub Actionspull_request
イベントを使用してフォーマットしたフォークPR番号に設定します。 詳細については、branch selectionをご覧ください。 (例:--branch '${{ env.PR_HEAD }}'
)--branch-start-point
オプションを、GitHub Actionspull_request
イベントを使用してフォークPRベースブランチの起点に設定します。 詳細については、branch selectionをご覧ください。 (例:--branch-start-point '${{ env.PR_BASE }}'
)--branch-start-point-hash
オプションを、GitHub Actionspull_request
イベントを使用してフォークPRベースブランチの起点ハッシュに設定します。 詳細については、branch selectionをご覧ください。 (例:--branch-start-point-hash '${{ env.PR_BASE_SHA }}'
)--testbed
オプションをテストベッド名に設定します。 これは、runs-on
で選択されたマシンと一致すべきです。 詳細については、the--testbed
ドキュメントをご覧ください。 (例:--testbed ubuntu-latest
)--adapter
オプションを、望むベンチマークハーネスアダプターに設定します。 詳細については、benchmark harness adaptersをご覧ください。 (例:--adapter json
)- アラートが生成された場合にコマンドを失敗させるために
--err
フラグを設定します。 詳細については、Threshold & Alertsをご覧ください。 (例:--err
) - the GitHub Actions
GITHUB_TOKEN
環境変数を使用してGitHub API認証トークンを--github-actions
オプションに設定し、プルリクエストに結果をコメントとして投稿します。 詳細については、the--github-actions
ドキュメントをご覧ください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) --ci-number
オプションをプルリクエスト番号に設定します。 詳細については、the--ci-number
ドキュメントをご覧ください。 (例:--ci-number '${{ env.PR_NUMBER }}'
)--file
オプションをベンチマーク結果ファイルのパスに設定します。 詳細については、benchmark commandをご覧ください。 (例:--file "$BENCHMARK_RESULTS"
)
ターゲットブランチからのフォークPRをベンチマークし、必要なレビュワーを設定する
フォークされたプルリクエストのコードが安全であることを保証するために、このGitHubアクションはフォークが別のリポジトリからかどうかをチェックします。 フォークが別のリポジトリからの場合、レビューが必要になるでしょう。
⚠️ フォークPRを承認する前に、非常に重要ですが、すべてを入念にレビューすることが重要です! そうしないと、pwnリクエストの結果になる可能性があります!
それを頭の上にぶら下げたくない場合は、上記の[Benchmark Fork PR and Upload from Default Branch][benchmark fork pr and upload from default branch]を見てください。
このワークフローを設定するためには、二つの[GitHub Actions Environments][github actions environments]を作成する必要があります。
Your Repo -> Settings -> Environments -> New environment
に移動します。
internal
とexternal
の二つの新しい環境を作成します。
internal
環境にはDeployment protection rules
を設定しません。
しかし、external
環境には、ベンチマーク前にフォークPRをレビューするために信頼できるレビュワーをRequired reviewers
として設定します。
完全な概要については、[このブログ投稿][iterative.ai blog]をご覧ください。
この設定は、pull_request_target
がプルリクエストのターゲットブランチのコンテキストで実行されるために機能します。そのため、BENCHER_API_TOKEN
やGITHUB_TOKEN
のような秘密が利用可能です。
したがって、このワークフローは、ターゲット ブランチに存在する場合にのみ実行されます。
GITHUB_TOKEN
やBENCHER_API_TOKEN
のような秘密を環境変数として設定しないでください。
代わりに、秘密をbencher run
に明示的に渡してください。
-
GitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/pr_target_benchmarks.yml
) -
pull_request
イベントで実行されるようにします:opened
- プルリクエストが作成されました。reopened
- 以前に閉じられたプルリクエストが再開されました。edited
- プルリクエストのタイトルや本文が編集されたり、プルリクエストの基本ブランチが変更されました。synchronize
- プルリクエストのヘッドブランチが更新されました。 例えば、ヘッドブランチがベースブランチから更新されたり、ヘッドブランチに新しいコミットがプッシュされました。
[GitHub Actions
on
のドキュメント][github actions on]と [GitHub Actionspull_request
のドキュメント][github action pull_request]を参照して、完全な概要をご覧ください。 (例:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
ワークフローがレビューを必要とするかどうかを確認する最初のGitHub Actionsの
job
を作成します。 (例:jobs: fork_pr_requires_review
) -
プルリクエストが同じリポジトリからの場合にのみ
internal
にenvironment
を設定します。 それ以外の場合は、レビュワーの承認が必要になるexternal
にenvironment
を設定します。 ⚠️ この行を削除しないでください! (例:environment: ${{ (github.event.pull_request.head.repo.full_name == github.repository && 'internal') || 'external' }}
) -
ベンチマークを実行するための2番目のGitHub Actionsの
job
を作成します。 (例:benchmark_fork_pr_branch
) -
benchmark_fork_pr_branch
ジョブが実行されるには、fork_pr_requires_review
ジョブが必要です。 ⚠️ この行を削除しないでください! [GitHub Actionsneeds
のドキュメント][github actions needs]を参照して、完全な概要をご覧ください。 (例:needs: fork_pr_requires_review
) -
ジョブを実行するマシンのタイプを設定します。 [GitHub Actions
runs-on
のドキュメント][github actions runs-on]を参照して、完全な概要をご覧ください。 (例:runs-on: ubuntu-latest
) -
フォークPRのソースコードをチェックアウトします。
pull_request_target
はプルリクエストのターゲットブランチのコンテキストで実行されるため、 プルリクエストブランチをチェックアウトする必要があります。 (例:uses: actions/checkout@v4
)- フォークPRリポジトリを指定します (例:
repository: ${{ github.event.pull_request.head.repo.full_name }}
) - フォークPRのハッシュを指定します (例:
ref: ${{ github.event.pull_request.head.sha }}
) git
認証情報を保持しないでください (例:persist-credentials: false
)
- フォークPRリポジトリを指定します (例:
-
[GitHub Actionを使用して][bencher cli github action] Bencher CLIをインストールします。 (例:
uses: bencherdev/bencher@main
) -
bencher run
CLIのサブコマンドを使って、 フォークプルブランチのベンチマークを実行します。 [thebencher run
CLI subcommand][bencher run]を参照して、完全な概要をご覧ください。 (例:bencher run
) -
--project
オプションをプロジェクトのスラグに設定します。 [the--project
docs][project option]を参照して、詳細をご確認ください。 (例:--project save-walter-white-1234abcd
) -
BENCHER_API_TOKEN
リポジトリ シークレットを--token
オプションに設定します。 [the--token
docs][token option]を参照して、詳細をご確認ください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
[GitHub Actions
pull_request
イベント][github action pull_request]を使用して、 フォークPR番号をフォーマットした--branch
オプションを設定します。 [branch selection][branch selection branch]を参照して、完全な概要をご覧ください。 (例:--branch '${{ github.event.number }}/merge'
) -
[GitHub Actions
github
コンテキスト][github actions context]を使用して、 フォークPR基本ブランチのスタートポイントを--branch-start-point
オプションに設定します。 [branch selection][branch selection start point]を参照して、完全な概要をご覧ください。 (例:--branch-start-point '${{ github.base_ref }}'
) -
[GitHub Actions
pull_request
イベント][github action pull_request]を使用して、 フォークPR基本ブランチのスタートポイントハッシュを--branch-start-point-hash
オプションに設定します。 [branch selection][branch selection start point hash]を参照して、完全な概要をご覧ください。 (例:--branch-start-point-hash '${{ github.event.pull_request.base.sha }}'
) -
--testbed
オプションをテストベッド名に設定します。 これは、runs-on
で選択されたマシンと一致すべきです。 [the--tested
docs][testbed option]を参照して、詳細をご覧ください。 (例:--testbed ubuntu-latest
) -
ベンチマークハーネスアダプターとして望ましいものを
--adapter
オプションに設定します。 [benchmark harness adapters][adapters]を参照して、完全な概要をご覧ください。 (例:--adapter json
) -
アラートが生成された場合にコマンドを失敗させるために
--err
フラグを設定します。 [Threshold & Alerts][alerts]を参照して、完全な概要をご覧ください。 (例:--err
) -
[GitHub Actions
GITHUB_TOKEN
環境変数][github token]を使用して、プルリクエストにコメントとして結果を投稿するためのGitHub API認証トークンを--github-actions
オプションに設定します。 [the--github-actions
docs][github actions option]を参照して、詳細をご覧ください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
ベンチマークコマンド引数を指定します。 [benchmark command][command argument]を参照して、完全な概要をご覧ください。 (例:
bencher mock
)
🐰 おめでとうございます!GitHub ActionsでBencherを使用する方法を学びました!🎉