GitHub Actions에서 Bencher 사용하기


당신의 사용 사례에 따라, GitHub Actions에서 지속적 벤치마킹을 설정할 수 있습니다:

진행하기 전에 프로젝트 API 키를 생성하고, 이를 BENCHER_API_KEY이라는 저장소 비밀로 설정했는지 확인하세요! Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secret로 이동합니다. 비밀 이름을 BENCHER_API_KEY으로 지정하고 비밀값을 프로젝트 API 키로 설정하세요.

GitHub Actions에서, 비밀은 포크된 리포지토리에서 워크플로우가 트리거될 때 실행자에게 전달되지 않습니다. 따라서 아래의 워크플로 중 하나를 저장소에 풀 리퀘스트로 추가할 때는 같은 저장소의 브랜치를 사용해야 합니다. 포크로부터 풀 리퀘스트로 Bencher를 추가하면, BENCHER_API_KEY 비밀은 사용 가능하지 않습니다. ${{ secrets.BENCHER_API_KEY }}는 빈 문자열이 될 것입니다.

기본 브랜치

통계적 지속 벤치마킹의 초석은 기본 브랜치에 대한 역사적 기준선을 보유하는 것입니다. 이 역사적 기준선은 풀 리퀘스트에서 성능 저하를 감지하는 데 사용될 수 있습니다.

.github/workflows/base_benchmarks.yml
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
  1. GitHub Actions workflow 파일을 생성하세요. (예: .github/workflows/base_benchmarks.yml)
  2. main 브랜치에 대한 push 이벤트에서 실행하세요. 전체 개요는 GitHub Actions on 문서 및 GitHub Actions push 문서를 참조하세요. (예: on: push: branches: main)
  3. GitHub Actions job을 생성하세요. (예: jobs: benchmark_base_branch)
  4. GITHUB_TOKEN의 권한을 설정하십시오 checks에 대해 write로 설정합니다. (예: permissions: checks: write)
  5. 작업이 실행될 머신의 유형을 설정하세요. 전체 개요는 GitHub Actions runs-on 문서를 참조하세요. (예: runs-on: ubuntu-latest)
  6. 기본 브랜치 소스 코드를 체크아웃하세요. (예: uses: actions/checkout@v6)
  7. GitHub Action을 사용하여 Bencher CLI를 설치하세요. (예: uses: bencherdev/bencher@main)
  8. bencher run CLI 서브 커맨드를 사용하여 main 브랜치 벤치마크를 실행하세요. 전체 개요는 bencher run CLI 서브 커맨드를 참조하세요. (예: bencher run)
  9. --project 옵션을 프로젝트 슬러그로 설정하세요. 자세한 내용은 --project 문서를 참조하세요. (예: --project project-abc4567-wxyz123456789)
  10. --key 옵션을 BENCHER_API_KEY 레포지토리 비밀로 설정하세요. 자세한 내용은 --key 문서를 참조하세요. (예: --key '${{ secrets.BENCHER_API_KEY }}')
  11. --branch 옵션을 기본 브랜치 이름으로 설정하세요. 전체 개요는 --branch 문서를 참조하세요. (예: --branch main)
  12. --testbed 옵션을 테스트베드 이름으로 설정하세요. 이는 아마도 runs-on에 선택된 머신과 일치해야 합니다. 자세한 내용은 --tested 문서를 참조하세요. (예: --testbed ubuntu-latest)
  13. main 브랜치, ubuntu-latest 테스트베드, latency 측정을 위한 임계값을 설정하세요:
    1. --threshold-measure 옵션을 bencher mock에 의해 생성된 기본 latency 측정값으로 설정하세요. 자세한 내용은 --threshold-measure 문서를 참조하세요. (예: --threshold-measure latency)
    2. --threshold-test 옵션을 Student의 t-test (t_test)로 설정하세요. 전체 개요는 --threshold-test 문서를 참조하세요. (예: --threshold-test t_test)
    3. --threshold-max-sample-size 옵션을 최대 샘플 크기 64로 설정하세요. 자세한 내용은 --threshold-max-sample-size 문서를 참조하세요. (예: --threshold-max-sample-size 64)
    4. --threshold-upper-boundary 옵션을 0.99의 상한으로 설정하세요. 자세한 내용은 --threshold-upper-boundary 문서를 참조하세요. (예: --threshold-upper-boundary 0.99)
    5. --thresholds-reset 플래그를 설정하여 지정된 임계값만 활성 상태가 되도록 하세요. 전체 개요는 --thresholds-reset 문서를 참조하세요. (예: --thresholds-reset)
  14. 알림이 생성되면 명령을 실패하도록 --error-on-alert 플래그를 설정하세요. 전체 개요는 --error-on-alert 문서를 참조하세요. (예: --error-on-alert)
  15. Bencher Metric Format JSON (json)에 대해 --adapter 옵션을 설정하세요. 이 형식은 bencher mock에 의해 생성됩니다. 전체 개요는 벤치마크 하니스 어댑터를 참조하세요. (예: --adapter json)
  16. GitHub Checks 댓글로 결과를 게시하기 위해 GitHub Actions GITHUB_TOKEN 환경 변수를 사용하여 GitHub API 인증 토큰을 --github-actions 옵션에 설정하세요. 자세한 내용은 --github-actions 문서를 참조하세요. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  17. 벤치마크 명령 인수를 지정하세요. 전체 개요는 벤치마크 명령를 참조하세요. (예: bencher mock)

Pull Requests

성능 성능 회귀를 감지하려면 PR에서 벤치마크를 실행해야 합니다. 만약 PR들이 동일한 저장소에서만 있다고 가정한다면, 단순히 같은 저장소에서 pull_request 이벤트를 트리거하도록 하는 또 다른 워크플로우를 생성할 수 있습니다.

⚠️ 이 솔루션은 모든 PR이 동일한 저장소에서 온 경우에만 작동합니다! 아래의 포크에서의 Pull Requests를 참조하십시오.

.github/workflows/pr_benchmarks.yml
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
  1. GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/pr_benchmarks.yml)

  2. pull_request 이벤트에서 실행합니다:

    • opened - Pull request가 생성되었습니다.
    • reopened - 이전에 닫혔던 pull request가 다시 열렸습니다.
    • edited - pull request의 제목이나 본문이 편집되었거나 pull request의 기본 브랜치가 변경되었습니다.
    • synchronize - pull request의 헤드 브랜치가 업데이트되었습니다. 예를 들어, 헤드 브랜치가 기본 브랜치에서 업데이트되었거나 새로운 커밋이 헤드 브랜치로 푸쉬되었습니다.

    전체 개요는 GitHub Actions on 문서 및 GitHub Actions pull_request 문서를 참조하세요. (예: on: pull_request: types: [opened, reopened, edited, synchronize])

  3. GitHub Actions job을 생성합니다. (예: jobs: benchmark_pr_branch)

  4. pull request가 동일한 저장소에서 온 경우에만 pull_request 이벤트에서 실행합니다. ⚠️ 이 라인을 제거하지 마십시오! 포크 PR 처리에 관해서는 아래의 포크에서의 Pull Requests를 참조하세요. (예: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)

  5. GITHUB_TOKEN의 권한을 설정하여 checks 및 pull-requests에 write를 부여합니다. GitHub 설정에 따라 이 작업이 필요하지 않을 수 있습니다. 그러나 2023년 2월 2일 이후에 생성된 모든 조직 및 개인 저장소의 경우 기본 동작입니다. 전체 개요는 GitHub 문서를 참조하세요. (예: permissions: checks: write pull-requests: write)

  6. 작업을 실행할 머신의 유형을 설정합니다. 전체 개요는 GitHub Actions runs-on 문서를 참조하세요. (예: runs-on: ubuntu-latest)

  7. PR 브랜치의 소스 코드를 체크아웃합니다. (예: uses: actions/checkout@v6)

  8. GitHub Action을 사용하여 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)

  9. PR 브랜치 벤치마크를 실행하기 위해 bencher run CLI 서브커맨드를 사용합니다. 전체 개요는 bencher run CLI 서브커맨드를 참조하세요. (예: bencher run)

  10. --project 옵션을 프로젝트 슬러그로 설정합니다. 더 많은 세부 사항은 --project 문서를 참조하세요. (예: --project project-abc4567-wxyz123456789)

  11. --key 옵션을 BENCHER_API_KEY 레포지토리 시크릿으로 설정합니다. 더 많은 세부 사항은 --key 문서를 참조하세요. (예: --key '${{ secrets.BENCHER_API_KEY }}')

  12. GitHub Actions GITHUB_HEAD_REF 기본 환경 변수를 사용하여 PR 브랜치 이름을 --branch 옵션으로 설정합니다. 전체 개요는 --branch 문서를 참조하세요. (예: --branch "$GITHUB_HEAD_REF")

  13. PR 브랜치의 시작점을 설정합니다:

    1. GitHub Actions GITHUB_BASE_REF 기본 환경 변수을 사용하여 PR 브랜치 시작점으로 --start-point 옵션을 설정합니다. 전체 개요는 --start-point 문서를 참조하세요. (예: --start-point "$GITHUB_BASE_REF")
    2. PR 브랜치 시작점 git 해시값을 사용하여 --start-point-hash 옵션을 설정합니다. GitHub Actions pull_request 이벤트를 사용하여. 전체 개요는 --start-point-hash 문서를 참조하세요. (예: --start-point-hash '${{ github.event.pull_request.base.sha }}')
    3. 시작점에서 임계값을 복제하도록 --start-point-clone-thresholds 플래그를 설정합니다. 전체 개요는 --start-point-clone-thresholds 문서를 참조하세요. (예: --start-point-clone-thresholds)
    4. 항상 PR 브랜치를 시작점으로 재설정하도록 --start-point-reset 플래그를 설정합니다. 이는 벤치마크 데이터 드리프트를 방지합니다. 전체 개요는 --start-point-reset 문서를 참조하세요. (예: --start-point-reset)
  14. --testbed 옵션을 테스트베드 이름으로 설정합니다. 이는 runs-on에서 선택한 머신과 일치해야 합니다. 더 많은 세부 사항은 --testbed 문서를 참조하세요. (예: --testbed ubuntu-latest)

  15. 알림이 생성되면 명령어를 실패시키도록 --error-on-alert 플래그를 설정합니다. 전체 개요는 --error-on-alert 문서를 참조하세요. (예: --error-on-alert)

  16. bencher mock에 의해 생성된 Bencher Metric Format JSON (json)에 --adapter 옵션을 설정합니다. 전체 개요는 벤치마크 하네스 어댑터를 참조하세요. (예: --adapter json)

  17. GitHub Actions GITHUB_TOKEN 환경 변수을 사용하여 결과를 GitHub Check 및 Pull Request 댓글로 게시하는 GitHub API 인증 토큰에 --github-actions 옵션을 설정합니다. 더 많은 세부 사항은 --github-actions 문서를 참조하세요. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')

  18. 벤치마크 명령어 인수를 지정합니다. 전체 개요는 벤치마크 명령어를 참조하세요. (예: bencher mock)

