VSTS - 在发布期间删除以前的部署

2023-12-29

我正在从事一个 Azure 项目,该项目只能使用 Visual Studio CI 中的 ARM 模板进行部署,并且我们只有对 Azure 门户的读取访问权限。

目前我收到以下错误并且无法发布。我也无法从 Portal 中删除部署,因为我只有配置构建和发布阶段的权限,我想知道是否可以创建任何阶段来删除以前的部署。

到目前为止,我尝试了一些方法,例如使用内联 PowerShell 命令删除-AzureRmResourceGroupDeployment,删除类型的资源组Microsoft.资源/部署在资源部署阶段之前,但没有一个起作用。

[错误]创建部署“azuredeploy-2017721-715”将超出配额“800”。当前部署计数为“800”,请在创建新部署之前删除一些部署。请参见https://aka.ms/arm-deploy https://aka.ms/arm-deploy了解使用详情。


这是一个允许您以并行方式删除此类部署的脚本。您还可以将其用于 Azure DevOps 中的 Azure PowerShell 任务。如果您有有关身份验证的问题,请查看此处:Azure 凭据尚未设置或已过期,请运行 Connect-AzAccount https://stackoverflow.com/questions/54942499/azure-credentials-have-not-been-set-up-or-have-expired-please-run-connect-azacc

Param(
    [string] 
    [Parameter(Mandatory = $true)]
    $subscriptionId,

    [string] 
    [Parameter(Mandatory = $true)]
    $tenantId,

    [string] 
    [Parameter(Mandatory = $true)]
    $resourceGroupName,

    [int] 
    [Parameter(Mandatory = $true)]
    $numberOfDeploymentsToKeep,

    [int] 
    [Parameter(Mandatory = $true)]
    $batchSize
)

try {
    $c = Get-AzContext
}
catch {
    $c = $null
}

if (!$c -or !$c.Account) {
    Connect-AzAccount -Subscription $subscriptionId -Tenant $tenantId
} else {
    Select-AzSubscription -Subscription $subscriptionId -Tenant $tenantId
}

# ----------------------------------
# Get Deployments
# ----------------------------------

#$dateBeforeDeleteDeployments = Get-Date -Year 2018 -Month 06 -Day 30
#$deploymentsToDelete = Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName | Where-Object { $_.Timestamp -le $dateBeforeDeleteDeployments }

$currentDeployments = Get-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName

$currentNumberOfDeployments = ($currentDeployments | Measure-Object).Count
$numberOfDeploymentsToRemove = $currentNumberOfDeployments - $numberOfDeploymentsToKeep

if ($numberOfDeploymentsToRemove -lt 0) {
    throw "Number of deployments to remove is < 0..."
} 
if ($numberOfDeploymentsToRemove -eq 0) {
    Write-Host "Number of deployments to remove is 0..."
    return
}

Write-Host "Number of Deployments to remove: '$numberOfDeploymentsToRemove'..."

$deploymentsToDelete = $currentDeployments | Sort-Object -Property Timestamp | Select-Object -First $numberOfDeploymentsToRemove

$deploymentsToDelete | ForEach-Object {$i=0; $j=0; $deploymentsToDeleteBatched=@{}} {
    if($i -ne $batchSize -and $deploymentsToDeleteBatched["Batch $j"]) { 
        $deploymentsToDeleteBatched["Batch $j"]+=$_
        $i+=1 
    }
    else {
        $i=1
        $j+=1
        $deploymentsToDeleteBatched["Batch $j"]=@($_)
    }
}

Write-Host "Created $($deploymentsToDeleteBatched.Count) batches..."

# ----------------------------------
# Execute deletion in parallel
# ----------------------------------
$jobNames = @()
foreach ($batchkey in $deploymentsToDeleteBatched.Keys) {
    $deploymentsToDeleteBatch = $deploymentsToDeleteBatched.$batchkey

    $logic = {
        Param(
            [object] 
            [Parameter(Mandatory = $true)]
            $ctx,

            [object] 
            [Parameter(Mandatory = $true)]
            $deploymentsToDeleteBatch,

            [string] 
            [Parameter(Mandatory = $true)]
            $resourceGroupName
        )

        foreach ($deploymentToDelete in $deploymentsToDeleteBatch) {
            $deploymentName = $deploymentToDelete.DeploymentName
            Remove-AzResourceGroupDeployment -ResourceGroupName $resourceGroupName -Name $deploymentName -DefaultProfile $ctx -ErrorAction Stop
            Write-Host "Deleted Deployment '$deploymentName' from '$($deploymentToDelete.Timestamp)'..."
        }  
    }

    $jobName = ([System.Guid]::NewGuid()).Guid
    $jobNames += $jobName
    $jobObject = Start-Job $logic -Name $jobName -ArgumentList (Get-AzContext), $deploymentsToDeleteBatch, $resourceGroupName
}

while (Get-Job -State "Running") {
    Write-Host "---------------------------------------------------------------"
    Write-Host "Jobs still running..."
    Get-Job | Format-Table
    Write-Host "---------------------------------------------------------------"
    Start-Sleep -Seconds 10
}

Write-Host "Jobs completed, getting output..."
Write-Host "---------------------------------------------------------------"

foreach ($jobName in $jobNames) {
    Write-Host "Output of Job '$jobName'..."
    Receive-Job -Name $jobName
    Write-Host "---------------------------------------------------------------"
}

Write-Host "Done..."
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VSTS - 在发布期间删除以前的部署 的相关文章

