GitHub Actions에서 Bencher 사용하기


사용 사례에 따라 다음에 대해 GitHub Actions에서 지속적인 벤치마킹을 설정할 수 있습니다:

API 토큰을 생성했는지 확인하고 계속하기 전에 BENCHER_API_TOKEN이라는 이름의 리포지토리 비밀로 설정했는지 확인하세요! Your Repo -> Settings -> Secrets and variables -> Actions -> New repository secret으로 이동하세요. 비밀 이름을 BENCHER_API_TOKEN로 설정하고 비밀 값에 API 토큰을 설정하세요.

GitHub Actions에서, 워크플로우가 포크된 저장소에서 트리거될 때 시크릿은 러너에 전달되지 않습니다. 따라서 아래의 워크플로우를 추가할 때 동일한 저장소의 브랜치를 사용하여 풀 리퀘스트를 만들어야 합니다. 포크된 저장소에서 Bencher를 추가하려고 시도하면, BENCHER_API_TOKEN 시크릿을 사용할 수 없습니다. ${{ secrets.BENCHER_API_TOKEN }}은 빈 문자열이 됩니다.

기본 브랜치

통계적 지속적 벤치마킹의 핵심은 기본 브랜치에 대한 역사적 기준선을 가지고 있는 것입니다. 이 역사적 기준선은 풀 리퀘스트에서 성능 회귀를 탐지하는 데 사용할 수 있습니다.

on:
push:
branches: main
jobs:
benchmark_base_branch:
name: Continuous Benchmarking with Bencher
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: bencherdev/bencher@main
- name: Track base branch benchmarks with Bencher
run: |
bencher run \
--project save-walter-white-1234abcd \
--token '${{ secrets.BENCHER_API_TOKEN }}' \
--branch main \
--testbed ubuntu-latest \
--adapter json \
--err \
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 Actions runs-on 문서를 참조하여 전체 개요를 확인하세요. (예: runs-on: ubuntu-latest)
  5. 기본 브랜치 소스 코드를 체크아웃하세요. (예: uses: actions/checkout@v4)
  6. GitHub Action을 사용하여 Bencher CLI를 설치하세요. (예: uses: bencherdev/bencher@main)
  7. bencher run CLI 서브커맨드를 사용하여 main 브랜치 벤치마크를 실행하세요. the bencher run CLI 서브커맨드를 참조하여 전체 개요를 확인하세요. (예: bencher run)
  8. --project 옵션을 프로젝트 슬러그로 설정하세요. the --project 문서를 참조하여 더 자세히 알아보세요. (예: --project save-walter-white-1234abcd)
  9. --token 옵션을 BENCHER_API_TOKEN Repository 비밀로 설정하세요. the --token 문서를 참조하여 더 자세히 알아보세요. (예: --token '${{ secrets.BENCHER_API_TOKEN }}')
  10. --branch 옵션을 브랜치 이름으로 설정하세요. branch 선택을 참조하여 전체 개요를 확인하세요. (예: --branch main)
  11. --testbed 옵션을 테스트베드 이름으로 설정하세요. 이는 runs-on에서 선택한 기기와 일치해야 할 가능성이 높습니다. the --testbed 문서를 참조하여 더 자세히 알아보세요. (예: --testbed ubuntu-latest)
  12. --adapter 옵션을 원하는 벤치마크 하네스 어댑터로 설정하세요. 벤치마크 하네스 어댑터를 참조하여 전체 개요를 확인하세요. (예: --adapter json)
  13. 경고가 생성되면 명령을 실패하게 하는 --err 플래그를 설정하세요. Threshold & Alerts를 참조하여 전체 개요를 확인하세요. (예: --err)
  14. 벤치마크 커맨드 인자를 지정하세요. 벤치마크 커맨드를 참조하여 전체 개요를 확인하세요. (예: bencher mock)

풀 리퀘스트

