我们的构建工件是一个章鱼nuget包。发布构建后,它将进入QA阶段,在此阶段,工件将通过Octopus进行部署。这个章鱼直接从Azure Artifacts nuget提要中使用它。
如果部署和后续测试成功,我们希望将工件提升到Azure Artifacts nuget提要的Release视图,因为我们认为它为我们提供了一个不同的nuget URL,该URL可以供下一阶段的另一个章鱼使用(出于历史原因,我们每个阶段都专门设置了章鱼-努力改变这一点,但这需要时间。)
我们可以手动升级,但是我们想自动升级。该怎么办?
我们正在本地TFS 2019 RC2上对其进行测试。
编辑1
建议的插件似乎未安装在本地TFS 2019 RC2上:
答案 0 :(得分:2)
$organisationName = '' # Name of organisation
$projectName = '' # Name of project
$feedName = '' # Name of Azure Artifacts feed
$viewName = 'Release' # I believe this can also be Prerelease, but I've not tried it
# List of names of packages within Azure Artifacts feed to be promoted
$packagesToPromote = @('')
# Need a personal access token for this script to work
# PAT token should be assigned to Packaging (Read, Write and Manage) scopes
$azureArtifactsPAT = ''
$AzureArtifactsPAT_Base64 = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($azureArtifactsPAT)"))
$restAPICallHeader = @{ Authorization = "Basic $AzureArtifactsPAT_Base64" }
$feedBaseURL = "https://feeds.dev.azure.com/$organisationName/$projectName/_apis/packaging/feeds"
$packageBaseURL = "https://pkgs.dev.azure.com/$organisationName/$projectName/_apis/packaging/feeds"
$feedIdURL = "$feedBaseURL/$feedName/?api-version=5.1-preview.1"
$feedIdResponse = (Invoke-RestMethod -Method Get -Uri $feedIdUrl -Headers $restAPICallHeader -ContentType 'application/json')
$feedId = $feedIdResponse.id
$viewIdURL = "$feedBaseURL/$feedId/views/$viewName/?api-version=5.1-preview.1"
$viewIdResponse = (Invoke-RestMethod -Method Get -Uri $viewIdUrl -Headers $restAPICallHeader -ContentType 'application/json')
$viewId = $viewIdResponse.id
$restAPICallBodyJson = @{
views = @{
op = 'add'
path = '/views/-'
value = "$viewId"
}
}
$restAPICallBody = (ConvertTo-Json $restAPICallBodyJson)
foreach ($packageName in $packagesToPromote) {
$packageQueryUrl = "$feedBaseURL/$feedId/packages?api-version=5.1-preview.1&packageNameQuery=$packageName"
$packagesResponse = (Invoke-RestMethod -Method Get -Uri $packageQueryUrl -Headers $restAPICallHeader -ContentType 'application/json')
$latestPackageVersion = ($packagesResponse.value.versions | ? { $_.isLatest -eq $True } | Select -ExpandProperty version)
$encodedPackageVersion = [System.Web.HttpUtility]::UrlEncode($latestPackageVersion)
Write-Host "Package Name: $packageName"
Write-Host "Package Version: $latestPackageVersion"
$releaseViewURL = $packageBaseURL `
+ "/$($feedId)" `
+ "/nuget/packages/$packageName" `
+ "/versions/$encodedPackageVersion" `
+ "?api-version=5.1-preview.1"
$response = Invoke-RestMethod -Method Patch -Uri $releaseViewURL -Headers $restAPICallHeader -ContentType 'application/json' -Body $restAPICallBody
Write-Host $response
}
作为参考,以上脚本使用以下API调用:
Feed管理-获取Feed
Feed管理-获取Feed视图
工件详细信息-获取软件包
NuGet-更新程序包版本
答案 1 :(得分:1)
我最近还努力尝试使用TFS实现版本。我已经制作了一些PowerShell脚本(使其他脚本在网络上适应)来进行软件包版本控制。
https://gist.github.com/oceanexplorer/6a91930419b35c1923974af265777a5f
https://gist.github.com/oceanexplorer/35e0f26962018dc8578c745060365c15
第一步是构建管道,我使用“ Update AssemblyInfo”任务设置构建版本,然后将其嵌入到DLL中。
https://marketplace.visualstudio.com/items?itemName=sebastianlux.UpdateAssemblyInfo
最初,我将上述脚本嵌入到我的项目中,以使事情顺利进行,但最终在发布管道中,我有一个任务,该任务通过“ NuGet Install”任务部署这些构建脚本,该任务有效地将它们从提要中拉出并解压缩。
在发布管道中,我有一个任务“版本包”,它是一个自定义PowerShell脚本,它调用了以上两个要点中定义的函数,它们的作用是解压缩从构建管道中创建的NuGet包,然后放置在工件目录中,将正确的版本应用于该软件包,并将其压缩后备份。我在构建管道中使用了以下内部版本号格式:
$(version.major).$(version.minor).$(version.patch).$(Date:yyyyMMdd)$(Rev:r)-CI
1.0.0.201902051-CI
This will produce a semantic build number format of:
1.0.0-alpha.201902051
我使用内联PowerShell任务调用脚本
##-------------------------------------------
## Import Build Scripts
##-------------------------------------------
gci -Recurse "$(System.DefaultWorkingDirectory)\scripts\*.psm1" | ForEach-Object { Import-Module $_.FullName }
##-------------------------------------------
## Version Files
##-------------------------------------------
Expand-NugetPackages -packagesDirectory "$(artifact.directory)" -Verbose
Add-VersionToAssemblies -suffix "$(Release.EnvironmentName)" -semVer "2.0" -artifactsToApplyTo "nuspec" -isRelease $(isRelease) -Verbose
Compress-NugetPackages -packagesDirectory "$(artifact.directory)" -Verbose
然后执行NuGet推送任务来推送软件包
这是另一个内联PowerShell脚本,用于设置软件包供稿的发布视图:
##-------------------------------------------
## Import Build Scripts
##-------------------------------------------
gci -Recurse "$(System.DefaultWorkingDirectory)\scripts\*.psm1" | ForEach-Object { Import-Module $_.FullName }
##-------------------------------------------
## Set Package Quality
##-------------------------------------------
Set-PackageQuality -feedName "Libraries" -packageId $(nuget.packageId) -packageVersion $env:semanticVersion -packageQuality $(Release.EnvironmentName)
答案 2 :(得分:0)
根据Azure DevOps documentation,建议从CI / CD管道中完成市场任务Promote package to Release View。
可以在Github上找到存储库。
因为您的本地版本不支持此任务。我想说的是,关于使用REST API的评论将是您需要使用Powershell脚本之类的路线。
我从未完全使用过REST Api来执行此任务,因此我不确定主体应如何查找请求。但是,似乎已记录在here中。
我对JSON Patch object的理解是有限的,但我认为您可能会使用replace
操作。
{ "op": "replace", "path": "/view", "value": "@Release" }
This article可能也有帮助,但是我仍然看不到与REST Api文档中from
定义上的JsonPatchObject
标识符有关的任何内容。