pr: none

schedules:
  - cron: "0 5 * * Mon-Fri"
    displayName: Mon-Fri at 7:00
    branches:
      include:
        - main
        - joao/web

parameters:
  - name: VSCODE_DISTRO_REF
    displayName: Distro Ref (Private build)
    type: string
    default: " "
  - name: VSCODE_QUALITY
    displayName: Quality
    type: string
    default: insider
    values:
      - exploration
      - insider
      - stable
  - name: ENABLE_TERRAPIN
    displayName: "Enable Terrapin"
    type: boolean
    default: true
  - name: VSCODE_BUILD_WIN32
    displayName: "🎯 Windows x64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_WIN32_32BIT
    displayName: "🎯 Windows ia32"
    type: boolean
    default: true
  - name: VSCODE_BUILD_WIN32_ARM64
    displayName: "🎯 Windows arm64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_LINUX
    displayName: "🎯 Linux x64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_LINUX_ARM64
    displayName: "🎯 Linux arm64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_LINUX_ARMHF
    displayName: "🎯 Linux armhf"
    type: boolean
    default: true
  - name: VSCODE_BUILD_LINUX_ALPINE
    displayName: "🎯 Alpine Linux x64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_LINUX_ALPINE_ARM64
    displayName: "🎯 Alpine Linux arm64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_MACOS
    displayName: "🎯 macOS x64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_MACOS_ARM64
    displayName: "🎯 macOS arm64"
    type: boolean
    default: true
  - name: VSCODE_BUILD_MACOS_UNIVERSAL
    displayName: "🎯 macOS universal"
    type: boolean
    default: true
  - name: VSCODE_BUILD_WEB
    displayName: "🎯 Web"
    type: boolean
    default: true
  - name: VSCODE_PUBLISH
    displayName: "Publish to builds.code.visualstudio.com"
    type: boolean
    default: true
  - name: VSCODE_PUBLISH_TO_MOONCAKE
    displayName: "Publish to Azure China"
    type: boolean
    default: true
  - name: VSCODE_RELEASE
    displayName: "Release build if successful"
    type: boolean
    default: false
  - name: VSCODE_COMPILE_ONLY
    displayName: "Run Compile stage exclusively"
    type: boolean
    default: false
  - name: VSCODE_STEP_ON_IT
    displayName: "Skip tests"
    type: boolean
    default: false