풀 리퀘스트에서 성능 저하를 감지하려면 PR에서 벤치마크를 실행해야 합니다. 같은 저장소 내의 브랜치에서만 PR이 있을 것으로 예상되는 경우, 같은 저장소의 pull_request 이벤트에서 실행되는 또 다른 워크플로를 생성하면 됩니다.

⚠️ 이 솔루션은 모든 PR이 같은 저장소에서 나오는 경우에만 작동합니다! 아래의 포크에서의 풀 리퀘스트를 참조하세요.

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:
pull-requests: write
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: bencherdev/bencher@main
- name: Track PR Benchmarks with Bencher
run: |
bencher run \
--project save-walter-white-1234abcd \
--token '${{ secrets.BENCHER_API_TOKEN }}' \
--branch '${{ github.head_ref }}' \
--branch-start-point '${{ github.base_ref }}' \
--branch-start-point-hash '${{ github.event.pull_request.base.sha }}' \
--branch-reset \
--testbed ubuntu-latest \
--adapter json \
--err \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
bencher mock
  1. GitHub Actions workflow 파일을 생성합니다. (예: .github/workflows/pr_benchmarks.yml)

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

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

    전체 개요는 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 이벤트에서 실행합니다. ⚠️ 이 줄을 삭제하지 마십시오! 포크 PR을 처리하는 방법은 아래의 포크에서의 풀 리퀘스트를 참조하세요. (예: if: github.event_name == 'pull_request' && github.event.pull_request.head.repo.full_name == github.repository)

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

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

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

  8. GitHub Action을 통해 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)

  9. bencher run CLI 서브 명령을 사용하여 풀 리퀘스트 브랜치 벤치마크를 실행합니다. 전체 개요는 bencher run CLI 서브 명령을 참조하세요. (예: bencher run)

  10. 프로젝트 슬러그에 --project 옵션을 설정합니다. 자세한 내용은 --project 문서를 참조하세요. (예: --project save-walter-white-1234abcd)

  11. 레포지토리 비밀 키에 BENCHER_API_TOKEN--token 옵션을 설정합니다. 자세한 내용은 --token 문서를 참조하세요. (예: --token '${{ secrets.BENCHER_API_TOKEN }}')

  12. GitHub Actions github 컨텍스트를 사용하여 PR 브랜치 이름에 --branch 옵션을 설정합니다. 전체 개요는 브랜치 선택를 참조하세요. (예: --branch '${{ github.head_ref }}')

  13. GitHub Actions github 컨텍스트를 사용하여 PR 기본 브랜치 시작점에 --branch-start-point 옵션을 설정합니다. 전체 개요는 브랜치 선택를 참조하세요. (예: --branch-start-point '${{ github.base_ref }}')

  14. GitHub Actions pull_request 이벤트를 참조하여 PR 기본 브랜치 시작점 해시에 --branch-start-point-hash 옵션을 설정합니다. 전체 개요는 브랜치 선택를 참조하세요. (예: --branch-start-point-hash '${{ github.event.pull_request.base.sha }}')

  15. 항상 브랜치를 시작 지점으로 재설정하기 위해 --branch-reset 플래그를 설정합니다. 이는 벤치마크 데이터 드리프트를 방지합니다. 전체 개요는 브랜치 선택를 참조하세요. (예: --branch-reset)

  16. 테스트베드 이름에 --testbed 옵션을 설정합니다. 이는 주로 runs-on에 선택된 머신과 일치해야 합니다. 자세한 내용은 --testbed 문서를 참조하세요. (예: --testbed ubuntu-latest)

  17. 원하는 벤치마크 하네스 어댑터에 --adapter 옵션을 설정합니다. 전체 개요는 벤치마크 하네스 어댑터를 참조하세요. (예: --adapter json)

  18. 경고가 생성되면 명령이 실패하도록 --err 플래그를 설정합니다. 전체 개요는 임계값 및 경고를 참조하세요. (예: --err)

  19. GitHub Actions GITHUB_TOKEN 환경 변수를 사용하여 결과를 풀 리퀘스트 댓글로 게시하기 위해 GitHub API 인증 토큰에 --github-actions 옵션을 설정합니다. 자세한 내용은 --github-actions 문서를 참조하세요. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')

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


