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では、
ワークフローがフォークされたリポジトリからトリガーされた場合、セcretsはランナーに渡されません。
したがって、以下のいずれかのワークフローをプルリクエストでリポジトリに追加する場合は、
同じ リポジトリのブランチを使用する必要があります。
フォークからプルリクエストでBencherを追加しようとすると、
BENCHER_API_TOKEN
secretが利用できません。
${{ secrets.BENCHER_API_TOKEN }}
は空の文字列になります。
基本ブランチ
統計的連続ベンチマーキング の基本は、基本ブランチのための歴史的なベースラインを持つことです。 この歴史的なベースラインを利用して、プルリクエスト中のパフォーマンスの退行を検出できます。
- 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でベンチマークを実行する必要があります。
同じリポジトリ内の同じブランチからのみプルリクエストを受け取ることを期待する場合は、
同じリポジトリからのプルリクエストイベントでon
を実行する別のワークフローを作成するだけで済みます。
⚠️ この解決策は、すべてのプルリクエストが同じリポジトリからの場合にのみ機能します! 下記のフォークからのプルリクエストを参照してください。
-
GitHub Actionsの
workflow
ファイルを作成します。 (例:.github/workflows/pr_benchmarks.yml
) -
pull_request
イベントで実行します:opened
- プルリクエストが作成されました。reopened
- 以前に閉じられたプルリクエストが再開されました。edited
- プルリクエストのタイトルや本文が編集されたり、ベースブランチが変更された場合。synchronize
- プルリクエストのheadブランチが更新されました。 例えば、headブランチがベースブランチから更新されたり、新しいコミットがheadブランチにプッシュされた場合。
完全な概要については、GitHub Actions
on
ドキュメントおよびGitHub Actionspull_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 Actionsの
github
コンテキストを使用して、--branch
オプションをPRブランチ名に設定します。 完全な概要については、ブランチ選択を参照してください。 (例:--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 }}'
) -
--branch-reset
フラグを設定して、常にブランチを開始点にリセットします。 これにより、ベンチマークデータのドリフトが防止されます。 完全な概要については、ブランチ選択を参照してください。 (例:--branch-reset
) -
--testbed
オプションをテストベッド名に設定します。 これは、おそらくruns-on
で選択したマシンと一致するはずです。 詳細については、--tested
ドキュメントを参照してください。 (例:--testbed ubuntu-latest
) -
望ましいベンチマークハーネスアダプターに
--adapter
オプションを設定します。 完全な概要については、ベンチマークハーネスアダプターを参照してください。 (例:--adapter json
) -
アラートが生成された場合にコマンドが失敗するように、
--err
フラグを設定します。 完全な概要については、しきい値とアラートを参照してください。 (例:--err
) -
GitHub Actionsの
GITHUB_TOKEN
環境変数を使用して、結果をプルリクエストのコメントとして投稿するために、--github-actions
オプションをGitHub API認証トークンに設定します。 詳細については、--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 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/track_fork_pr_benchmarks.yml
) - このワークフローを名前付きの2番目のワークフローとします。
(例:
name: Track Benchmarks with Bencher
) - 2つのワークフローを
workflow_run
イベント でチェーンします。 (例: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 サブコマンドを使用して、 フォークプルブランチのベンチマークを追跡します。 完全な概要については、bencher run
CLI サブコマンド を参照してください。 (例:bencher run
)--project
オプションをプロジェクトのスラッグに設定します。 詳細については、--project
ドキュメント を参照してください。 (例:--project save-walter-white-1234abcd
)--token
オプションを リポジトリ のシークレットであるBENCHER_API_TOKEN
に設定します。 詳細については、--token
ドキュメント を参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
)--branch
オプションをGitHub Actionspull_request
イベントを使用してフォークPR番号にフォーマットします。 完全な概要については、ブランチ選択 を参照してください。 (例:--branch '${{ env.PR_HEAD }}'
)--branch-start-point
オプションをGitHub Actionspull_request
イベントを使用してフォーク PR ベース ブランチの開始ポイントに設定します。 完全な概要については、ブランチ選択 を参照してください。 (例:--branch-start-point '${{ env.PR_BASE }}'
)--branch-start-point-hash
オプションをpull_request
イベントを使用してフォークPRベースブランチの開始ポイントハッシュに設定します。 完全な概要については、ブランチ選択 を参照してください。 (例:--branch-start-point-hash '${{ env.PR_BASE_SHA }}'
)--branch-reset
フラグを設定して、ブランチを開始ポイントに常にリセットします。 これにより、ベンチマークデータのドリフトを防ぐことができます。 完全な概要については、ブランチ選択 を参照してください。 (例:--branch-reset
)--testbed
オプションをテストベッドの名前に設定します。 これはおそらくruns-on
で選択されたマシンと一致する必要があります。 詳細については、--tested
ドキュメント を参照してください。 (例:--testbed ubuntu-latest
)--adapter
オプションを希望するベンチマークハーネスアダプターに設定します。 完全な概要については、ベンチマーク ハーネス アダプター を参照してください。 (例:--adapter json
)--err
フラグを設定して、アラートが生成された場合にコマンドを失敗させます。 完全な概要については、しきい値とアラート を参照してください。 (例:--err
)- 結果をプルリクエストのコメントとして投稿するために GitHub API 認証トークンを使用するため、
--github-actions
オプションを設定します。 詳細については、GitHub ActionsGITHUB_TOKEN
環境変数 を参照してください。 詳細については、github actions
ドキュメント を参照してください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) --ci-number
オプションをプルリクエスト番号に設定します。 詳細については、--ci-number
ドキュメント を参照してください。 (例:--ci-number '${{ env.PR_NUMBER }}'
)--file
オプションをベンチマーク結果ファイルのパスに設定します。 完全な概要については、ベンチマーク コマンド を参照してください。 (例:--file "$BENCHMARK_RESULTS"
)
ターゲットブランチからフォークしたPRのベンチマークと必要なレビュアー
フォークプルリクエストのコードが安全であることを保証するために、このGitHub Actionはフォークが他のリポジトリからのものであるかどうかを確認します。他のリポジトリからのフォークであれば、レビューが必要です。
⚠️ 各フォークPRを承認前に完全にレビューすることが非常に重要です! そうしないと、攻撃リクエストになる可能性があります!
これを避けたい場合は、デフォルトブランチからのフォークPRのベンチマークとアップロード を参照してください。
このワークフローを設定するには、2つのGitHub Actions 環境を作成する必要があります。
Your Repo -> Settings -> Environments -> New environment
に移動します。
internal
と external
の2つの新しい環境を作成します。
internal
環境には Deployment protection rules
が設定されていない必要があります。
一方、external
環境にはフォークPRをベンチマーク前にレビューする信頼できるレビュアーがRequired reviewers
として設定されている必要があります。
詳細はこのブログ投稿 を参照してください。
この設定は、pull_request_target
がプルリクエストのターゲットブランチのコンテキストで実行されるため機能します。
そのため、BENCHER_API_TOKEN
や GITHUB_TOKEN
のようなシークレットが利用可能です。
したがって、このワークフローはターゲットブランチに存在する場合のみ実行されます。
シークレットを環境変数として設定することは避け、代わりに明示的に bencher run
にシークレットを渡してください。
-
GitHub Actions の
workflow
ファイルを作成します。 (例:.github/workflows/pr_target_benchmarks.yml
) -
pull_request
イベントで実行します:opened
- プルリクエストが作成された。reopened
- 閉じられていたプルリクエストが再開された。edited
- プルリクエストのタイトルや本文が編集された、またはベースブランチが変更された。synchronize
- プルリクエストのヘッドブランチが更新された。 例えば、ベースブランチからの更新や新しいコミットがヘッドブランチにプッシュされた場合です。
完全な概要については、GitHub Actions
on
ドキュメント および GitHub Actionspull_request
ドキュメント を参照してください。 (例:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
ワークフローがレビューを必要とするかどうかを確認する最初の GitHub Actions
job
を作成します。 (例:jobs: fork_pr_requires_review
) -
プルリクエストが同じリポジトリから来ている場合にのみ
environment
をinternal
に設定します。 それ以外の場合は、environment
をexternal
に設定し、レビュー担当者の承認が必要となります。 ⚠️ この行を削除しないでください! (例: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
ドキュメント を参照してください。 (例:needs: fork_pr_requires_review
) -
ジョブが実行されるマシンのタイプを設定します。 完全な概要については、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 をインストールします。 (例:
uses: bencherdev/bencher@main
) -
bencher run
CLIのサブコマンドを使って、 フォークプルブランチのベンチマークを実行します。 thebencher run
CLI subcommandを参照して、完全な概要をご覧ください。 (例:bencher run
) -
--project
オプションをプロジェクトスラッグに設定します。 詳細は--project
ドキュメント を参照してください。 (例:--project save-walter-white-1234abcd
) -
--token
オプションをリポジトリ シークレットBENCHER_API_TOKEN
に設定します。 詳細は--token
ドキュメント を参照してください。 (例:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
--branch
オプションをフォークPRの番号をフォーマットして設定します GitHub Actionspull_request
イベント を使用します。 完全な概要についてはブランチセレクション を参照してください。 (例:--branch '${{ github.event.number }}/merge'
) -
--branch-start-point
オプションをフォークPRのベースブランチの開始ポイントに設定します GitHub Actionsgithub
コンテキストを使用します。 完全な概要についてはブランチセレクション を参照してください。 (例:--branch-start-point '${{ github.base_ref }}'
) -
--branch-start-point-hash
オプションをフォークPRのベースブランチの開始ポイントハッシュに設定します GitHub Actionspull_request
イベント を使用します。 完全な概要についてはブランチセレクション を参照してください。 (例:--branch-start-point-hash '${{ github.event.pull_request.base.sha }}'
) -
--branch-reset
フラグを設定して常にブランチを開始ポイントにリセットします。 これにより、ベンチマークデータのドリフトを防止できます。 完全な概要についてはブランチセレクション を参照してください。 (例:--branch-reset
) -
--testbed
オプションをテストベッド名に設定します。 これは選択したマシンと一致する必要があります。 詳細は--tested
ドキュメント を参照してください。 (例:--testbed ubuntu-latest
) -
--adapter
オプションを希望するベンチマークハーネスアダプタに設定します。 完全な概要については ベンチマークハーネスアダプタ を参照してください。 (例:--adapter json
) -
--err
フラグを設定して、アラートが生成された場合にコマンドを失敗させるようにします。 完全な概要については しきい値とアラート を参照してください。 (例:--err
) -
--github-actions
オプションを GitHub API 認証トークンに設定して、結果をプルリクエストのコメントとして投稿します。 GitHub ActionsGITHUB_TOKEN
環境変数 を使用します。 完全な概要については--github-actions
ドキュメント を参照してください。 (例:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
ベンチマークコマンドの引数を指定します。 完全な概要については ベンチマークコマンド を参照してください。 (例:
bencher mock
)
🐰 おめでとうございます!GitHub ActionsでBencherを使用する方法を学びました!🎉