red and gray industrial machinery
Azure DevOps

A starter Azure multistage pipeline

trigger:
  branches:
    include:
    - master
    - feature*

name: 1.0.0.$(Rev:.r)

parameters:
  - name: WebApiProjectsToBuild
    type: object
    default:
      - WebApi

  - name: UnitTestProjects
    type: object
    default:
      - WebApi.UnitTest

  - name: IntegrationTestProjects
    type: object
    default:
      - WebApi.IntegrationTest 


variables:
  buildPlatform: 'Any CPU'
  buildConfiguration: 'Release'  
  counter: $[counter('buildCounter',0)]
  branchSourcePath: $[replace(variables['Build.SourceBranch'], 'refs/heads/', '')]
  disable.coverage.autogenerate: 'true'

stages:
- stage: BuildStage
  jobs:
  - job: BuildJob
    pool:
      vmImage: 'windows-latest'
    steps:
      - checkout: self
        clean: true
        fetchDepth: 1 # Fetch only one commit

      - powershell: |
         $SourceBranch = "$(Build.SourceBranch)"
         $VersionTag=""
         $dateVersion= Get-Date -Format "yyyy.M.d"
         $Version = "$dateVersion.$(counter)"
         Write-Host "SourceBranch : $SourceBranch"   
         If($SourceBranch -like "*feature*") {
           $VersionTag = "-feature"
         }
         Write-Host "New version: $Version"
         Write-Host "Set environment variable FullBuildNumber to ($Version)"
         Write-Host "##vso[task.setvariable variable=FullBuildNumber;]$Version$VersionTag"
         Write-Host "##vso[build.updatebuildnumber]$Version"
         Write-Host "##vso[task.setvariable variable=BuildVersion;isOutput=true]$Version$VersionTag"
        displayName: 'Rewrite build version'
        name: SetBuildVersion

      - task: UseDotNet@2
        displayName: Install .NET
        inputs:
            version: '8.x'

      - task: NuGetAuthenticate@1
        displayName: Authenticate with Azure Artifacts
      
      - ${{ each project in parameters.UnitTestProjects}}:
        - task: DotNetCoreCLI@2
          displayName: Run ${{project}} tests
          inputs:
            command: test
            testRunTitle: ${{project}}
            publishWebProjects: false
            projects: '**/${{ project }}.csproj'
            arguments: '--configuration $(buildConfiguration) --logger trx --collect "XPlat Code Coverage"'
            publishTestResults: true

      - ${{ each project in parameters.IntegrationTestProjects}}:
        - task: DotNetCoreCLI@2
          displayName: Run ${{project}} tests
          inputs:
            command: test
            testRunTitle: ${{project}}
            publishWebProjects: false
            projects: '**/${{ project }}.csproj'
            arguments: '--configuration $(buildConfiguration) --logger trx --collect "XPlat Code Coverage"'
            publishTestResults: true

      - ${{ each project in parameters.WebApiProjectsToBuild }}:
        - task: DotNetCoreCLI@2
          displayName: Build ${{project}} project
          inputs:
            command: publish
            publishWebProjects: false
            projects: '**/${{ project }}.csproj'
            arguments: '--configuration $(buildConfiguration) --output $(Build.ArtifactStagingDirectory)\WebApps\${{project}}'    
            zipAfterPublish: true

      - task: DotNetCoreCLI@2
        displayName: New Manifest for tools
        inputs:
          command: custom
          custom: 'new '
          arguments: tool-manifest
      
      - task: DotNetCoreCLI@2
        displayName : Install EF Tool
        inputs:
         command: custom
         custom: 'tool '
         arguments: install dotnet-ef

      - task: DotNetCoreCLI@2
        displayName: Make migration script
        inputs:
         command: custom
         custom: 'ef '
         arguments: migrations script -i -p  src/SqlDataProvider/SqlDataProvider.csproj -v -s src/SqlDataProvider/SqlDataProvider.csproj -o migrationScript.sql
      
      - task: PublishBuildArtifacts@1
        displayName : Publish migration script
        inputs:
          pathToPublish: migrationScript.sql
          artifactName: 'Database Migration'

      - task: PublishPipelineArtifact@1
        displayName: 'Publish WebApps deployable artifacts'
        inputs:
          targetPath: '$(Build.ArtifactStagingDirectory)\WebApps'
          artifactName: WebApps
          publishLocation: 'pipeline'

      - task: reportgenerator@5
        displayName: Generate Code Coverage Report
        inputs:
          reports: '$(Agent.TempDirectory)/**/coverage.cobertura.xml'
          targetdir: '$(Agent.TempDirectory)/CoverageResults'
          reporttypes: 'HtmlInline_AzurePipelines;Cobertura'

      - task: PublishCodeCoverageResults@1
        displayName: 'Publish code coverage report'
        inputs:
          codeCoverageTool: 'Cobertura'
          summaryFileLocation: '$(Agent.TempDirectory)/CoverageResults/Cobertura.xml'          
          reportDirectory: '$(Agent.TempDirectory)/CoverageResults'

Leave a Reply

Your email address will not be published. Required fields are marked *