【问题标题】:Multiple primary artifacts to trigger Azure DevOps release definition触发 Azure DevOps 发布定义的多个主要工件
【发布时间】:2019-11-27 16:14:26
【问题描述】:

我们在 Azure DevOps 中有发布定义,其中包含多个工件来源。其中一个工件是构建工件,第二个是 azure repos Git。

只要有可用的新工件(构建工件或 azure git repos 工件),是否可以触发发布?这在 Azure DevOps 中是否可行。

【问题讨论】:

  • @LeoLiu-MSFT 感谢您提供的信息,您能否告诉我配置 Invoke Rest Api 任务时要提供的服务连接。
  • @LeoLiu-MSFT 我们无法在下拉列表中选择服务连接。我有构建和发布管理员权限。
  • 对不起,我不明白你现在在做什么,你可以在你的问题中描述它,并使用 REST API 来触发发布,你可以参考这个文档:developercommunity.visualstudio.com/content/problem/552318/…
  • @LeoLiu-MSFT 我已经添加了 Invoke Rest API 任务,连接类型是通用的。但是,即使服务连接在服务连接设置下可用,“通用服务连接”的下拉列表也是空的。
  • 我们正在通过此链接创建服务连接:docs.microsoft.com/en-us/azure/devops/pipelines/library/…

标签: azure-devops


【解决方案1】:

是的,您可以将 2 个工件添加到发布管道。不,(根据您的问题标题)您不能将超过 1 个工件标记为 Primary。是的,您可以将CD Triggers 添加到您希望添加到管道中的任意数量的工件源中。

请注意,存储库更改时的 CD 触发器并不要求您将从构建源中使用的工件与以前的版本不同。我不知道你的情况,但我可能会建议你有 2 个单独的 After Release 阶段,每个阶段都应用一个工件过滤器,这样你只在有新版本可用时才使用构建,并且只使用代码当提交可用时。

【讨论】:

  • 谢谢。在我们的例子中,我们有两个工件(构建工件和 Azure Repos Git 工件)。每当生成新工件(新构建工件或 git 提交)时,我们都需要自动触发 CD。希望我的案子现在很清楚。如果我们可以在 Azure DevOps 中实现这一点,请告诉我。
  • 是的。我相信我在回答中很清楚这一点。 CD 触发器可以添加到您的工件中,以便为其中任何一个启动管道。这就是说you can add CD Triggers to any number of artifact sources you desire 的意思。查看我提供的图像,您会看到我有一个简单的管道,其中包含构建和 repo 工件,并且都设置了 CD 触发器。
【解决方案2】:

只要有可用的新工件(构建工件或 azure git repos 工件),是否可以触发发布?这在 Azure DevOps 中是否可行。

抱歉给您带来不便。

构建/发布定义目前仅支持单个触发器

作为解决方法,您可以将 Azure Repos Git artifact 设置为 primary 工件以触发 Azure DevOps 发布定义。

对于构建工件,我们可以通过REST API 从任一构建定义中的构建任务触发发布定义。

查看this ticket了解更多详情。

更新:

详细说明如何使用构建管道中的 Rest API 触发器发布。

正如我上面回答的,我们可以使用 Rest API Releases - Update Release 来触发发布:

PATCH https://vsrm.dev.azure.com/{organization}/{project}/_apis/Release/releases/{releaseId}/environments/{environmentId}?api-version=5.1-preview.6

当您打开发布管道,然后切换到日志选项卡时,您可以获得releaseIdenvironmentId

然后,我们在构建管道中添加一个Inline Powershell 任务来调用API 来触发发布。脚本如下:

$url = "https://vsrm.dev.azure.com/<OrganizationName>/<ProjectName>/_apis/Release/releases/285/environments/370?api-version=5.1-preview.6"

$connectionToken="Your PAT Here"
$base64AuthInfo= [System.Convert]::ToBase64String([System.Text.Encoding]::ASCII.GetBytes(":$($connectionToken)"))


$headers = @{ Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
$body=@"
  {
    "status":"inProgress",
    "scheduledDeploymentTime":null,
    "comment":""
  }
"@
Write-Host "$url"
$response= Invoke-RestMethod -Uri $url  -ContentType "application/json" -Body $body -headers @{authorization = "Basic $base64AuthInfo"} -Method PATCH 

如果你执行这个构建管道,它会触发发布管道。

作为测试,它在我这边运行良好。

注意:

当您使用上述脚本时,您需要进入代理阶段并选择允许脚本访问 OAuth 令牌。见Use the OAuth token to access the REST API

更新2:

Powershell 脚本可以工作,但它会下载旧的构建工件。 但是,我们需要将发布与最新的构建工件相关联, 这如何实现?

您可以使用另一个 REST API 来获取最新的 Release ID 和 environmentId

Definitions - Get

我们可以获得definitionId的所有Release ID:

"isDeleted": false,
"lastRelease": {
    "id": 285,
    "name": "xxxxxx",
    "artifacts": [],
    "_links": {},

然后使用Select-Object -first 1 获取最新的Release ID。

接下来,我们可以使用另一个 API Releases - Get ReleasereleaseId,通过上面的 Rest API,我们可以得到 environmentId

GET https://vsrm.dev.azure.com/{organization}/{project}/_apis/release/releases/{releaseId}?api-version=5.1

输出如下:

"environments": [
    {
        "id": 370,
        "releaseId": 285,
        "name": "Dev",
        "status": "succeeded",
        "variables": {

现在,我们获得了最新的发布 ID,我们可以使用第一个 REST API 来触发发布。

希望这会有所帮助。

【讨论】:

  • 嗨 Leo,Powershell 脚本可以工作,但它会下载旧的构建工件。但是,我们需要将发布与最新的构建工件相关联,如何实现呢?我们也可以在正文中指定发布名称,现在的行为是每当我们执行脚本时都会创建相同的发布名称(例如:Release-1)。
  • @Santhosh,检查我的回答中的 updated2,我们无法在正文中添加发布名称。
  • 我们如何触发发布,以便它始终下载最新的构建工件。谢谢。
  • @Santhosh,我在 update2 的回答中已经回答了这个问题,我们需要另外两个 Powershell 任务调用 API 来获取最新的 Release ID 和 environmentId,然后将这两个值转移到之前的 powershell 任务中触发发布管道。
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 1970-01-01
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多