name: "CI: Integration" defaults: run: shell: bash on: pull_request: paths: - 'frontend/**' - 'common/**' - 'render-wasm/**' types: - opened - synchronize - ready_for_review push: branches: - develop - staging paths: - 'frontend/**' - 'common/**' - 'render-wasm/**' concurrency: group: ${{ github.workflow }}-${{ github.event.pull_request.number || github.ref }} cancel-in-progress: true jobs: build-integration: if: ${{ !github.event.pull_request.draft }} name: "Build Integration Bundle" runs-on: penpot-runner-02 container: image: penpotapp/devenv:latest volumes: - /var/cache/github-runner/m2:/root/.m2 - /var/cache/github-runner/gitlib:/root/.gitlibs steps: - name: Checkout repository uses: actions/checkout@v6 - name: Build Bundle working-directory: ./frontend run: | ./scripts/build - name: Store Bundle Cache uses: actions/cache@v5 with: key: "integration-bundle-${{ github.sha }}" path: frontend/resources/public test-integration: if: ${{ !github.event.pull_request.draft }} name: "Integration Tests" runs-on: penpot-runner-02 container: image: penpotapp/devenv:latest volumes: - /var/cache/github-runner/m2:/root/.m2 - /var/cache/github-runner/gitlib:/root/.gitlibs needs: build-integration steps: - name: Checkout Repository uses: actions/checkout@v6 - name: Restore Cache uses: actions/cache/restore@v5 with: key: "integration-bundle-${{ github.sha }}" path: frontend/resources/public - name: Run Tests working-directory: ./frontend env: PLAYWRIGHT_REPORTER: list,json PLAYWRIGHT_JSON_OUTPUT_NAME: report.json run: | ./scripts/test-e2e - name: Flaky summary if: always() working-directory: ./frontend run: | if [ ! -f report.json ]; then echo "No report.json produced (the run failed early)." >> "$GITHUB_STEP_SUMMARY" exit 0 fi jq -r ' [ .. | objects | select(has("tests") and has("file")) | select(any(.tests[]; .status == "flaky")) | "- `\(.file):\(.line)` — \(.title)" ] as $f | "## Flaky tests: \($f | length)\n" + (if ($f | length) == 0 then "_none_" else ($f | join("\n")) end) ' report.json >> "$GITHUB_STEP_SUMMARY" - name: Upload JSON report uses: actions/upload-artifact@v7 if: always() with: name: integration-json-report path: frontend/report.json overwrite: true retention-days: 30 - name: Upload test result uses: actions/upload-artifact@v7 if: always() with: name: integration-tests-result path: frontend/test-results/ overwrite: true retention-days: 3