Deploying a Next.js app to SWA using the CLI and Azure DevOps
Notes:
- Requires a AZURE_STATIC_WEB_APPS_API_TOKENenvironment variable to be available.
- Assumes a .nvmrcfile in the root with a specified version of Node.
name: $(BuildID)+$(Date:yyyyMMdd)
trigger:
  batch: true
  branches:
    include:
      - main
pool:
  name: Azure Pipelines # Update with pool name
stages:
  - stage: Build
    jobs:
      - job:
        steps:
          - checkout: self
          - task: NodeTool@0
            displayName: 'Use Node version from .nvmrc'
            inputs:
              versionSource: 'fromFile'
              versionFilePath: '$(build.sourcesdirectory)/.nvmrc'
          - script: npm install
            displayName: Install npm dependencies
          - script: npx @azure/static-web-apps-cli build
            displayName: Build NextJS site and API
            env:
              NEXT_PUBLIC_BUILD_NUMBER: $(Build.BuildNumber)
          # Optionally include APIs.
          - task: CopyFiles@2
            displayName: 'Copy `api/` to staging'
            inputs:
              SourceFolder: '$(build.sourcesdirectory)/api'
              TargetFolder: '$(build.artifactstagingdirectory)/api'
              OverWrite: true
          - task: CopyFiles@2
            displayName: 'Copy `out/` to staging'
            inputs:
              SourceFolder: '$(build.sourcesdirectory)/out'
              TargetFolder: '$(build.artifactstagingdirectory)/out'
              OverWrite: true
          - task: PublishBuildArtifacts@1
            displayName: 'Publish artifacts'
  - stage: Preview
    displayName: Deploy to preview
    dependsOn:
      - Build
    jobs:
      - job:
        steps:
          - checkout: none
          - task: DownloadPipelineArtifact@2
            inputs:
              buildType: 'current'
              artifactName: 'drop'
              targetPath: '$(build.sourcesdirectory)'
          - task: NodeTool@0
            displayName: 'Use Node version from .nvmrc'
            inputs:
              versionSource: 'fromFile'
              versionFilePath: '$(build.sourcesdirectory)/.nvmrc'
          - script: npx @azure/static-web-apps-cli deploy --env preview --api-location "$(build.sourcesdirectory)/api" --app-location "$(build.sourcesdirectory)/out" --verbose=silly --deployment-token $(AZURE_STATIC_WEB_APPS_API_TOKEN)
            displayName: Deploy to preview
          # Spot to add integration testing on preview.
  - stage: Production
    displayName: Deploy to production
    dependsOn:
      - Preview
    jobs:
      - job:
        steps:
          - checkout: none
          - task: DownloadPipelineArtifact@2
            inputs:
              buildType: 'current'
              artifactName: 'drop'
              targetPath: '$(build.sourcesdirectory)'
          - task: NodeTool@0
            displayName: 'Use Node version from .nvmrc'
            inputs:
              versionSource: 'fromFile'
              versionFilePath: '$(build.sourcesdirectory)/.nvmrc'
          - script: npx @azure/static-web-apps-cli deploy --env production --api-location "$(build.sourcesdirectory)/api" --app-location "$(build.sourcesdirectory)/out" --verbose=silly --deployment-token $(AZURE_STATIC_WEB_APPS_API_TOKEN)
            displayName: Deploy to production