パフォーマンス最適化
最後にAzure Artifactsのストレージ効率を最適化するため、古いパッケージバージョンの自動削除機能を実装します。
自動クリーンアップの実装
保持ポリシーに基づいて、不要になった古いバージョンを定期的に削除する実装を追加します。前項で追加した「(4)ワークアイテムの自動更新」の後ろに新たにタスクを追加します。
# (5)古いパッケージバージョンのクリーンアップ
- task: PowerShell@2
displayName: '古いパッケージバージョンクリーンアップ'
inputs:
targetType: 'inline'
script: |
# パイプラインの自動認証トークンをbase64エンコードする
$base64Token = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$(System.AccessToken)"))
$headers = @{
'Authorization' = "Basic $base64Token"
'Content-Type' = 'application/json'
}
# 各種変数の定義
$orgName = "$(System.TeamFoundationCollectionUri)".Split('/')[-2]
$project = "$(System.TeamProject)"
$feedName = "WingsLibraries"
#(5)-1 削除ポリシーの定義
$retentionCount = 5 # 保持するバージョン数(最新5バージョンは削除しない)
$cutoffDate = (Get-Date).AddDays(-30) # 削除するパッケージの公開日(現在より30日より前の場合は削除する)
Write-Host "古いパッケージバージョンのクリーンアップを開始します..."
Write-Host "保持ポリシー: 最新 $retentionCount バージョン、または30日以内のバージョンを保持"
try {
#(5)-2 Azure Artifacts用のREST APIからフィード内のパッケージ一覧を取得
$packagesUri = "https://feeds.dev.azure.com/$orgName/$project/_apis/packaging/feeds/$feedName/packages?api-version=7.1-preview.1"
$packages = Invoke-RestMethod -Uri $packagesUri -Headers $headers -ErrorAction Stop
$totalDeletedCount = 0
#(5)-3 各パッケージのバージョンを確認して削除対象を特定
foreach ($package in $packages.value) {
$versionsUri = "https://feeds.dev.azure.com/$orgName/$project/_apis/packaging/feeds/$feedName/packages/$($package.id)/versions?api-version=7.1-preview.1"
try {
$versions = Invoke-RestMethod -Uri $versionsUri -Headers $headers -ErrorAction Stop
if ($versions.value.Count -le $retentionCount) {
continue
}
$sortedVersions = $versions.value | Sort-Object publishDate
$versionsToConsider = $sortedVersions | Select-Object -SkipLast $retentionCount
$versionsToDelete = $versionsToConsider | Where-Object { [DateTime]$_.publishDate -lt $cutoffDate }
if ($versionsToDelete.Count -eq 0) {
continue
}
Write-Host "パッケージ '$($package.name)': $($versionsToDelete.Count) 個の古いバージョンを検出"
foreach ($version in $versionsToDelete) {
$daysOld = ((Get-Date) - [DateTime]$version.publishDate).Days
Write-Host " - バージョン $($version.version) ($daysOld 日前)"
$packageName = $package.name
$packageVersion = $version.version
$deleteUri = "https://pkgs.dev.azure.com/$orgName/$project/_apis/packaging/feeds/$feedName/nuget/packages/$packageName/versions/$packageVersion" + "?api-version=7.1"
try {
#(5)-4 パッケージの削除処理
Invoke-RestMethod -Uri $deleteUri -Method Delete -Headers $headers -ErrorAction Stop
Write-Host " ✓ 削除完了"
$totalDeletedCount++
} catch {
Write-Warning " ✗ バージョン $packageVersion の削除に失敗: $($_.Exception.Message)"
}
}
} catch {
Write-Warning "パッケージ $($package.name) の処理に失敗"
}
}
Write-Host "`nクリーンアップ処理完了: $totalDeletedCount 個のバージョンを削除しました"
} catch {
Write-Warning "クリーンアップ処理でエラーが発生しました: $($_.Exception.Message)"
exit 0
}
このタスクは、Azure Artifactsフィード内の古いパッケージバージョンを自動的に削除し、ストレージを最適化します。
今回の例では、最新5バージョンのみを保持し、かつ30日以上経過したバージョンを削除対象とする変数定義をしています((5)-1)。これにより、必要なバージョンは残しつつ不要なバージョンを削除できるようにしています。
指定したAzure Artifactsのフィード内に含まれるパッケージの一覧を取得し((5)-2)、パッケージごとに削除ポリシーに合致するバージョンのパッケージが存在するかのチェックを行います((5)-3)。削除対象が存在する場合は、Azure ArtifactsのREST APIを用いて該当するパッケージの削除処理を実行します((5)-4)。
このタスクを追加してAzure Pipelinesのワークフローを実行すると、図のように削除ポリシーに合致したパッケージが削除されます。
まとめ
今回はAzure Pipelinesを中心とし、Azure ArtifactsやAzure Boardsと連携したパイプラインの処理の深掘り方法について説明しました。次回は、Azure DevOpsの手動および探索的テストサービスであるAzure Test Plansについて紹介する予定です。
