Azure管道:批量批准对环境的部署

时间:2020-02-09 03:39:37

标签: azure-devops azure-pipelines

是否可以通过CLI或API(或其他任何方式)批准运行?我正在寻找一种批量批准来自不同管道的多次运行的方法,但是在UI中不可用。

比方说,我有100个管道,这些管道具有到生产环境的部署工作。我想批准所有等待批准的运行。

当前,我在Azure DevOps REST API或CLI的文档中找不到类似的内容。

功能文档: https://docs.microsoft.com/en-us/azure/devops/pipelines/process/environments https://docs.microsoft.com/en-us/azure/devops/pipelines/process/approvals

以下问题是相关的,但我正在寻找解决问题的方法,而不仅仅是通过API: Approve a yaml pipeline deployment in Azure DevOps using REST api

4 个答案:

答案 0 :(得分:4)

jesshouwing的猜测是正确的。现在多阶段仍处于预览状态,并且相应的SDK / API /扩展尚未扩展并提供给公众。

您可能会认为不使用API​​怎么办。我已经从后端检查了相应的代码,对multi-stage approval的所有操作都包含一个必需的参数:approvalId。我确定您知道此值是唯一,并且具有不同的approvalId值的不同批准图。这意味着,无论您要尝试哪种方法,approvalId都是大麻烦。而且据我所知,到目前为止,还没有任何api / SDK,第三个工具或扩展程序可以直接直接实现该值。


此外,对于multi-stage YAML,其发布过程逻辑与用UI定义的发布不同。因此,所有可以与release(UI)一起使用的公共API都不适合多阶段发布。

我们有一个未公开的api,可以获取Approval多阶段的消息:

https://dev.azure.com/{org}/{project}/_apis/pipelines/approvals/{approvalId}

您可以尝试批准上市,而无需指定approvalIdhttps://dev.azure.com/{org}/{project}/_apis/pipelines/approvals。及其响应消息:Query for approvals failed. A minimum of one query parameter is required.\r\nParameter name: queryParameters.这表示您必须告诉系统指定的approval(我之前提到的大麻烦)。

事实上,为什么approvalId是必需的部分,这是由我们的后端代码结构引起的。我建议您提出针对多阶段here开发API / SDK的建议。

答案 1 :(得分:3)

我只是在寻找有关获取所需批准ID的答案。实际上,有一个未记录的API可以批准批准检查。

这是Merlin解释的以下内容

https://dev.azure.com/{org}/{project}/_apis/pipelines/approvals/{approvalId}

身体必须看起来像这样

[{
    "approvalId": "{approvalId}",
    "status": {approvalStatus},
    "comment": ""
}]

其中{approvalStatus}告诉API是否批准。您可能需要尝试,但是我的状态为4。我猜只有两种可能性。 “批准”或“拒绝”。

现在的问题是如何获得批准ID?我找到了。您可以使用经典构建的时间轴API来获得它。 build API documentation说您是通过以下方式获得的

https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}?api-version=5.1

您在构建运行的响应中获得的构建时间表,但是它的模式是

https://dev.azure.com/{organization}/{project}/_apis/build/builds/{buildId}/Timeline?api-version=5.1

除了平板容器之外,还有来自阶段,阶段,工作和任务的父母/孩子关系,您可以在其中找到类似以下内容的东西:

{
  "records": [
    {
      "previousAttempts": [
        
      ],
      "id": "95f5837e-769d-5a92-9ecb-0e7edb3ac322",
      "parentId": "9e7965a8-d99d-5b8f-b47b-3ee7c58a5b1c",
      "type": "Checkpoint",
      "name": "Checkpoint",
      "startTime": "2020-08-14T13:44:03.05Z",
      "finishTime": null,
      "currentOperation": null,
      "percentComplete": null,
      "state": "inProgress",
      "result": null,
      "resultCode": null,
      "changeId": 73,
      "lastModified": "0001-01-01T00:00:00",
      "workerName": null,
      "details": null,
      "errorCount": 0,
      "warningCount": 0,
      "url": null,
      "log": null,
      "task": null,
      "attempt": 1,
      "identifier": "Checkpoint"
    },
    {
      "previousAttempts": [
        
      ],
      "id": "9e7965a8-d99d-5b8f-b47b-3ee7c58a5b1c",
      "parentId": null,
      "type": "Stage",
      "name": "Power Platform Test (orgf92be262)",
      "startTime": null,
      "finishTime": null,
      "currentOperation": null,
      "percentComplete": null,
      "state": "pending",
      "result": null,
      "resultCode": null,
      "changeId": 1,
      "lastModified": "0001-01-01T00:00:00",
      "workerName": null,
      "order": 2,
      "details": null,
      "errorCount": 0,
      "warningCount": 0,
      "url": null,
      "log": null,
      "task": null,
      "attempt": 1,
      "identifier": "Import_Test"
    },
    {
      "previousAttempts": [
        
      ],
      "id": "e54149c5-b5a7-4b82-8468-56ad493224b5",
      "parentId": "95f5837e-769d-5a92-9ecb-0e7edb3ac322",
      "type": "Checkpoint.Approval",
      "name": "Checkpoint.Approval",
      "startTime": "2020-08-14T13:44:03.02Z",
      "finishTime": null,
      "currentOperation": null,
      "percentComplete": null,
      "state": "inProgress",
      "result": null,
      "resultCode": null,
      "changeId": 72,
      "lastModified": "0001-01-01T00:00:00",
      "workerName": null,
      "details": null,
      "errorCount": 0,
      "warningCount": 0,
      "url": null,
      "log": null,
      "task": null,
      "attempt": 1,
      "identifier": "e54149c5-b5a7-4b82-8468-56ad493224b5"
    }
  ],
  "lastChangedBy": "00000002-0000-8888-8000-000000000000",
  "lastChangedOn": "2020-08-14T13:44:03.057Z",
  "id": "86fb4204-9c5e-4e72-bdb1-eefe230480ec",
  "changeId": 73,
  "url": "https://dev.azure.com/***"
}

在下面,您可以看到一个称为“ Checkpoint.Approval”的步骤。该步骤的ID IS 就是您需要批准所有内容的批准ID。如果您想知道批准从哪个阶段开始,则可以跟进parentId,直到parentId属性为null。 然后将是舞台。

通过此操作,您可以成功获取批准ID,并使用其进行上述批准

答案 2 :(得分:1)

@tf.function def reward_to_go_matmul(self, rewards, gamma=1.0): # initialize coefficients (gamma cumprod to the number of steps) coeffs = tf.math.cumprod(tf.fill([self.input_length], tf.constant(gamma)), exclusive=True) # create upper triangular matrix with coefficients coeff_m = tf.zeros([self.input_length, self.input_length]) for i in range(self.input_length): coeff_m = matrix_set_diag_v2(coeff_m, tf.fill([self.input_length-i], coeffs[i]), k=i) # calculate reward to go rtg = tf.matmul(coeff_m, tf.squeeze(rewards)) return tf.expand_dims(rtg, axis=-1) 扩展名尚未获得批准,我想是由于多级管道仍处于预览状态,并且最终将由旧的发行中心取代。

但是there is a REST API you can use to list and update approvals。可以从PowerShell相对容易地调用它们。

或者使用vsteam powershell modulebatch_rtg = self.reward_to_go_array_cond(tf.stack(ep_rews), tf.constant(self.gamma)) batch_rtg = self.reward_to_go_array(tf.stack(ep_rews), tf.constant(self.gamma)) batch_rtg = self.reward_to_go_matmul(tf.stack(ep_rews), self.gamma) batch_rtg = self.reward_to_go(ep_rews, self.gamma) az pipelines

答案 3 :(得分:1)

即使在Azure DevOps 2020内部部署中,我也可以确认Sebastian的答案对我有用。 从上面使用的两种方法中检索了 approvalId (我专门使用服务挂钩进行集成)之后,我使用了以下API PATCH 调用:

https://dev.azure.com/{organization}/{project}/_apis/pipelines/approvals/?api-version=6.0-preview

并在正文中

[
    {
        "approvalId": "{approvalId}",
        "status": {status integer}, (4 - approved; 8 - rejected)
        "comment": ""
    }
]

该调用与application / json Content-Type一起传递,但是在某些情况下,它不喜欢我使用[]括号,因此您需要解决该问题,然后调用才能起作用。 我什至可以将此呼叫集成到MS Power Automate

中的自定义连接器中