@@ -2,6 +2,11 @@ name: Benchmark PR
22
33on :
44 pull_request :
5+ types :
6+ - opened
7+ - synchronize
8+ - reopened
9+ - ready_for_review
510 workflow_dispatch :
611 inputs :
712 versions :
5863 type : string
5964
6065permissions :
61- contents : read
66+ contents : write
67+ pages : write
68+ id-token : write
6269
6370concurrency :
6471 group : benchmark-pr-${{ github.event.pull_request.number || github.event.inputs.sourcePrNumber || github.run_id }}
8087 INPUT_TRIGGER_REPOSITORY : ${{ github.event.inputs.triggerRepository }}
8188 INPUT_TRIGGER_PR_NUMBER : ${{ github.event.inputs.triggerPrNumber }}
8289 INPUT_TRIGGER_PR_URL : ${{ github.event.inputs.triggerPrUrl }}
90+ GH_EVENT_PR_NUMBER : ${{ github.event.pull_request.number || '' }}
8391 PR_OR_RUN_ID : ${{ github.event.pull_request.number || github.event.inputs.sourcePrNumber || github.run_id }}
8492 GITHUB_REPOSITORY : ${{ github.repository }}
8593 GITHUB_WORKFLOW : ${{ github.workflow }}
8997 GITHUB_REF_NAME : ${{ github.ref_name }}
9098 GITHUB_TOKEN : ${{ github.token }}
9199 PERFORMANCE_TESTS_TRIGGER_TOKEN : ${{ secrets.PERFORMANCE_TESTS_TRIGGER_TOKEN }}
100+ BENCHMARK_DATA_BRANCH : ${{ vars.BENCHMARK_DATA_BRANCH || 'benchmark-data' }}
101+ PR_PREVIEW_BASE_URL : ${{ vars.PR_PREVIEW_PAGES_BASE_URL || 'https://javalin.github.io/javalin-performance-tests-testing/pr-previews' }}
92102 steps :
93103 - name : Checkout
94104 uses : actions/checkout@v4
@@ -113,7 +123,8 @@ jobs:
113123 source_dir="$(mktemp -d)"
114124 git clone "https://github.com/${INPUT_SOURCE_REPOSITORY}.git" "${source_dir}"
115125 pushd "${source_dir}" >/dev/null
116- git checkout "${INPUT_SOURCE_REF}"
126+ checkout_target="${INPUT_SOURCE_REF:-${INPUT_SOURCE_SHA}}"
127+ git checkout "${checkout_target}"
117128 chmod +x ./mvnw
118129 snapshot_version="$(./mvnw -q -DforceStdout help:evaluate -Dexpression=project.version | tail -n 1 | tr -d '\r')"
119130 if [ -z "${snapshot_version}" ]; then
@@ -191,11 +202,19 @@ jobs:
191202 mkdir -p pr-history/runs
192203 repo_url="https://x-access-token:${GITHUB_TOKEN}@github.com/${GITHUB_REPOSITORY}.git"
193204
194- if git ls-remote --exit-code --heads "$repo_url" benchmark-data >/dev/null 2>&1; then
195- git clone --depth 1 --branch benchmark-data "$repo_url" benchmark-history
196- if [ -d benchmark-history/runs ]; then
197- cp -R benchmark-history/runs/. pr-history/runs/
198- fi
205+ if git ls-remote --exit-code --heads "$repo_url" "${BENCHMARK_DATA_BRANCH}" >/dev/null 2>&1; then
206+ git clone --depth 1 --branch "${BENCHMARK_DATA_BRANCH}" "$repo_url" benchmark-history
207+ else
208+ mkdir benchmark-history
209+ pushd benchmark-history >/dev/null
210+ git init
211+ git checkout -b "${BENCHMARK_DATA_BRANCH}"
212+ git remote add origin "$repo_url"
213+ popd >/dev/null
214+ fi
215+
216+ if [ -d benchmark-history/runs ]; then
217+ cp -R benchmark-history/runs/. pr-history/runs/
199218 fi
200219
201220 RUN_ID="$(python3 -c 'import json; print(json.load(open("current-run/run-metadata.json"))["runId"])')"
@@ -207,6 +226,95 @@ jobs:
207226 --output-dir pr-site \
208227 --repository "${GITHUB_REPOSITORY}"
209228
229+ - name : Resolve PR preview target
230+ id : preview_target
231+ run : |
232+ set -euo pipefail
233+
234+ pr_number="${INPUT_SOURCE_PR_NUMBER:-${INPUT_TRIGGER_PR_NUMBER:-${GH_EVENT_PR_NUMBER:-}}}"
235+ run_id="$(python3 -c 'import json; print(json.load(open("current-run/run-metadata.json"))["runId"])')"
236+
237+ if [ -z "${pr_number}" ]; then
238+ echo "No PR number resolved; skipping PR preview publishing."
239+ echo "has_pr_number=false" >> "$GITHUB_OUTPUT"
240+ exit 0
241+ fi
242+
243+ preview_root="pr-${pr_number}"
244+ preview_run_dir="${preview_root}/${run_id}"
245+ preview_latest_dir="${preview_root}/latest"
246+ base_url="${PR_PREVIEW_BASE_URL%/}"
247+
248+ echo "has_pr_number=true" >> "$GITHUB_OUTPUT"
249+ echo "pr_number=${pr_number}" >> "$GITHUB_OUTPUT"
250+ echo "preview_root=${preview_root}" >> "$GITHUB_OUTPUT"
251+ echo "preview_run_dir=${preview_run_dir}" >> "$GITHUB_OUTPUT"
252+ echo "preview_latest_dir=${preview_latest_dir}" >> "$GITHUB_OUTPUT"
253+ echo "preview_run_url=${base_url}/${preview_run_dir}/" >> "$GITHUB_OUTPUT"
254+ echo "preview_latest_url=${base_url}/${preview_latest_dir}/" >> "$GITHUB_OUTPUT"
255+
256+ - name : Publish PR preview content to benchmark-data branch
257+ if : ${{ steps.preview_target.outputs.has_pr_number == 'true' }}
258+ run : |
259+ set -euo pipefail
260+
261+ preview_run_path="pr-previews/${{ steps.preview_target.outputs.preview_run_dir }}"
262+ preview_latest_path="pr-previews/${{ steps.preview_target.outputs.preview_latest_dir }}"
263+ preview_root_path="pr-previews/${{ steps.preview_target.outputs.preview_root }}"
264+
265+ rm -rf "benchmark-history/${preview_run_path}" "benchmark-history/${preview_latest_path}"
266+ mkdir -p "benchmark-history/${preview_run_path}" "benchmark-history/${preview_latest_path}"
267+ cp -R pr-site/. "benchmark-history/${preview_run_path}/"
268+ cp -R pr-site/. "benchmark-history/${preview_latest_path}/"
269+
270+ pushd benchmark-history >/dev/null
271+ git config user.name "github-actions[bot]"
272+ git config user.email "41898282+github-actions[bot]@users.noreply.github.com"
273+ git add "${preview_root_path}"
274+
275+ if git diff --cached --quiet; then
276+ echo "No preview page changes to commit."
277+ else
278+ git commit -m "Update PR preview ${preview_root_path}"
279+ git push origin HEAD:"${BENCHMARK_DATA_BRANCH}"
280+ fi
281+ popd >/dev/null
282+
283+ - name : Build deployable site (main + PR previews)
284+ run : |
285+ set -euo pipefail
286+ mkdir -p benchmark-history/runs
287+ python3 scripts/generate_pages.py \
288+ --history-root benchmark-history/runs \
289+ --output-dir site \
290+ --repository "${GITHUB_REPOSITORY}"
291+
292+ if [ -d benchmark-history/pr-previews ]; then
293+ mkdir -p site/pr-previews
294+ cp -R benchmark-history/pr-previews/. site/pr-previews/
295+ fi
296+
297+ - name : Configure Pages
298+ uses : actions/configure-pages@v5
299+
300+ - name : Upload Pages artifact
301+ uses : actions/upload-pages-artifact@v3
302+ with :
303+ path : site
304+
305+ - name : Deploy to GitHub Pages
306+ id : deploy
307+ uses : actions/deploy-pages@v4
308+
309+ - name : Add PR preview links to job summary
310+ if : ${{ steps.preview_target.outputs.has_pr_number == 'true' }}
311+ run : |
312+ {
313+ echo "### PR Preview Links"
314+ echo "- Latest: ${{ steps.preview_target.outputs.preview_latest_url }}"
315+ echo "- This run: ${{ steps.preview_target.outputs.preview_run_url }}"
316+ } >> "$GITHUB_STEP_SUMMARY"
317+
210318 - name : Add summary to job page
211319 run : |
212320 python3 scripts/print_summary_markdown.py pr-site/summary.json --limit 60 >> "$GITHUB_STEP_SUMMARY"
@@ -229,13 +337,16 @@ jobs:
229337 const [owner, repo] = process.env.INPUT_TRIGGER_REPOSITORY.split("/");
230338 const prNumber = parseInt(process.env.INPUT_TRIGGER_PR_NUMBER, 10);
231339 const runUrl = `https://github.com/${process.env.GITHUB_REPOSITORY}/actions/runs/${process.env.GITHUB_RUN_ID}`;
340+ const previewUrl = `${{ steps.preview_target.outputs.preview_latest_url }}`;
341+ const previewLine = previewUrl ? `- [View PR preview page](${previewUrl})\n` : "";
232342 await github.rest.issues.createComment({
233343 owner,
234344 repo,
235345 issue_number: prNumber,
236346 body:
237347 "Performance benchmark completed successfully.\n\n" +
238- `- [View benchmark results](${runUrl})`,
348+ `- [View benchmark workflow run](${runUrl})\n` +
349+ previewLine,
239350 });
240351
241352 - name : Comment benchmark failure on triggering PR
0 commit comments