Как использовать Bencher в GitHub Actions
Depending on your use case, you can set up Continuous Benchmarking in GitHub Actions for your:
Make sure you have created an API token
and set it as a Repository secret named BENCHER_API_TOKEN
before continuing on!
Navigate to Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secret
.
Name the secret BENCHER_API_TOKEN
and set the secret value to your API token.
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_TOKEN
secret will not be available.
${{ secrets.BENCHER_API_TOKEN }}
will be an empty string.
Основная ветка
Краеугольным камнем Статистического непрерывного бенчмаркинга является наличие исторического базового уровня для вашей основной ветки. Этот исторический базовый уровень затем может быть использован для обнаружения ухудшений производительности в Pull Requests.
- Создайте файл
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
) - Установите тип машины, на которой будет выполняться задание.
См. документацию о
runs-on
для GitHub Actions для получения подробной информации. (например,runs-on: ubuntu-latest
) - Получите исходный код вашей основной ветки.
(например,
uses: actions/checkout@v4
) - Установите Bencher CLI, используя GitHub Action.
(например,
uses: bencherdev/bencher@main
) - Используйте подкaманды CLI
bencher run
для запуска бенчмарков вашей веткиmain
. См. подкaманды CLIbencher run
для получения полной информации. (например,bencher run
) - Установите опцию
--project
на шифр проекта. См. документацию о--project
для получения более подробной информации. (например,--project save-walter-white-1234abcd
) - Установите опцию
--token
на секрет RepositorийBENCHER_API_TOKEN
. См. документацию о--token
для получения более подробной информации. (например,--token '${{ secrets.BENCHER_API_TOKEN }}'
) - Установите опцию
--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
)
- Установите опцию
- Установите флаг
--err
, чтобы команда завершалась с ошибкой, если будет сформировано оповещение. См. документацию о--err
для получения полной информации. (например,--err
) - Установите опцию
--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
)
Запросы на вытягивание
Для того чтобы поймать регрессию производительности в запросах на вытягивание, вам нужно будет запускать свои бенчмарки на PR.
Если вы ожидаете PR только от веток в том же репозитории,
то вы можете просто создать другой рабочий процесс для запуска on
событий pull_request
из того же репозитория.
⚠️ Это решение работает только если все PR из того же репозитория! См. [Запросы на вытягивание из форков][pull requests from forks] ниже.
-
Создайте файл
workflow
в GitHub Actions. (пример:.github/workflows/pr_benchmarks.yml
) -
Запускайте на событиях
pull_request
:opened
- Создан запрос на вытягивание.reopened
- Ранее закрытый запрос на вытягивание был снова открыт.edited
- Название или тело запроса на вытягивание изменено, или базовая ветка запроса изменена.synchronize
- Голова ветки запроса на вытягивание обновлена. Например, голова ветки обновлена от базовой ветки или в голову ветки добавлены новые коммиты.
См. [документацию
on
для GitHub Actions][github actions on] и [документациюpull_request
для GitHub Actions][github action pull_request] для полного обзора. (пример:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
Создайте
job
в GitHub Actions. (пример:jobs: benchmark_pr_branch
) -
Запускайте на событиях
pull_request
, если и только если запрос на вытягивание из того же репозитория. ⚠️ НЕ УДАЛЯЙТЕ ЭТУ СТРОКУ! Для обработки Форк PR см. [Запросы на вытягивание из форков][pull requests from forks] ниже. (пример:if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
) -
Установите [разрешения для
GITHUB_TOKEN
][github token permissions] дляwrite
вpull-requests
. В зависимости от ваших настроек GitHub, это может не требоваться. Но для всех организаций и личных репозиториев [созданных после 02 февраля 2023][github token read only], это поведение по умолчанию. См. [документацию GitHub][github token permissions security] для полного обзора. (пример:permissions: pull-requests: write
) -
Установите тип машины, на которой будет выполняться работа. См. [документацию
runs-on
для GitHub Actions][github actions runs-on] для полного обзора. (пример:runs-on: ubuntu-latest
) -
Выполните checkout исходного кода ветки PR. (пример:
uses: actions/checkout@v4
) -
Установите Bencher CLI, используя [действие GitHub Action][bencher cli github action]. (пример:
uses: bencherdev/bencher@main
) -
Используйте подкоманду CLI
bencher run
для запуска ваших бенчмарков ветки запроса на вытягивание. См. [подкоманду CLIbencher run
][bencher run] для полного обзора. (пример:bencher run
) -
Установите опцию
--project
для слага проекта. См. [документацию--project
][project option] для более подробной информации. (пример:--project save-walter-white-1234abcd
) -
Установите опцию
--token
для секрета репозиторияBENCHER_API_TOKEN
. См. [документацию--token
][token option] для более подробной информации. (пример:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
Установите опцию
--branch
для имени ветки PR с использованием [контекстаgithub
в GitHub Actions][github actions context]. См. [документацию--branch
][branch option] для полного обзора. (пример:--branch '${{ github.head_ref }}'
) -
Установите начальную точку для ветки PR:
- Установите опцию
--start-point
для начальной точки ветки PR с использованием [контекстаgithub
в GitHub Actions][github actions context]. См. [документацию--start-point
][start point] для полного обзора. (пример:--start-point '${{ github.base_ref }}'
) - Установите опцию
--start-point-hash
для хешаgit
начальной точки ветки PR с использованием [событияpull_request
в GitHub Actions][github action pull_request]. См. [документацию--start-point-hash
][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-clone-thresholds
) - Установите флаг
--start-point-reset
для постоянного сброса ветки PR к начальной точке. Это предотвратит дрейф данных бенчмарка. См. [документацию--start-point-reset
][start point reset] для полного обзора. (пример:--start-point-reset
)
- Установите опцию
-
Установите опцию
--testbed
для имени тестовой базы. Это должно, вероятно, соответствовать машине, выбранной вruns-on
. См. [документацию--tested
][testbed option] для более подробной информации. (пример:--testbed ubuntu-latest
) -
Установите флаг
--err
для провала команды, если сгенерировано предупреждение. См. [документацию--err
][alert err] для полного обзора. (пример:--err
) -
Установите опцию
--adapter
на [Bencher Metric Format JSON (json
)][bmf], который генерируетсяbencher mock
. См. [адаптеры для тестов производительности][adapter json] для полного обзора. (пример:--adapter json
) -
Установите опцию
--github-actions
на токен аутентификации API GitHub для публикации результатов в виде комментария к запросу на вытягивание, используя [переменную окруженияGITHUB_TOKEN
в GitHub Actions][github token]. См. [документацию--github-actions
][github actions option] для более подробной информации. (пример:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
Укажите аргументы команды для бенчмарка. См. [документацию команды для бенчмарка][command argument] для полного обзора. (пример:
bencher mock
)
Чтобы очистить ветку PR после закрытия запроса на слияние,
вы можете создать отдельный workflow, который будет запускаться по событиям типа closed
для pull_request
.
Этот workflow архивирует ветку PR с помощью команды bencher archive
.
-
Создайте файл
workflow
GitHub Actions. (например,.github/workflows/pr_benchmarks_closed.yml
) -
Запускать события
pull_request
:closed
- Запрос на слияние был закрыт.
Ознакомьтесь с документацией GitHub Actions по
on
и документацией GitHub Actions поpull_request
для полного обзора. (например,on: pull_request: types: [closed]
) -
Создайте
job
GitHub Actions. (например,jobs: archive_pr_branch
) -
Запускать события
pull_request
только если запрос на слияние из того же репозитория. ⚠️ НЕ УДАЛЯЙТЕ ЭТУ СТРОКУ! Для обработки Fork PRs см. Запросы на слияние из форков ниже. (например,if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository
) -
Установите разрешения для
GITHUB_TOKEN
наwrite
дляpull-requests
. В зависимости от настроек GitHub, это может не требоваться. Но для всех организаций и персональных репозиториев, созданных после 02 февраля 2023, это поведение по умолчанию. Ознакомьтесь с документацией GitHub для полного обзора. (например,permissions: pull-requests: write
) -
Установите тип машины, на которой будет выполняться работа. Ознакомьтесь с документацией GitHub Actions по
runs-on
для полного обзора. (например,runs-on: ubuntu-latest
) -
Проверяя исходный код ветки PR. (например,
uses: actions/checkout@v4
) -
Установите Bencher CLI, используя GitHub Action. (например,
uses: bencherdev/bencher@main
) -
Используйте подкоманду
bencher archive
CLI, чтобы архивировать ветку PR. (например,bencher archive
) -
Установите опцию
--project
на слаг проекта. Ознакомьтесь с документами опции--project
для более подробной информации. (например,--project save-walter-white-1234abcd
) -
Установите опцию
--token
на секрет RepositoryBENCHER_API_TOKEN
. Ознакомьтесь с документами опции--token
для более подробной информации. (например,--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
Установите опцию
--branch
на имя ветки PR используя контекстgithub
GitHub Actions. (например,--branch '${{ github.head_ref }}'
)
Запросы на вытягивание из форков
Если вы планируете принимать запросы на вытягивание из форков, как это часто бывает в публичных open source проектах, то вам потребуется немного по-другому с этим справляться. По соображениям безопасности, такие данные, как ваш BENCHER_API_TOKEN
и GITHUB_TOKEN
, недоступны в GitHub Actions для запросов на вытягивание из форков. То есть, если внешний участник открывает PR из форка, приведенный выше пример не будет работать. Смотрите это описание безопасности от лаборатории GitHub и этот пост в блоге для полного обзора о предотвращении атак pwn requests.
Это безопасный и рекомендуемый способ добавления Непрерывного Бенчмаркинга к запросам на вытягивание из форков. Он требует двух отдельных рабочих процессов. Первый рабочий процесс запускается и кэширует результаты бенчмаркинга в контексте pull_request
. Там недоступны такие секреты, как ваш BENCHER_API_TOKEN
и GITHUB_TOKEN
. Затем второй рабочий процесс загружает кешированные результаты бенчмаркинга в контексте workflow_run
и загружает их в Bencher. Это работает, потому что workflow_run
запускается в контексте основной ветки репозитория, где доступны такие секреты, как ваш BENCHER_API_TOKEN
и GITHUB_TOKEN
. Номер запроса на вытягивание, ветка источника и базовая ветка, используемые в первоначальном рабочем процессе pull_request
, также должны быть явно переданы в рабочий процесс workflow_run
, так как они там недоступны. Эти рабочие процессы будут выполняться только если они существуют в основной ветке. Смотрите использование данных от запускающего рабочего процесса для полного обзора.
-
Создайте первый файл
workflow
GitHub 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@v4
) -
Запустите тесты производительности и сохраните результаты в файл. (например:
/bin/echo '{ ... }' > benchmark_results.json
) -
Загрузите файл с результатами тестов производительности как артефакт. (например:
uses: actions/upload-artifact@v4
) -
Загрузите объект события
pull_request
как артефакт. (например:uses: actions/upload-artifact@v4
)
- Создайте первый файл
workflow
для GitHub Actions. (например:.github/workflows/fork_pr_benchmarks_track.yml
) - Назовите этот рабочий процесс вторым рабочим процессом.
(например:
name: Track Benchmarks with Bencher
) - Свяжите два рабочих процесса с использованием
события
workflow_run
. (например:on: workflow_run: ...
) - Создайте
job
для GitHub Actions. (например:jobs: track_fork_pr_branch
) - Выполните этот job только в случае успешного завершения предыдущего рабочего процесса, используя
событие
workflow_run
GitHub Actions. (например:if: github.event.workflow_run.conclusion == 'success'
) - Установите тип машины, на которой будет выполняться job.
См. документацию по
runs-on
GitHub Actions для полного обзора. (например:runs-on: ubuntu-latest
) - Установите результаты тестирования и объектное событие
pull_request
в качестве переменных среды. (например:env: ...
) - Загрузите кэшированные результаты тестирования и события
pull_request
, используя действиеaction-download-artifact
GitHub. (например:uses: dawidd6/action-download-artifact@v6
) - Экспортируйте необходимые данные из события
pull_request
как переменные среды. (например:core.exportVariable(...)
) - Установите Bencher CLI, используя действие GitHub.
(например:
uses: bencherdev/bencher@main
) - Используйте подкоманду CLI
bencher run
для отслеживания тестов вашей ветки-форка pull request. См. подкоманду CLIbencher run
для полного обзора. (например:bencher run
) - Установите параметр
--project
в значение Project slug. См. документацию по--project
для получения более подробной информации. (например:--project save-walter-white-1234abcd
) - Установите опцию
--token
в секрет репозиторияBENCHER_API_TOKEN
. См. документацию по--token
для получения более подробной информации. (например:--token '${{ secrets.BENCHER_API_TOKEN }}'
) - Установите параметр
--branch
в имя ветки форка PR , используя [контекстgithub
GitHub Actions][github actions context]. См. документацию по--branch
для полного обзора. (например:--branch '${{ env.PR_HEAD }}'
) - Установите начальную точку для ветки форка PR:
- Установите параметр
--start-point
в начальную точку ветки форка PR , используя [контекстgithub
GitHub Actions][github actions context]. См. документацию по--start-point
для полного обзора. (например:--start-point '${{ env.PR_BASE }}'
) - Установите параметр
--start-point-hash
в хешgit
начальной точки ветки форка PR , используя событиеpull_request
GitHub Actions. См. документацию по--start-point-hash
для полного обзора. (например:--start-point-hash '${{ env.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
) - Установите флаг
--err
, чтобы команда завершалась с ошибкой, если сработает предупреждение. См. документацию по--err
для полного обзора. (например:--err
) - Установите параметр
--adapter
для Bencher Metric Format JSON (json
), который генерируетсяbencher mock
. См. обзор адаптеров для тестов для полного обзора. (например:--adapter json
) - Установите параметр
--github-actions
в токен аутентификации API GitHub для публикации результатов в виде комментария в Pull Request, используя переменную окруженияGITHUB_TOKEN
GitHub Actions. См. документацию по--github-actions
для получения более подробной информации. (например:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) - Установите параметр
--ci-number
в номер pull request. См. документацию по--ci-number
для получения более подробной информации. (например:--ci-number '${{ env.PR_NUMBER }}'
) - Установите параметр
--file
в путь к файлу с результатами тестирования. См. команду benchmark для полного обзора. (например:--file "$BENCHMARK_RESULTS"
)
Чтобы очистить ветку форка PR после закрытия его PR,
вы можете создать отдельный рабочий процесс, который будет запускаться on
событиях pull_request
с типом closed
.
Этот рабочий процесс заархивирует ветку форка PR с помощью команды bencher archive
.
-
Создайте файл
workflow
для GitHub Actions. (например,.github/workflows/fork_pr_benchmarks_closed.yml
) -
Запускается на событиях
pull_request
:closed
- Запрос на слияние был закрыт.
Ознакомьтесь с документацией по
on
для GitHub Actions и документацией поpull_request
в GitHub Actions для полного обзора. (например,on: pull_request: types: [closed]
) -
Создайте
job
для GitHub Actions. (например,jobs: archive_pr_branch
) -
Установите разрешения для
GITHUB_TOKEN
наwrite
дляpull-requests
. В зависимости от ваших настроек GitHub, это может быть не обязательным. Но для всех организаций и личных репозиториев, созданных после 02 февраля 2023, это стандартное поведение. См. документацию GitHub для полного обзора. (например,permissions: pull-requests: write
) -
Установите тип машины, на которой будет выполняться задание. См. документацию по
runs-on
для GitHub Actions для полного обзора. (например,runs-on: ubuntu-latest
) -
Выполните checkout исходного кода ветки PR. (например,
uses: actions/checkout@v4
) -
Установите Bencher CLI, используя GitHub Action. (например,
uses: bencherdev/bencher@main
) -
Используйте подкоманду CLI
bencher archive
для архивирования ветки PR. (например,bencher archive
) -
Установите параметр
--project
на слаг проекта. См. документацию по--project
для получения дополнительных сведений. (например,--project save-walter-white-1234abcd
) -
Установите параметр
--token
на секрет RepositoryBENCHER_API_TOKEN
. См. документацию по--token
для получения дополнительных сведений. (например,--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
Установите параметр
--branch
на имя ветки PR используя контекстgithub
в GitHub Actions. (например,--branch '${{ github.head_ref }}'
)
🐰 Поздравляем! Вы научились использовать Bencher в GitHub Actions! 🎉