PR이 닫힌 후 PR 브랜치를 정리하려면 closed 타입의 pull_request 이벤트에서 실행할 별도의 워크플로를 생성할 수 있습니다. 이 워크플로는 bencher archive 명령을 사용하여 PR 브랜치를 아카이브합니다.

.github/workflows/pr_benchmarks_closed.yml
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"
  1. GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/pr_benchmarks_closed.yml)

  2. pull_request 이벤트에서 실행하십시오:

    • closed - 풀 리퀘스트가 닫혔습니다.

    전체 개요는 GitHub Actions on 문서 및 GitHub Actions pull_request 문서를 참조하십시오. (예: on: pull_request: types: [closed])

  3. GitHub Actions job을 생성하십시오. (예: jobs: archive_pr_branch)

  4. 풀 리퀘스트가 동일한 저장소에서 온 경우에만 pull_request 이벤트에서 실행하십시오. ⚠️ 이 줄을 제거하지 마십시오! 포크 PR 처리에 대해서는 아래 포크로부터 풀 리퀘스트를 참조하십시오. (예: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)

  5. 잡을 실행할 머신의 유형을 설정하십시오. 전체 개요는 GitHub Actions runs-on 문서를 참조하십시오. (예: runs-on: ubuntu-latest)

  6. PR 브랜치 소스 코드를 체크아웃합니다. (예: uses: actions/checkout@v6)

  7. GitHub Action을 사용하여 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)

  8. PR 브랜치를 아카이브하기 위해 bencher archive CLI 서브커맨드를 사용하십시오. (예: bencher archive)

  9. 프로젝트 슬러그로 --project 옵션을 설정하십시오. 자세한 내용은 --project 문서를 참조하십시오. (예: --project project-abc4567-wxyz123456789)

  10. --key 옵션을 BENCHER_API_KEY 저장소 시크릿으로 설정하십시오. 자세한 내용은 --key 문서를 참조하십시오. (예: --key '${{ secrets.BENCHER_API_KEY }}')

  11. GitHub Actions GITHUB_HEAD_REF 기본 환경 변수를 사용하여 PR 브랜치 이름으로 --branch 옵션을 설정하십시오. (예: --branch "$GITHUB_HEAD_REF")


