name: Deploy Next.js site to Pages on: push: branches: ["main"] workflow_dispatch: permissions: contents: read pages: write id-token: write concurrency: group: "pages" cancel-in-progress: true jobs: build: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@v3 with: fetch-depth: 0 - name: Detect package manager id: detect-package-manager run: | if [ -f "${{ github.workspace }}/yarn.lock" ]; then echo "manager=yarn" >> $GITHUB_OUTPUT echo "command=install --frozen-lockfile" >> $GITHUB_OUTPUT echo "runner=yarn" >> $GITHUB_OUTPUT exit 0 elif [ -f "${{ github.workspace }}/package.json" ]; then echo "manager=npm" >> $GITHUB_OUTPUT echo "command=ci" >> $GITHUB_OUTPUT echo "runner=npx --no-install" >> $GITHUB_OUTPUT exit 0 else echo "Unable to determine packager manager" exit 1 fi - name: Setup Node uses: actions/setup-node@v3 with: node-version: "16" cache: ${{ steps.detect-package-manager.outputs.manager }} - name: Cache node_modules uses: actions/cache@v3 with: path: | ~/.npm ~/.cache/yarn key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }} restore-keys: ${{ runner.os }}-node- - name: Setup Pages uses: actions/configure-pages@v3 with: static_site_generator: next - name: Restore cache uses: actions/cache@v3 with: path: | .next/cache # Generate a new cache whenever packages or source files change. key: ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}-${{ hashFiles('**.[jt]s', '**.[jt]sx') }} # If source files changed but packages didn't, rebuild from a prior cache. restore-keys: | ${{ runner.os }}-nextjs-${{ hashFiles('**/package-lock.json', '**/yarn.lock') }}- - name: Install dependencies run: ${{ steps.detect-package-manager.outputs.manager }} ${{ steps.detect-package-manager.outputs.command }} - name: Build with Next.js run: ${{ steps.detect-package-manager.outputs.runner }} next build - name: Static HTML export with Next.js run: ${{ steps.detect-package-manager.outputs.runner }} next export - name: Upload artifact uses: actions/upload-pages-artifact@v1 with: path: './out' sentry: runs-on: ubuntu-latest needs: build env: SENTRY_AUTH_TOKEN: ${{ secrets.SENTRY_AUTH_TOKEN }} SENTRY_ORG: ${{ secrets.SENTRY_ORG }} SENTRY_PROJECT: ${{ secrets.SENTRY_PROJECT }} steps: - name: Checkout uses: actions/checkout@v3 with: fetch-depth: 0 - name: Install Sentry CLI run: curl -sL https://sentry.io/get-cli/ | bash - name: Create Sentry release id: create-release run: | VERSION=$(sentry-cli releases propose-version) echo "RELEASE_VERSION=$VERSION" >> $GITHUB_ENV - name: Upload sourcemaps to Sentry run: sentry-cli releases files "$RELEASE_VERSION" upload-sourcemaps --ext map --ext js --url-prefix '~/static' './out/_next/static/' - name: Set commits for Sentry release run: sentry-cli releases set-commits "$RELEASE_VERSION" --auto - name: Deploy to Sentry run: sentry-cli releases deploys "$RELEASE_VERSION" new -e ${{ secrets.SENTRY_DEPLOY_ENVIRONMENT }} - name: Finalize Sentry release run: sentry-cli releases finalize "$RELEASE_VERSION" # Deployment job deploy: environment: name: github-pages url: ${{ steps.deployment.outputs.page_url }} runs-on: ubuntu-latest needs: build steps: - name: Deploy to GitHub Pages id: deployment uses: actions/deploy-pages@v1