pr: none

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

parameters:
  - 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"
    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_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: 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_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_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)) }}

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

stages:
  - stage: Compile
    jobs:
      - job: Compile
        pool: compile
        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:
        vmImage: VS2017-Win2016
      jobs:

        - ${{ if eq(parameters.VSCODE_BUILD_WIN32, true) }}:
          - job: Windows
            timeoutInMinutes: 90
            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: 90
            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: Linux
      dependsOn:
        - Compile
      pool:
        vmImage: "Ubuntu-18.04"
      jobs:

        - ${{ if eq(parameters.VSCODE_BUILD_LINUX, true) }}:
          - job: Linux
            container: vscode-x64
            variables:
              VSCODE_ARCH: x64
              NPM_ARCH: x64
            steps:
              - template: linux/product-build-linux.yml

        - ${{ if and(eq(variables['VSCODE_CIBUILD'], false), eq(parameters.VSCODE_BUILD_LINUX, true)) }}:
          - job: LinuxSnap
            dependsOn:
              - Linux
            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.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.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
            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
      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(variables['VSCODE_PUBLISH'], true), eq(parameters.VSCODE_COMPILE_ONLY, false)) }}:
    - stage: Mooncake
      dependsOn:
        - ${{ if eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true) }}:
          - Windows
        - ${{ if eq(variables['VSCODE_BUILD_STAGE_LINUX'], true) }}:
          - Linux
        - ${{ if eq(variables['VSCODE_BUILD_STAGE_MACOS'], true) }}:
          - macOS
      condition: succeededOrFailed()
      pool:
        vmImage: "Ubuntu-18.04"
      jobs:
        - job: SyncMooncake
          displayName: Sync Mooncake
          steps:
            - template: sync-mooncake.yml

  - ${{ if and(eq(parameters.VSCODE_COMPILE_ONLY, false), or(eq(parameters.VSCODE_RELEASE, true), and(in(parameters.VSCODE_QUALITY, 'insider', 'exploration'), eq(variables['VSCODE_SCHEDULEDBUILD'], true)))) }}:
    - stage: Release
      dependsOn:
        - ${{ if eq(variables['VSCODE_BUILD_STAGE_WINDOWS'], true) }}:
          - Windows
        - ${{ if eq(variables['VSCODE_BUILD_STAGE_LINUX'], true) }}:
          - Linux
        - ${{ if eq(variables['VSCODE_BUILD_STAGE_MACOS'], true) }}:
          - macOS
      pool:
        vmImage: "Ubuntu-18.04"
      jobs:
        - job: ReleaseBuild
          displayName: Release Build
          steps:
            - template: release.yml
