parameters:
  # Agent OS identifier and used as job name
  agentOs: ''

  # Agent pool
  pool: {}

  # Additional variables
  variables: {}

  # Build strategy - matrix
  strategy: {}

  # Job timeout
  timeoutInMinutes: 180

  # Publish using pipelines
  enablePublishUsingPipelines: true

phases:
- template: /eng/common/templates/job/job.yml
  parameters:
    name: ${{ parameters.agentOs }}
    timeoutInMinutes: ${{ parameters.timeoutInMinutes }}
    ${{ if eq(parameters.agentOs, 'Windows_NT') }}:
      enableMicrobuild: true
    enablePublishBuildAssets: true
    # Don't use built-in arcade logic for publishing artifacts and test results, as we manually do this and give better names
    #enablePublishBuildArtifacts: true
    #enablePublishTestResults: true
    enablePublishUsingPipelines: ${{parameters.enablePublishUsingPipelines}}
    enableTelemetry: true
    helixRepo: dotnet/core-sdk
    pool: ${{ parameters.pool }}
    ${{ if ne(parameters.strategy, '') }}:
      strategy: ${{ parameters.strategy }}
    workspace:
      clean: all

    variables: 
      - _AgentOSName: ${{ parameters.agentOs }}
      - _TeamName: Roslyn-Project-System
      - _BuildArgs: ''
      - _SignType: test
      - _DOTNETCLIMSRC_READ_SAS_TOKEN: ''

      - ${{ if eq(variables['System.TeamProject'], 'internal') }}:
        - group: DotNet-MSRC-Storage
        - _DOTNETCLIMSRC_READ_SAS_TOKEN: $(dotnetclimsrc-read-sas-token)

      - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest')) }}:
        - group: DotNet-Symbol-Server-PATs
        - group: DotNet-HelixApi-Access
        - group: DotNet-Blob-Feed
        - _DotNetPublishToBlobFeed: true
        - _PushToVSFeed: true
        - _SignType: real
        - _BuildArgs: /p:OfficialBuildId=$(BUILD.BUILDNUMBER)
                  /p:DotNetPublishToBlobFeed=$(_DotNetPublishToBlobFeed)
                  /p:DotNetPublishBlobFeedKey=$(dotnetfeed-storage-access-key-1)
                  /p:DotNetPublishBlobFeedUrl=$(PB_PublishBlobFeedUrl)
                  /p:DotnetPublishSdkAssetsBlobFeedUrl=$(_PublishBlobFeedUrl)
                  /p:DotNetSymbolServerTokenMsdl=$(microsoft-symbol-server-pat)
                  /p:DotNetSymbolServerTokenSymWeb=$(symweb-symbol-server-pat)
                  /p:PB_PublishType=blob
                  /p:DotnetPublishChecksumsBlobFeedUrl=$(_PublishChecksumsBlobFeedUrl)
                  /p:DotNetSignType=real
                  /p:TeamName=$(_TeamName)
                  /p:DotNetPublishUsingPipelines=$(_PublishUsingPipelines)

    steps:
    - checkout: self
      clean: true
    - ${{ if eq(parameters.agentOs, 'Windows_NT') }}:
      - script: 'eng\setbuildinfo.bat $(_BuildArchitecture) $(_BuildConfig)'
        displayName: Set test info (Windows)
      - ${{ if ne(variables['System.TeamProject'], 'public') }}:
        - task: PowerShell@2
          displayName: Setup Private Feeds Credentials
          inputs:
            filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.ps1
            arguments: -ConfigFile $(Build.SourcesDirectory)/NuGet.config -Password $Env:Token
          env:
            Token: $(dn-bot-dnceng-artifact-feeds-rw)
      - script: build.cmd
                  $(TestParameter)
                  -pack -publish -ci
                  -Configuration $(_BuildConfig)
                  -Architecture $(_BuildArchitecture)
                  $(_BuildArgs)
                  $(SignBuildParameters)
                  $(_AdditionalBuildParameters)
        displayName: Build
        env:
          DOTNET_CLI_UI_LANGUAGE: $(_DOTNET_CLI_UI_LANGUAGE)
          DOTNETCLIMSRC_READ_SAS_TOKEN: $(_DOTNETCLIMSRC_READ_SAS_TOKEN)

    - ${{ if ne(parameters.agentOs, 'Windows_NT') }}:
      - script: 'eng/setbuildinfo.sh $(_BuildArchitecture) $(_BuildConfig)'
        displayName: Set test info (Non-Windows)
      - ${{ if ne(variables['System.TeamProject'], 'public') }}:
        - task: Bash@3
          displayName: Setup Private Feeds Credentials
          inputs:
            filePath: $(Build.SourcesDirectory)/eng/common/SetupNugetSources.sh
            arguments: $(Build.SourcesDirectory)/NuGet.config $Token
          env:
            Token: $(dn-bot-dnceng-artifact-feeds-rw)
    - ${{ if eq(parameters.agentOs, 'Linux') }}:
      - script: ./build.sh
                  $(TestParameter)
                  --pack --publish --ci
                  --noprettyprint
                  --configuration $(_BuildConfig)
                  $(_DockerParameter)
                  --architecture $(_BuildArchitecture)
                  $(_LinuxPortable)
                  $(_RuntimeIdentifier)
                  $(_BuildArgs)
                  $(_AdditionalBuildParameters)
        displayName: Build
        env:
          DOTNETCLIMSRC_READ_SAS_TOKEN: $(_DOTNETCLIMSRC_READ_SAS_TOKEN)

    - ${{ if or(eq(parameters.agentOs, 'Darwin'), eq(parameters.agentOs, 'FreeBSD')) }}:
      - script: ./build.sh
                  $(TestParameter)
                  --pack --publish --ci
                  --noprettyprint
                  --configuration $(_BuildConfig)
                  $(_BuildArgs)
                  $(_AdditionalBuildParameters)
        displayName: Build
        env:
          DOTNETCLIMSRC_READ_SAS_TOKEN: $(_DOTNETCLIMSRC_READ_SAS_TOKEN)

    - ${{ if and(ne(variables['System.TeamProject'], 'public'), notin(variables['Build.Reason'], 'PullRequest'), eq(parameters.agentOs, 'Windows_NT')) }}:
      - task: NuGetCommand@2
        displayName: Push Visual Studio NuPkgs
        inputs:
          command: push
          packagesToPush: '$(Build.SourcesDirectory)/artifacts/packages/$(_BuildConfig)/NonShipping/VS.*.nupkg'
          nuGetFeedType: external
          publishFeedCredentials: 'DevDiv - VS package feed'
        condition: and(succeeded(), eq(variables['_PushToVSFeed'], 'true'), eq(variables['_DotNetPublishToBlobFeed'], 'true'), or(eq(variables['_BuildArchitecture'], 'x64'), eq(variables['_BuildArchitecture'], 'x86')))

    - task: PublishTestResults@1	
      displayName: Publish Test Results	
      inputs:
        testRunner: XUnit	
        testResultsFiles: 'artifacts/TestResults/$(_BuildConfig)/*.xml'	
        testRunTitle: '$(_AgentOSName)_$(Agent.JobName)'	
        platform: '$(BuildPlatform)'	
        configuration: '$(_BuildConfig)'	
      condition: ne(variables['TestParameter'], '')

    - task: CopyFiles@2	
      displayName: Gather Logs	
      inputs:
        SourceFolder: '$(Build.SourcesDirectory)/artifacts'	
        Contents: |	
         log/$(_BuildConfig)/**/*	
         TestResults/$(_BuildConfig)/**/*	
        TargetFolder: '$(Build.ArtifactStagingDirectory)'	
      continueOnError: true	
      condition: always()

    - task: PublishBuildArtifacts@1	
      displayName: Publish Logs to VSTS	
      inputs:
        PathtoPublish: '$(Build.ArtifactStagingDirectory)'	
        ArtifactName: '$(_AgentOSName)_$(Agent.JobName)_$(Build.BuildNumber)'	
        publishLocation: Container	
      continueOnError: true	
      condition: always()