随机推荐

  • PM2 Flush 不清除日志

    我运行的 Ubuntu 服务器突然满了 因为 pm2 日志占用了 16GB 我试过pm2 flush 但这只会清除占用 4GB 的文件夹 作为 root pm2 文件夹被清除 但日志文件夹未被清除 作为我自己的用户 该文件夹已被清除 但用户
  • 在Python中如何将`email.message.Message`对象转换为`email.message.EmailMessage`对象

    据我了解mboxPython 3 6 标准库中的类生成以下类型的旧式消息对象email message Message 较新的班级email message EmailMessage3 4 3 6 中引入的功能可以更轻松地访问消息内容 通过
  • 禁用 nginx 中的请求缓冲

    看起来 nginx 在将请求传递到上游服务器之前会缓冲请求 虽然对我来说大多数情况下都可以 但这是非常糟糕的 我的情况是这样的 我有 nginx 作为前端服务器来代理 3 个不同的服务器 apache 与典型的 php 应用程序 我用 py
  • lambda函数使用其参数作为模板参数调用模板函数

    以下是示例代码 无法编译 We use 迭代函数来迭代某个范围并运行 lambda 回调函数 这iterate函数将传递一些指示 即type 到回调 lambda 函数 然后该函数将根据指示进行工作 由于这些指示在编译时是固定的 我相信有一
  • Collection.stream() 的实现

    我已经在 J DK 1 8 上工作了几天 我遇到了一些与此类似的代码 List
  • 使用 ul li 生成 Jquery 多级菜单列表

    images vertical horizontal Jquery UI include quickfox 要处理的数组 我有像上面一样的文件夹结构 它存储在数组目录中 见下文 var dirs images images vertical
  • 如何在Vuejs中处理浏览器后退按钮单击事件

    在 Vue 组件中 我想像这样处理浏览器返回事件 mounted if browser back console log browser back button clicked else console log stay here 为了处理
  • 从 JSON 文件定义 Mongoose 模式

    我想从 JSON 文件定义我的猫鼬架构 这是我的 JSON 文件结构 default item productTitle label Product Title note e g Samsung GALAXY Note 4 type tex
  • Angular.js 观察函数调用的结果

    以下代码片段是否存在任何表面问题 ul class breadcrumb li class active span nbsp a href path dir url dir name a nbsp span class dividier s
  • 如何在 pythonpyder IDE 中使用相对导入

    我有 anaconda python 并正在使用spyder IDE 我试图弄清楚如何在运行底部或 F5 中使用相对导入 假设我有 pkg A foo1 py pkg A foo2 py 并且 foo1 py 有 from import f
  • 如何修复手机上的 Skrollr?

    我遵循移动浏览器支持指南 将内容包装在正文标记之后和之前 解释在这里 https github com Prinzhorn skrollr what you need in order to support mobile browsers
  • PHP Curl 和 setcookie 问题

    我有一个curl 脚本 充当客户端和主服务器之间的代理 field array array Accept gt HTTP ACCEPT Accept Charset gt HTTP ACCEPT CHARSET Accept Encodin
  • 在 Magento ORM 中使用布尔字段

    我正在为我的自定义实体开发后端编辑页面 我几乎一切都正常工作 包括保存一堆不同的文本字段 但是 当尝试设置布尔字段的值时 我遇到了问题 我努力了 landingPage gt setEnabled 1 landingPage gt setE
  • 在域模型之间映射数据的模式

    这是我最近需要做的一件常见的事情 我正在寻找任何常见的模式来使这变得更容易一些 这一切的主要要点是我有一些数据模型 它们被建模来满足 ORM 并纯粹对对象进行 CRUD 操作 这些模型目前通过存储库 工厂公开 取决于其 C 还是 RUD 然
  • Matplotlib动画,移动方块

    我正在从文本文件加载 x y 坐标和偏航角 这些坐标是正方形中间的坐标 yaw 是正方形与 x 轴的角度 在我的文本文件中 坐标正在变化 我想制作一个动画 其中方块将移动 遵循文件中的坐标 并具有精确的偏航角 一个动画刻度应该代表一个方块移
  • 如何禁用一条指令的中断?

    有没有其他方法可以在持续时间内禁用中断只有一条指令 in x86 questions tagged x86比使用CLI操作说明 是的 正在加载SS with a MOV将禁止下一条指令的外部中断 指令集参考是这样说的 使用 MOV 指令加载
  • ODE45 和 Runge-Kutta 方法与解析解的绝对误差比较

    如果有人可以帮助解决以下问题 我将不胜感激 我有以下常微分方程 dr dt 4 exp 0 8 t 0 5 r r 0 2 t 0 1 1 我用两种不同的方式解决了 1 借助于龙格 库塔法 第四阶 并通过ode45在Matlab中 我将这两
  • Oracle:将子查询中的多个结果合并为单个逗号分隔值[重复]

    这个问题在这里已经有答案了 我正在尝试将单列子查询转换为命令分隔的子查询VARCHAR 键入的值列表 这与这个问题 https stackoverflow com questions 111341 combine multiple resu
  • 实体框架自连接[重复]

    这个问题在这里已经有答案了 我使用 Entity Framework 6 和 Code First 并且有一个具有以下结构的表 public class Item Key public int ItemId get set Required
  • VSTS - 在发布期间删除以前的部署

    我正在从事一个 Azure 项目 该项目只能使用 Visual Studio CI 中的 ARM 模板进行部署 并且我们只有对 Azure 门户的读取访问权限 目前我收到以下错误并且无法发布 我也无法从 Portal 中删除部署 因为我只有