Как использовать Bencher в GitHub Actions
В зависимости от вашего случая использования, вы можете настроить Непрерывное бенчмаркинг в GitHub Actions для вашего:
- Основного ветки
- Запросов на вытягивание (Pull Requests)
- Запросов на вытягивание из форков
- ⛑️ Безопаснее: Бенчмаркинг PR из форка и загрузка из основной ветки
- ⚠️ Рискованнее: Бенчмаркинг PR из форка из целевой ветки с обязательными рецензентами
🐰 Убедитесь, что вы создали токен API и установили его как секрет Репозитория под названием
BENCHER_API_TOKEN
перед тем как продолжить! Перейти кВаш Репозиторий -> Настройки -> Секреты и переменные -> Действия -> Новый секрет репозитория
. Назовите секретBENCHER_API_TOKEN
и установите значение секрета вашим токеном API.
Основная ветка
Краеугольным камнем Статистического Непрерывного Бенчмаркинга является наличие исторической базы для вашей основной ветки. Эта историческая база может быть использована для обнаружения регрессий производительности в запросах на слияние (Pull Requests).
- Создайте файл
workflow
для GitHub Actions. (например,.github/workflows/base_benchmarks.yml
) - Запустите на событиях
push
в веткуmain
. Смотрите документациюon
GitHub Actions и документациюpush
GitHub Actions для полного обзора. (например:on: push: branches: main
) - Создайте
job
для GitHub Actions. (например:jobs: benchmark_base_branch
) - Установите тип машины, на которой будет выполняться задание.
Смотрите документацию
runs-on
GitHub Actions для полного обзора. (например:runs-on: ubuntu-latest
) - Выполните checkout исходного кода вашей основной ветки.
(например:
uses: actions/checkout@v4
) - Установите Bencher CLI, используя действие GitHub.
(например:
uses: bencherdev/bencher@main
) - Используйте подкоманду CLI
bencher run
для запуска бенчмарков вашей веткиmain
. Смотрите подкоманду CLIbencher run
для полного обзора. (например:bencher run
) - Установите опцию
--project
в слаг проекта. Смотрите документацию--project
для более подробной информации. (например:--project save-walter-white-1234abcd
) - Установите опцию
--token
в секрет РепозиторияBENCHER_API_TOKEN
. Смотрите документацию--token
для более подробной информации. (например:--token '${{ secrets.BENCHER_API_TOKEN }}'
) - Установите опцию
--branch
в имя ветки. Смотрите выбор ветки для полного обзора. (например:--branch main
) - Установите опцию
--testbed
в имя тестовой среды. Это должно, вероятно, совпадать с машиной, выбранной вruns-on
. Смотрите документацию--testbed
для более подробной информации. (например:--testbed ubuntu-latest
) - Установите опцию
--adapter
в желаемый адаптер инструмента для бенчмаркинга. Смотрите адаптеры инструментов для бенчмаркинга для полного обзора. (например:--adapter json
) - Установите флаг
--err
, чтобы команда завершалась с ошибкой, если сгенерировано предупреждение. Смотрите Пороги и Предупреждения для полного обзора. (например:--err
) - Укажите аргументы команды бенчмарка.
Смотрите команду бенчмарка для полного обзора.
(например:
bencher mock
)
Пулл Реквесты
Чтобы отслеживать регрессию производительности в пулл реквестах, вам нужно будет запускать ваши бенчмарки на PR’ах.
Если вы ожидаете пулл реквесты только из веток того же репозитория,
то вы можете просто создать еще один workflow для запуска на событиях pull_request
из того же репозитория.
⚠️ Это решение работает, только если все PR’ы из того же репозитория! Смотрите Пулл Реквесты из Форков ниже.
-
Создайте файл
workflow
для GitHub Actions. (например:.github/workflows/pr_benchmarks.yml
) -
Запускайте на событиях
pull_request
:opened
- Был создан пулл реквест.reopened
- Ранее закрытый пулл реквест был повторно открыт.edited
- Заголовок или тело пулл реквеста были отредактированы, или базовая ветка пулл реквеста была изменена.synchronize
- Ветка заголовка пулл реквеста была обновлена. Например, ветка заголовка была обновлена из базовой ветки или в ветку заголовка были добавлены новые коммиты.
Смотрите документацию GitHub Actions
on
и документацию GitHub Actionspull_request
для полного описания. (например:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
Создайте
job
для GitHub Actions. (например: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
на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
) -
Используйте подкоманду CLI
bencher run
для запуска бенчмарков вашей ветки pull request. Смотрите подкомандуbencher run
CLI для полного описания. (например:bencher run
) -
Укажите опцию
--project
для Slug проекта. Смотрите документацию--project
для дополнительных деталей. (например:--project save-walter-white-1234abcd
) -
Укажите опцию
--token
для секрета репозиторияBENCHER_API_TOKEN
. Смотрите документацию--token
для дополнительных деталей. (например:--token '${{ secrets.BENCHER_API_TOKEN }}'
) -
Укажите опцию
--branch
для имени ветки PR с использованием контекста GitHub Actionsgithub
. Смотрите выбор ветки для полного описания. (например:--branch '${{ github.head_ref }}'
) -
Укажите опцию
--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 }}'
) -
Укажите опцию
--testbed
для имени тестовой среды. Это должно, вероятно, соответствовать машине, выбранной вruns-on
. Смотрите документацию--testbed
для дополнительных деталей. (например:--testbed ubuntu-latest
) -
Укажите опцию
--adapter
для желаемого адаптера бенчмарк харнесса. Смотрите адаптеры бенчмарк харнесса для полного описания. (например:--adapter json
) -
Укажите флаг
--err
для завершения команды с ошибкой, если сгенерировано предупреждение. Смотрите Пороги & Предупреждения для полного описания. (например:--err
) -
Укажите опцию
--github-actions
для токена аутентификации API GitHub для публикации результатов в виде комментария к пулл реквесту с использованием переменной окружения GitHub ActionsGITHUB_TOKEN
. Смотрите документацию--github-actions
для дополнительных деталей. (например:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
Укажите аргументы команды бенчмарка. Смотрите команду бенчмарка для полного описания. (например:
bencher mock
)
Pull Request’ы из форков
Если вы планируете принимать pull request’ы из форков, как это часто бывает в публичных проектах с открытым исходным кодом, вам потребуется немного иначе подходить к вопросу.
Из соображений безопасности, такие секреты, как ваш BENCHER_API_TOKEN
и GITHUB_TOKEN
, недоступны в GitHub Actions для pull request’ов из форков. То есть, если внешний участник создает pull request из форка, приведенный выше пример не сработает.
Есть два варианта для pull request’ов из форков:
- ⛑️ Безопаснее: Бенчмарк pull request’а из форка и загрузка из основной ветви
- ⚠️ Рискованнее: Бенчмарк pull request’а из форка из целевой ветви с требованием рецензентов
Смотрите этот анализ GitHub Security Lab и этот блог пост для получения полного обзора по предотвращению pwn запросов.
Бенчмарк форкнутых PR и загрузка из базовой ветки
Это безопасный и рекомендуемый способ добавления Непрерывного бенчмаркинга к форкнутым pull request’ам.
Требуется два отдельных потока работы (workflow).
Первый поток работы запускается и кэширует результаты бенчмарка в контексте pull_request
.
Здесь недоступны секреты, такие как ваш BENCHER_API_TOKEN
и GITHUB_TOKEN
.
Затем второй поток работы загружает кэшированные результаты бенчмарка в контексте workflow_run
и загружает их в Bencher.
Это работает, потому что workflow_run
выполняется в контексте базовой ветки репозитория,
где доступны секреты, такие как ваш BENCHER_API_TOKEN
и GITHUB_TOKEN
.
Номер pull request’а, ветка исходной точки и базовая ветка, использованные в исходном потоке работы pull_request
,
также должны быть явно переданы в поток работы workflow_run
, поскольку они там недоступны.
Эти потоки работы будут выполняться только если они существуют в базовой ветке.
Смотрите использование данных из инициирующего потока работы для полного обзора.
-
Создайте первый файл потока работы GitHub Actions. (например:
.github/workflows/run_fork_pr_benchmarks.yml
) -
Назовите этот поток работы, чтобы его можно было ссылать из второго потока. (например:
name: Run and Cache Benchmarks
) -
Запускайте на событиях
pull_request
:opened
- Был создан pull request.reopened
- Ранее закрытый pull request был вновь открыт.edited
- Были отредактированы заголовок или тело pull request’а, или была изменена базовая ветка pull request’а.synchronize
- Была обновлена ветка исходной точки pull request’а. Например, ветка исходной точки была обновлена из базовой ветки или в ветку исходной точки были отправлены новые коммиты.
Смотрите документацию GitHub Actions
on
и документацию GitHub Actionspull_request
для полного обзора. (например:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
Создайте задание (job) GitHub Actions. (например:
jobs: benchmark_fork_pr_branch
) -
Укажите тип машины, на которой будет выполняться задание. Смотрите документацию GitHub Actions
runs-on
для полного обзора. (например:runs-on: ubuntu-latest
) -
Выполните checkout исходного кода ветки PR форка. (например:
uses: actions/checkout@v4
) -
Запустите ваши бенчмарки и сохраните результаты в файл. (например:
/bin/echo '{ ... }' > benchmark_results.json
) -
Загрузите файл результатов бенчмарков как артефакт. (например:
uses: actions/upload-artifact@v4
) -
Загрузите объект события
pull_request
как артефакт. (например:uses: actions/upload-artifact@v4
)
- Создайте второй файл потока работы GitHub Actions.
(например:
.github/workflows/track_fork_pr_benchmarks.yml
) - Назовите этот поток вторым потоком работы.
(например:
name: Track Benchmarks with Bencher
) - Свяжите два потока работы событием
the
workflow_run
event. (например:on: workflow_run: ...
) - Создайте задание (job) GitHub Actions.
(например:
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(...)
) - Установите CLI Bencher, используя GitHub Action.
(например:
uses: bencherdev/bencher@main
) - Используйте подкоманду CLI
bencher run
для отслеживания бенчмарков веток с форком pull request. Смотрите подкоманда CLIbencher run
для полного обзора. (например:bencher run
) - Установите параметр
--project
для идентификатора проекта. Смотрите документацию--project
для дополнительных сведений. (например:--project save-walter-white-1234abcd
) - Установите параметр
--token
для секрета репозиторияBENCHER_API_TOKEN
. Смотрите документацию--token
]token option для дополнительных сведений. (например:--token '${{ secrets.BENCHER_API_TOKEN }}'
) - Установите параметр
--branch
для форматированного номера PR форка, используя событие GitHub Actionspull_request
. Смотрите выбор ветки для полного обзора. (например:--branch '${{ env.PR_HEAD }}'
) - Установите параметр
--branch-start-point
для точки начала базовой ветки форка PR, используя событие GitHub Actionspull_request
. Смотрите выбор ветки для полного обзора. (например:--branch-start-point '${{ env.PR_BASE }}'
) - Установите параметр
--branch-start-point-hash
для хэша точки начала базовой ветки форка PR, используя событие GitHub Actionspull_request
. Смотрите выбор ветки для полного обзора. (например:--branch-start-point-hash '${{ env.PR_BASE_SHA }}'
) - Установите параметр
--testbed
для названия тестовой среды. Это, вероятно, должно совпадать с машиной, выбранной вruns-on
. Смотрите документацию--testbed
для дополнительных сведений. (например:--testbed ubuntu-latest
) - Установите параметр
--adapter
для желаемого адаптера бенчмаркинга. Смотрите адаптеры бенчмаркинга для полного обзора. (например:--adapter json
) - Установите флаг
--err
, чтобы команда завершилась с ошибкой, если сгенерировано предупреждение. Смотрите Пороги и предупреждения для полного обзора. (например:--err
) - Установите параметр
--github-actions
для аутентификационного токена API GitHub для публикации результатов в качестве комментария к Pull Request, используя переменную окружения GitHub ActionsGITHUB_TOKEN
. Смотрите документацию--github-actions
для дополнительных сведений. (например:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) - Установите параметр
--ci-number
для номера pull request’а. Смотрите документацию--ci-id
для дополнительных сведений. (например:--ci-number '${{ env.PR_NUMBER }}'
) - Установите параметр
--file
для пути к файлу с результатами бенчмарков. Смотрите команду benchmark для полного обзора. (например:--file "$BENCHMARK_RESULTS"
)
Сравнение PR из вилки с целевой веткой с обязательными проверяющими
Для гарантии безопасности кода из pull request вилки, это действие GitHub проверяет, что вилка из другого репозитория. Если вилка из другого репозитория, тогда ее необходимо проверить.
⚠️ Это очень, очень важно тщательно проверять каждый PR из вилки перед его одобрением! В противном случае можно получить pwn запрос!
Если вы предпочитаете, чтобы это не висело над вами, смотрите [Сравнение PR из вилки и загрузку с ветки по умолчанию][benchmark fork pr and upload from default branch] выше.
Для настройки этого рабочего процесса вам нужно создать два [Среды действий GitHub][github actions environments].
Перейдите к Ваш репозиторий -> Настройки -> Среды -> Создать среду
.
Создайте две новые среды, internal
и external
.
Среда internal
не должна иметь Правил защиты развертывания
.
Однако, среда external
должна иметь установленных Обязательных проверяющих
для проверки PR из вилок перед сравнением.
Смотрите [этот блог][iterative.ai blog] для полного обзора.
Эта настройка работает потому что pull_request_target
выполняется в контексте целевой ветки pull request,
где такие секреты, как BENCHER_API_TOKEN
и GITHUB_TOKEN
доступны.
Таким образом, этот рабочий процесс будет выполняться только если он существует в целевой ветке.
Избегайте установки любых секретов как переменные среды, такие как GITHUB_TOKEN
и BENCHER_API_TOKEN
.
Вместо этого явно передавайте ваши секреты в bencher run
.
-
Создайте файл
workflow
действий GitHub. (например:.github/workflows/pr_target_benchmarks.yml
) -
Запускать на событиях
pull_request
:opened
- Был создан pull request.reopened
- Ранее закрытый pull request был снова открыт.edited
- Заголовок или тело pull request были изменены, или базовая ветка pull request была изменена.synchronize
- Ветка головы pull request была обновлена. Например, ветка головы была обновлена от базовой ветки или в ветку головы были запушены новые коммиты.
Смотрите [документацию
on
действий GitHub][github actions on] и [документацию действий GitHubpull_request
][github action pull_request] для полного обзора. (например:on: pull_request: types: [opened, reopened, edited, synchronize]
) -
Создайте первую задачу действий GitHub для проверки необходимости рассмотрения рабочего процесса. (например:
jobs: fork_pr_requires_review
) -
Установите
environment
вinternal
если и только если pull request из того же репозитория. В противном случае установитеenvironment
вexternal
, что потребует одобрения от проверяющего для продолжения. ⚠️ НЕ УДАЛЯЙТЕ ЭТУ СТРОКУ! (например:environment: ${{ (github.event.pull_request.head.repo.full_name == github.repository && 'internal') || 'external' }}
) -
Создайте вторую задачу действий GitHub для запуска ваших сравнений. (например:
benchmark_fork_pr_branch
) -
Укажите, что задача
benchmark_fork_pr_branch
требует выполнения задачиfork_pr_requires_review
для запуска. ⚠️ НЕ УДАЛЯЙТЕ ЭТУ СТРОКУ! Смотрите [документациюneeds
действий GitHub][github actions needs] для полного обзора. (например:needs: fork_pr_requires_review
) -
Укажите тип машины, на которой будет выполняться задача. Смотрите [документацию
runs-on
действий GitHub][github actions runs-on] для полного обзора. (например:runs-on: ubuntu-latest
) -
Проверьте исходный код PR из вилки. Так как
pull_request_target
выполняется в контексте целевой ветки pull request, вам все еще нужно проверить ветку pull request. (например: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 из вилки (например:
-
Установите CLI Bencher с использованием [действия GitHub][bencher cli github action]. (например:
uses: bencherdev/bencher@main
) -
Используйте подкоманду CLI
bencher run
для выполнения сравнений вашей ветки pull request из вилки. Смотрите [подкомандуbencher run
CLI][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 из вилки с использованием [события действий GitHubpull_request
][github action pull_request]. Смотрите [выбор ветки][branch selection branch] для полного обзора. (например:--branch '${{ github.event.number }}/merge'
) -
Установите параметр
--branch-start-point
на начальную точку базовой ветки PR из вилки с использованием [контекстаgithub
действий GitHub][github actions context]. Смотрите [выбор ветки][branch selection start point] для полного обзора. (например:--branch-start-point '${{ github.base_ref }}'
) -
Установите параметр
--branch-start-point-hash
на хэш начальной точки базовой ветки PR из вилки с использованием [события действий GitHubpull_request
][github action pull_request]. Смотрите [выбор ветки][branch selection start point hash] для полного обзора. (например:--branch-start-point-hash '${{ github.event.pull_request.base.sha }}'
) -
Установите параметр
--testbed
на имя тестовой среды. Это, скорее всего, должно соответствовать машине, выбранной вruns-on
. Смотрите [документацию--tested
][testbed option] для дополнительных деталей. (например:--testbed ubuntu-latest
) -
Установите параметр
--adapter
на желаемый адаптер среды тестирования. Смотрите [адаптеры среды тестирования][adapters] для полного обзора. (например:--adapter json
) -
Установите флаг
--err
, чтобы команда завершилась с ошибкой, если генерируется предупреждение. Смотрите [Пороги & Предупреждения][alerts] для полного обзора. (например:--err
) -
Установите параметр
--github-actions
на токен аутентификации API GitHub для публикации результатов в виде комментария к Pull Request с использованием [переменной средыGITHUB_TOKEN
действий GitHub][github token]. Смотрите [документацию--github-actions
][github actions option] для дополнительных деталей. (например:--github-actions '${{ secrets.GITHUB_TOKEN }}'
) -
Укажите аргументы команды сравнения. Смотрите [команду сравнения][command argument] для полного обзора. (например:
bencher mock
)
🐰 Поздравляем! Вы научились использовать Bencher в GitHub Actions! 🎉