next.js/.github/workflows/test_e2e_deploy_release.yml
test_e2e_deploy_release.yml313 lines10.4 KB
name: test-e2e-deploy-release

on:
  # run on every release/prerelease
  release:
    types: [published]
  # allow triggering manually as well
  workflow_dispatch:
    inputs:
      nextVersion:
        description: canary or custom tarball URL
        default: canary
        type: string
      vercelCliVersion:
        description: Version of Vercel CLI to use
        default: 'vercel@latest'
        type: string
      overrideProxyAddress:
        description: Override the proxy address to use for the test
        default: ''
        type: string
      deployScriptPath:
        description: Custom deploy script path (NEXT_TEST_DEPLOY_SCRIPT_PATH)
        default: ''
        type: string
      deployLogsScriptPath:
        description: Custom deploy logs script path (NEXT_TEST_DEPLOY_LOGS_SCRIPT_PATH)
        default: ''
        type: string
      cleanupScriptPath:
        description: Custom cleanup script path (NEXT_TEST_CLEANUP_SCRIPT_PATH)
        default: ''
        type: string

env:
  DD_ENV: 'ci'
  DATADOG_API_KEY: ${{ secrets.DATA_DOG_API_KEY }}
  VERCEL_TEST_TEAM: vtest314-next-e2e-tests
  VERCEL_TEST_TOKEN: ${{ secrets.VERCEL_TEST_TOKEN }}
  VERCEL_ADAPTER_TEST_TEAM: vtest314-next-adapter-e2e-tests
  VERCEL_ADAPTER_TEST_TOKEN: ${{ secrets.VERCEL_ADAPTER_TEST_TOKEN }}
  VERCEL_TURBOPACK_TEST_TEAM: vtest314-next-turbo-e2e-tests
  VERCEL_TURBOPACK_TEST_TOKEN: ${{ secrets.VERCEL_TURBOPACK_TEST_TOKEN }}

run-name: test-e2e-deploy ${{ inputs.nextVersion || (github.event_name == 'release' && github.event.release.tag_name) || 'canary' }}