포크에서 온 풀 리퀘스트

공개 오픈 소스 프로젝트에서 그렇듯이, 포크에서 온 풀 리퀘스트를 받으려고 한다면, 일을 조금 다르게 처리해야 할 필요가 있습니다. 보안상의 이유로, BENCHER_API_TOKENGITHUB_TOKEN과 같은 비밀 값들은 포크 PR에서 GitHub Actions에서 이용할 수 없습니다. 즉, 외부 기여자가 포크에서 풀 리퀘스트를 올릴 경우 이전 예제는 작동하지 않습니다. 포크 PR에 대한 두 가지 옵션이 있습니다:

GitHub 보안 연구소 글과 악의적인 풀 리퀘스트의 위협을 방지하는 방법에 대한 이 블로그 포스트를 참고하여 전체 개요를 확인하십시오.

기본 브랜치에서 포크 PR 벤치마크 및 업로드

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

name: Run and Cache 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@v4
- 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/run_fork_pr_benchmarks.yml)

  2. 두 번째 워크플로우에서 참조할 수 있도록 이 워크플로우에 이름을 지정합니다. (예: name: 벤치마크 실행 및 캐시)

  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@v4)

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

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

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

name: Track Benchmarks with Bencher
on:
workflow_run:
workflows: [Run and Cache Benchmarks]
types: [completed]
jobs:
track_fork_pr_branch:
if: github.event.workflow_run.conclusion == 'success'
runs-on: ubuntu-latest
env:
BENCHMARK_RESULTS: benchmark_results.json
PR_EVENT: event.json
steps:
- name: Download Benchmark Results
uses: actions/github-script@v6
with:
script: |
async function downloadArtifact(artifactName) {
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
owner: context.repo.owner,
repo: context.repo.repo,
run_id: context.payload.workflow_run.id,
});
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
return artifact.name == artifactName
})[0];
if (!matchArtifact) {
core.setFailed(`Failed to find artifact: ${artifactName}`);
}
let download = await github.rest.actions.downloadArtifact({
owner: context.repo.owner,
repo: context.repo.repo,
artifact_id: matchArtifact.id,
archive_format: 'zip',
});
let fs = require('fs');
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/${artifactName}.zip`, Buffer.from(download.data));
}
await downloadArtifact(process.env.BENCHMARK_RESULTS);
await downloadArtifact(process.env.PR_EVENT);
- name: Unzip Benchmark Results
run: |
unzip $BENCHMARK_RESULTS.zip
unzip $PR_EVENT.zip
- 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.number}/merge`);
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 save-walter-white-1234abcd \
--token '${{ secrets.BENCHER_API_TOKEN }}' \
--branch '${{ env.PR_HEAD }}' \
--branch-start-point '${{ env.PR_BASE }}' \
--branch-start-point-hash '${{ env.PR_BASE_SHA }}' \
--branch-reset \
--testbed ubuntu-latest \
--adapter json \
--err \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
--ci-number '${{ env.PR_NUMBER }}' \
--file "$BENCHMARK_RESULTS"
  1. 첫 번째 GitHub Actions workflow 파일을 만듭니다. (예: .github/workflows/track_fork_pr_benchmarks.yml)
  2. 이 두 번째 워크플로우에 이름을 지정합니다. (예: name: 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 Actions runs-on 문서을 참조하십시오. (예: runs-on: ubuntu-latest)
  7. 벤치마크 결과 파일과 pull_request 이벤트 객체 파일 이름을 환경 변수로 설정합니다. (예: env: ...)
  8. 캐시된 벤치마크 결과와 pull_request 이벤트를 다운로드합니다. (예: uses: actions/github-script@v6)
  9. 캐시된 벤치마크 결과와 pull_request 이벤트를 추출합니다. (예: unzip ...)
  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 save-walter-white-1234abcd)
  14. --token 옵션을 BENCHER_API_TOKEN 저장소 비밀로 설정합니다. 자세한 내용은 --token 문서를 참조하십시오. (예: --token '${{ secrets.BENCHER_API_TOKEN }}')
  15. GitHub Actions pull_request 이벤트를 사용하여 포크 PR 번호를 형식화한 --branch 옵션을 설정합니다. 전체 개요는 브랜치 선택를 참조하십시오. (예: --branch '${{ env.PR_HEAD }}')
  16. GitHub Actions pull_request 이벤트를 사용하여 포크 PR 기본 브랜치의 시작점으로 --branch-start-point 옵션을 설정합니다. 전체 개요는 브랜치 선택를 참조하십시오. (예: --branch-start-point '${{ env.PR_BASE }}')
  17. GitHub Actions pull_request 이벤트를 사용하여 포크 PR 기본 브랜치의 시작점 해시로 --branch-start-point-hash 옵션을 설정합니다. 전체 개요는 브랜치 선택를 참조하십시오. (예: --branch-start-point-hash '${{ env.PR_BASE_SHA }}')
  18. 브랜치를 시작점으로 항상 리셋하려면 --branch-reset 플래그를 설정합니다. 이는 벤치마크 데이터 이동을 방지합니다. 전체 개요는 브랜치 선택를 참조하십시오. (예: --branch-reset)
  19. 테스트베드 이름으로 --testbed 옵션을 설정합니다. 이는 runs-on에서 선택한 머신과 일치해야 합니다. 자세한 내용은 --tested 문서를 참조하십시오. (예: --testbed ubuntu-latest)
  20. 원하는 벤치마크 하네스 어댑터로 --adapter 옵션을 설정합니다. 전체 개요는 벤치마크 하네스 어댑터를 참조하십시오. (예: --adapter json)
  21. 경고가 생성될 경우 명령이 실패하도록 --err 플래그를 설정합니다. 전체 개요는 임계값 및 경고를 참조하십시오. (예: --err)
  22. GitHub Actions GITHUB_TOKEN 환경 변수를 사용하여 GitHub API 인증 토큰에 --github-actions 옵션을 설정하여 풀 리퀘스트에 결과를 주석으로 게시합니다. 자세한 내용은 --github-actions 문서를 참조하십시오. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')
  23. 풀 리퀘스트 번호에 --ci-number 옵션을 설정합니다. 자세한 내용은 --ci-number 문서를 참조하십시오. (예: --ci-number '${{ env.PR_NUMBER }}')
  24. 벤치마크 결과 파일 경로에 --file 옵션을 설정합니다. 전체 개요는 벤치마크 명령를 참조하십시오. (예: --file "$BENCHMARK_RESULTS")