포크로부터의 풀 리퀘스트

공개 오픈 소스 프로젝트에서 일반적으로 발생하는 것처럼 포크로부터의 풀 리퀘스트를 수락할 계획이라면 조금 다르게 처리해야 합니다. 보안상의 이유로, 포크 PR에서는 BENCHER_API_KEY과 GITHUB_TOKEN과 같은 비밀이 GitHub Actions에서 사용할 수 없습니다. 즉, 외부 기여자가 포크로부터 PR을 열면 위의 예제는 작동하지 않습니다. 전체 개요를 보려면 GitHub Security Lab 글 작성 및 블로그 게시물 을 참조하십시오.

포크 풀 리퀘스트에 지속적인 벤치마킹을 추가하는 안전하고 권장되는 방법입니다. 두 개의 별도 워크플로우가 필요합니다. 첫 번째 워크플로우는 pull_request 컨텍스트에서 벤치마크 결과를 실행하고 캐시합니다. 여기에는 BENCHER_API_KEY과 GITHUB_TOKEN 같은 비밀은 사용할 수 없습니다. 그런 다음 두 번째 워크플로우는 workflow_run 컨텍스트에서 캐시된 벤치마크 결과를 다운로드하여 Bencher에 업로드합니다. 이 방법은 workflow_run이 저장소의 기본 브랜치 컨텍스트에서 실행되기 때문에 BENCHER_API_KEY과 GITHUB_TOKEN 같은 비밀이 사용 가능하기 때문입니다. 초기의 pull_request 워크플로우에서 사용된 풀 리퀘스트 번호, 헤드 브랜치, 그리고 베이스 브랜치도 명시적으로 workflow_run 워크플로우에 전달되어야 합니다. 이 워크플로우는 기본 브랜치에 있을 때만 실행됩니다. 전체 개요는 트리거링 워크플로우에서 데이터 사용하기를 참조하십시오.

.github/workflows/fork_pr_benchmarks_run.yml
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 }}
  1. 첫 번째 GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/fork_pr_benchmarks_run.yml)

  2. 두 번째 워크플로에서 참조할 수 있도록 이 워크플로의 이름을 지정합니다. (예: name: Run Benchmarks)

  3. pull_request 이벤트에 대해 실행합니다:

    • opened - 풀 리퀘스트가 생성되었습니다.
    • reopened - 이전에 닫힌 풀 리퀘스트가 다시 열렸습니다.
    • edited - 풀 리퀘스트의 제목 또는 본문이 편집되었거나, 풀 리퀘스트의 기본 분기가 변경되었습니다.
    • synchronize - 풀 리퀘스트의 헤드 분기가 업데이트되었습니다. 예를 들어, 기본 분기로부터 헤드 분기가 업데이트되거나 새로운 커밋이 헤드 분기로 푸시되었습니다.

    전체 개요는 GitHub Actions on 문서 및 GitHub Actions pull_request 문서를 참조하세요. (예: on: pull_request: types: [opened, reopened, edited, synchronize])

  4. GitHub Actions job을 생성합니다. (예: jobs: benchmark_fork_pr_branch)

  5. 잡을 실행할 머신의 유형을 설정합니다. 전체 개요는 GitHub Actions runs-on 문서 를 참조하세요. (예: runs-on: ubuntu-latest)

  6. 포크 PR 브랜치의 소스 코드를 체크아웃합니다. (예: uses: actions/checkout@v6)

  7. 벤치마크를 실행하고 결과를 파일에 저장합니다. (예: /bin/echo '{ ... }' > benchmark_results.json)

  8. 벤치마크 결과 파일을 아티팩트로 업로드합니다. (예: uses: actions/upload-artifact@v4)

  9. pull_request 이벤트 객체를 아티팩트로 업로드합니다. (예: uses: actions/upload-artifact@v4)

