Как использовать Bencher в GitHub Actions
Depending on your use case, you can set up Continuous Benchmarking in GitHub Actions for your:
Make sure you have created a project API key
and set it as a Repository secret named BENCHER_API_KEY before continuing on!
Navigate to Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secret.
Name the secret BENCHER_API_KEY and set the secret value to your project API key.
In GitHub Actions,
secrets are not passed to the runner when a workflow is triggered from a forked repository.
Therefore, you will need to use a branch from the same repository
when adding any of the workflows below to your repository with a pull request.
If you try to add Bencher with a pull request from a fork,
then the BENCHER_API_KEY secret will not be available.
${{ secrets.BENCHER_API_KEY }} will be an empty string.
Основная ветка
Краеугольным камнем Статистического непрерывного бенчмаркинга является наличие исторического базового уровня для вашей основной ветки. Этот исторический базовый уровень затем может быть использован для обнаружения ухудшений производительности в Pull Requests.
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- Создайте файл
workflowдля GitHub Actions. (например,.github/workflows/base_benchmarks.yml) - Запустите при событиях
pushв веткуmain. См. документацию GitHub Actionsonи документацию оpushдля GitHub Actions для получения общей информации. (например,on: push: branches: main) - Создайте
jobдля GitHub Actions. (например,jobs: benchmark_base_branch) - Установите разрешения для
GITHUB_TOKENнаwriteдляchecks. (например:permissions: checks: write) - Установите тип машины, на которой будет выполняться задание.
См. документацию о
runs-onдля GitHub Actions для получения подробной информации. (например,runs-on: ubuntu-latest) - Получите исходный код вашей основной ветки.
(например,
uses: actions/checkout@v6) - Установите Bencher CLI, используя GitHub Action.
(например,
uses: bencherdev/bencher@main) - Используйте подкaманды CLI
bencher runдля запуска бенчмарков вашей веткиmain. См. подкaманды CLIbencher runдля получения полной информации. (например,bencher run) - Установите опцию
--projectна шифр проекта. См. документацию о--projectдля получения более подробной информации. (например,--project project-abc4567-wxyz123456789) - Установите опцию
--keyна секрет RepositorийBENCHER_API_KEY. См. документацию о--keyдля получения более подробной информации. (например,--key '${{ secrets.BENCHER_API_KEY }}') - Установите опцию
--branchна имя основной ветки. См. документацию о--branchдля получения полной информации. (например,--branch main) - Установите опцию
--testbedна имя Testbed. Это, вероятно, должно соответствовать машине, выбранной вruns-on. См. документацию о--testedдля получения более подробной информации. (например,--testbed ubuntu-latest) - Установите порог для ветки
main, тестового стендаubuntu-latestи измеренияlatency:- Установите опцию
--threshold-measureна встроенное измерениеlatency, которое создаетсяbencher mock. См. документацию о--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)
- Установите опцию
- Установите флаг
--error-on-alert, чтобы команда завершалась с ошибкой, если будет сформировано оповещение. См. документацию о--error-on-alertдля получения полной информации. (например,--error-on-alert) - Установите опцию
--adapterна формат метрик Bencher в формате JSON (json), который сгенерированbencher mock. См. Адаптеры для бенчмарк-харнесов для получения полной информации. (например,--adapter json) - Установите опцию
--github-actionsна токен аутентификации API GitHub, чтобы отправить результаты в виде комментария GitHub Checks, используя переменную окруженияGITHUB_TOKENдля GitHub Actions. См. документацию о--github-actionsдля получения более подробной информации. (например,--github-actions '${{ secrets.GITHUB_TOKEN }}') - Укажите аргументы для команды бенчмарков.
См. документацию о команде бенчмарков для получения полной информации.
(например,
bencher mock)
Pull Requests
Чтобы отлавливать регрессии производительности в Pull Requests, вам нужно будет запускать свои тесты производительности на PRs.
Если вы ожидаете иметь PR только из веток внутри того же репозитория,
тогда вы можете просто создать другой workflow для запуска on событий pull_request из того же репозитория.
⚠️ Это решение работает только если все PR из того же репозитория! См. Pull Requests из Fork ниже.
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" \ --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-
Создайте файл
workflowGitHub Actions. (пример:.github/workflows/pr_benchmarks.yml) -
Запустите на событиях
pull_request:opened- Pull request был создан.reopened- Ранее закрытый pull request был переоткрыт.edited- Название или тело pull request было отредактировано, или базовая ветка pull request была изменена.synchronize- Ветка head pull request была обновлена. Например, ветка head была обновлена из базовой ветки или новые коммиты были добавлены в ветку head.
См. документацию GitHub Actions
onи документацию GitHub Actionspull_requestдля полного обзора. (пример:on: pull_request: types: [opened, reopened, edited, synchronize]) -
Создайте
jobGitHub Actions. (пример:jobs: benchmark_pr_branch) -
Запустите на событиях
pull_requestтолько в том случае, если pull request из того же репозитория. ⚠️ НЕ УДАЛЯЙТЕ ЭТУ СТРОКУ! Для обработки Fork PRs см. Pull Requests из Fork ниже. (пример:if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) -
Установите разрешения для
GITHUB_TOKENнаwriteдляchecksиpull-requests. В зависимости от настроек GitHub, это может не требоваться. Но для всех организаций и личных репозиториев, созданных после 02 февраля 2023, это поведение является поведением по умолчанию. См. документацию GitHub для полного обзора. (пример:permissions: checks: write pull-requests: write) -
Установите тип машины, на которой будет выполняться job. См. документацию GitHub Actions
runs-onдля полного обзора. (пример:runs-on: ubuntu-latest) -
Проверьте исходный код ветки PR. (пример:
uses: actions/checkout@v6) -
Установите Bencher CLI с использованием GitHub Action. (пример:
uses: bencherdev/bencher@main) -
Используйте
bencher runCLI подкоманду для запуска тестов производительности ветки pull request. См. подкомандуbencher runCLI для полного обзора. (пример:bencher run) -
Установите опцию
--projectна идентификатор проекта. См. документацию--projectдля подробностей. (пример:--project project-abc4567-wxyz123456789) -
Установите опцию
--keyна секрет репозиторияBENCHER_API_KEY. См. документацию--keyдля подробностей. (пример:--key '${{ secrets.BENCHER_API_KEY }}') -
Установите опцию
--branchна имя ветки PR используя переменную окруженияGITHUB_HEAD_REFпо умолчанию GitHub Actions. См. документацию--branchдля полного обзора. (пример:--branch "$GITHUB_HEAD_REF") -
Установите начальную точку для ветки PR:
- Установите опцию
--start-pointна стартовую точку ветки PR используя переменную окруженияGITHUB_BASE_REFпо умолчанию GitHub Actions. См. документацию--start-pointдля полного обзора. (пример:--start-point "$GITHUB_BASE_REF") - Установите опцию
--start-point-hashнаgitхеш стартовой точки ветки PR используя событиеpull_requestGitHub Actions. См. документацию--start-point-hashдля полного обзора. (пример:--start-point-hash '${{ github.event.pull_request.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на имя Testbed. Это, вероятно, должно совпадать с машиной, выбранной вruns-on. См. документацию--testbedдля подробностей. (пример:--testbed ubuntu-latest) -
Установите флаг
--error-on-alert, чтобы команда завершалась неудачей, если генерируется предупреждение. См. документацию--error-on-alertдля полного обзора. (пример:--error-on-alert) -
Установите опцию
--adapterна Bencher Metric Format JSON (json), который генерируетсяbencher mock. См. адаптеры тестовых сред для полного обзора. (пример:--adapter json) -
Установите опцию
--github-actionsна токен аутентификации API GitHub для публикации результатов как проверка GitHub и комментарий к Pull Request с использованием переменной окруженияGITHUB_TOKEN. См. документацию--github-actionsдля подробностей. (пример:--github-actions '${{ secrets.GITHUB_TOKEN }}') -
Укажите аргументы команды теста производительности. См. команду теста производительности для полного обзора. (пример:
bencher mock)
Чтобы очистить PR-ветку после закрытия PR, вы можете создать отдельный workflow, который будет запускаться on событиях типа pull_request с типом closed. Этот workflow архивирует PR-ветку с помощью команды bencher archive.
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"-
Создайте файл
workflowдля GitHub Actions. (например,.github/workflows/pr_benchmarks_closed.yml) -
Запускать на событиях
pull_request:closed- запрос на включение изменений был закрыт.
См. документацию по GitHub Actions
onи документацию по GitHub Actionspull_requestдля полного обзора. (например,on: pull_request: types: [closed]) -
Создайте
jobдля GitHub Actions. (например,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@v6) -
Установите Bencher CLI, используя GitHub Action. (например,
uses: bencherdev/bencher@main) -
Используйте подкоманду CLI
bencher archiveдля архивирования PR-ветки. (например,bencher archive) -
Установите для опции
--projectзначение идентификатора проекта (slug). См. документацию по--projectопции для более подробной информации. (например,--project project-abc4567-wxyz123456789) -
Установите для опции
--keyзначение секрета РепозиторияBENCHER_API_KEY. См. документацию по--keyопции для более подробной информации. (например,--key '${{ secrets.BENCHER_API_KEY }}') -
Установите для опции
--branchзначение имени PR-ветки, используя переменную среды по умолчанию GitHub ActionsGITHUB_HEAD_REF. (например,--branch "$GITHUB_HEAD_REF")
Запросы на вытягивание из форков
Если вы планируете принимать запросы на вытягивание из форков, как это часто бывает в публичных open source проектах, то вам потребуется немного по-другому с этим справляться. По соображениям безопасности, такие данные, как ваш BENCHER_API_KEY и GITHUB_TOKEN, недоступны в GitHub Actions для запросов на вытягивание из форков. То есть, если внешний участник открывает PR из форка, приведенный выше пример не будет работать. Смотрите это описание безопасности от лаборатории GitHub и этот пост в блоге для полного обзора о предотвращении атак pwn requests.
Это безопасный и рекомендуемый способ добавления Непрерывного Бенчмаркинга к запросам на вытягивание из форков. Он требует двух отдельных рабочих процессов. Первый рабочий процесс запускается и кэширует результаты бенчмаркинга в контексте pull_request. Там недоступны такие секреты, как ваш BENCHER_API_KEY и GITHUB_TOKEN. Затем второй рабочий процесс загружает кешированные результаты бенчмаркинга в контексте workflow_run и загружает их в Bencher. Это работает, потому что workflow_run запускается в контексте основной ветки репозитория, где доступны такие секреты, как ваш BENCHER_API_KEY и GITHUB_TOKEN. Номер запроса на вытягивание, ветка источника и базовая ветка, используемые в первоначальном рабочем процессе pull_request, также должны быть явно переданы в рабочий процесс workflow_run, так как они там недоступны. Эти рабочие процессы будут выполняться только если они существуют в основной ветке. Смотрите использование данных от запускающего рабочего процесса для полного обзора.
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 }}-
Создайте первый файл
workflowGitHub Actions. (например:.github/workflows/fork_pr_benchmarks_run.yml) -
Назовите этот workflow так, чтобы его можно было использовать во втором workflow. (например:
name: Run Benchmarks) -
Запускайте на событиях
pull_request:opened- Создан новый pull request.reopened- Повторно открыт ранее закрытый pull request.edited- Изменен заголовок или тело pull request, или изменена базовая ветка pull request.synchronize- Обновлена головная ветка pull request. Например, головная ветка была обновлена из базовой ветки или в головную ветку были отправлены новые коммиты.
См. документацию по
onв GitHub Actions и документацию поpull_requestв GitHub Actions для полного обзора. (например:on: pull_request: types: [opened, reopened, edited, synchronize]) -
Создайте
jobв GitHub Actions. (например:jobs: benchmark_fork_pr_branch) -
Установите тип машины, на которой будет выполняться job. См. документацию по
runs-onв GitHub Actions для полного обзора. (например:runs-on: ubuntu-latest) -
Выполните checkout исходного кода ветки fork PR. (например:
uses: actions/checkout@v6) -
Запустите тесты производительности и сохраните результаты в файл. (например:
/bin/echo '{ ... }' > benchmark_results.json) -
Загрузите файл с результатами тестов производительности как артефакт. (например:
uses: actions/upload-artifact@v4) -
Загрузите объект события
pull_requestкак артефакт. (например:uses: actions/upload-artifact@v4)
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@v6 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"- Создайте первый файл
workflowдля GitHub Actions. (например,.github/workflows/fork_pr_benchmarks_track.yml) - Назовите этот workflow вторым workflow.
(например,
name: Track Benchmarks with Bencher) - Свяжите два workflow с помощью
события
workflow_run. (например,on: workflow_run: ...) - Создайте
jobдля GitHub Actions. (например,jobs: track_fork_pr_branch) - Выполните эту задачу только в случае успешного завершения предыдущего workflow, используя
событие
workflow_runGitHub Actions. (например,if: github.event.workflow_run.conclusion == 'success') - Установите разрешения для
GITHUB_TOKENнаwriteдляchecksиpull-requests. В зависимости от ваших настроек GitHub, это может не требоваться. Однако для всех организаций и персональных репозиториев, созданных после 02 февраля 2023 года, это поведение по умолчанию. Полный обзор см. в документации GitHub. (например,permissions: checks: write pull-requests: write) - Установите тип компьютера, на котором будет выполняться задача.
Полный обзор см. в документации
runs-onдля GitHub Actions. (например,runs-on: ubuntu-latest) - Задайте результаты бенчмарков и файлы объектов события
pull_requestв качестве переменных среды. (например,env: ...) - Скачайте кешированные результаты бенчмарков и событие
pull_requestс помощью GitHub Actionaction-download-artifact. (например,uses: dawidd6/action-download-artifact@v6) - Экспортируйте необходимые данные из события
pull_requestкак промежуточные переменные среды. (например,core.exportVariable(...)) - Установите Bencher CLI с помощью GitHub Action.
(например,
uses: bencherdev/bencher@main) - Используйте подкоманду CLI
bencher runдля отслеживания бенчмарков брэнча в вашем форке. Полный обзор см. в подкомандеbencher runдля CLI. (например,bencher run) - Установите параметр
--projectв значение Project slug. Подробности смотрите в документации--project. (например,--project project-abc4567-wxyz123456789) - Установите параметр
--keyв значение секрета RepositoryBENCHER_API_KEY. Подробности смотрите в документации--key. (например,--key '${{ secrets.BENCHER_API_KEY }}') - Установите параметр
--branchна имя ветки PR форка с использованием промежуточной переменной среды. Полный обзор см. в документации--branch. (например,--branch "$PR_HEAD") - Установите параметр
--hashвgithash ветки PR форка с использованием промежуточной переменной среды. Полный обзор см. в документации--hash. (например,--hash "$PR_HEAD_SHA") - Установите Начальную Точку для ветки PR форка:
- Установите параметр
--start-pointна начальную точку ветки PR форка с использованием промежуточной переменной среды. Полный обзор см. в документации--start-point. (например,--start-point "$PR_BASE") - Установите параметр
--start-point-hashвgithash начальной точки ветки PR форка с использованием промежуточной переменной среды. Полный обзор см. в документации--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на имя Testbed. Это должно совпадать с машиной, выбранной вruns-on. Подробности смотрите в документации--tested. (например,--testbed ubuntu-latest) - Установите флаг
--error-on-alert, чтобы команда завершилась неудачно, если сгенерируется Уведомление. Полный обзор см. в документации--error-on-alert. (например,--error-on-alert) - Установите параметр
--adapterв значение Bencher Metric Format JSON (json), который генерируетсяbencher mock. Полный обзор см. в документации адаптеров. (например,--adapter json) - Установите параметр
--github-actionsна значение токена аутентификации GitHub API для публикации результатов в виде проверки GitHub и комментария к Pull Request, используя переменную средыGITHUB_TOKENGitHub Actions. Подробности смотрите в документации--github-actions. (например,--github-actions '${{ secrets.GITHUB_TOKEN }}') - Установите параметр
--ci-numberна номер pull request, используя промежуточную переменную среды. Подробности смотрите в документации--ci-number. (например,--ci-number "$PR_NUMBER") - Установите параметр
--fileна путь к файлу с результатами бенчмарков. Полный обзор см. в документации о команде бенчмарков. (например,--file "$BENCHMARK_RESULTS")
Чтобы очистить ветку PR форка после закрытия её PR, вы можете создать отдельный рабочий процесс, который будет запускаться на события pull_request_target с типом closed. Этот рабочий процесс заархивирует ветку PR форка с помощью команды bencher archive.
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"-
Создайте файл
workflowдля GitHub Actions. (например,.github/workflows/fork_pr_benchmarks_closed.yml) -
Запускайте на событиях
pull_request_target:closed- Пул-реквест был закрыт.
См. документацию по GitHub Actions
onи документацию по GitHub Actionspull_request_targetдля полного обзора. (например,on: pull_request_target: types: [closed]) -
Создайте задание
jobдля GitHub Actions. (например,jobs: archive_pr_branch) -
Установите тип машины, на которой будет выполнено задание. См. документацию по GitHub Actions
runs-onдля полного обзора. (например,runs-on: ubuntu-latest) -
Выполните проверку исходного кода ветки PR. (например,
uses: actions/checkout@v6) -
Установите Bencher CLI, используя действие GitHub Action. (например,
uses: bencherdev/bencher@main) -
Используйте подкоманду CLI
bencher archiveдля архивирования ветки PR. (например,bencher archive) -
Установите опцию
--projectна идентификатор проекта. Подробнее см. в документации по--project. (например,--project project-abc4567-wxyz123456789) -
Установите опцию
--keyна секрет репозиторияBENCHER_API_KEY. Подробнее см. в документации по--key. (например,--key '${{ secrets.BENCHER_API_KEY }}') -
Установите опцию
--branchна имя ветки PR, используя переменную среды по умолчаниюGITHUB_HEAD_REFдля GitHub Actions. (например,--branch "$GITHUB_HEAD_REF")
Pull Requests на выделенном оборудовании
У GitHub Actions есть Self-Hosted раннеры, но для них нужно использовать их шумный бинарный файл GitHub Actions Runner. Bencher Bare Metal запускает бенчмарки на выделенном парке оборудования bare metal с помощью специально созданного малошумного раннера бенчмарков. Кроме того, Bencher Bare Metal поддерживает PR из форков, а GitHub Actions Runner нет.
После перехода на Bencher Bare Metal вам не захочется, чтобы job GitHub Actions работал все время, пока он ждет Bencher. Для этого Bencher использует разделенный workflow, благодаря которому GitHub Actions может асинхронно ожидать Job в Bencher Bare Metal.
Следующий пример предназначен для веток в том же репозитории. Используйте этот шаблон вместе с workflow Pull Requests из Fork выше, чтобы запускать бенчмарки на выделенном оборудовании для PR из форков.
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" \ --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 }}' \ --ci-callback-token '${{ secrets.BENCHER_CALLBACK_TOKEN }}' \ bencher mock- Создайте первый файл
workflowGitHub Actions. (пример:.github/workflows/pr_bare_metal_benchmarks.yml) - Запустите на событиях
pull_request, как в разделе Pull Requests выше. (пример:on: pull_request: types: [opened, reopened, edited, synchronize]) - Создайте
jobGitHub Actions. (пример:jobs: submit_pr_benchmarks) - Запустите на событиях
pull_requestтолько в том случае, если pull request из того же репозитория. ⚠️ НЕ УДАЛЯЙТЕ ЭТУ СТРОКУ! Для обработки Fork PRs см. Pull Requests из Fork выше. (пример:if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository) - Установите разрешения для
GITHUB_TOKENнаwriteдляchecks. Первый workflow запускает проверку GitHub и не публикует комментарий. (пример:permissions: checks: write) - Установите тип машины, на которой будет выполняться job.
Он только отправляет Job, поэтому достаточно небольшой машины.
(пример:
runs-on: ubuntu-latest) - Получите исходный код ветки PR.
(пример:
uses: actions/checkout@v6) - Установите Bencher CLI с использованием GitHub Action.
(пример:
uses: bencherdev/bencher@main) - Используйте
bencher runCLI подкоманду для отправки бенчмарков ветки pull request. См. подкомандуbencher runCLI для полного обзора. (пример:bencher run) - Установите опцию
--projectна идентификатор проекта. См. документацию--projectдля подробностей. (пример:--project project-abc4567-wxyz123456789) - Установите опцию
--keyна секрет репозиторияBENCHER_API_KEY. См. документацию--keyдля подробностей. (пример:--key '${{ secrets.BENCHER_API_KEY }}') - Установите опцию
--branchна имя ветки PR используя переменную окруженияGITHUB_HEAD_REFпо умолчанию GitHub Actions. См. документацию--branchдля полного обзора. (пример:--branch "$GITHUB_HEAD_REF") - Установите начальную точку для ветки PR, как в разделе Pull Requests выше.
См. документацию
--start-pointдля полного обзора. (пример:--start-point "$GITHUB_BASE_REF") - Установите опцию
--adapterна Bencher Metric Format JSON (json), который генерируетbencher mock. См. адаптеры тестовых харнесов для полного обзора. (пример:--adapter json) - Установите опцию
--imageна ваш образ для выделенного оборудования. См. документацию--imageдля полного обзора. (пример:--image project-abc4567-wxyz123456789:latest) - Установите флаг
--detach, чтобы завершиться сразу после отправки Job. См. документацию--detachдля подробностей. (пример:--detach) - Установите опцию
--github-actionsна токен аутентификации API GitHub, чтобы запустить проверку GitHub, используя переменную окруженияGITHUB_TOKENGitHub Actions. См. документацию--github-actionsдля подробностей. (пример:--github-actions '${{ secrets.GITHUB_TOKEN }}') - Установите опцию
--ci-callback-tokenна секрет репозиторияBENCHER_CALLBACK_TOKEN, чтобы Bencher мог отправить событиеrepository_dispatch, когда Job завершится. См. документацию--ci-callback-tokenдля подробностей. (пример:--ci-callback-token '${{ secrets.BENCHER_CALLBACK_TOKEN }}') - Укажите команду бенчмарка, которая выполняется в образе.
Команда передается точке входа образа, если она есть (см. опцию
--entrypoint). См. команду бенчмарка для полного обзора. (пример:bencher mock)
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 }}'- Создайте второй файл
workflowGitHub Actions в ветке по умолчанию. GitHub запускает workflowrepository_dispatchтолько из ветки по умолчанию, поэтому, пока этого файла там нет, проверка GitHub, которую запускает первый workflow, остается выполняющейся. (пример:.github/workflows/pr_bare_metal_benchmarks_attach.yml) - Запустите на событиях
repository_dispatchтипаbencher_run. См. документацию GitHub Actionsonи документацию GitHub Actionsrepository_dispatchдля полного обзора. (пример:on: repository_dispatch: types: [bencher_run]) - Создайте
jobGitHub Actions. (пример:jobs: attach_pr_benchmarks) - Установите разрешения для
GITHUB_TOKENнаwriteдляchecksиpull-requests. (пример:permissions: checks: write pull-requests: write) - Установите тип машины, на которой будет выполняться job.
Job уже завершен, поэтому этот job только публикует результаты.
(пример:
runs-on: ubuntu-latest) - Установите Bencher CLI с использованием GitHub Action.
Получать исходный код не нужно.
(пример:
uses: bencherdev/bencher@main) - Передайте UUID Job из события через промежуточную переменную окружения,
а не напрямую в
run:, как того требуют рекомендации GitHub по защите от внедрения скриптов. (пример:env: JOB_UUID: ${{ github.event.client_payload.bencher.job }}) - Используйте
bencher runCLI подкоманду для подключения к Job. См. подкомандуbencher runCLI для полного обзора. (пример:bencher run) - Установите опцию
--projectна идентификатор проекта. Если в репозитории несколько Проектов, передайтеgithub.event.client_payload.bencher.projectчерез переменную окружения тем же способом и заключите ее в кавычки (пример:--project "$PROJECT_SLUG"). См. документацию--projectдля подробностей. (пример:--project project-abc4567-wxyz123456789) - Установите опцию
--keyна секрет репозиторияBENCHER_API_KEY. См. документацию--keyдля подробностей. (пример:--key '${{ secrets.BENCHER_API_KEY }}') - Установите опцию
--jobна UUID Job в кавычках. См. документацию--jobдля полного обзора. (пример:--job "$JOB_UUID") - Установите флаг
--error-on-alert, чтобы команда завершалась неудачей при генерации предупреждения. Событие несет только данные, поэтому опции, которые определяют, как публикуются результаты, например--ci-only-on-alertи--ci-public-links, тоже указываются здесь, во втором workflow. См. документацию--error-on-alertдля полного обзора. (пример:--error-on-alert) - Установите опцию
--github-actionsна токен аутентификации API GitHub, чтобы публиковать результаты как проверку GitHub и комментарий к Pull Request, используя переменную окруженияGITHUB_TOKENGitHub Actions. Явно заданные здесь--ci-numberили--ci-idимеют приоритет над событием. См. документацию--github-actionsдля подробностей. (пример:--github-actions '${{ secrets.GITHUB_TOKEN }}')
🐰 Поздравляем! Вы научились использовать Bencher в GitHub Actions! 🎉