【问题标题】:PS Script to manage Azure Batch Application Version Retention用于管理 Azure Batch 应用程序版本保留的 PS 脚本
【发布时间】:2019-09-12 15:05:22
【问题描述】:

我们有一个 Azure Devops 版本,它使用以下 PowerShell 脚本构建我们的存储库、对其进行打包并将其部署到我们的 Azure Batch 服务:

New-AzureRmBatchApplicationPackage -AccountName "$(BatchAccountName)" -ResourceGroupName "$(ResourceGroupName)" -ApplicationId "$(ApplicationId)" -ApplicationVersion "$(Build.BuildNumber)-$(Release.ReleaseId)" -Format zip -FilePath "$(System.DefaultWorkingDirectory)/_artifact/artifact/bin/theapplication.zip"

Set-AzureRmBatchApplication -AccountName "$(BatchAccountName)" -ResourceGroupName "$(ResourceGroupName)" -ApplicationId "$(ApplicationId)" -DefaultVersion "$(Build.BuildNumber)-$(Release.ReleaseId)"

$Context = Get-AzureRmBatchAccount -AccountName "$(BatchAccountName)" -ResourceGroupName "$(ResourceGroupName)"

Get-AzureBatchComputeNode -PoolId "$(PoolId)" -BatchContext $Context | Restart-AzureBatchComputeNode -BatchContext $Context

问题是,这似乎并没有“清理”旧版本的应用程序包,而且我在 API 文档中没有看到这样做的方法。所以每隔几周我就会收到这样的错误信息:

应用程序包的最大允许数量已经达到 为指定的应用程序添加。

如何更改此脚本以部署应用程序并清理旧版本,以免在部署过程中出现周期性故障?

【问题讨论】:

    标签: azure powershell azure-devops azure-batch


    【解决方案1】:

    根据您是否要保留任何历史记录以及您的版本,您应该能够调用 Get-AzBatchApplicationPackage 来列出与应用程序关联的应用程序包 (https://docs.microsoft.com/en-us/powershell/module/az.batch/get-azbatchapplicationpackage?view=azps-1.7.0)。请注意,对于此调用,ApplicationVersion 实际上是可选的。

    然后在您不想保留的任何应用程序包上使用 Remove-AzBatchApplicationPackage (https://docs.microsoft.com/en-us/powershell/module/Az.Batch/Remove-AzBatchApplicationPackage?view=azps-1.7.0),无论是您添加的应用程序包以外的所有应用程序包还是版本上的某些功能都取决于您。

    【讨论】:

    • 文档没有表明 ApplicationVersion 是可选的......它表明参数名称是可选的,据我所知。我尝试不包括它,但系统提示我输入它;试图传递它会产生错误。
    • 这是我的错误,因为我认为您使用的是最新版本的 Batch powershell 模块(列为预览版)。对于当前的捆绑版本,我相信该列表是 GetApplication (docs.microsoft.com/en-us/dotnet/api/…) 的属性
    • Get-AzBatchApplication 为 AccountPackages 带回一个空对象?
    • 我认为这是返回对象的 toString 的错误。我可以通过以下方式查看它们:PS C:\WINDOWS\system32> $tmp = Get-AzBatchApplication -AccountName "sdktest2" -ResourceGroupName "sdktest" -ApplicationId "new"PS C:\WINDOWS\system32> $tmp.ApplicationPackages
    【解决方案2】:

    我们使用 Azure CLI(在 PowerShell 中),因此语法与您的略有不同。这是我们实现您所要求的(以及更多)的脚本。关键是在某些调用上使用参数--query,以便能够计算应用程序版本的数量,并获取最旧的版本:

    $Environment = "dev"
    $ResourceGroup="rg-name-$Environment"
    $BatchAccount="batchname$Environment"
    $BatchApplicationName="MyApplication"
    $BatchApplicationVersion="1.2.3.4"
    $SetAsDefaultVersion=$true
    $MaxNumOfAppVersions=39
    
    Write-Host "Uploading new version of application to batch service..."
    $filename = "folder/file.zip"
    
    $numOfVersions = az batch application package list --resource-group "$ResourceGroup" --name "$BatchAccount" --application-name "$BatchApplicationName" --query "length([].{name:name})"
    Write-Host "There are currently $numOfVersions versions of the Application in the Batch Account"
    if ($numOfVersions -gt $MaxNumOfAppVersions) {
      # Do not automatically delete old version in the prod environment:
      if (($Environment.ToLower() -eq "prod")) {
        throw "The Batch Application $BatchApplicationName contains too many versions. Delete the oldest, after you have made sure that it is not in use in production."
      }
    
      $oldestAppVersion = az batch application package list --resource-group "$ResourceGroup" --name "$BatchAccount" --application-name "$BatchApplicationName" --query "sort_by([].{name:name, lastActivationTime:lastActivationTime}, &lastActivationTime)[0].{name:name}" -o tsv
      Write-Host "Deleting the oldest version (by lastActivationTime) of the Application, $oldestAppVersion, to avoid the max limit"
      az batch application package delete --resource-group "$ResourceGroup" --name "$BatchAccount" --application-name "$BatchApplicationName" --version-name $oldestAppVersion --yes
    }
    
    Write-Host "Uploading $filename..."
    az batch application package create --resource-group "$ResourceGroup" --name "$BatchAccount" --application-name "$BatchApplicationName" --package-file "$filename" --version-name "$BatchApplicationVersion"
    
    if ($SetAsDefaultVersion) {
      Write-Host "Setting this new version $BatchApplicationVersion as the default version..."
      az batch application set --resource-group "$ResourceGroup" --name "$BatchAccount" --application-name "$BatchApplicationName" --default-version "$BatchApplicationVersion"
    }
    
    Write-Host "All done!"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-27
      • 1970-01-01
      • 2019-09-06
      • 2018-05-14
      • 1970-01-01
      • 1970-01-01
      • 2011-09-19
      • 1970-01-01
      相关资源
      最近更新 更多