在 Azure Devops 的“经典”部署管道中,我们将利用 Azure 部署代理组来启动 Docker 实例,然后在容器内执行操作。
我们正在转向 YAML 管道,并正在努力执行相同的工作流程。
似乎没有功能对等,因此我们需要在 DevOps 中利用环境。我有一个 docker 容器,可以毫无问题地将自身注册为环境中的资源。我还可以使用 REST API 即时查询和创建这些。
我的问题是,似乎不可能在不破坏整个环境的情况下“删除”资源?我们可以通过/_apis/distributedtask/environments/62?expands=resourceReferences
查询我们当然可以通过在容器上运行remove命令来取消注册资源
,但这并不能满足“如果docker容器死机/离线怎么办”的场景。我们将留下悬而未决的资源,这将阻碍新资源的创建 我最初通过为每个容器创建一个新的动态命名环境来解决这个问题,但似乎由于 YAML 在运行之前评估部署环境,所以这是不可行的(因为环境不存在!)
回到实际问题:是否可以在环境中删除/取消注册资源?
是的。我们可以使用以下两种方法来删除Pipeline环境中的VM资源。
方法一:我们可以通过环境中的
删除选项手动删除虚拟机资源。 查看截图示例
方法2:我们可以使用API来实现。我们目前没有官方的 Rest API 来支持此操作,但我们可以使用后端捕获的 API(浏览器 F12 选项并检查 Network 选项卡)来删除环境中的资源。
这是 API 示例:
API地址:
POST https://dev.azure.com/{OrganizationName}/_apis/Contribution/HierarchyQuery?api-version=5.0-preview.1
请求正文:
{
"contributionIds":["ms.vss-environments-web.environment-delete-resource-data-provider"],
"dataProviderContext":
{
"properties":
{
"resourceId":"{VMresourceID}",
"resourceType":"2",
"sourcePage":
{
"url":"https://dev.azure.com/{orgname}/{projectname}/_environments/{environmentID}?view=resources",
"routeId":"ms.vss-environments-web.environments-route-with-id",
"routeValues":{
"project":"{Projectname}",
"environmentId":"{environmentID}",
"viewname":"environment",
"controller":"ContributedPage",
"action":"Execute"
}
}
}
}
}
我们可以通过Rest API获取相关参数:
GET https://dev.azure.com/{organization}/{project}/_apis/distributedtask/environments/{environmentId}?expands=resourceReferences&api-version=7.1-preview.1