대상 브랜치에서 포크 풀 요청 벤치마킹 및 필수 검토자

포크 풀 요청의 코드가 안전한지 보장하기 위해, 이 GitHub Action은 포크가 다른 리포지토리에서 왔는지 확인합니다. 포크가 다른 리포지토리에서 왔다면, 검토가 필요합니다.

⚠️ 포크 PR을 승인하기 전에 반드시, 반드시 철저히 검토하는 것이 중요합니다! 그렇지 않으면 pwn 요청이 발생할 수 있습니다!

이러한 부담을 덜고 싶다면, 기본 브랜치에서 벤치마킹 포크 PR 및 업로드를 참조하십시오.

이 워크플로우를 설정하려면, 두 개의 GitHub Actions Environments를 생성해야 합니다. Your Repo -> Settings -> Environments -> New environment로 이동합니다. internalexternal이라는 두 개의 새 환경을 만듭니다. internal 환경은 배포 보호 규칙이 없어야 합니다. 그러나, external 환경은 벤치마킹 전에 포크 PR을 검토할 신뢰할 수 있는 검토자가 필요합니다. 전체 개요는 이 블로그 게시물을 참조하십시오.

이 설정이 작동하는 이유는 pull_request_target이 풀 요청의 대상 브랜치 컨텍스트에서 실행되기 때문입니다. 따라서 BENCHER_API_TOKENGITHUB_TOKEN과 같은 비밀이 가능합니다. 따라서, 이 워크플로우는 대상 브랜치에 있을 때만 실행됩니다. GITHUB_TOKENBENCHER_API_TOKEN과 같은 비밀을 환경 변수로 설정하지 마십시오. 대신, 당신의 비밀을 명시적으로 bencher run에 전달하십시오.

