next.js/.github/workflows/trigger_release.yml
trigger_release.yml131 lines4.1 KB
on:
  schedule:
    # run every day at 23:15
    - cron: '15 23 * * *'

  workflow_dispatch:
    inputs:
      releaseType:
        description: stable, canary, beta, or release candidate?
        required: true
        type: choice
        options:
          - canary
          - stable
          - release-candidate
          - beta

      semverType:
        description: semver type?
        type: choice
        options:
          - patch
          - minor
          - major

      force:
        description: create a new release even if there are no new commits
        default: false
        type: boolean

name: Trigger Release

env:
  NAPI_CLI_VERSION: 2.18.4
  TURBO_VERSION: 2.9.4
  NODE_LTS_VERSION: 20

jobs:
  start:
    if: github.repository_owner == 'vercel'
    runs-on: ubuntu-latest
    env:
      NEXT_TELEMETRY_DISABLED: 1
      # we build a dev binary for use in CI so skip downloading
      # canary next-swc binaries in the monorepo
      NEXT_SKIP_NATIVE_POSTINSTALL: 1

    steps:
      - name: Setup node
        uses: actions/setup-node@v4
        with:
          node-version: 20
          check-latest: true

      - name: Create GitHub App token
        id: release-app-token
        uses: actions/create-github-app-token@v3
        with:
          client-id: ${{ vars.RELEASE_GITHUB_APP_CLIENT_ID }}
          private-key: ${{ secrets.RELEASE_GITHUB_APP_PRIVATE_KEY }}
          owner: ${{ github.repository_owner }}
          repositories: next.js
          permission-contents: write

      - name: Get GitHub App user ID
        id: release-app-user
        run: |
          user_id="$(gh api "/users/${{ steps.release-app-token.outputs.app-slug }}[bot]" --jq .id)"
          echo "user-id=$user_id" >> "$GITHUB_OUTPUT"
        env:
          GH_TOKEN: ${{ steps.release-app-token.outputs.token }}

      - name: Clone Next.js repository
        run: git clone https://github.com/vercel/next.js.git --depth=25 --single-branch --branch ${GITHUB_REF_NAME:-canary} .

      - name: Check token
        run: gh auth status
        # This sometimes fails for unknown reasons.
        # Ignoring failures for now to check if a failure truly implies a failed publish.
        continue-on-error: true
        env:
          GH_TOKEN: ${{ steps.release-app-token.outputs.token }}

      - name: Get commit of the latest tag
        run: |
          git fetch --tags --force --deepen=1000 origin
          latest_tag="$(git describe --tags --abbrev=0)"
          echo "LATEST_TAG_COMMIT=$(git rev-list -n 1 "$latest_tag")" >> $GITHUB_ENV

      - name: Get latest commit
        run: echo "LATEST_COMMIT=$(git rev-parse HEAD)" >> $GITHUB_ENV

      - name: Check if new commits since last tag
        if: ${{ github.event.inputs.releaseType != 'stable' && github.event.inputs.force != true }}
        run: |
          if [ "$LATEST_TAG_COMMIT" = "$LATEST_COMMIT" ]; then
            echo "No new commits. Exiting..."
            exit 1
          fi

      # https://github.com/actions/virtual-environments/issues/1187
      - name: tune linux network
        run: sudo ethtool -K eth0 tx off rx off

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

      - id: get-store-path
        run: echo STORE_PATH=$(pnpm store path) >> $GITHUB_OUTPUT

      - uses: actions/cache@v4
        timeout-minutes: 5
        id: cache-pnpm-store
        with:
          path: ${{ steps.get-store-path.outputs.STORE_PATH }}
          key: pnpm-store-v2-${{ hashFiles('pnpm-lock.yaml') }}
          # Do not use restore-keys since it leads to indefinite growth of the cache.

      - run: pnpm install

      - run: node ./scripts/start-release.js --release-type "${INPUT_RELEASETYPE}" --semver-type "${INPUT_SEMVERTYPE}"
        env:
          RELEASE_GITHUB_TOKEN: ${{ steps.release-app-token.outputs.token }}
          RELEASE_GITHUB_APP_SLUG: ${{ steps.release-app-token.outputs.app-slug }}
          RELEASE_GITHUB_APP_USER_ID: ${{ steps.release-app-user.outputs.user-id }}
          INPUT_RELEASETYPE: ${{ github.event.inputs.releaseType || 'canary' }}
          INPUT_SEMVERTYPE: ${{ github.event.inputs.semverType }}
Quest for Codev2.0.0
/
SIGN IN