2021-12-05に更新

Azure Pipelineを使ったリリースの実施方法2

Azure Pipelineでリリースした際に、増分リリースだと名称変更などした場合に反映先ADFにリソースが残ってしまうので、その対処方法について確認。

◆前提
増分リリース

◆前準備
・デプロイ前後に実行するスクリプトの準備
参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-sample-script#pre--and-post-deployment-script
上記をそのままコピーして、反映元のブランチにPowerShellスクリプトとして保存する
トリガーの停止も組み込まれているので別途用意する必要はない
デプロイ前、デプロイ後の処理も、スクリプト実行時の引数で切り分けて実行するようになっている

◆手順
1.ジョブの追加
参照:https://docs.microsoft.com/ja-jp/azure/data-factory/continuous-integration-delivery-sample-script#script-execution-and-parameters
リリースの前後に、PowerShellを実行するジョブを追加する
デプロイ前のジョブのScript Argumentsには下記を設定する

-armTemplate "$(System.DefaultWorkingDirectory)/<your-arm-template-location>" -ResourceGroupName <your-resource-group-name> -DataFactoryName <your-data-factory-name> -predeployment $true -deleteDeployment $false

デプロイ後のジョブのScript Argumentsには下記を設定する

-armTemplate "$(System.DefaultWorkingDirectory)/<your-arm-template-location>" -ResourceGroupName <your-resource-group-name> -DataFactoryName <your-data-factory-name> -predeployment $false -deleteDeployment $true

下記のような感じになる
image

2.保存して動作確認

★注意
トリガーを削除して同じ名前で異なる種類のトリガーを作成したら、リリースでエラーが発生する
同名トリガーの型を更新できない、というエラーだった
TriggerTypeCannotUpdate: Trigger type cannot be updated.null

DataFactoryでトリガーを再作成しようとすると、一度トリガー削除→発行→再作成という手順をとらないといけないけど、Azure Pipelineでも同様らしい

↑スクリプトを修正して解決できた
対処方法は下記。

前準備で作成したスクリプトに下記を追加する
① $triggersToStartの下くらいに以下を追加
同名、かつ、テンプレート内と反映先でタイプの違うトリガーを取得

#Trigger reCreate
$triggersNameAndTypeInTemplate = $triggersInTemplate | ForEach-Object { 
    New-Object PSObject -Property @{
        Name = $_.name.Substring(37, $_.name.Length-40)
        TriggerType = $_.Properties.type
    }
}
$triggersToReCreate = $triggersToStop | ForEach-Object {
    foreach($entry in $triggersNameAndTypeInTemplate.GetEnumerator()) {
        if (($entry.Name -eq $_.Name) -and ($_.TriggerType -ne $entry.TriggerType)) {
            Write-Host "reCreate target trigger name " $_.Name
            New-Object PSObject -Property @{
                Name = $_.Name
                TriggerType = $_.TriggerType
            }
        }
    }
}

② if ($predeployment -eq $true) {}のブロックの中の、$triggersToStop | ForEach-Object {}のブロックの次に以下を追加

    #Delete reCreate trigger
    Write-Host "Deleting triggers for reCreate"
    $triggersToReCreate | ForEach-Object { 
        Write-Host "Deleting trigger "  $_.Name
        $trig = Get-AzDataFactoryV2Trigger -name $_.Name -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName
        if ($trig.RuntimeState -eq "Started") {
            if ($_.TriggerType -eq "BlobEventsTrigger" -or $_.TriggerType -eq "CustomEventsTrigger") {
                Write-Host "Unsubscribing trigger" $_.Name "from events"
                $status = Remove-AzDataFactoryV2TriggerSubscription -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_.Name
                while ($status.Status -ne "Disabled"){
                    Start-Sleep -s 15
                    $status = Get-AzDataFactoryV2TriggerSubscriptionStatus -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_.Name
                }
            }
            Stop-AzDataFactoryV2Trigger -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Name $_.Name -Force 
        }
        Remove-AzDataFactoryV2Trigger -Name $_.Name -ResourceGroupName $ResourceGroupName -DataFactoryName $DataFactoryName -Force 
    }
ツイッターでシェア
みんなに共有、忘れないようにメモ

ao-iro

Crieitは誰でも投稿できるサービスです。 是非記事の投稿をお願いします。どんな軽い内容でも投稿できます。

また、「こんな記事が読みたいけど見つからない!」という方は是非記事投稿リクエストボードへ!

有料記事を販売できるようになりました!

こじんまりと作業ログやメモ、進捗を書き残しておきたい方はボード機能をご利用ください。
ボードとは?

コメント