variables:
  - name: VSCODE_DISTRO_REF
    value: ${{ parameters.VSCODE_DISTRO_REF }}
  - name: ENABLE_TERRAPIN
    value: ${{ eq(parameters.ENABLE_TERRAPIN, true) }}
  - name: VSCODE_QUALITY
    value: ${{ parameters.VSCODE_QUALITY }}
  - name: VSCODE_BUILD_STAGE_WINDOWS
    value: ${{ or(eq(parameters.VSCODE_BUILD_WIN32, true), eq(parameters.VSCODE_BUILD_WIN32_32BIT, true), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}
  - name: VSCODE_BUILD_STAGE_LINUX
    value: ${{ or(eq(parameters.VSCODE_BUILD_LINUX, true), eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true), eq(parameters.VSCODE_BUILD_LINUX_ALPINE, true), eq(parameters.VSCODE_BUILD_LINUX_ALPINE_ARM64, true), eq(parameters.VSCODE_BUILD_WEB, true)) }}
  - name: VSCODE_BUILD_STAGE_MACOS
    value: ${{ or(eq(parameters.VSCODE_BUILD_MACOS, true), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}
  - name: VSCODE_CIBUILD
    value: ${{ in(variables['Build.Reason'], 'IndividualCI', 'BatchedCI') }}
  - name: VSCODE_PUBLISH
    value: ${{ and(eq(parameters.VSCODE_PUBLISH, true), eq(variables.VSCODE_CIBUILD, false)) }}
  - name: VSCODE_PUBLISH_TO_MOONCAKE
    value: ${{ eq(parameters.VSCODE_PUBLISH_TO_MOONCAKE, true) }}
  - name: VSCODE_SCHEDULEDBUILD
    value: ${{ eq(variables['Build.Reason'], 'Schedule') }}
  - name: VSCODE_STEP_ON_IT
    value: ${{ eq(parameters.VSCODE_STEP_ON_IT, true) }}
  - name: VSCODE_BUILD_MACOS_UNIVERSAL
    value: ${{ and(eq(variables['VSCODE_PUBLISH'], true), eq(parameters.VSCODE_BUILD_MACOS, true), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true), eq(parameters.VSCODE_BUILD_MACOS_UNIVERSAL, true)) }}
  - name: AZURE_CDN_URL
    value: https://az764295.vo.msecnd.net
  - name: AZURE_DOCUMENTDB_ENDPOINT
    value: https://vscode.documents.azure.com:443/
  - name: MOONCAKE_CDN_URL
    value: https://vscode.cdn.azure.cn
  - name: VSCODE_MIXIN_REPO
    value: microsoft/vscode-distro
  - name: skipComponentGovernanceDetection
    value: true

resources:
  containers:
    - container: vscode-bionic-x64
      image: vscodehub.azurecr.io/vscode-linux-build-agent:bionic-x64
      endpoint: VSCodeHub
      options: --user 0:0 --cap-add SYS_ADMIN
    - container: vscode-arm64
      image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-arm64
      endpoint: VSCodeHub
      options: --user 0:0 --cap-add SYS_ADMIN
    - container: vscode-armhf
      image: vscodehub.azurecr.io/vscode-linux-build-agent:stretch-armhf
      endpoint: VSCodeHub
      options: --user 0:0 --cap-add SYS_ADMIN
    - container: centos7-devtoolset8-x64
      image: vscodehub.azurecr.io/vscode-linux-build-agent:centos7-devtoolset8-x64
      endpoint: VSCodeHub
      options: --user 0:0 --cap-add SYS_ADMIN
    - container: snapcraft
      image: snapcore/snapcraft:stable

stages:
  - stage: Compile
    jobs:
      - job: Compile
        pool: vscode-1es-linux
        variables:
          VSCODE_ARCH: x64
        steps:
          - template: product-compile.yml

  - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true)) }}:
      - stage: Windows
        dependsOn:
          - Compile
        pool: vscode-1es-windows
        jobs:
          - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}:
              - job: Windows
                timeoutInMinutes: 120
                variables:
                  VSCODE_ARCH: x64
                steps:
                  - template: win32/product-build-win32.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_32BIT, true)) }}:
              - job: Windows32
                timeoutInMinutes: 120
                variables:
                  VSCODE_ARCH: ia32
                steps:
                  - template: win32/product-build-win32.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WIN32_ARM64, true)) }}:
              - job: WindowsARM64
                timeoutInMinutes: 90
                variables:
                  VSCODE_ARCH: arm64
                steps:
                  - template: win32/product-build-win32.yml

  - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_LINUX'], true)) }}:
      - stage: LinuxServerDependencies
        dependsOn: [] # run in parallel to compile stage
        pool: vscode-1es-linux
        jobs:
          - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}:
              - job: x64
                container: centos7-devtoolset8-x64
                variables:
                  VSCODE_ARCH: x64
                  NPM_ARCH: x64
                steps:
                  - template: linux/product-build-linux-server.yml

  - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_LINUX'], true)) }}:
      - stage: Linux
        dependsOn:
          - Compile
          - LinuxServerDependencies
        pool: vscode-1es-linux
        jobs:
          - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}:
              - job: Linuxx64
                container: vscode-bionic-x64
                variables:
                  VSCODE_ARCH: x64
                  NPM_ARCH: x64
                  DISPLAY: ":10"
                steps:
                  - template: linux/product-build-linux-client.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX, true), ne(variables['VSCODE_PUBLISH'], 'false')) }}:
              - job: LinuxSnap
                dependsOn:
                  - Linuxx64
                container: snapcraft
                variables:
                  VSCODE_ARCH: x64
                steps:
                  - template: linux/snap-build-linux.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true)) }}:
              - job: LinuxArmhf
                container: vscode-armhf
                variables:
                  VSCODE_ARCH: armhf
                  NPM_ARCH: armv7l
                steps:
                  - template: linux/product-build-linux-client.yml

          # TODO@joaomoreno: We don't ship ARM snaps for now
          - ${{ if and(false, eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ARMHF, true)) }}:
              - job: LinuxSnapArmhf
                dependsOn:
                  - LinuxArmhf
                container: snapcraft
                variables:
                  VSCODE_ARCH: armhf
                steps:
                  - template: linux/snap-build-linux.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true)) }}:
              - job: LinuxArm64
                container: vscode-arm64
                variables:
                  VSCODE_ARCH: arm64
                  NPM_ARCH: arm64
                steps:
                  - template: linux/product-build-linux-client.yml

          # TODO@joaomoreno: We don't ship ARM snaps for now
          - ${{ if and(false, eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ARM64, true)) }}:
              - job: LinuxSnapArm64
                dependsOn:
                  - LinuxArm64
                container: snapcraft
                variables:
                  VSCODE_ARCH: arm64
                steps:
                  - template: linux/snap-build-linux.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ALPINE, true)) }}:
              - job: LinuxAlpine
                variables:
                  VSCODE_ARCH: x64
                steps:
                  - template: linux/product-build-alpine.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX_ALPINE_ARM64, true)) }}:
              - job: LinuxAlpineArm64
                timeoutInMinutes: 120
                variables:
                  VSCODE_ARCH: arm64
                steps:
                  - template: linux/product-build-alpine.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_WEB, true)) }}:
              - job: LinuxWeb
                variables:
                  VSCODE_ARCH: x64
                steps:
                  - template: web/product-build-web.yml

  - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), eq(variables['VSCODE_BUILD_STAGE_MACOS'], true)) }}:
      - stage: macOS
        dependsOn:
          - Compile
        pool:
          vmImage: macOS-latest
        variables:
          BUILDSECMON_OPT_IN: true
        jobs:
          - ${{ if eq(parameters.VSCODE_BUILD_MACOS, true) }}:
              - job: macOS
                timeoutInMinutes: 90
                variables:
                  VSCODE_ARCH: x64
                steps:
                  - template: darwin/product-build-darwin.yml
              - ${{ if ne(variables['VSCODE_PUBLISH'], 'false') }}:
                  - job: macOSSign
                    dependsOn:
                      - macOS
                    timeoutInMinutes: 90
                    variables:
                      VSCODE_ARCH: x64
                    steps:
                      - template: darwin/product-build-darwin-sign.yml

          - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_MACOS_ARM64, true)) }}:
              - job: macOSARM64
                timeoutInMinutes: 90
                variables:
                  VSCODE_ARCH: arm64
                steps:
                  - template: darwin/product-build-darwin.yml
              - ${{ if ne(variables['VSCODE_PUBLISH'], 'false') }}:
                  - job: macOSARM64Sign
                    dependsOn:
                      - macOSARM64
                    timeoutInMinutes: 90
                    variables:
                      VSCODE_ARCH: arm64
                    steps:
                      - template: darwin/product-build-darwin-sign.yml

          - ${{ if eq(variables['VSCODE_BUILD_MACOS_UNIVERSAL'], true) }}:
              - job: macOSUniversal
                dependsOn:
                  - macOS
                  - macOSARM64
                timeoutInMinutes: 90
                variables:
                  VSCODE_ARCH: universal
                steps:
                  - template: darwin/product-build-darwin.yml
              - ${{ if ne(variables['VSCODE_PUBLISH'], 'false') }}:
                  - job: macOSUniversalSign
                    dependsOn:
                      - macOSUniversal
                    timeoutInMinutes: 90
                    variables:
                      VSCODE_ARCH: universal
                    steps:
                      - template: darwin/product-build-darwin-sign.yml

  - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), ne(variables['VSCODE_PUBLISH'], 'false')) }}:
      - stage: Publish
        dependsOn:
          - Compile
        pool: vscode-1es-linux
        variables:
          - name: BUILDS_API_URL
            value: $(System.CollectionUri)$(System.TeamProject)/_apis/build/builds/$(Build.BuildId)/
        jobs:
          - job: PublishBuild
            timeoutInMinutes: 180
            displayName: Publish Build
            steps:
              - template: product-publish.yml

      - ${{ if or(and(parameters.VSCODE_RELEASE, eq(parameters.VSCODE_DISTRO_REF, ' ')), and(in(parameters.VSCODE_QUALITY, 'insider', 'exploration'), eq(variables['VSCODE_SCHEDULEDBUILD'], true))) }}:
          - stage: Release
            dependsOn:
              - Publish
            pool: vscode-1es-linux
            jobs:
              - job: ReleaseBuild
                displayName: Release Build
                steps:
                  - template: product-release.yml
