如何在Azure Devops(VSTS)中导入版本定义?

reg*_*ahn 9 tfs continuous-integration azure azure-devops azure-pipelines-release-pipeline

我正在尝试将发布定义从一个Azure Devops(VSTS)项目复制到另一个项目。在源项目中,我能够将发布定义导出为json文件。

出口发布定义

但是我找不到将其导入到目标项目中的方法。我只获得创建新定义的选项。

创建发布定义

Jay*_*ran 8

由于VSTS已重命名/更新为Azure DevOps,因此UI进行了一些更改以在上面找到这些选项。

汇入

在此处输入图片说明

用于出口

在此处输入图片说明

关于附录

所有的构建/发布定义都带有一个称为“管道”的术语。因此,无需创建虚拟发布定义即可导入新的发布定义。您可以导入一个新的发行版定义,而无需任何虚拟的定义。

  • 我不同意您的观点,即在导入之前不需要虚拟管道。我与@jeevs处于同一位置-我有一个新的Azure DevOps项目,我正在尝试将生成定义导入其中。但是,由于没有现有的BD,因此不会出现包含导入选项的菜单栏。如果没有至少一个BD,似乎无法访问导入功能。 (5认同)

Gab*_*ada 8

如果没有看到导入选项,可以尝试创建第一个空管道

在此处输入图片说明

一旦你拥有它,它就会启用导入选项

在此处输入图片说明

  • 谢谢,这是一个愚蠢的事情,到 2021 年仍然如此。微软似乎太忙于鞭打 github,无暇修复他们已经拥有的东西。 (3认同)

Ant*_*ios 7

通过阅读上面的评论,您在从不同的 VSTS/Azure DevOps 组织导入发布定义时遇到问题的原因是因为您导出的发布定义包含对您正在导入的组织或项目中不存在的对象的 GUID 引用发布定义到。因此,您将不得不卷起袖子做一些工作,以便获得一个成功且完全集成的发布定义,您可以将其用作模板。我们将使用此处找到的 REST API:https : //docs.microsoft.com/en-us/rest/api/vsts/release/definitions/create?view= vsts-rest- 4.1

这是我的技术答案以及我为复制发布定义所做的工作并创建了一个可多次使用的模板:

  1. 导出您选择的版本定义

  2. https://jsonformatter.curiousconcept.com 等工具中格式化 JSON以使其更具可读性,然后将其保存在 ReleasePipelineTemplate-Formatted.json 等文本文件中

  3. 我不知道您在 Release Definition 中定义了哪些组件,但请环顾四周,看看整个过程中如何使用 GUID。创建发布定义以查找您将要替换的 GUID 可能会有所帮助。

  4. 要查找的 GUID 是 SYSTEM_COLLECTIONID、SYSTEM_TEAMPROJECTID、SYSTEM_DEFINITIONID、BUILD_QUEUEDBYID

  5. 让我们从您的构建组织和项目中获取上面提到的一些变量。为了获得这些,我们需要在常规构建期间打印一些环境变量。因此,请在 CI 构建的开头添加一个构建步骤,该步骤使用以下命令“C:\Windows\System32\cmd.exe”和参数“/c set”添加“批处理脚本”步骤。构建完成后,查看该构建步骤的日志并找到这些变量的值。您将需要发布定义中的那些。

  6. 在我们修改 json 文件之前,您应该复制一份。您应该通过删除诸如“createdOn”、“modifiedBy”、“modifiedOn”之类的内容来稍微缩减 json 文件。最底部是“url”是 3 个链接。例如,这些需要使用团队项目 ID GUID 进行修改。这只是需要修改的地方的示例。请检查您自己的版本定义。

  7. 我假设您已经对 JSON 文件进行了必要的更改并准备好尝试导入它。使用以下脚本示例创建名为“CreateReleasePipeline.ps1”的 PowerShell 脚本。

$homeDir = "$(Split-Path -parent $MyInvocation.MyCommand.Definition)"
$VSTS_RestApiHost = "https://vsrm.dev.azure.com/yourpath/_apis"
$VSTS_PAT = "YOUR_PAT_TOKEN_HERE"
$headers = @{Authorization = "Basic " + [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($VSTS_PAT)"))}
$relDefInfo = Get-Content "$homeDir\ReleasePipelineTemplate-Formatted.json"
Write-Host "Creating Release Pipeline..."
$createReleaseDef = "$($VSTS_RestApiHost)/release/definitions?api-version=4.1-preview.3"
$response = Invoke-RestMethod -Method Post -Uri $createReleaseDef -Body $relDefInfo -ContentType 'application/json' -Headers $headers
Write-Host "Create Release Pipeline done. Pipeline id: $($response.id)"
if ($response.id -gt 0) {
  Write-Host "Release definition: succeeded."
}
Write-Host $response.id
Run Code Online (Sandbox Code Playgroud)

  1. 使用 '.\CreateReleasePipeline.ps1' 执行您的脚本,输出将如下所示:

.\CreateReleasePipeline.ps1
Creating Release Pipeline...
Create Release Pipeline done. Pipeline id: 71
Release definition: succeeded.
71
Run Code Online (Sandbox Code Playgroud)

  1. 刷新您的发布管道网页,您应该会看到新创建的发布管道。

  2. 您可以继续并重试,直到您对结果感到满意为止。

我正在使用这个 REST API 将发布定义模板放入源代码存储库,这样当我对它们进行调整时,我不必更新 50+ 和不断增长的发布管道。我可以通过 REST API 调用检查发布定义是否存在,如果不存在则创建它,如果它不是最新的则更新它。在创建新的 get 存储库时,无需手动更新它们或创建管道。我想尽可能地自动化一切。我想更改一次或尽可能少更改,让系统自行更新。

请让我知道这可不可以帮你。


小智 5

在此处输入图片说明

转到构建和发布,然后发布,您将找到一个选项。单击+按钮,然后有一个选项可以导入版本定义

让我知道您是否需要进一步的帮助。

  • 如果您所在的项目中没有发布定义,则不会看到该+按钮,您必须创建一个新的空白发布并将其保存,然后再返回时将看到该按钮。 (3认同)