name: Benchmark Comment on: workflow_run: workflows: [Benchmark] types: [completed] jobs: comment-pr: name: Post benchmark comment # Only run when triggered by a pull_request event and the benchmark succeeded. if: > github.event.workflow_run.conclusion == 'success' && github.event.workflow_run.event == 'pull_request' runs-on: ubuntu-latest permissions: contents: read actions: read pull-requests: write issues: write steps: - uses: actions/checkout@v4 - name: Download benchmark results uses: actions/download-artifact@v4 with: run-id: ${{ github.event.workflow_run.id }} name: benchmark-results path: current-results github-token: ${{ secrets.GITHUB_TOKEN }} - name: Download PR number uses: actions/download-artifact@v4 with: run-id: ${{ github.event.workflow_run.id }} name: pr-number path: . github-token: ${{ secrets.GITHUB_TOKEN }} - name: Read PR number id: pr run: echo "number=$(cat pr-number.txt)" >> "$GITHUB_OUTPUT" - name: Fetch baseline from benchmark-data release run: | gh release download benchmark-data \ --repo atlarge-research/opendc \ -A benchmark-history.json \ -O baseline.json 2>/dev/null \ || echo "[]" > baseline.json env: GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} - name: Generate comparison comment run: | python3 .github/scripts/compare_benchmarks.py \ current-results/results.json \ baseline.json \ > comment.md - name: Post or update PR comment uses: actions/github-script@v7 with: script: | const fs = require('fs'); const body = fs.readFileSync('comment.md', 'utf8'); const marker = ''; const fullBody = marker + '\n' + body; const prNumber = parseInt(fs.readFileSync('pr-number.txt', 'utf8').trim()); core.info(`Posting comment to ${context.repo.owner}/${context.repo.repo} PR #${prNumber}`); core.info(`Comment body length: ${body.length} chars`); const { data: comments } = await github.rest.issues.listComments({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prNumber, }); const existing = comments.find(c => c.body.includes(marker)); if (existing) { core.info(`Updating existing comment ${existing.id}`); await github.rest.issues.updateComment({ owner: context.repo.owner, repo: context.repo.repo, comment_id: existing.id, body: fullBody, }); } else { core.info('Creating new comment'); await github.rest.issues.createComment({ owner: context.repo.owner, repo: context.repo.repo, issue_number: prNumber, body: fullBody, }); }