如何在Azure Devops(VSTS)中导入发布定义?

18

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

export release definition

但是我找不到将此导入目标项目的方法。我只能选择创建新的定义。

create release definition

6个回答

14
如果您没有看到导入选项,可以尝试创建第一个空管道。一旦创建成功,它将启用导入选项。请参见以下截图:

输入图像描述

输入图像描述

3
谢谢。虽然这样做看起来很愚蠢,但在2021年仍然有效。似乎微软太忙于推销Github,而无暇修复他们已经拥有的东西。 - robnick

11

自从VSTS更名/更新为Azure DevOps,在UI上寻找那些选项时有一些变化。

导入方面

enter image description here

用于导出

enter image description here

关于附录

所有的构建/发布定义都包含了一个称为Pipeline的单一术语。因此,无需创建虚拟发布定义即可导入新的发布定义。您可以导入新的发布定义而无需任何虚拟定义。


6
我不同意你关于导入管道之前不需要虚拟管道的观点。我和@jeevs面临相同的问题 - 我有一个新的Azure DevOps项目,想要导入构建定义。但是,由于不存在现有的BD,包括导入选项的菜单栏没有出现。似乎没有办法在至少存在一个BD之前访问导入功能。 - Philip Stratford
有没有关于管道 JSON 长什么样子的文档?其他地方都使用 YAML 文件。 - Marcus
@Marcus,你可以在这里找到JSON模型,它实际上是获取定义REST API。 - Jayendran
我同意Philip的观点 - 没有现有的管道,似乎没有办法进行导入。 - Thierry

9

enter image description here

前往“生成和发布”、“发布”,您将找到一个选项。 单击“+”按钮,然后有一个导入发布定义的选项。

如果需要进一步帮助,请告诉我。


它运行得很好,谢谢!它给了我一个警告,说“在发布定义中以下属性未被导入:代理队列、部署组、部署组标记、批准、变量组和机密变量的值。”有什么解决方法吗? - reggaemahn
我不知道有什么方法可以绕过开发组和代理队列...当你导入时,它确实会给你选择从下拉菜单中选择的选项。 - noor
8
如果您在一个没有发布定义的项目中,您将看不到这个“+”按钮,您需要创建一个新的空白发布,保存它,然后当您返回时就会看到该按钮。 - raterus
@raterus 谢谢……这个信息应该被添加到答案中。 - Jose

8
从上面的评论中可以看出,您无法从不同的VSTS/Azure DevOps组织导入发布定义的原因是,您导出的发布定义包含对在您导入发布定义的组织或项目中不存在的对象的GUID引用。因此,您需要做一些工作以获得成功,平稳和完全集成的发布定义,以便将其用作模板。我们将使用此处找到的REST API:https://learn.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. 我不知道您在发布定义中定义了哪些组件,但是请查看并了解GUID如何在整个过程中使用。创建发布定义可能很有帮助,以查找必须替换的GUID。
  4. 要查找的GUID为SYSTEM_COLLECTIONID、SYSTEM_TEAMPROJECTID、SYSTEM_DEFINITIONID和BUILD_QUEUEDBYID
  5. 让我们从您的构建组织和项目中获取上述一些变量。为了获得这些变量,我们需要在常规构建期间打印一些环境变量。因此,请在CI构建的开始处添加一个“批处理脚本”步骤,并使用以下命令“C:\Windows\System32\cmd.exe”和参数“/c set”。完成构建后,请查看该构建步骤的日志并查找这些变量的值。您将需要在发布定义中使用它们。
  6. 在修改json文件之前,应该先进行复制。您应该删除JSON文件的一些内容,例如“createdOn”、“modifiedBy”、“modifiedOn”。底部的“url”有3个链接。这些需要使用Team Project 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

使用'.\CreateReleasePipeline.ps1'执行您的脚本,输出结果将类似于以下内容:

.\CreateReleasePipeline.ps1
Creating Release Pipeline...
Create Release Pipeline done. Pipeline id: 71
Release definition: succeeded.
71

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

  2. 您可以继续尝试,直到满意为止。

我正在使用这个REST API将一个发布定义模板放入源代码库中,这样当我进行调整时,就不必更新50多个甚至更多的发布管道。我可以通过REST API调用检查发布定义是否存在,如果不存在则创建它,如果不是最新的则更新它。所有这些都不需要手动更新或在创建新的获取仓库时创建管道。我希望尽可能地自动化所有内容。我想尽可能少地进行更改,让系统自行更新。

请告诉我这是否有所帮助。


你好,这种方法适用于创建构建流水线。当我使用你所提到的相同方法时,我得到了“页面未找到”的错误。https://devops.azure.com/VSS/_apis/release/definitions?api-version=4.1-preview.3:页面未找到https://devops.azure.com/VSS/_apis/build/definitions?api-version=4.1-preview.3:有效 - Bala
你好 @Antebios。我正在按照你提到的相同步骤进行操作,一切正常。但是你能否在json中设置代理池?在导出的定义json中,我没有看到类似于队列/池的属性。 - Bala

4
留在这里作为接受答案的补充说明。
接受的答案确实有效,但我应该提到它并没有完全解决我的初始问题。
基本上,如果您没有任何现有的发布定义,则似乎没有办法导入定义。我的做法是创建一个“虚拟”的定义,然后按照接受的答案所说的去操作。至少创建一个定义会带您到那个屏幕,否则您只会看到我在问题中展示的屏幕。

请注意,此答案是指使用GUI导入已下载的JSON文件,该文件导入发布定义同时剥离对另一个组织的用户、代理队列、部署组和其他组织和团队项目特定对象的引用。另一个答案揭示了您将不得不解决这些问题并在尝试导入之前准备好发布定义JSON文件。 - Antebios

0

导出后,它会生成一个 JSON 文件并将其保存在本地文件夹中。 然后转到发布或加号(+)按钮,单击它,您可以看到导入选项,单击它并选择该 JSON 文件。 就这样.....


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接