.github/workflows/fork_pr_benchmarks_track.yml
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"
  1. 첫 번째 GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/fork_pr_benchmarks_track.yml)
  2. 이 워크플로우의 이름을 두 번째 워크플로우로 지정합니다. (예: name: Track Benchmarks with Bencher)
  3. 두 워크플로우를 workflow_run 이벤트와 연결합니다. (예: on: workflow_run: ...)
  4. GitHub Actions job을 만듭니다. (예: jobs: track_fork_pr_branch)
  5. 이전 워크플로우의 결론이 성공일 경우에만 이 작업을 실행합니다 GitHub Actions workflow_run 이벤트. (예: if: github.event.workflow_run.conclusion == 'success')
  6. GITHUB_TOKEN에 대한 권한을 checks 및 pull-requests에 대해 write로 설정합니다. GitHub 설정에 따라, 이 작업이 필요하지 않을 수 있습니다. 하지만 2023년 2월 2일 이후에 생성된 모든 조직과 개인 저장소에서는 이 동작이 기본입니다. 전체 개요는 GitHub 문서를 참조하세요. (예: permissions: checks: write pull-requests: write)
  7. 작업이 실행될 머신 유형을 설정합니다. 전체 개요는 GitHub Actions runs-on documentation을 참조하세요. (예: runs-on: ubuntu-latest)
  8. 벤치마크 결과와 pull_request 이벤트 객체 파일 이름을 환경 변수로 설정합니다. (예: env: ...)
  9. 캐시된 벤치마크 결과와 pull_request 이벤트를 다운로드합니다 GitHub Action action-download-artifact를 사용하여. (예: uses: dawidd6/action-download-artifact@v6)
  10. pull_request 이벤트에서 필요한 데이터를 중간 환경 변수로 내보냅니다. (예: core.exportVariable(...))
  11. GitHub Action을 사용하여 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)
  12. bencher run CLI 하위 명령을 사용하여 포크 풀 브랜치의 벤치마크를 추적합니다. bencher run CLI 하위 명령의 전체 개요를 참조하세요. (예: bencher run)
  13. --project 옵션을 프로젝트 슬러그로 설정합니다. 더 자세한 내용은 --project 문서를 참조하세요. (예: --project project-abc4567-wxyz123456789)
  14. --key 옵션을 BENCHER_API_KEY Repository 시크릿으로 설정합니다. 더 자세한 내용은 --key 문서를 참조하세요. (예: --key '${{ secrets.BENCHER_API_KEY }}')
  15. --branch 옵션을 포크 PR 브랜치 이름으로 설정합니다 중간 환경 변수를 사용하여. 전체 개요는 --branch 문서를 참조하세요. (예: --branch "$PR_HEAD")
  16. --hash 옵션을 포크 PR 브랜치의 git 해시로 설정합니다 중간 환경 변수를 사용하여. 전체 개요는 --hash 문서를 참조하세요. (예: --hash "$PR_HEAD_SHA")
  17. 포크 PR 브랜치의 시작점을 설정합니다:
    1. --start-point 옵션을 포크 PR 브랜치 시작점으로 설정합니다 중간 환경 변수를 사용하여. 전체 개요는 --start-point 문서를 참조하세요. (예: --start-point "$PR_BASE")
    2. --start-point-hash 옵션을 포크 PR 브랜치 시작점의 git 해시로 설정합니다 중간 환경 변수를 사용하여. 전체 개요는 --start-point-hash 문서를 참조하세요. (예: --start-point-hash "$PR_BASE_SHA")
    3. --start-point-clone-thresholds 플래그를 설정하여 시작점에서 임계값을 복제합니다. 전체 개요는 --start-point-clone-thresholds 문서를 참조하세요. (예: --start-point-clone-thresholds)
    4. 포크 PR 브랜치를 항상 시작점으로 재설정하기 위해 --start-point-reset 플래그를 설정합니다. 이는 벤치마크 데이터 드리프트를 방지합니다. 전체 개요는 --start-point-reset 문서를 참조하세요. (예: --start-point-reset)
  18. --testbed 옵션을 테스트베드 이름으로 설정합니다. 이는 runs-on에서 선택한 머신과 일치해야 합니다. 더 자세한 내용은 --tested 문서를 참조하세요. (예: --testbed ubuntu-latest)
  19. 경고가 생성되면 명령을 실패 처리하는 --error-on-alert 플래그를 설정합니다. 전체 개요는 --error-on-alert 문서를 참조하세요. (예: --error-on-alert)
  20. bencher mock에 의해 생성된 Bencher Metric Format JSON (json)으로 --adapter 옵션을 설정합니다. 전체 개요는 benchmark harness adapters를 참조하세요. (예: --adapter json)
  21. GitHub API 인증 토큰을 사용하여 결과를 GitHub Check 및 Pull Request 주석으로 게시하기 위해 --github-actions 옵션을 설정합니다 GitHub Actions GITHUB_TOKEN 환경 변수를 사용하여. 더 자세한 내용은 --github-actions 문서를 참조하세요. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  22. --ci-number 옵션을 중간 환경 변수를 사용하여 풀 리퀘스트 번호로 설정합니다. 더 자세한 내용은 --ci-number 문서를 참조하세요. (예: --ci-number "$PR_NUMBER")
  23. --file 옵션을 벤치마크 결과 파일 경로로 설정합니다. 전체 개요는 benchmark command를 참조하세요. (예: --file "$BENCHMARK_RESULTS")

포크 PR 브랜치를 PR이 종료된 후 정리하려면, pull_request_target 이벤트 중 closed 타입으로 실행되는 별도의 워크플로를 생성할 수 있습니다. 이 워크플로는 bencher archive 명령어를 사용하여 포크 PR 브랜치를 아카이브합니다.

.github/workflows/fork_pr_benchmarks_closed.yml
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"
  1. GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/fork_pr_benchmarks_closed.yml)

  2. pull_request_target 이벤트에서 실행하십시오:

    • closed - 풀 리퀘스트가 종료되었습니다.

    전체 개요는 GitHub Actions on 문서 및 GitHub Actions pull_request_target 문서를 참조하십시오. (예: on: pull_request_target: types: [closed])

  3. GitHub Actions job을 생성합니다. (예: jobs: archive_pr_branch)

  4. 작업이 실행될 머신 유형을 설정하십시오. 전체 개요는 GitHub Actions runs-on 문서를 참조하십시오. (예: runs-on: ubuntu-latest)

  5. PR 브랜치 소스 코드를 체크아웃합니다. (예: uses: actions/checkout@v6)

  6. GitHub Action을 사용하여 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)

  7. PR 브랜치를 아카이브하기 위해 bencher archive CLI 서브커맨드를 사용합니다. (예: bencher archive)

  8. --project 옵션을 프로젝트 슬러그로 설정합니다. 자세한 사항은 --project 문서를 참조하십시오. (예: --project project-abc4567-wxyz123456789)

  9. --key 옵션을 BENCHER_API_KEY 저장소 시크릿으로 설정합니다. 자세한 사항은 --key 문서를 참조하십시오. (예: --key '${{ secrets.BENCHER_API_KEY }}')

  10. GitHub Actions GITHUB_HEAD_REF 기본 환경 변수를 사용하여 PR 브랜치 이름을 --branch 옵션으로 설정합니다. (예: --branch "$GITHUB_HEAD_REF")


베어 메탈에서의 Pull Requests

GitHub Actions에는 Self-Hosted 러너가 있지만, 이를 사용하려면 노이즈가 많은 GitHub Actions Runner 바이너리를 사용해야 합니다. Bencher Bare Metal은 목적에 맞게 설계된 저노이즈 벤치마크 러너를 사용하여 전용 베어 메탈 하드웨어 플릿에서 벤치마크를 실행합니다. 또한 Bencher Bare Metal은 포크에서 온 PR을 지원하지만, GitHub Actions Runner는 지원하지 않습니다.

Bencher Bare Metal로 전환한 뒤에는, Bencher를 기다리는 동안 GitHub Actions 작업을 계속 실행해 두고 싶지 않을 것입니다. 이를 해결하기 위해 Bencher는 분할 워크플로를 사용하여 GitHub Actions가 Bencher Bare Metal Job을 비동기적으로 기다릴 수 있게 합니다.

다음 예시는 동일한 저장소 내의 브랜치에서 사용하기 위한 것입니다. 포크 PR에서 베어 메탈 벤치마킹을 하려면 위의 포크에서의 Pull Requests 워크플로와 이 패턴을 함께 사용하세요.

.github/workflows/pr_bare_metal_benchmarks.yml
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
  1. 첫 번째 GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/pr_bare_metal_benchmarks.yml)
  2. 위의 Pull Requests처럼 pull_request 이벤트에서 실행합니다. (예: on: pull_request: types: [opened, reopened, edited, synchronize])
  3. GitHub Actions job을 생성합니다. (예: jobs: submit_pr_benchmarks)
  4. pull request가 동일한 저장소에서 온 경우에만 pull_request 이벤트에서 실행합니다. ⚠️ 이 라인을 제거하지 마십시오! 포크 PR 처리에 관해서는 위의 포크에서의 Pull Requests를 참조하세요. (예: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)
  5. GITHUB_TOKEN의 권한을 설정하여 checks에 write를 부여합니다. 첫 번째 워크플로는 GitHub Check를 시작하고 댓글은 게시하지 않습니다. (예: permissions: checks: write)
  6. 작업을 실행할 머신의 유형을 설정합니다. Job을 제출하기만 하므로 작은 머신으로 충분합니다. (예: runs-on: ubuntu-latest)
  7. PR 브랜치의 소스 코드를 체크아웃합니다. (예: uses: actions/checkout@v6)
  8. GitHub Action을 사용하여 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)
  9. PR 브랜치 벤치마크를 제출하기 위해 bencher run CLI 서브커맨드를 사용합니다. 전체 개요는 bencher run CLI 서브커맨드를 참조하세요. (예: bencher run)
  10. --project 옵션을 프로젝트 슬러그로 설정합니다. 더 많은 세부 사항은 --project 문서를 참조하세요. (예: --project project-abc4567-wxyz123456789)
  11. --key 옵션을 BENCHER_API_KEY 레포지토리 시크릿으로 설정합니다. 더 많은 세부 사항은 --key 문서를 참조하세요. (예: --key '${{ secrets.BENCHER_API_KEY }}')
  12. GitHub Actions GITHUB_HEAD_REF 기본 환경 변수를 사용하여 PR 브랜치 이름을 --branch 옵션으로 설정합니다. 전체 개요는 --branch 문서를 참조하세요. (예: --branch "$GITHUB_HEAD_REF")
  13. 위의 Pull Requests처럼 PR 브랜치의 시작점을 설정합니다. 전체 개요는 --start-point 문서를 참조하세요. (예: --start-point "$GITHUB_BASE_REF")
  14. --adapter 옵션을 bencher mock이 생성하는 Bencher Metric Format JSON (json)으로 설정합니다. 전체 개요는 벤치마크 하니스 어댑터를 참조하세요. (예: --adapter json)
  15. --image 옵션을 베어 메탈 이미지로 설정합니다. 전체 개요는 --image 문서를 참조하세요. (예: --image project-abc4567-wxyz123456789:latest)
  16. Job을 제출하자마자 종료하도록 --detach 플래그를 설정합니다. 더 많은 세부 사항은 --detach 문서를 참조하세요. (예: --detach)
  17. GitHub Actions GITHUB_TOKEN 환경 변수를 사용하여 GitHub Check를 시작할 GitHub API 인증 토큰으로 --github-actions 옵션을 설정합니다. 더 많은 세부 사항은 --github-actions 문서를 참조하세요. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  18. Job이 끝났을 때 Bencher가 repository_dispatch 이벤트를 보낼 수 있도록 --ci-callback-token 옵션을 BENCHER_CALLBACK_TOKEN 레포지토리 시크릿으로 설정합니다. 더 많은 세부 사항은 --ci-callback-token 문서를 참조하세요. (예: --ci-callback-token '${{ secrets.BENCHER_CALLBACK_TOKEN }}')
  19. 이미지 안에서 실행할 벤치마크 명령을 지정합니다. 이미지에 엔트리포인트가 있으면 명령은 그 엔트리포인트에 전달됩니다(--entrypoint 옵션 참조). 전체 개요는 벤치마크 명령을 참조하세요. (예: bencher mock)
