NEXTSCAPE Advent Calendar 2022 13日目の記事です。
はじめに
「アドベントカレンダー」とはそもそもどういう主旨のものなのか、皆さんごは存じでしょうか?
最近はIT系のアドベントカレンダーがかなり流行っているため、指定の日までのカレンダーを作成して、1日ずつ記事を投稿して公開していくもの……という認識の方も多いのではないでしょうか。
(私も調べるまで知らなかったのですが)実は「アドベント」というのは、イエス・キリストの降誕を待ち望む期間を指すそうです。つまりアドベントカレンダーとは、本来クリスマスまでの期間を1日1日数えて楽しみにするためのカレンダーなのです。
ならばその源流に則って、楽しいクリスマスを迎えるためのお手伝いができるような記事にしたい。そのためには何ができるだろうか……と考えた結果、今回の記事は「Azure pipeline を利用したデプロイのスケジュール実行」にしようと決めました。
楽しいクリスマスを迎えるための必須要件
楽しいクリスマスを迎えるために必要なこと。
それは当然、クリスマスイブの夜に外せない仕事が入らないことです!
開発者にとってよくある外せない仕事(特に深夜作業)が発生するのは、デプロイ作業ではないかと思います。
12月25日の0時ちょうどに公開したいサイトがあり、ちょっとしたデプロイをしなければならない。そのために、クリスマスを楽しむ友人や恋人、家族たちから離れて、一人孤独にパソコンの前に座り、粛々と作業をする……そんな悲しいクリスマスはもうやめにしましょう。
Azure pipeline を利用して、指定した時間になったら勝手にデプロイしてもらえば良いのです。
構成とデプロイまでの流れ
では、具体的な構成についてお話していきます。
Blue / Green デプロイメントで、指定日時になったらスワップされ最新アプリが公開されるように構成していきましょう。

Azure App Service に sub スロットを追加し、現行のアプリケーションを運用スロットにデプロイ、12月25日 0:00 に公開されてほしいアプリケーションを sub スロットにデプロイしておきます。
デプロイが完了したら、 sub スロットにアクセスして公開予定のアプリケーションが問題なく動作することを確認します。
アプリケーションの準備ができたら、定時になったら自動でデプロイ(スワッピング)されるように Azure Pipelines を設定していきましょう。
Azure Pipelines
今回はパイプラインのスケジュール実行についての話であるため、パイプラインの作り方や基本的なパイプラインの YAML の記述方法については省略します。
パイプラインの作成方法や基本的な部分については、以下のページが参考になります。
参考:パイプラインをカスタマイズする
さて、 Azure Pipelines ではスケジュールをトリガーにしてパイプラインを実行させることが可能です。
スケジュールは cron 構文で指定します。
schedules:
- cron: string # cron syntax defining a schedule
displayName: string # friendly name given to a specific schedule
branches:
include: [ string ] # which branches the schedule applies to
exclude: [ string ] # which branches to exclude from the schedule
always: boolean # whether to always run the pipeline or only if there have been source code changes since the last successful scheduled run. The default is false.
cron 構文で指定するタイムゾーンは UTC であるため、日本時間のまま指定しないように注意してください。
また、今回のデプロイ作業はスワッピングのみを想定しているためalwaysはtrueにしておきましょう。
(alwaysは既定でfalseです。falseになっていると、ブランチに変更がない場合はパイプラインが実行されません)
今回は 12月25日 0:00(日本時間)に、Azure WebApps の運用スロットと sub スロットがスワップされるように構成していきましょう。
schedules:
- cron: "00 15 24 12 *"
branches:
include:
- master
always: true
trigger: none
pool:
vmImage: ubuntu-latest
stages:
- stage:
jobs:
- job:
steps:
- task: AzureAppServiceManage@0
inputs:
azureSubscription: {Service connections 名}
Action: Swap Slots
SwapWithProduction: true
WebAppName: {デプロイ先の WebApp 名}
ResourceGroupName: {デプロイ先のリソースグループ名}
SourceSlot: sub
YAMLを上記の通り作成してパイプラインを登録します。
登録したパイプラインの右上のメニュー(3つの点のボタン)から「Scheduled runs」を開くと、一週間内に実行されるパイプラインの実行予定一覧を表示することができます。


※ 12/13時点で12/24のスケジュールを表示することができなかったので、画像はcron を00 15 13 12 *と指定したものを表示しています。
これで準備は完了です。12/25 0:00 になれば、あなたの代わりに Azure Pipelines がスロットをスワップし、アプリケーションを公開してくれるでしょう。サイト更新という顧客へのクリスマスプレゼントはこれで完璧です。あなたは心置きなく自分の大切な人のサンタさんになることに注力できるというわけです。
おわりに
実際の Web アプリのリリースは、パイプラインだけでは賄えない部分はどうしても出てくると思います。
しかし、やはり深夜作業は体にも心にも人的コストにも作業効率にも良くありませんので、自動化してシステムに任せられる部分は任せて、人間は好きなことして有意義な時間を過ごせると良いですよね。
この記事が、皆さんの素敵なクリスマスを過ごすための一助となれば幸いです。
参考
・パイプラインのスケジュールを構成する
https://learn.microsoft.com/ja-jp/azure/devops/pipelines/process/scheduled-triggers?view=azure-devops&tabs=yaml