Invoke-BuildStep.task.ps1
param ( [Parameter(Mandatory = $false)] $OutputPath, [Parameter(Mandatory = $false)] $ProjectPath ) $MetadataPath = Resolve-Path $ProjectPath\*.metadata.json if (-not (Test-Path $MetadataPath)) { throw [System.IO.FileNotFoundException] "$MetadataPath not found." } $MetadataTemplate = Get-Content $MetadataPath | Out-String | ConvertFrom-Json # NOTE: Defoult tasks chain Task default UpdateConfiguration, Metadata, Csproj, Changelog # NOTE: Update configuration Task UpdateConfiguration { Set-Content $ProjectPath\GitVersion.yml @" branches: master:` mode: ContinuousDeployment tag: stable increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false release: mode: ContinuousDeployment tag: release increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false (pull|pull\-requests|pr)[/-]: mode: ContinuousDeployment tag: pr increment: None prevent-increment-of-merged-branch-version: false tag-number-pattern: '[/-](?<number>\d+)[-/]' track-merge-target: false hotfix(es)?[/-]: mode: ContinuousDeployment tag: hotfix increment: None prevent-increment-of-merged-branch-version: false track-merge-target: false support[/-]: mode: ContinuousDeployment tag: support increment: None prevent-increment-of-merged-branch-version: true track-merge-target: false develop: mode: ContinuousDeployment tag: develop increment: None prevent-increment-of-merged-branch-version: false track-merge-target: true "@ } # NOTE: Generate metadata Task Metadata { Set-Location $ProjectPath $CurrentTime = Get-Date -Format "MM-dd-yyyy-hh-mm-ss" $GitVersionVars = ConvertFrom-Json ( GitVersion.exe | Out-String) $Script:Metadata = [PSCustomObject]@{ Name = $MetadataTemplate.Name Version = if ($GitVersionVars.FullSemVer) {$GitVersionVars.FullSemVer} else {"none"}; Build = [PSCustomObject] @{ Time = $CurrentTime BuildId = if ($env:BUILD_BUILDID) {$env:BUILD_BUILDID} else {"none"}; DefinitionName = if ($env:BUILD_DEFINITIONNAME) {$env:BUILD_DEFINITIONNAME} else {"none"}; BuildNumber = if ($env:BUILD_BUILDNUMBER) {$env:BUILD_BUILDNUMBER} else {"none"}; DefinitionVersion = if ($env:BUILD_DEFINITIONVERSION) {$env:BUILD_DEFINITIONVERSION} else {"none"}; QueuedBy = if ($env:BUILD_QUEUEDBY) {$env:BUILD_QUEUEDBY} else {"none"}; RepositoryUri = if ($env:BUILD_REPOSITORY_URI) {$env:BUILD_REPOSITORY_URI} else {"none"}; TeamProject = if ($env:SYSTEM_TEAMPROJECT) {$env:SYSTEM_TEAMPROJECT} else {"none"}; BuildReason = if ($env:RELEASE_ENVIRONMENTNAME) {$env:RELEASE_ENVIRONMENTNAME} else {"none"}; AgentName = if ($env:AGENT_NAME) {$env:AGENT_NAME} else {"none"}; } SemVer = $GitVersionVars Resources = $MetadataTemplate.Resources } $MetadataAsJson = $Metadata | ConvertTo-Json -depth 100 $MetadataFileName = Split-Path $MetadataPath -leaf $MetadataOutputFile = (Join-Path $OutputPath $MetadataFileName) Write-Verbose ("MetadataAsJson: {0}" -f $MetadataAsJson) -Verbose $MetadataAsJson | Out-File $MetadataOutputFile -Force Write-Verbose ("Metadata saved to: [{0}]" -f $MetadataOutputFile) -Verbose Write-Host "##vso[task.setvariable variable=MetadataOutputFile;]$MetadataOutputFile" } # NOTE: Generate changelog file Task Changelog { Set-Location $ProjectPath $ChangelogFile = (Join-Path $OutputPath CHANGELOG.md) exec { conventional-changelog -p angular -i $ChangelogFile -s -r 0 } Write-Build Green "ChangelogFile: $ChangelogFile" Write-Host "##vso[task.setvariable variable=ChangelogFile;]$ChangelogFile" } # NOTE: Set version and update all csproj files Task Csproj { # Update Version element in each csproj Set-Location $ProjectPath Get-ChildItem -Recurse -Filter *.csproj -File | ForEach-Object { [xml]$CsProjectName = Get-Content $_.FullName $Version = $CsProjectName.SelectSingleNode('//Version[last()]') if ($Version) { $Version.InnerText = $metadata.Version $CsProjectName.Save($_.FullName) } } } |