on:
pull_request_target:
types: [opened, reopened, edited, synchronize]
jobs:
fork_pr_requires_review:
environment: ${{ (github.event.pull_request.head.repo.full_name == github.repository && 'internal') || 'external' }}
runs-on: ubuntu-latest
steps:
- run: true
benchmark_fork_pr_branch:
needs: fork_pr_requires_review
name: Continuous Benchmarking Fork PRs with Bencher
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
with:
repository: ${{ github.event.pull_request.head.repo.full_name }}
ref: ${{ github.event.pull_request.head.sha }}
persist-credentials: false
- uses: bencherdev/bencher@main
- name: Track Fork PR Benchmarks with Bencher
run: |
bencher run \
--project save-walter-white-1234abcd \
--token '${{ secrets.BENCHER_API_TOKEN }}' \
--branch '${{ github.event.number }}/merge' \
--branch-start-point '${{ github.base_ref }}' \
--branch-start-point-hash '${{ github.event.pull_request.base.sha }}' \
--branch-reset \
--testbed ubuntu-latest \
--adapter json \
--err \
--github-actions '${{ secrets.GITHUB_TOKEN }}' \
bencher mock
  1. GitHub Actions 워크플로우 파일을 생성합니다. (예: .github/workflows/pr_target_benchmarks.yml)

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

    • opened - 풀 요청이 생성되었습니다.
    • reopened - 이전에 닫힌 풀 요청이 다시 열렸습니다.
    • edited - 풀 요청의 제목 또는 본문이 편집되었거나 풀 요청의 기본 브랜치가 변경되었습니다.
    • synchronize - 풀 요청의 헤드 브랜치가 업데이트되었습니다. 예: 기본 브랜치에서 헤드 브랜치가 업데이트되었거나 새 커밋이 헤드 브랜치에 푸시되었습니다.

    GitHub Actions on 문서GitHub Actions pull_request 문서에서 전체 개요를 참조하십시오. (예: on: pull_request: types: [opened, reopened, edited, synchronize])

  3. 워크플로우가 검토를 필요로 하는지 확인하는 첫 번째 GitHub Actions job을 생성합니다. (예: jobs: fork_pr_requires_review)

  4. 풀 요청이 동일한 리포지토리에서 온 경우에만 environmentinternal로 설정합니다. 그렇지 않으면, 검토자가 승인해야 하는 external 환경을 설정하여 계속 작업하도록 합니다. ⚠️ 이 줄을 제거하지 마십시오! (예: environment: ${{ (github.event.pull_request.head.repo.full_name == github.repository && 'internal') || 'external' }})

  5. 벤치마크를 실행하는 두 번째 GitHub Actions job을 생성합니다. (예: benchmark_fork_pr_branch)

  6. benchmark_fork_pr_branch 작업이 실행되려면 fork_pr_requires_review 작업이 필요하다는 것을 설정하십시오. ⚠️ 이 줄을 제거하지 마십시오! GitHub Actions needs 문서에서 전체 개요를 참조하십시오. (예: needs: fork_pr_requires_review)

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

  8. 포크 PR 소스 코드를 체크아웃합니다. pull_request_target은 풀 요청의 대상 브랜치 컨텍스트에서 실행되므로, 여전히 풀 요청 브랜치를 체크아웃해야 합니다. (예: uses: actions/checkout@v4)

    • 포크 PR 리포지토리를 지정합니다 (예: repository: ${{ github.event.pull_request.head.repo.full_name }})
    • 포크 PR 해시를 지정합니다 (예: ref: ${{ github.event.pull_request.head.sha }})
    • git 자격 증명을 유지하지 않도록 합니다 (예: persist-credentials: false)
  9. GitHub Action을 사용하여 Bencher CLI를 설치합니다. (예: uses: bencherdev/bencher@main)

  10. bencher run CLI 서브커맨드를 사용하여 포크 풀 브랜치 벤치마크를 실행합니다. bencher run CLI 서브커맨드에서 전체 개요를 참조하십시오. (예: bencher run)

  11. --project 옵션을 프로젝트 슬러그로 설정합니다. --project 문서에서 자세한 내용을 참조하십시오. (예: --project save-walter-white-1234abcd)

  12. --token 옵션을 리포지토리 비밀인 BENCHER_API_TOKEN으로 설정합니다. --token 문서에서 자세한 내용을 참조하십시오. (예: --token '${{ secrets.BENCHER_API_TOKEN }}')

  13. --branch 옵션을 GitHub Actions pull_request 이벤트를 사용하여 포맷된 포크 PR 번호로 설정합니다. 전체 개요는 브랜치 선택에서 참조하십시오. (예: --branch '${{ github.event.number }}/merge')

  14. --branch-start-point 옵션을 포크 PR 기본 브랜치 시작 지점으로 설정합니다. GitHub Actions github 컨텍스트를 사용하여, 전체 개요는 브랜치 선택에서 참조하십시오. (예: --branch-start-point '${{ github.base_ref }}')

  15. GitHub Actions pull_request 이벤트를 사용하여 포크 PR 기본 브랜치 시작 지점 해시로 --branch-start-point-hash 옵션을 설정합니다. 전체 개요는 브랜치 선택에서 참조하십시오. (예: --branch-start-point-hash '${{ github.event.pull_request.base.sha }}')

  16. --branch-reset 플래그를 설정하여 항상 브랜치를 시작 지점으로 재설정합니다. 이는 벤치마크 데이터 드리프트를 방지합니다. 전체 개요는 브랜치 선택에서 참조하십시오. (예: --branch-reset)

  17. --testbed 옵션을 테스트베드 이름으로 설정합니다. 이는 runs-on에서 선택된 머신과 일치해야 합니다. 자세한 내용은 --testbed 문서를 참조하십시오. (예: --testbed ubuntu-latest)

  18. 필요한 벤치마크 하니스 어댑터를 선택하여 --adapter 옵션을 설정합니다. 전체 개요는 벤치마크 하니스 어댑터에서 참조하십시오. (예: --adapter json)

  19. 경고가 생성되면 명령을 실패하게 하기 위해 --err 플래그를 설정합니다. 전체 개요는 한계 및 경고에서 참조하십시오. (예: --err)

  20. GitHub API 인증 토큰을 사용하여 벤치마크 결과를 풀 요청 코멘트로 게시하기 위해 --github-actions 옵션을 설정합니다. GitHub Actions GITHUB_TOKEN 환경 변수를 사용하십시오. 자세한 내용은 --github-actions 문서를 참조하십시오. (예: --github-actions '${{ secrets.GITHUB_TOKEN }}')

  21. 벤치마크 명령 인수를 지정합니다. 자세한 내용은 벤치마크 명령를 참조하십시오. (예: bencher mock)



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


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

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


Published: Fri, October 27, 2023 at 8:40:00 AM UTC | Last Updated: Thu, August 22, 2024 at 12:40:00 PM UTC