【问题标题】:How do you import a release definition in Azure Devops (VSTS)?如何在 Azure Devops (VSTS) 中导入发布定义?
【发布时间】:2018-10-19 02:52:55
【问题描述】:

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

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

【问题讨论】:

    标签: azure tfs continuous-integration azure-devops azure-pipelines-release-pipeline


    【解决方案1】:

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

    用于导入

    用于导出

    关于附录

    所有的构建/发布定义都伴随着一个叫做管道的术语。因此,无需创建虚拟版本定义即可导入新版本。您可以导入新的发布定义而无需任何虚拟定义。

    【讨论】:

    • 我不同意你关于在导入之前不需要虚拟管道的观点。我与@jeevs 处于同一位置 - 我有一个新的 Azure DevOps 项目,我正在尝试将构建定义导入其中。但是,由于没有现有的 BD,因此不会出现包含导入选项的菜单栏。如果不存在至少一个 BD,似乎无法访问导入功能。
    • 关于管道 json 外观的任何文档?其他任何地方都使用 yaml 文件。
    • @Marcus 你可以从here 找到json的模型,这不过是获取定义rest API
    • 我同意 Philip - 如果没有现有的管道,似乎无法导入。
    【解决方案2】:

    转到构建和发布,然后是发布,您会在其中找到一个选项。 点击+按钮,有一个导入发布定义的选项

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

    【讨论】:

    • 效果很好,谢谢!它给了我一个警告说Following properties in the release definition are not imported: Agent Queues, Deployment Groups, Deployment Group Tags, Approvals, Variable Groups and values of secret variables. 有什么办法吗?
    • 我不知道有什么方法可以超越开发组和代理队列..当您导入时,它确实让您可以从下拉列表中进行选择
    • 如果您在一个没有发布定义的项目中,您将看不到这个+按钮,您必须创建一个新的空白发布,保存它,然后当您返回时您会看到按钮.
    • @raterus 谢谢...此信息应添加到答案中
    【解决方案3】:

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

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

    【讨论】:

    • 谢谢,这么愚蠢的事情,到 2021 年仍然如此。似乎微软正忙着鞭打 github,无暇修复他们已经拥有的东西。
    【解决方案4】:

    通过阅读上面的 cmets,您在从不同的 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 个链接。例如,这些需要使用团队项目 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. 刷新您的发布管道网页,您应该会看到新创建的发布管道。

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

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

    如果这有帮助,请告诉我。

    【讨论】:

    • 您好,该方法适用于创建构建管道。当我使用您提到的相同方法时,我找不到页面。 devops.azure.com/VSS/_apis/release/…:找不到页面devops.azure.com/VSS/_apis/build/…:有效
    • 你好@Antebios。我正在按照您提到的相同步骤进行操作。效果很好。但是你能在 json 中设置代理池吗?在导出的定义 json 中,我没有看到像 queue / pool 这样的属性。
    【解决方案5】:

    将此作为已接受答案的附录。

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

    基本上,如果您没有任何现有的发布定义,似乎没有办法导入定义。我所做的是创建一个“虚拟”定义,然后遵循公认的答案。创建至少一个定义会将您带到该屏幕,否则您只会看到我在问题中显示的屏幕。

    【讨论】:

    • 请注意,这里指的答案是使用 GUI 导入下载的 json 文件,该文件导入发布定义,同时去除对另一个组织的用户、代理队列、部署组和其他组织的引用组织和团队项目的特定对象。另一个答案表明,您必须在尝试导入之前解决这些问题并准备发布定义 json 文件。
    【解决方案6】:

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

    【讨论】:

      猜你喜欢
      • 2019-11-09
      • 2019-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多