# Xcode
# Build, test, and archive an Xcode workspace on macOS.
# Add steps that install certificates, test, sign, and distribute an app, save build artifacts, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/xcode

trigger:
  branches:
    include:
      # Build all branches starting with 'ms-' This is useful when making and testing chanes made to this file
      - ms-*
  tags:
    include:
      - "*"
  # pr:
  #   - '*'
variables:
  xpcBuildOutputPath: xpcPlugin/XPlaneConnect/
  xpcArtifactNameLinux: xpc-linux
  xpcArtifactNameMac: xpc-macos
  xpcArtifactNameWindows: xpc-windows
  xpcPackageName: XPlaneConnect

  # The Github Release tasks requires a GH 'service connection' to be setup in the MS Azure Account
  # This connection must be setup in with a GH token in the MS Azure Project Settings
  #
  # https://docs.microsoft.com/en-us/azure/devops/pipelines/tasks/utility/github-release?view=azure-devops
  # https://docs.microsoft.com/en-us/azure/devops/pipelines/library/service-endpoints?view=azure-devops&tabs=yaml#sep-github
  xpcGitHubConnection: XPC-Azure

stages:
  - stage: Build
    jobs:
      - job: macOS
        pool:
          vmImage: "macos-latest"

        steps:
          - task: Xcode@5
            inputs:
              actions: "build"
              scheme: ""
              sdk: "macosx10.15"
              configuration: "Release"
              xcWorkspacePath: "xpcPlugin/xpcPlugin.xcodeproj"
              xcodeVersion: "default" # Options: 8, 9, 10, default, specifyPath
          - task: PublishPipelineArtifact@0
            inputs:
              artifactName: "$(xpcArtifactNameMac)"
              targetPath: "$(xpcBuildOutputPath)"

      - job: Linux
        pool:
          vmImage: "ubuntu-latest"

        steps:
          - script: |
              sudo add-apt-repository ppa:ubuntu-toolchain-r/test
              sudo apt-get update
              sudo apt-get install -y g++-5 mesa-common-dev g++-multilib g++-5-multilib
            displayName: "apt install"

          - script: |
              cd xpcPlugin
              cmake .
              make
            displayName: "make"

          - task: PublishPipelineArtifact@0
            inputs:
              artifactName: "xpc-linux"
              targetPath: "$(xpcBuildOutputPath)"

      - job: Windows
        pool:
          vmImage: "vs2017-win2016"

        variables:
          solution: "xpcPlugin/xpcPlugin/xpcPlugin.sln"
          buildPlatform: "Win32|x64"
          buildConfiguration: "Release"
          appxPackageDir: '$(build.artifactStagingDirectory)\AppxPackages\\'

        steps:
          - task: NuGetToolInstaller@0

          - task: NuGetCommand@2
            inputs:
              restoreSolution: "$(solution)"

          - task: VSBuild@1
            inputs:
              platform: "Win32"
              solution: "$(solution)"
              configuration: "$(buildConfiguration)"
              msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" /p:AppxPackageDir="$(appxPackageDir)" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload'

          - task: VSBuild@1
            inputs:
              platform: "x64"
              solution: "$(solution)"
              configuration: "$(buildConfiguration)"
              msbuildArgs: '/p:AppxBundlePlatforms="$(buildPlatform)" /p:AppxPackageDir="$(appxPackageDir)" /p:AppxBundle=Always /p:UapAppxPackageBuildMode=StoreUpload'

          - task: Bash@3
            inputs:
              targetType: "inline"
              script: |
                rm $(xpcBuildOutputPath)/win.exp
                rm $(xpcBuildOutputPath)/win.lib
                rm $(xpcBuildOutputPath)/64/win.exp
                rm $(xpcBuildOutputPath)/64/win.lib

          - task: PublishPipelineArtifact@0
            inputs:
              artifactName: "$(xpcArtifactNameWindows)"
              targetPath: "$(xpcBuildOutputPath)"

  - stage: Deploy
    jobs:
      - job: Package_Binaries
        displayName: "Package Binaries"
        pool:
          vmImage: "ubuntu-latest"

        steps:
          - task: DownloadPipelineArtifact@0
            inputs:
              artifactName: "$(xpcArtifactNameMac)"
              targetPath: $(System.DefaultWorkingDirectory)/$(xpcPackageName)
          - task: DownloadPipelineArtifact@0
            inputs:
              artifactName: "$(xpcArtifactNameLinux)"
              targetPath: $(System.DefaultWorkingDirectory)/$(xpcPackageName)

          - task: DownloadPipelineArtifact@0
            inputs:
              artifactName: "$(xpcArtifactNameWindows)"
              targetPath: $(System.DefaultWorkingDirectory)/$(xpcPackageName)

          - task: PublishPipelineArtifact@0
            inputs:
              artifactName: "$(xpcPackageName)"
              targetPath: $(System.DefaultWorkingDirectory)/$(xpcPackageName)

          # Archive Files
          - task: ArchiveFiles@2
            inputs:
              rootFolderOrFile: "$(System.DefaultWorkingDirectory)/$(xpcPackageName)"
              includeRootFolder: true
              archiveType: "zip"
              archiveFile: "$(Build.ArtifactStagingDirectory)/$(xpcPackageName).zip"

          # Uploads the .zip to GitHub and creates a new "Release" with the commit tag
          # This tasks runs only on pushed tags
          - task: GitHubRelease@0
            inputs:
              gitHubConnection: "$(xpcGitHubConnection)"
              repositoryName: "$(Build.Repository.Name)"
              action: "create"
              target: "$(Build.SourceVersion)"
              tagSource: "auto"
              tag: $(tagName)
              assets: "$(Build.ArtifactStagingDirectory)/$(xpcPackageName).zip"
              isPreRelease: true
              isDraft: true
