SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Azureのクラウド環境でDevOpsを実現する「Azure DevOps」入門

Azure Pipelinesを中心とした連携で、品質管理などの機能を実装しよう

Azureのクラウド環境でDevOpsを実現する「Azure DevOps」入門 第7回

パフォーマンス最適化

 最後にAzure Artifactsのストレージ効率を最適化するため、古いパッケージバージョンの自動削除機能を実装します。

自動クリーンアップの実装

 保持ポリシーに基づいて、不要になった古いバージョンを定期的に削除する実装を追加します。前項で追加した「(4)ワークアイテムの自動更新」の後ろに新たにタスクを追加します。

[リスト4]デプロイステージへの古いパッケージ自動削除タスクの追加(azure-pipelines.yml)
  # (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)。

図4:古いバージョンのパッケージ削除の例
図4:古いバージョンのパッケージ削除の例

 このタスクを追加してAzure Pipelinesのワークフローを実行すると、図のように削除ポリシーに合致したパッケージが削除されます。

まとめ

 今回はAzure Pipelinesを中心とし、Azure ArtifactsやAzure Boardsと連携したパイプラインの処理の深掘り方法について説明しました。次回は、Azure DevOpsの手動および探索的テストサービスであるAzure Test Plansについて紹介する予定です。

この記事は参考になりましたか?

Azureのクラウド環境でDevOpsを実現する「Azure DevOps」入門連載記事一覧

もっと読む

この記事の著者

WINGSプロジェクト 秋葉 龍一(アキバ リュウイチ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/22974 2026/01/26 11:00

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング