name: regression on: pull_request: push: branches: - main jobs: changes: name: Detect changes runs-on: ubuntu-latest timeout-minutes: 2 outputs: code: ${{ steps.filter.outputs.code }} steps: - uses: actions/checkout@v4 - uses: dorny/paths-filter@v3 id: filter with: filters: | code: - "packages/core/**" - "packages/producer/**" - "packages/engine/**" - "scripts/**" - "Dockerfile*" regression-shards: needs: changes if: needs.changes.outputs.code == 'true' runs-on: ubuntu-latest timeout-minutes: 40 strategy: fail-fast: false matrix: include: - shard: fast args: "--sequential --exclude-tags slow" - shard: styles-a args: "style-1-prod style-2-prod style-3-prod" - shard: styles-b args: "style-4-prod style-5-prod style-6-prod" - shard: styles-c args: "style-7-prod style-8-prod style-9-prod" - shard: styles-d args: "style-10-prod style-11-prod style-12-prod" - shard: styles-e args: "style-13-prod style-15-prod style-16-prod" - shard: styles-f args: "style-17-prod style-18-prod" - shard: styles-g args: "overlay-montage-prod" steps: - name: Checkout (with LFS) uses: actions/checkout@v4 with: lfs: true - name: Validate LFS files run: | echo "Checking golden baseline MP4s are real files (not LFS pointers)..." for mp4 in packages/producer/tests/*/output/output.mp4; do if [ -f "$mp4" ]; then size=$(stat --format=%s "$mp4") if [ "$size" -lt 1000 ]; then echo "ERROR: $mp4 appears to be an LFS pointer ($size bytes)" exit 1 fi echo "OK: $mp4 ($size bytes)" fi done - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Build test Docker image (cached) uses: docker/build-push-action@v6 with: context: . file: Dockerfile.test load: true tags: hyperframes-producer:test cache-from: type=gha,scope=regression-test-image cache-to: type=gha,mode=max,scope=regression-test-image - name: "Run regression shard: ${{ matrix.shard }}" run: | echo "Shard: ${{ matrix.shard }}" echo "Args: ${{ matrix.args }}" docker run --rm \ --security-opt seccomp=unconfined \ --shm-size=4g \ -v ${{ github.workspace }}/packages/producer/tests:/app/packages/producer/tests \ hyperframes-producer:test \ ${{ matrix.args }} - name: Upload failure artifacts if: failure() uses: actions/upload-artifact@v4 with: name: regression-failures-${{ matrix.shard }} path: packages/producer/tests/*/failures/ if-no-files-found: ignore # Summary job — matches the required check name in branch protection regression: runs-on: ubuntu-latest needs: [changes, regression-shards] if: always() steps: - name: Check results run: | if [ "${{ needs.changes.outputs.code }}" != "true" ]; then echo "No code changes — skipping regression (auto-pass)" exit 0 fi if [ "${{ needs.regression-shards.result }}" != "success" ]; then echo "One or more regression shards failed" exit 1 fi