parameters: - name: ApplicationName type: string - name: SolutionFile type: string - name: ProjectFile type: string - name: PublishFolder type: string - name: BuildConfiguration type: string default: Release - name: BuildPlatform type: string default: AnyCPU stages: - stage: build displayName: Build and Publish jobs: - job: build displayName: Build and Publish workspace: clean: all steps: - task: PowerShell@2 displayName: Write Build Parameters condition: contains(variables['system.debug'], 'true') inputs: targetType: inline script: | Write-Host "ApplicationName: ${{parameters.ApplicationName}}" Write-Host "SolutionFile: ${{parameters.SolutionFile}}" Write-Host "ProjectFile: ${{parameters.ProjectFile}}" Write-Host "PublishFolder: ${{parameters.PublishFolder}}" Write-Host "BuildConfiguration: ${{parameters.BuildConfiguration}}" Write-Host "BuildPlatform: ${{parameters.BuildPlatform}}" pwsh: true - template: create-agent-capabilities-variables.yml - task: PowerShell@2 displayName: Write Environment Variables condition: contains(variables['system.debug'], 'true') inputs: targetType: inline script: '(gci env:*).GetEnumerator() | Sort-Object Name | Out-String' pwsh: true - task: PowerShell@2 displayName: Tag Files env: DEPLOY_BUILDNUMBER: $(Build.BuildNumber) DEPLOY_REQUESTEDFOREMAIL: $(Build.RequestedForEmail) DEPLOY_REQUESTEDFOR: $(Build.RequestedFor) inputs: targetType: inline script: | $appVersion = $env:DEPLOY_BUILDNUMBER $tag = $appVersion Write-Host "Performing Git Tag Delete" git tag -d $tag git push origin :refs/tags/$tag Write-Host "Performing Git Tag" git tag $tag Write-Host "Performing Git Tag Push" git push --tags pwsh: true workingDirectory: '$(Build.SourcesDirectory)' - task: NuGetToolInstaller@1 displayName: Install NuGet 6.7.0 inputs: versionSpec: '6.7.0' - task: NuGetCommand@2 displayName: NuGet Restore inputs: restoreSolution: '${{parameters.SolutionFile}}' - template: update-semantic-versioning-in-assembyinfo-files.yml parameters: ApplicationName: ${{parameters.ApplicationName}} PathToSearch: '$(Build.SourcesDirectory)/src' - task: projectfileprops@1 displayName: Modify ApplicationVersion in Project File inputs: path: '${{parameters.ProjectFile}}' fieldOptions: ApplicationVersion value: '$(VersionMajor).$(VersionMinor).$(VersionBuild).%2a' - task: projectfileprops@1 displayName: Modify ApplicationRevision in Project File inputs: path: '${{parameters.ProjectFile}}' fieldOptions: ApplicationRevision value: '$(VersionRevision)' - task: VSBuild@1 displayName: Build ${{parameters.ApplicationName}} Project inputs: solution: '${{parameters.ProjectFile}}' msbuildArgs: '/t:publish /p:PublishDir="$(Build.BinariesDirectory)"' platform: '${{parameters.BuildPlatform}}' configuration: '${{parameters.BuildConfiguration}}' clean: true - task: PowerShell@2 displayName: Clean-up Published Files env: BUILD_BUILDNUMBER: $(Build.BuildNumber) BUILD_ARTIFACTSTAGINGDIRECTORY: $(Build.ArtifactStagingDirectory) BUILD_BINARIESDIRECTORY: $(Build.BinariesDirectory) inputs: targetType: inline script: | $appVersion = $env:BUILD_BUILDNUMBER $appVersionWithUnderscores = $appVersion.Replace('.', '_') # Remove unwanted files Remove-Item -Path "$env:BUILD_BINARIESDIRECTORY/*.application" -Force -ErrorAction Ignore Remove-Item -Path "$env:BUILD_BINARIESDIRECTORY/*.exe" -Force -ErrorAction Ignore # Rename application files folder $applicationFolders = Get-ChildItem -Path "$env:BUILD_BINARIESDIRECTORY\Application Files" -Filter "*_$appVersionWithUnderscores" -Directory -Name $applicationFolder = $applicationFolders.Where({$_.Replace(' ', '') -eq "${{parameters.ApplicationName}}_$appVersionWithUnderscores"}) if ($applicationFolder.Count -ne 1) { throw "Could not find the application folder (${{parameters.ApplicationName}}_$appVersionWithUnderscores)" } $applicationFolderName = $applicationFolder[0] $sourceFolder = "$env:BUILD_BINARIESDIRECTORY\Application Files\$applicationFolderName" $destFolder = "$env:BUILD_BINARIESDIRECTORY\Application Files\${{parameters.ApplicationName}}_$appVersionWithUnderscores" if ($sourceFolder -ne $destFolder) { Rename-Item -Path $sourceFolder -NewName $destFolder -Force } pwsh: true - task: CopyFiles@2 displayName: Copy Artifact Files inputs: SourceFolder: '$(Build.SourcesDirectory)' Contents: | src/${{parameters.ApplicationName}}/VersionFeed.xml src/${{parameters.ApplicationName}}/VersionFeedBeta.xml src/${{parameters.ApplicationName}}/Globalization/en-US/en-US.xaml TargetFolder: '$(Build.ArtifactStagingDirectory)' OverWrite: true flattenFolders: true preserveTimestamp: true - task: PowerShell@2 displayName: Create Latest Version Files env: BUILD_BUILDNUMBER: $(Build.BuildNumber) BUILD_ARTIFACTSTAGINGDIRECTORY: $(Build.ArtifactStagingDirectory) inputs: targetType: inline script: | $appVersion = $env:BUILD_BUILDNUMBER $appVersionShort = $appVersion.Substring(0, $appVersion.LastIndexOf('.')) $versionFile = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/latest.txt" $AppVersionShort | Set-Content "$versionFile" $versionFile = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/latestBeta.txt" $AppVersion | Set-Content "$versionFile" pwsh: true - task: PowerShell@2 displayName: Create Installer File env: BUILD_BUILDNUMBER: $(Build.BuildNumber) BUILD_ARTIFACTSTAGINGDIRECTORY: $(Build.ArtifactStagingDirectory) BUILD_BINARIESDIRECTORY: $(Build.BinariesDirectory) BUILD_SOURCESDIRECTORY: $(Build.SourcesDirectory) #AGENT_USER_INNOSETUP: 'C:\Program Files (x86)\Inno Setup 6\ISCC.exe' inputs: targetType: inline script: | $appVersion = $env:BUILD_BUILDNUMBER $appVersionShort = $appVersion.Substring(0, $appVersion.LastIndexOf('.')) $appVersionWithUnderscores = $appVersion.Replace('.', '_') $iconFile = "$env:BUILD_SOURCESDIRECTORY/src/${{parameters.ApplicationName}}/Art/favicon.ico" Copy-Item -Path "$iconFile" -Destination "$env:BUILD_BINARIESDIRECTORY/favicon.ico" -Force $installScriptFile = ".azure/scripts/${{parameters.ApplicationName}}.iss" $installTextFile = '.azure/scripts/Installer.txt' $installTextFileContent = @" #define AppVer "$appVersionShort" #define AppVerFull "$appVersion" #define AppVerPath "$appVersionWithUnderscores" #define RootPath "$env:BUILD_BINARIESDIRECTORY" #define SourceDir "$env:BUILD_BINARIESDIRECTORY\Application Files\${{parameters.ApplicationName}}_$appVersionWithUnderscores" #define OutputDir "$env:BUILD_ARTIFACTSTAGINGDIRECTORY" "@ $installTextFileContent | Set-Content "$installTextFile" -Encoding Ascii -Force & "$env:AGENT_USER_INNOSETUP" "$installScriptFile" $exeFile = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/${{parameters.ApplicationName}}_$appVersionShort.exe" Copy-Item -Path $exeFile -Destination "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/latest.exe" -Force pwsh: true - task: PowerShell@2 displayName: Create Duplicate ServerManager Updater File env: BUILD_BUILDNUMBER: $(Build.BuildNumber) BUILD_ARTIFACTSTAGINGDIRECTORY: $(Build.ArtifactStagingDirectory) BUILD_BINARIESDIRECTORY: $(Build.BinariesDirectory) inputs: targetType: inline script: | $appVersion = $env:BUILD_BUILDNUMBER $appVersionWithUnderscores = $appVersion.Replace('.', '_') $applicationFolderName = "${{parameters.ApplicationName}}_$($appVersionWithUnderscores)" $sourcePath = "$env:BUILD_BINARIESDIRECTORY/Application Files/$applicationFolderName" Copy-Item -Path "$sourcePath\ServerManagerUpdater.exe" -Destination "$sourcePath\NewServerManagerUpdater.exe" -Force pwsh: true - task: PowerShell@2 displayName: Archive Binary Files env: BUILD_BUILDNUMBER: $(Build.BuildNumber) BUILD_ARTIFACTSTAGINGDIRECTORY: $(Build.ArtifactStagingDirectory) BUILD_BINARIESDIRECTORY: $(Build.BinariesDirectory) inputs: targetType: inline script: | $appVersion = $env:BUILD_BUILDNUMBER $appVersionShort = $appVersion.Substring(0, $appVersion.LastIndexOf('.')) $appVersionWithUnderscores = $appVersion.Replace('.', '_') $applicationFolderName = "${{parameters.ApplicationName}}_$($appVersionWithUnderscores)" $sourcePath = "$env:BUILD_BINARIESDIRECTORY/Application Files/$applicationFolderName" $zipFile = "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/${{parameters.ApplicationName}}_$($appVersionShort).zip" Add-Type -Assembly System.IO.Compression.FileSystem $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcePath, $zipFile, $compressionLevel, $false) Copy-Item -Path $zipFile -Destination "$env:BUILD_ARTIFACTSTAGINGDIRECTORY/latest.zip" -Force pwsh: true - task: PublishBuildArtifacts@1 displayName: Publish Artifacts enabled: true inputs: PathtoPublish: '$(Build.ArtifactStagingDirectory)' ArtifactName: '${{parameters.PublishFolder}}' - template: clean-agent-folders.yml parameters: CleanArtifactsFolder: true CleanBinariesFolder: true CleanSourcesFolder: true CleanPublishFolder: true PublishFolder: ${{parameters.PublishFolder}}