Трубопровод Azure. Увеличение номера сборки и отображение в веб-приложении.
У меня есть следующий простой конвейер сборки, работающий в Azure DevOps с выпусками, развернутыми в промежуточном слоте.
Я хотел бы иметь строку ревизии / версии сборки, которая автоматически увеличивается. Затем я хочу отобразить это в своем веб-приложении, чтобы узнать, какая версия программного обеспечения находится в производстве.
В настоящее время я отображаю строку версии из файла.csproj. Как то так в
<Version>1.1.4.7</Version>
И затем отображается на веб-странице, используя следующий код:
Version: @typeof(Startup).Assembly.GetName().Version.ToString()
Если бы я мог обновить существующую строку версии, это было бы замечательно, но я готов перейти к тому, что проще всего интегрировать в процесс CI.
4 ответа
Управление версиями упрощено в мире.Net Core.
Отредактируйте ваш csproj и измените его следующим образом:
<PropertyGroup>
<Version Condition=" '$(BUILD_BUILDNUMBER)' == '' ">1.0.0.0</Version>
<Version Condition=" '$(BUILD_BUILDNUMBER)' != '' ">$(BUILD_BUILDNUMBER)</Version>
</PropertyGroup>
Если у вашего файла нет узла версии, добавьте выше.
Вышеуказанная настройка будет означать, что локальная отладка даст вам версию 1.0.0.0, и в случае, если вы создадите среду DevOps, отличную от Azure, вы также получите версию 1.0.0.0. $(BUILD_BUILDNUMBER) - это переменная среды, установленная Team Build, которая будет обновляться во время сборки с помощью VSTS или TFS.
Версия.Net должна быть в формате [major].[Minor].[Build].[Revision], где каждый сегмент должен быть числом от 0 до 65000. Вы можете настроить формат номера сборки на вкладке Options, см. Здесь больше информации о форматировании. Смотрите здесь для полезных шагов по настройке сборки.
Я использую переменные конвейера ADO и функцию счетчика, подобную этой
Переменная патча
$[counter(format('{0}.{1}',variables['Major'], variables['Minor']),0)]
Затем я помещаю все эти значения непосредственно в переменную как задачу PowerShell.
- task: InlinePowershell@1
displayName: Create Version Number
inputs:
Script: |
param($major, $minor, $patch)
$bv = "$major.$minor.$patch"
Write-Host "##vso[task.setvariable variable=buildVersion]$bv"
Write-Host "Version of net App : $bv"
ScriptArguments: '-major $(Major) -minor $(Minor) -patch $(Patch)'
Теперь, когда я публикую .net, я просто передаю версию
- task: DotNetCoreCLI@2
displayName: Publish Application
inputs:
command: 'publish'
publishWebProjects: false
projects: '**/MyAPIProject.csproj'
arguments: '-r $(buildPlatform) -o $(Build.BinariesDirectory) -c $(buildConfiguration) --self-contained true /p:Version=$(buildVersion)'
zipAfterPublish: false
modifyOutputPath: false
Что действительно хорошо в этом, так это то, что патч получает нулевое значение, а затем каждая последующая сборка будет автоматически увеличиваться.
Вы должны использовать выпуск конвейеров Azure DevOps (он же выпуск Azure Pipelines) вместо сборки Azure DevOps Pipelines (она же сборка Azure Pipelines). Выпуск конвейеров Azure по умолчанию автоматически увеличивает ваши выпуски.
Сборка Azure Pipelines по умолчанию не имеет автоматической нумерации версий. Потому что увеличение версии после того, как это должно быть сделано на этапе выпуска, потому что сборка должна касаться только непрерывных интеграций, а не использования в качестве контроля версий для выпускаемой версии.
Это официальные документы выпуска Azure Pipelines для автоматического увеличения вашего выпуска: https://docs.microsoft.com/en-us/azure/devops/pipelines/release/?view=vsts
В приложении .NET Core (в частности, .NET 6.0) я установил следующий код в .csproj:
<PropertyGroup>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
</PropertyGroup>
Затем в Azure DevOps я добавил следующую задачу сценария powershell, чтобы установить версию моей сборки.
Обратите внимание, что я использую следующее соглашение:Major -> Цикл фазы/продукта. Я использую переменную/параметр для передачи этого значения в конвейер. Минор -> Номер спринта. Я использую переменную/параметр для передачи этого значения в конвейер. Редакция -> Максимальное ограничение для этого номера составляет 65000, поэтому нельзя использовать Build.BuildNumber. Я использую (Дата:ГГ)(ДеньГода).Build -> Берем вторую часть Build.BuildNumber (приращение дня)
- task: PowerShell@2
displayName: 'Edit AssemblyInfo'
inputs:
targetType: 'inline'
script: |
$Major = "$(Major)"
Write-Host "Major: $Major"
$Minor = "$(Minor)"
Write-Host "Minor: $Minor"
$DayOfYear = (Get-Date).DayOfYear
$Year = (Get-Date –format yy)
$Revision = '' + $Year + $DayOfYear
Write-Host "Revision: $Revision"
$BuildNumber = "$(Build.BuildNumber)"
Write-Host "BuildNumber: $BuildNumber"
$Build = $BuildNumber.Split('.')[1]
Write-Host "Build: $Build"
$pattern = '<AssemblyVersion>(.*)</AssemblyVersion>'
Write-Host "Will search in paths.."
$csProjFiles = Get-ChildItem .\*.csproj -Recurse
Write-Host "CsProjFiles found are: "
Write-Host "$csProjFiles"
foreach ($file in $csProjFiles)
{
(Get-Content $file.PSPath) | ForEach-Object{
if($_ -match $pattern){
# We have found the matching line
# Edit the version number and put back.
Write-Host "Matched $file"
$fileVersion = [version]$matches[1]
$newVersion = "{0}.{1}.{2}.{3}" -f $Major, $Minor, $Revision, $Build
'<AssemblyVersion>{0}</AssemblyVersion>' -f $newVersion
} else {
# Output line as is
$_
}
} | Set-Content $file.PSPath
}