|
30 | 30 | - "5.1" |
31 | 31 | - "4.5" |
32 | 32 | default: "5.2" |
| 33 | + sweep: |
| 34 | + description: Also run the full showcase falsifier sweep (5.2, sharded) |
| 35 | + required: false |
| 36 | + type: boolean |
| 37 | + default: false |
33 | 38 | schedule: |
34 | 39 | - cron: "0 7 * * 1" # weekly, Monday 07:00 UTC |
35 | 40 | push: |
@@ -391,17 +396,130 @@ jobs: |
391 | 396 | --xvfb \ |
392 | 397 | --catalog tests/smoke/catalog.json |
393 | 398 |
|
394 | | - - name: Full showcase falsifier sweep (weekly, 5.2) |
395 | | - # The catalog runs one falsifier per row on every smoke run. The weekly |
396 | | - # cron also runs every falsifier in every showcase README table and |
397 | | - # asserts each lands on the exit it declares (~5 min). |
398 | | - if: ${{ github.event_name == 'schedule' && matrix.series == '5.2' }} |
399 | | - run: | |
400 | | - set -euo pipefail |
401 | | - python3 tests/check_falsifier_targets.py --run "$BLENDER" |
402 | | -
|
403 | 399 | - name: Smoke summary |
404 | 400 | if: ${{ always() && env.BLENDER != '' }} |
405 | 401 | run: | |
406 | 402 | set -euo pipefail |
407 | 403 | python3 tests/smoke/summarize.py --status "$BDT_SMOKE_STATUS" |
| 404 | +
|
| 405 | + showcase-sweep: |
| 406 | + # The catalog runs one falsifier per row on every smoke run. The weekly |
| 407 | + # cron also runs every falsifier in every showcase README table and asserts |
| 408 | + # each lands on the exit it declares. At 80 pieces / 800+ falsifiers one |
| 409 | + # serial sweep no longer fit beside the happy paths in the smoke job's 75 |
| 410 | + # minutes (cancelled on 2026-10-12, #482), so it is its own job, fanned out |
| 411 | + # over four jobs by piece (check_falsifier_targets.py --shard K/N). |
| 412 | + name: Showcase falsifier sweep ${{ matrix.shard }}/4 (5.2) |
| 413 | + if: github.event_name == 'schedule' || (github.event_name == 'workflow_dispatch' && inputs.sweep) |
| 414 | + runs-on: ubuntu-latest |
| 415 | + timeout-minutes: 60 |
| 416 | + strategy: |
| 417 | + fail-fast: false |
| 418 | + matrix: |
| 419 | + shard: [0, 1, 2, 3] # N is 4: keep the "/4" in the job name and the run step in step |
| 420 | + steps: |
| 421 | + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7 |
| 422 | + |
| 423 | + - name: Install Blender runtime libraries |
| 424 | + run: | |
| 425 | + set -euo pipefail |
| 426 | + sudo apt-get update |
| 427 | + sudo apt-get install -y --no-install-recommends \ |
| 428 | + xvfb libgl1 libegl1 libxrender1 libxxf86vm1 libxfixes3 libxi6 \ |
| 429 | + libxkbcommon0 libsm6 libice6 |
| 430 | +
|
| 431 | + - name: Resolve Blender 5.2 |
| 432 | + id: resolve |
| 433 | + run: | |
| 434 | + set -euo pipefail |
| 435 | + base="https://download.blender.org/release/Blender5.2/" |
| 436 | + file=$(curl -fsSL "$base" \ |
| 437 | + | grep -oE "blender-5\.2\.[0-9]+-linux-x64\.tar\.xz" \ |
| 438 | + | sort -V | uniq | tail -1) |
| 439 | + if [ -z "$file" ]; then |
| 440 | + echo "::error::Could not resolve a linux-x64 build for Blender 5.2 at $base" |
| 441 | + exit 1 |
| 442 | + fi |
| 443 | + version="${file#blender-}" |
| 444 | + version="${version%-linux-x64.tar.xz}" |
| 445 | + echo "base=$base" >> "$GITHUB_OUTPUT" |
| 446 | + echo "file=$file" >> "$GITHUB_OUTPUT" |
| 447 | + echo "version=$version" >> "$GITHUB_OUTPUT" |
| 448 | +
|
| 449 | + - name: Restore Blender ${{ steps.resolve.outputs.version }} from cache |
| 450 | + id: bl-cache |
| 451 | + uses: actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9 # v6.1.0 |
| 452 | + with: |
| 453 | + path: ${{ runner.temp }}/bl |
| 454 | + key: blender-${{ steps.resolve.outputs.version }}-linux-x64 |
| 455 | + |
| 456 | + - name: Download Blender and verify its published sha256 |
| 457 | + if: steps.bl-cache.outputs.cache-hit != 'true' |
| 458 | + run: | |
| 459 | + set -euo pipefail |
| 460 | + base="${{ steps.resolve.outputs.base }}" |
| 461 | + file="${{ steps.resolve.outputs.file }}" |
| 462 | + version="${{ steps.resolve.outputs.version }}" |
| 463 | + mkdir -p "$RUNNER_TEMP/bl" |
| 464 | + curl -fSL --retry 3 -o "$RUNNER_TEMP/bl.tar.xz" "${base}${file}" |
| 465 | + curl -fsSL --retry 3 -o "$RUNNER_TEMP/bl.sha256" "${base}blender-${version}.sha256" |
| 466 | + expected=$(grep -E " ${file}$" "$RUNNER_TEMP/bl.sha256" | awk '{print $1}') |
| 467 | + if [ -z "$expected" ]; then |
| 468 | + echo "::error::no published sha256 for ${file}" |
| 469 | + exit 1 |
| 470 | + fi |
| 471 | + echo "${expected} $RUNNER_TEMP/bl.tar.xz" | sha256sum -c - \ |
| 472 | + || { echo "::error::sha256 mismatch for ${file}; refusing to extract"; exit 1; } |
| 473 | + tar -xf "$RUNNER_TEMP/bl.tar.xz" -C "$RUNNER_TEMP/bl" |
| 474 | +
|
| 475 | + - name: Locate Blender binary |
| 476 | + run: | |
| 477 | + set -euo pipefail |
| 478 | + bl=$(find "$RUNNER_TEMP/bl" -maxdepth 2 -type f -name blender | head -1) |
| 479 | + if [ -z "$bl" ]; then |
| 480 | + echo "::error::blender binary not found" |
| 481 | + exit 1 |
| 482 | + fi |
| 483 | + "$bl" --version | head -1 |
| 484 | + echo "BLENDER=$bl" >> "$GITHUB_ENV" |
| 485 | +
|
| 486 | + - name: Run shard ${{ matrix.shard }}/4 |
| 487 | + run: | |
| 488 | + set -euo pipefail |
| 489 | + python3 tests/check_falsifier_targets.py --run "$BLENDER" --shard "${{ matrix.shard }}/4" |
| 490 | +
|
| 491 | + report-scheduled-failure: |
| 492 | + # A red or cancelled weekly run used to go unnoticed (#482): open an issue, |
| 493 | + # or comment on the one already open, so the cron is never silently red. |
| 494 | + name: Report a failed weekly run |
| 495 | + needs: [smoke, showcase-sweep] |
| 496 | + if: >- |
| 497 | + always() && github.event_name == 'schedule' && |
| 498 | + (contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled')) |
| 499 | + runs-on: ubuntu-latest |
| 500 | + timeout-minutes: 5 |
| 501 | + permissions: |
| 502 | + issues: write |
| 503 | + steps: |
| 504 | + - name: Open or update the tracking issue |
| 505 | + env: |
| 506 | + GH_TOKEN: ${{ github.token }} |
| 507 | + GH_REPO: ${{ github.repository }} |
| 508 | + RUN_URL: ${{ github.server_url }}/${{ github.repository }}/actions/runs/${{ github.run_id }} |
| 509 | + SMOKE: ${{ needs.smoke.result }} |
| 510 | + SWEEP: ${{ needs.showcase-sweep.result }} |
| 511 | + run: | |
| 512 | + set -euo pipefail |
| 513 | + title="Weekly Blender smoke run failed" |
| 514 | + body="Scheduled run: $RUN_URL |
| 515 | + - smoke matrix: \`$SMOKE\` |
| 516 | + - showcase falsifier sweep: \`$SWEEP\` |
| 517 | +
|
| 518 | + Opened by blender-smoke.yml (report-scheduled-failure). Close it once a weekly run is green." |
| 519 | + num=$(gh issue list --state open --search "\"$title\" in:title" --json number --jq '.[0].number // empty') |
| 520 | + if [ -n "$num" ]; then |
| 521 | + gh issue comment "$num" --body "$body" |
| 522 | + echo "commented on #$num" |
| 523 | + else |
| 524 | + gh issue create --title "$title" --body "$body" --label "bug,ci,priority: high" |
| 525 | + fi |
0 commit comments