.github/workflows/pr_bare_metal_benchmarks_attach.yml
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 }}'
  1. 기본 브랜치에 두 번째 GitHub Actions workflow 파일을 생성합니다. GitHub는 repository_dispatch 워크플로를 기본 브랜치에서만 실행하므로, 이 파일이 그곳에 있기 전까지는 첫 번째 워크플로가 시작한 GitHub Check가 진행 중으로 남습니다. (예: .github/workflows/pr_bare_metal_benchmarks_attach.yml)
  2. bencher_run 유형의 repository_dispatch 이벤트에서 실행합니다. 전체 개요는 GitHub Actions on 문서 및 GitHub Actions repository_dispatch 문서를 참조하세요. (예: on: repository_dispatch: types: [bencher_run])
  3. GitHub Actions job을 생성합니다. (예: jobs: attach_pr_benchmarks)
  4. GITHUB_TOKEN의 권한을 설정하여 checks 및 pull-requests에 write를 부여합니다. (예: permissions: checks: write pull-requests: write)
  5. 작업을 실행할 머신의 유형을 설정합니다. Job은 이미 끝났으므로 이 작업은 결과를 게시하기만 합니다. (예: runs-on: ubuntu-latest)
  6. GitHub Action을 사용하여 Bencher CLI를 설치합니다. 체크아웃은 필요하지 않습니다. (예: uses: bencherdev/bencher@main)
  7. GitHub의 스크립트 인젝션 가이드에 따라, 이벤트의 Job UUID는 run:에 직접 넣지 말고 중간 환경 변수를 통해 전달합니다. (예: env: JOB_UUID: ${{ github.event.client_payload.bencher.job }})
  8. Job에 연결하기 위해 bencher run CLI 서브커맨드를 사용합니다. 전체 개요는 bencher run CLI 서브커맨드를 참조하세요. (예: bencher run)
  9. --project 옵션을 프로젝트 슬러그로 설정합니다. 저장소에 프로젝트가 둘 이상이면 github.event.client_payload.bencher.project도 같은 방식으로 환경 변수를 통해 전달하고 따옴표로 감싸세요(예: --project "$PROJECT_SLUG"). 더 많은 세부 사항은 --project 문서를 참조하세요. (예: --project project-abc4567-wxyz123456789)
  10. --key 옵션을 BENCHER_API_KEY 레포지토리 시크릿으로 설정합니다. 더 많은 세부 사항은 --key 문서를 참조하세요. (예: --key '${{ secrets.BENCHER_API_KEY }}')
  11. --job 옵션을 따옴표로 감싼 Job UUID로 설정합니다. 전체 개요는 --job 문서를 참조하세요. (예: --job "$JOB_UUID")
  12. 경고가 생성되면 명령이 실패하도록 --error-on-alert 플래그를 설정합니다. 이벤트는 데이터만 전달하므로, --ci-only-on-alert와 --ci-public-links처럼 결과를 게시하는 방식을 정하는 옵션도 여기, 두 번째 워크플로에 둡니다. 전체 개요는 --error-on-alert 문서를 참조하세요. (예: --error-on-alert)
  13. GitHub Actions GITHUB_TOKEN 환경 변수를 사용하여 결과를 GitHub Check와 pull request 댓글로 게시할 GitHub API 인증 토큰으로 --github-actions 옵션을 설정합니다. 여기에서 명시적으로 지정한 --ci-number 또는 --ci-id가 이벤트보다 우선합니다. 더 많은 세부 사항은 --github-actions 문서를 참조하세요. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')


🐰 축하합니다! GitHub Actions에서 Bencher를 사용하는 방법을 배웠습니다! 🎉


계속하기: 벤치마킹 개요 ➡

🤖 이 문서는 AI에 의해 자동으로 번역되었습니다. 정확하지 않을 수도 있고 오류가 있을 수도 있습니다. 오류를 발견하면 GitHub에서 문제를 열어주세요.


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Sun, September 27, 2026 at 12:00:00 AM UTC