name: PR-$(System.PullRequest.PullRequestNumber)-$(Date:yyyyMMdd)$(Rev:.rr)
trigger:
  # Batch merge builds together while a merge build is running
  batch: true
  branches:
    include:
    - master
    - release*
    - feature*
  paths:
    include:
    - '*'
    exclude:
    - /.vsts-ci/misc-analysis.yml
    - /.github/ISSUE_TEMPLATE/*
    - /.dependabot/config.yml
pr:
  branches:
    include:
    - master
    - release*
    - feature*
  paths:
    include:
    - '*'
    exclude:
    - tools/releaseBuild/*
    - tools/releaseBuild/azureDevOps/templates/*
    - /.vsts-ci/misc-analysis.yml
    - /.github/ISSUE_TEMPLATE/*
    - /.dependabot/config.yml

variables:
  DOTNET_CLI_TELEMETRY_OPTOUT: 1
  POWERSHELL_TELEMETRY_OPTOUT: 1
  # Avoid expensive initialization of dotnet cli, see: https://donovanbrown.com/post/Stop-wasting-time-during-NET-Core-builds
  DOTNET_SKIP_FIRST_TIME_EXPERIENCE: 1
  __SuppressAnsiEscapeSequences: 1

resources:
- repo: self
  clean: true

stages:
- stage: BuildLinux
  displayName: Build for Linux
  jobs:
  - template: templates/ci-build.yml
    parameters:
      pool: ubuntu-16.04
      jobName: linux_build
      displayName: linux Build

- stage: TestLinux
  displayName: Test for Linux
  jobs:
  - job: linux_test
    pool:
      vmImage: ubuntu-16.04
    displayName: Linux Test

    steps:
    - pwsh: |
        Get-ChildItem -Path env:
      displayName: Capture Environment
      condition: succeededOrFailed()

    - task: DownloadBuildArtifacts@0
      displayName: 'Download Build Artifacts'
      inputs:
        downloadType: specific
        itemPattern: |
          build/**/*
          xunit/**/*
        downloadPath: '$(System.ArtifactsDirectory)'

    - pwsh: |
        Get-ChildItem "$(System.ArtifactsDirectory)\*" -Recurse
      displayName: 'Capture Artifacts Directory'
      continueOnError: true

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Invoke-CIInstall -SkipUser
      displayName: Bootstrap
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\build.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        $output = (Get-PSOptions).Output
        $rootPath = Split-Path (Split-Path $output)
        Expand-Archive -Path '$(System.ArtifactsDirectory)\build\build.zip' -DestinationPath $rootPath -Force

        ## Fix permissions
        Get-ChildItem $rootPath -Recurse | ForEach-Object {
            if ($_ -is [System.IO.DirectoryInfo]) {
                chmod +rwx $_.FullName
            } else {
                chmod +rw $_.FullName
            }
        }
        chmod a+x $output

        Write-Host "=== Capture Unzipped Directory ==="
        Get-ChildItem $rootPath -Recurse
      displayName: 'Unzip Build and Fix Permissions'
      condition: succeeded()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose UnelevatedPesterTests -TagSet CI
      displayName: Test - UnelevatedPesterTests - CI
      condition: succeeded()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose ElevatedPesterTests -TagSet CI
      displayName: Test - ElevatedPesterTests - CI
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose UnelevatedPesterTests -TagSet Others
      displayName: Test - UnelevatedPesterTests - Others
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\tools\ci.psm1
        Restore-PSOptions -PSOptionsPath '$(System.ArtifactsDirectory)\build\psoptions.json'
        Invoke-CITest -Purpose ElevatedPesterTests -TagSet Others
      displayName: Test - ElevatedPesterTests - Others
      condition: succeededOrFailed()

    - pwsh: |
        Import-Module .\build.psm1
        $xUnitTestResultsFile = "$(System.ArtifactsDirectory)\xunit\xUnitTestResults.xml"
        Test-XUnitTestResults -TestResultsFile $xUnitTestResultsFile
      displayName: Verify xUnit Test Results
      condition: succeededOrFailed()

- stage: CodeCovTestPackage
  displayName: CodeCoverage and Test Packages
  dependsOn: [] # by specifying an empty array, this stage doesn't depend on the stage before it
  jobs:
  - job: CodeCovTestPackage
    displayName: CodeCoverage and Test Packages
    pool:
      vmImage: ubuntu-16.04
    steps:
    - pwsh: |
        Import-Module .\tools\ci.psm1
        New-CodeCoverageAndTestPackage
      displayName: CodeCoverage and Test Package
