feat(vercel): Add API-driven pipeline backend for Vercel integration setup #303792
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # Also note that this name *MUST* match the filename because GHA | |
| # only provides the workflow name (https://docs.github.com/en/free-pro-team@latest/actions/reference/environment-variables#default-environment-variables) | |
| # and GH APIs only support querying by workflow *FILENAME* (https://developer.github.com/v3/actions/workflows/#get-a-workflow) | |
| name: acceptance | |
| on: | |
| push: | |
| branches: | |
| - master | |
| - releases/** | |
| pull_request: | |
| # Cancel in progress workflows on pull_requests. | |
| # https://docs.github.com/en/actions/using-jobs/using-concurrency#example-using-a-fallback-value | |
| concurrency: | |
| group: ${{ github.workflow }}-${{ github.head_ref || github.run_id }} | |
| cancel-in-progress: true | |
| # hack for https://github.com/actions/cache/issues/810#issuecomment-1222550359 | |
| env: | |
| SEGMENT_DOWNLOAD_TIMEOUT_MINS: 3 | |
| NODE_OPTIONS: '--max-old-space-size=4096' | |
| CHARTCUTERIE_CONFIG_PATH: ${{ github.workspace }}/config/chartcuterie | |
| SNUBA_NO_WORKERS: 1 | |
| jobs: | |
| files-changed: | |
| name: detect what files changed | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 3 | |
| # Map a step output to a job output | |
| outputs: | |
| acceptance: ${{ steps.changes.outputs.acceptance }} | |
| backend_all: ${{ steps.changes.outputs.backend_all }} | |
| frontend_all: ${{ steps.changes.outputs.frontend_all }} | |
| steps: | |
| - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | |
| - name: Check for backend file changes | |
| uses: dorny/paths-filter@0bc4621a3135347011ad047f9ecf449bf72ce2bd # v3.0.0 | |
| id: changes | |
| with: | |
| token: ${{ github.token }} | |
| filters: .github/file-filters.yml | |
| acceptance: | |
| if: needs.files-changed.outputs.acceptance == 'true' | |
| needs: files-changed | |
| name: acceptance | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 30 | |
| permissions: | |
| contents: read | |
| id-token: write | |
| actions: read # used for DIM metadata | |
| strategy: | |
| # This helps not having to run multiple jobs because one fails, thus, reducing resource usage | |
| # and reducing the risk that one of many runs would turn red again (read: intermittent tests) | |
| fail-fast: false | |
| matrix: | |
| # XXX: Use 5 runners when backend changes are present, 10 runners for frontend-only changes | |
| instance: ${{ needs.files-changed.outputs.backend_all == 'true' && fromJSON('[0, 1, 2, 3, 4]') || fromJSON('[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]') }} | |
| env: | |
| # XXX: MATRIX_INSTANCE_TOTAL must match the matrix size (5 for backend changes, 10 for frontend-only) | |
| MATRIX_INSTANCE_TOTAL: ${{ needs.files-changed.outputs.backend_all == 'true' && '5' || '10' }} | |
| TEST_GROUP_STRATEGY: roundrobin | |
| PYTHONHASHSEED: '0' | |
| XDIST_PER_WORKER_SNUBA: '1' | |
| XDIST_WORKERS: '2' | |
| steps: | |
| - uses: actions/checkout@692973e3d937129bcbf40652eb9f2f61becf3332 # v4.1.7 | |
| name: Checkout sentry | |
| - run: mkdir -p config/chartcuterie | |
| - uses: ./.github/actions/setup-devservices | |
| with: | |
| mode: acceptance-ci | |
| - name: Start Snuba bootstrap | |
| if: env.XDIST_PER_WORKER_SNUBA == '1' | |
| run: | | |
| # Start in background early so it overlaps with webpack and sentry env setup. | |
| # The script polls for ClickHouse readiness itself. | |
| python3 ./.github/actions/setup-devservices/bootstrap-snuba.py & | |
| - name: Step configurations | |
| id: config | |
| run: | | |
| echo "webpack-path=.webpack_cache" >> "$GITHUB_OUTPUT" | |
| echo "WEBPACK_CACHE_PATH=.webpack_cache" >> "$GITHUB_ENV" | |
| - name: webpack cache | |
| uses: actions/cache@1bd1e32a3bdc45362d1e726936510720a7c30a57 # v4.2.0 | |
| with: | |
| path: ${{ steps.config.outputs.webpack-path }} | |
| key: ${{ runner.os }}-v2-webpack-cache-${{ hashFiles('rspack.config.ts', 'pnpm-lock.yaml', 'package.json') }} | |
| - uses: ./.github/actions/setup-node-pnpm | |
| - name: webpack | |
| env: | |
| CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }} | |
| GH_COMMIT_SHA: ${{ github.event.pull_request.head.sha }} | |
| run: | | |
| pnpm run build-acceptance | |
| - name: Build chartcuterie configuration module | |
| run: | | |
| make build-chartcuterie-config | |
| - name: Setup sentry env | |
| uses: ./.github/actions/setup-sentry | |
| id: setup | |
| with: | |
| mode: acceptance-ci | |
| skip-devservices: 'true' | |
| - name: Wait for devservices | |
| run: | | |
| sentry init | |
| ./.github/actions/setup-devservices/wait.sh | |
| - name: Wait for Snuba bootstrap | |
| if: env.XDIST_PER_WORKER_SNUBA == '1' | |
| run: | | |
| timeout 600 bash -c 'until [ -f /tmp/snuba-bootstrap-exit ]; do sleep 2; done' || | |
| { echo "::error::Timed out waiting for Snuba bootstrap after 600s"; exit 1; } | |
| rc=$(</tmp/snuba-bootstrap-exit) | |
| [ "$rc" -eq 0 ] || { echo "::error::Snuba per-worker bootstrap failed"; exit "$rc"; } | |
| - name: Run acceptance tests (#${{ steps.setup.outputs.matrix-instance-number }} of ${{ steps.setup.outputs.matrix-instance-total }}) | |
| run: | | |
| export PYTEST_ADDOPTS="$PYTEST_ADDOPTS -n ${XDIST_WORKERS} --dist=loadfile" | |
| timeout 1200 make run-acceptance || rc=$? | |
| [ "${rc:-0}" -ne 124 ] || echo "::error::Test run timed out after 20 minutes (possible xdist hang)" | |
| exit "${rc:-0}" | |
| - name: Inspect failure | |
| if: failure() | |
| run: | | |
| if [ -f /tmp/ds.log ]; then | |
| echo "--- devservices startup log ---" | |
| cat /tmp/ds.log | |
| fi | |
| if command -v devservices; then | |
| devservices logs | |
| fi | |
| if [ "${XDIST_PER_WORKER_SNUBA}" = "1" ]; then | |
| for i in $(seq 0 $(( ${XDIST_WORKERS} - 1 ))); do | |
| echo "--- snuba-gw${i} logs ---" | |
| docker logs "snuba-gw${i}" 2>&1 | tail -30 || true | |
| done | |
| fi | |
| - name: Collect test data | |
| uses: ./.github/actions/collect-test-data | |
| if: ${{ !cancelled() }} | |
| with: | |
| artifact_path: .artifacts/pytest.acceptance.json | |
| gcs_bucket: ${{ secrets.COLLECT_TEST_DATA_GCS_BUCKET }} | |
| gcp_project_id: ${{ secrets.COLLECT_TEST_DATA_GCP_PROJECT_ID }} | |
| workload_identity_provider: ${{ secrets.SENTRY_GCP_DEV_WORKLOAD_IDENTITY_POOL }} | |
| service_account_email: ${{ secrets.COLLECT_TEST_DATA_SERVICE_ACCOUNT_EMAIL }} | |
| matrix_instance_number: ${{ steps.setup.outputs.matrix-instance-number }} | |
| acceptance-required-checks: | |
| # this is a required check so we need this job to always run and report a status. | |
| if: always() | |
| name: Acceptance | |
| needs: [acceptance, files-changed] | |
| runs-on: ubuntu-24.04 | |
| timeout-minutes: 3 | |
| steps: | |
| - name: Check for failures | |
| if: contains(needs.*.result, 'failure') || contains(needs.*.result, 'cancelled') | |
| run: | | |
| echo "One of the dependent jobs have failed. You may need to re-run it." && exit 1 |