jobs:
  setup:
    runs-on: ubuntu-latest
    if: github.repository_owner == 'vercel'
    outputs:
      next-version: ${{ steps.version.outputs.value }}
    steps:
      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: ${{ env.NODE_LTS_VERSION }}
          check-latest: true

      - name: Setup pnpm
        run: |
          npm i -g corepack@0.31
          corepack enable

      - name: Checkout
        uses: actions/checkout@v4
        with:
          fetch-depth: 25

      - id: nextPackageInfo
        name: Get `next` package info
        run: |
          cd packages/next 
          {
            echo 'value<<EOF'
            cat package.json
            echo EOF
          } >> "$GITHUB_OUTPUT"
      - id: version
        name: Extract `next` version
        run: echo 'value=${{ fromJson(steps.nextPackageInfo.outputs.value).version }}' >> "$GITHUB_OUTPUT"

      - name: Install dependencies
        run: pnpm install

      - name: Fetch test timings
        run: node run-tests.js --timings --write-timings -g 1/1
        continue-on-error: true
        env:
          KV_REST_API_URL: ${{ secrets.KV_REST_API_URL }}
          KV_REST_API_TOKEN: ${{ secrets.KV_REST_API_TOKEN }}

      - name: Ensure test timings file exists
        run: |
          if [ ! -f test-timings.json ]; then
            echo "No timings fetched, creating empty timings file"
            echo '{}' > test-timings.json
          fi

      - name: Upload test timings
        uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
        with:
          name: test-timings
          path: test-timings.json
          retention-days: 1
          if-no-files-found: error

  test-deploy-webpack:
    name: Run Deploy Tests (Webpack)
    needs: setup
    if: ${{ github.event.inputs.deployScriptPath == '' }}
    uses: ./.github/workflows/build_reusable.yml
    secrets: inherit
    strategy:
      fail-fast: false
      matrix:
        group: [1/8, 2/8, 3/8, 4/8, 5/8, 6/8, 7/8, 8/8]
    with:
      afterBuild: |
        npm i -g vercel@latest && \
        NEXT_E2E_TEST_TIMEOUT=240000 \
        NEXT_TEST_MODE=deploy \
        IS_WEBPACK_TEST=1 \
        NEXT_EXTERNAL_TESTS_FILTERS="test/deploy-tests-manifest.json" \
        NEXT_TEST_VERSION="${{ github.event.inputs.nextVersion || needs.setup.outputs.next-version || 'canary' }}" \
        VERCEL_CLI_VERSION="${{ github.event.inputs.vercelCliVersion || 'vercel@latest' }}" \
        NEXT_TEST_DEPLOY_SCRIPT_PATH="${{ github.event.inputs.deployScriptPath || '' }}" \
        NEXT_TEST_DEPLOY_LOGS_SCRIPT_PATH="${{ github.event.inputs.deployLogsScriptPath || '' }}" \
        NEXT_TEST_CLEANUP_SCRIPT_PATH="${{ github.event.inputs.cleanupScriptPath || '' }}" \
        node run-tests.js --timings --require-timings -g ${{ matrix.group }} -c 2 --type e2e
      testTimingsArtifact: 'test-timings'
      skipNativeBuild: 'yes'
      skipNativeInstall: 'no'
      stepName: 'test-deploy-webpack-${{ matrix.group }}'
      timeout_minutes: 180
      runs_on_labels: '["ubuntu-latest"]'
      overrideProxyAddress: ${{ inputs.overrideProxyAddress || '' }}

  test-deploy-turbopack:
    name: Run Deploy Tests (Turbopack)
    needs: [setup]
    uses: ./.github/workflows/build_reusable.yml
    secrets: inherit
    strategy:
      fail-fast: false
      matrix:
        group:
          [
            1/12,
            2/12,
            3/12,
            4/12,
            5/12,
            6/12,
            7/12,
            8/12,
            9/12,
            10/12,
            11/12,
            12/12,
          ]
    with:
      afterBuild: |
        npm i -g vercel@latest && \
        NEXT_E2E_TEST_TIMEOUT=240000 \
        NEXT_TEST_MODE=deploy \
        IS_TURBOPACK_TEST=1 \
        NEXT_TEST_CONTINUE_ON_ERROR="${{ github.event.inputs.continueOnError || false }}" \
        NEXT_EXTERNAL_TESTS_FILTERS="test/deploy-tests-manifest.json" \
        NEXT_TEST_VERSION="${{ github.event.inputs.nextVersion || needs.setup.outputs.next-version || 'canary' }}" \
        VERCEL_CLI_VERSION="${{ github.event.inputs.vercelCliVersion || 'vercel@latest' }}" \
        NEXT_TEST_DEPLOY_SCRIPT_PATH="${{ github.event.inputs.deployScriptPath || '' }}" \
        NEXT_TEST_DEPLOY_LOGS_SCRIPT_PATH="${{ github.event.inputs.deployLogsScriptPath || '' }}" \
        NEXT_TEST_CLEANUP_SCRIPT_PATH="${{ github.event.inputs.cleanupScriptPath || '' }}" \
        node run-tests.js --timings --require-timings -g ${{ matrix.group }} -c 2 --type e2e
      testTimingsArtifact: 'test-timings'
      skipNativeBuild: 'yes'
      skipNativeInstall: 'no'
      stepName: 'test-deploy-turbopack-${{ matrix.group }}'
      timeout_minutes: 180
      runs_on_labels: '["ubuntu-latest"]'
      overrideProxyAddress: ${{ inputs.overrideProxyAddress || '' }}

  test-deploy-adapter:
    name: Run Deploy Adapter Tests (Turbopack)
    needs: setup
    if: ${{ github.event.inputs.deployScriptPath == '' }}
    uses: ./.github/workflows/build_reusable.yml
    secrets: inherit
    strategy:
      fail-fast: false
      matrix:
        group:
          [
            1/12,
            2/12,
            3/12,
            4/12,
            5/12,
            6/12,
            7/12,
            8/12,
            9/12,
            10/12,
            11/12,
            12/12,
          ]
    with:
      afterBuild: |
        npm i -g vercel@latest && \
        NEXT_E2E_TEST_TIMEOUT=240000 \
        NEXT_TEST_MODE=deploy \
        IS_TURBOPACK_TEST=1 \
        NEXT_ENABLE_ADAPTER=1 \
        NEXT_EXTERNAL_TESTS_FILTERS="test/deploy-tests-manifest.json" \
        NEXT_TEST_VERSION="${{ github.event.inputs.nextVersion || needs.setup.outputs.next-version || 'canary' }}" \
        VERCEL_CLI_VERSION="${{ github.event.inputs.vercelCliVersion || 'vercel@latest' }}" \
        node run-tests.js --timings --require-timings -g ${{ matrix.group }} -c 2 --type e2e
      testTimingsArtifact: 'test-timings'
      skipNativeBuild: 'yes'
      skipNativeInstall: 'no'
      stepName: 'test-deploy-deploy-${{ matrix.group }}'
      testReportsArtifactPrefix: 'adapter-test-reports'
      timeout_minutes: 180
      runs_on_labels: '["ubuntu-latest"]'
      overrideProxyAddress: ${{ inputs.overrideProxyAddress || '' }}

  report-test-results-to-datadog:
    needs: [test-deploy-turbopack, test-deploy-webpack]
    if: ${{ always() && github.event.inputs.deployScriptPath == '' }}

    runs-on: ubuntu-latest
    name: Report test results to datadog
    steps:
      - uses: actions/checkout@v6
        with:
          sparse-checkout: |
            .github

      - name: Download test report artifacts
        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
        with:
          pattern: test-reports-*
          path: test
          merge-multiple: true

      - name: Install datadog-ci
        if: ${{ env.DATADOG_API_KEY != '' }}
        uses: ./.github/actions/setup-datadog-ci

      - name: Upload test report to datadog
        if: ${{ env.DATADOG_API_KEY != '' }}
        run: |
          if [ -d ./test/test-junit-report ]; then
            DD_ENV=ci "$DATADOG_CI_PATH" junit upload --tags test.type:deploy --service nextjs ./test/test-junit-report
          fi

  upload-adapter-test-results:
    name: Upload adapter test results
    needs: [test-deploy-adapter]
    if: >-
      ${{
        always() &&
        github.event.inputs.deployScriptPath == '' &&
        github.repository_owner == 'vercel' &&
        !startsWith(
          github.event.inputs.nextVersion || github.event.release.tag_name || 'canary',
          'http'
        )
      }}
    runs-on: ubuntu-latest
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Setup Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20.9.0
          check-latest: true

      - name: Download adapter test result artifacts
        continue-on-error: true
        uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
        with:
          pattern: adapter-test-reports-*
          path: adapter-test-results
          merge-multiple: true

      - name: Upload adapter test results
        run: |
          if [ -z "${ADAPTER_TEST_RESULTS_SECRET:-}" ]; then
            echo "ADAPTER_TEST_RESULTS_SECRET is not configured, skipping upload"
            exit 0
          fi

          if [ ! -d adapter-test-results ]; then
            echo "No adapter test artifact directory found, skipping upload"
            exit 0
          fi

          if ! find adapter-test-results -type f -name '*.results.json' | grep -q .; then
            echo "No adapter .results.json files found, skipping upload"
            exit 0
          fi

          node scripts/upload-adapter-test-results.mjs \
            --results-root adapter-test-results \
            --provider vercel \
            --commit-sha "${{ github.sha }}"
        env:
          ADAPTER_TEST_RESULTS_SECRET: ${{ secrets.ADAPTER_TEST_RESULTS_SECRET }}
Quest for Codev2.0.0
/
SIGN IN