stages:
- stage: Build
  jobs:
  ################################################################################
  - job: build_windows_agent_x64
  ################################################################################
    displayName: Windows Agent (x64)
    pool:
      vmImage: vs2017-win2016
    steps:

    # Steps template for windows platform
    - template: windows.template.yml
      parameters:
        targetRuntime: win-x64

    # Package dotnet core windows dependency (VC++ Redistributable)
    - powershell: |
        Write-Host "Downloading 'VC++ Redistributable' package."
        $outDir = Join-Path -Path $env:TMP -ChildPath ([Guid]::NewGuid())
        New-Item -Path $outDir -ItemType directory
        $outFile = Join-Path -Path $outDir -ChildPath "ucrt.zip"
        Invoke-WebRequest -Uri https://vstsagenttools.blob.core.windows.net/tools/ucrt/ucrt_x64.zip -OutFile $outFile
        Write-Host "Unzipping 'VC++ Redistributable' package to agent layout."
        $unzipDir = Join-Path -Path $outDir -ChildPath "unzip"
        Add-Type -AssemblyName System.IO.Compression.FileSystem
        [System.IO.Compression.ZipFile]::ExtractToDirectory($outFile, $unzipDir)
        $agentLayoutBin = Join-Path -Path $(Build.SourcesDirectory) -ChildPath "_layout\bin"
        Copy-Item -Path $unzipDir -Destination $agentLayoutBin -Force
      displayName: Package UCRT

    # Create agent package zip
    - script: dev.cmd package Release win-x64
      workingDirectory: src
      displayName: Package Release

    # Upload agent package zip as build artifact
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact (Windows x64)
      inputs:
        pathToPublish: _package
        artifactName: runners
        artifactType: container

  ################################################################################
  - job: build_linux_agent_x64
  ################################################################################
    displayName: Linux Agent (x64)
    pool:
      vmImage: ubuntu-16.04
    steps:

    # Steps template for non-windows platform
    - template: nonwindows.template.yml
      parameters:
        targetRuntime: linux-x64

    # Create agent package zip
    - script: ./dev.sh package Release linux-x64
      workingDirectory: src
      displayName: Package Release

    # Upload agent package zip as build artifact
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact (Linux x64)
      inputs:
        pathToPublish: _package
        artifactName: runners
        artifactType: container

  ################################################################################
  - job: build_linux_agent_arm64
  ################################################################################
    displayName: Linux Agent (arm64)
    pool:
      vmImage: ubuntu-16.04
    steps:

    # Steps template for non-windows platform
    - template: nonwindows.template.yml
      parameters:
        targetRuntime: linux-arm64

    # Create agent package zip
    - script: ./dev.sh package Release linux-arm64
      workingDirectory: src
      displayName: Package Release

    # Upload agent package zip as build artifact
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact (Linux ARM64)
      inputs:
        pathToPublish: _package
        artifactName: runners
        artifactType: container

  ################################################################################
  - job: build_linux_agent_arm
  ################################################################################
    displayName: Linux Agent (arm)
    pool:
      vmImage: ubuntu-16.04
    steps:

    # Steps template for non-windows platform
    - template: nonwindows.template.yml
      parameters:
        targetRuntime: linux-arm

    # Create agent package zip
    - script: ./dev.sh package Release linux-arm
      workingDirectory: src
      displayName: Package Release

    # Upload agent package zip as build artifact
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact (Linux ARM)
      inputs:
        pathToPublish: _package
        artifactName: runners
        artifactType: container

  ################################################################################
  - job: build_osx_agent_x64
  ################################################################################
    displayName: macOS Agent (x64)
    pool:
      vmImage: macOS-10.13
    steps:

    # Steps template for non-windows platform
    - template: nonwindows.template.yml
      parameters:
        targetRuntime: osx-x64

    # Create agent package zip
    - script: ./dev.sh package Release osx-x64
      workingDirectory: src
      displayName: Package Release

    # Upload agent package zip as build artifact
    - task: PublishBuildArtifacts@1
      displayName: Publish Artifact (OSX x64)
      inputs:
        pathToPublish: _package
        artifactName: runners
        artifactType: container

- stage: Release
  dependsOn: Build
  jobs:
  ################################################################################
  - job: publish_agent_packages
  ################################################################################
    displayName: Publish Agents (Windows/Linux/OSX)
    pool:
      name: ProductionRMAgents
    steps:

    # Download all agent packages from all previous phases
    - task: DownloadBuildArtifacts@0
      displayName: Download Agent Packages
      inputs:
        artifactName: runners

    # Upload agent packages to Azure blob storage and refresh Azure CDN
    - powershell: |
        Write-Host "Preloading Azure modules." # This is for better performance, to avoid module-autoloading.
        Import-Module AzureRM, AzureRM.profile, AzureRM.Storage, Azure.Storage, AzureRM.Cdn -ErrorAction Ignore -PassThru
        Enable-AzureRmAlias -Scope CurrentUser
        $uploadFiles = New-Object System.Collections.ArrayList
        $certificateThumbprint = (Get-ItemProperty -Path "$(ServicePrincipalReg)").ServicePrincipalCertThumbprint
        $clientId = (Get-ItemProperty -Path "$(ServicePrincipalReg)").ServicePrincipalClientId
        Write-Host "##vso[task.setsecret]$certificateThumbprint"
        Write-Host "##vso[task.setsecret]$clientId"
        Login-AzureRmAccount -ServicePrincipal -CertificateThumbprint $certificateThumbprint -ApplicationId $clientId -TenantId $(GitHubTenantId)
        Select-AzureRmSubscription -SubscriptionId $(GitHubSubscriptionId)
        $storage = Get-AzureRmStorageAccount -ResourceGroupName githubassets -AccountName githubassets
        Get-ChildItem -LiteralPath "$(System.ArtifactsDirectory)/runners" | ForEach-Object {
          $versionDir = $_.Name.Trim('.zip').Trim('.tar.gz')
          $versionDir = $versionDir.SubString($versionDir.LastIndexOf('-') + 1)
          Write-Host "##vso[task.setvariable variable=ReleaseAgentVersion;]$versionDir"
          Write-Host "Uploading $_ to BlobStorage githubassets/runners/$versionDir"
          Set-AzureStorageBlobContent -Context $storage.Context -Container runners -File "$(System.ArtifactsDirectory)/runners/$_" -Blob "$versionDir/$_" -Force
          $uploadFiles.Add("/runners/$versionDir/$_")
        }
        Write-Host "Get CDN info"
        Get-AzureRmCdnEndpoint -ProfileName githubassets -ResourceGroupName githubassets
        Write-Host "Purge Azure CDN Cache"
        Unpublish-AzureRmCdnEndpointContent -EndpointName githubassets -ProfileName githubassets -ResourceGroupName githubassets -PurgeContent $uploadFiles
        Write-Host "Pull assets through Azure CDN"
        $uploadFiles | ForEach-Object {
          $downloadUrl = "https://githubassets.azureedge.net" + $_
          Write-Host $downloadUrl
          Invoke-WebRequest -Uri $downloadUrl -OutFile $_.SubString($_.LastIndexOf('/') + 1)
        }
      displayName: Upload to Azure Blob

    # Create agent release on Github
    - powershell: |
        Write-Host "Creating github release."
        $releaseNotes = [System.IO.File]::ReadAllText("$(Build.SourcesDirectory)\releaseNote.md").Replace("<RUNNER_VERSION>","$(ReleaseAgentVersion)")
        $releaseData = @{
          tag_name = "v$(ReleaseAgentVersion)";
          target_commitish = "$(Build.SourceVersion)";
          name = "v$(ReleaseAgentVersion)";
          body = $releaseNotes;
          draft = $false;
          prerelease = $true;
        }
        $releaseParams = @{
          Uri = "https://api.github.com/repos/actions/runner/releases";
          Method = 'POST';
          Headers = @{
            Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("github:$(GithubToken)"));
          }
          ContentType = 'application/json';
          Body = (ConvertTo-Json $releaseData -Compress)
        }
        [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
        $releaseCreated = Invoke-RestMethod @releaseParams
        Write-Host $releaseCreated
        $releaseId = $releaseCreated.id
        Get-ChildItem -LiteralPath "$(System.ArtifactsDirectory)/runners" | ForEach-Object {
          Write-Host "Uploading $_ as GitHub release assets"
          $assetsParams = @{
            Uri = "https://uploads.github.com/repos/actions/runner/releases/$releaseId/assets?name=$($_.Name)"
            Method = 'POST';
            Headers = @{
              Authorization = 'Basic ' + [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes("github:$(GithubToken)"));
            }
            ContentType = 'application/octet-stream';
            Body = [System.IO.File]::ReadAllBytes($_.FullName)
          }  
          Invoke-RestMethod @assetsParams
        }
      displayName: Create agent release on Github
