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

问题描述 投票:6回答:5

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

export release definition

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

create release definition

azure tfs continuous-integration azure-devops azure-pipelines-release-pipeline
5个回答
3
投票

enter image description here

转到Build and Releases然后Releases,在那里你会找到一个选项。单击+按钮,可以选择导入版本定义

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


7
投票

由于VSTS已重命名/更新为Azure DevOps,因此UI中有一些更改可用于查找上述选项。

用于导入

enter image description here

用于出口

enter image description here

关于增编

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


4
投票

从上面的注释中读取您从其他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. 我不知道您在发布定义中定义了哪些组件,但请仔细查看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链接。例如,需要使用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
  1. 使用'。\ CreateReleasePipeline.ps1'执行脚本,输出将如下所示:

.\CreateReleasePipeline.ps1
Creating Release Pipeline...
Create Release Pipeline done. Pipeline id: 71
Release definition: succeeded.
71
  1. 刷新Release Pipeline网页,您应该会看到新创建的Release Pipeline。
  2. 您可以继续尝试,直到您对结果感到满意为止。

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

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


1
投票

将此留作接受答案的附录。

接受的答案确实有效,但我应该提一下,我最初的问题并没有得到解决。

基本上,如果您没有任何现有的版本定义,似乎没有办法导入定义。我所做的是创建一个“虚拟”定义,然后按照接受的答案说明。创建至少一个定义会带您进入该屏幕,否则您将只获得我在问题中显示的屏幕。


0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.