如何将工件自动升级到Azure DevOps中的提要视图?

时间:2019-02-04 20:14:26

标签: azure-devops release azure-pipelines-release-pipeline release-management

我们的构建工件是一个章鱼nuget包。发布构建后,它将进入QA阶段,在此阶段,工件将通过Octopus进行部署。这个章鱼直接从Azure Artifacts nuget提要中使用它。

如果部署和后续测试成功,我们希望将工件提升到Azure Artifacts nuget提要的Release视图,因为我们认为它为我们提供了一个不同的nuget URL,该URL可以供下一阶段的另一个章鱼使用(出于历史原因,我们每个阶段都专门设置了章鱼-努力改变这一点,但这需要时间。)

我们可以手动升级,但是我们想自动升级。该怎么办?

我们正在本地TFS 2019 RC2上对其进行测试。

enter image description here

编辑1

建议的插件似乎未安装在本地TFS 2019 RC2上:

enter image description here

3 个答案:

答案 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

https://docs.microsoft.com/en-us/rest/api/azure/devops/artifacts/feed%20%20management/get%20feed?view=azure-devops-rest-5.1

Feed管理-获取Feed视图

https://docs.microsoft.com/en-us/rest/api/azure/devops/artifacts/feed%20%20management/get%20feed%20view?view=azure-devops-rest-5.1

工件详细信息-获取软件包

https://docs.microsoft.com/en-us/rest/api/azure/devops/artifacts/artifact%20%20details/get%20packages?view=azure-devops-rest-5.1

NuGet-更新程序包版本

https://docs.microsoft.com/en-us/rest/api/azure/devops/artifactspackagetypes/nuget/update%20package%20version?view=azure-devops-rest-5.1

答案 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推送任务来推送软件包

Nuget Push task 这是另一个内联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上找到存储库。

enter image description here


编辑:

因为您的本地版本不支持此任务。我想说的是,关于使用REST API的评论将是您需要使用Powershell脚本之类的路线。

我从未完全使用过REST Api来执行此任务,因此我不确定主体应如何查找请求。但是,似乎已记录在here中。

我对JSON Patch object的理解是有限的,但我认为您可能会使用replace操作。

{ "op": "replace", "path": "/view", "value": "@Release" }

This article可能也有帮助,但是我仍然看不到与REST Api文档中from定义上的JsonPatchObject标识符有关的任何内容。