Skip to content

Commit 51d67d3

Browse files
committed
ci: select Hurl examples by path
1 parent 9acf4bd commit 51d67d3

1 file changed

Lines changed: 67 additions & 2 deletions

File tree

‎.github/workflows/ci.yml‎

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -333,22 +333,85 @@ jobs:
333333
retention-days: 1
334334
hurl_examples:
335335
runs-on: ubuntu-latest
336+
env:
337+
DIFF_BASE: ${{ github.event.pull_request.base.sha || github.event.merge_group.base_sha || github.event.before }}
338+
DIFF_HEAD: ${{ github.event.pull_request.head.sha || github.event.merge_group.head_sha || github.sha }}
336339
outputs:
337340
examples: ${{ steps.examples.outputs.examples }}
338341
steps:
339342
- uses: actions/checkout@v7
343+
with:
344+
fetch-depth: 0
340345
- id: examples
346+
name: Select relevant Hurl examples
347+
shell: bash
341348
run: |
342-
examples="$(find examples -mindepth 2 -maxdepth 2 -name test.hurl -print | sed 's#/test.hurl$##' | sort | jq -R -s -c 'split("\n")[:-1]')"
349+
set -euo pipefail
350+
all_examples() {
351+
find examples -mindepth 2 -maxdepth 2 -name test.hurl -print \
352+
| sed 's#/test.hurl$##' \
353+
| sort \
354+
| jq -R -s -c 'split("\n")[:-1]'
355+
}
356+
357+
if [[ "$GITHUB_REF_TYPE" == tag || -z "$DIFF_BASE" || -z "$DIFF_HEAD" || "$DIFF_BASE" =~ ^0+$ ]]; then
358+
examples="$(all_examples)"
359+
elif ! git cat-file -e "${DIFF_BASE}^{commit}" || ! git cat-file -e "${DIFF_HEAD}^{commit}"; then
360+
echo "Could not resolve the event's diff range; running all Hurl examples."
361+
examples="$(all_examples)"
362+
elif ! changed_paths="$(git diff --name-only "${DIFF_BASE}...${DIFF_HEAD}")"; then
363+
echo "Could not compare the event's commits; running all Hurl examples."
364+
examples="$(all_examples)"
365+
else
366+
declare -A selected=()
367+
run_all=false
368+
while IFS= read -r path; do
369+
case "$path" in
370+
# Build, harness, or workflow changes can affect every example.
371+
Dockerfile|.dockerignore|Cargo.toml|Cargo.lock|build.rs|\
372+
.cargo/*|scripts/*|.github/workflows/ci.yml)
373+
run_all=true
374+
;;
375+
# These suites cover telemetry and SMTP integrations end to end.
376+
src/telemetry.rs|src/main.rs|src/webserver/http.rs|\
377+
src/webserver/database/execute_queries.rs)
378+
selected["examples/telemetry"]=1
379+
;;
380+
src/app_config.rs|src/webserver/database/sqlpage_functions/functions/send_mail.rs)
381+
selected["examples/sending emails"]=1
382+
;;
383+
# Example-local edits run that example's Hurl suite.
384+
examples/*)
385+
relative_path="${path#examples/}"
386+
example="examples/${relative_path%%/*}"
387+
[[ -f "$example/test.hurl" ]] && selected["$example"]=1
388+
;;
389+
esac
390+
done <<< "$changed_paths"
391+
392+
if [[ "$run_all" == true ]]; then
393+
examples="$(all_examples)"
394+
elif ((${#selected[@]} == 0)); then
395+
examples='[]'
396+
else
397+
examples="$(printf '%s\n' "${!selected[@]}" | sort | jq -R -s -c 'split("\n")[:-1]')"
398+
fi
399+
fi
343400
echo "examples=$examples" >> "$GITHUB_OUTPUT"
401+
if [[ "$examples" == '[]' ]]; then
402+
echo 'No Hurl examples match these changes; Rust and Playwright checks still run.' >> "$GITHUB_STEP_SUMMARY"
403+
else
404+
echo "Selected Hurl examples: $examples" >> "$GITHUB_STEP_SUMMARY"
405+
fi
344406
- name: Restore Hurl archive
345407
id: hurl-cache
408+
if: steps.examples.outputs.examples != '[]'
346409
uses: actions/cache@v6
347410
with:
348411
path: .cache/hurl
349412
key: hurl-${{ runner.os }}-x86_64-unknown-linux-gnu-${{ env.HURL_VERSION }}
350413
- name: Download Hurl archive
351-
if: steps.hurl-cache.outputs.cache-hit != 'true'
414+
if: steps.examples.outputs.examples != '[]' && steps.hurl-cache.outputs.cache-hit != 'true'
352415
run: |
353416
set -euo pipefail
354417
archive="hurl-${HURL_VERSION}-x86_64-unknown-linux-gnu.tar.gz"
@@ -363,6 +426,7 @@ jobs:
363426
test "$expected_sha" = "$actual_sha"
364427
)
365428
- name: Upload Hurl archive
429+
if: steps.examples.outputs.examples != '[]'
366430
uses: actions/upload-artifact@v7
367431
with:
368432
name: hurl-${{ env.HURL_VERSION }}-x86_64-unknown-linux-gnu
@@ -373,6 +437,7 @@ jobs:
373437
hurl:
374438
name: hurl (${{ matrix.example }})
375439
runs-on: ubuntu-latest
440+
if: ${{ needs.hurl_examples.outputs.examples != '[]' }}
376441
timeout-minutes: 15
377442
needs:
378443
- docker_build

0 commit comments

Comments
 (0)