Azure DevOps を使って、GitHub に置いてある静的なWebサイトをクラウドにデプロイしてみたので、そのやり方をメモしておきます。
やりたいこと : Webサイトにファイルをごそっとおきたい
長らく放置していた静的Webサイトの引越しをやるにあたって、ついでに自動デプロイの練習をすることにしました。
結果として、masterにpushすると、自動的にサイトに配置されるようになりました。
初心者がやるタスクとしては最高にシンプルなやつだと思ったのですが、あまりに簡単すぎるのか、ちょうどいい記事が見当たらなくて、ちょっと調べながら進めることになりました。
Azure DevOps とは
Azure DevOps はSam Guckenheimer さんたちが作っているクラウドサービスで、もともとはVisual Studio Team Services とか Team Foundation Server とか言っていたものです。もともと DVDに入れてインストール型で売っていたアジャイル支援ツールを、クラウドに移行しました。プロダクトバックログ管理、デプロイパイプライン、アラート管理などが統合されています(バラバラでも使えますので今回はパイプラインだけ)。
ビルドを作る
今回やりたいのはGitHubからコピーするだけの作業ですが、それを行う「ビルド」を作ります。
[Pipelines]-[Builds] -> [+ New]-[New build pipeline]
更新元のファイルはGithub.comにあるのでGitHubを選択。
プロジェクトにGithubを連携してあると、自分のリポジトリを検索できます。
プロジェクトのGitHub連携は左下の project settings から GitHub Connections で [ + New Connection]でアカウントに紐づけて、連携対象のリポジトリを指定します。
GitHubのリポジトリ直下に azure-pipelines.yml があると自動的に読み込むみたいです。
設定ファイル azure-pipeline.yml の内容
今回の azure-pipeline.yml の内容はこれです。
masterブランチの更新をトリガーにして、WindowsのVM上で AzureFileCopyコマンドを実行し、SourcePath (規定値では作業ディレクトリ直下 = 対象リポジトリをクローンしたルートディレクトリ) から、ディレクトリの内容をごっそり対象のBlobストレージにコピーします。
trigger:
- master
pool:
vmImage: 'windows-2019'
steps:
- task: AzureFileCopy@3
inputs:
SourcePath:
azureSubscription: 'Free Trial (3372c....)'
Destination: 'AzureBlob'
storage: 'innov......'
ContainerName: '$web'
Azure DevOps上で設定を変更すると、このファイルに保存され、GithubリポジトリにPushされます。ここで master ブランチが更新されるため、すぐにこのビルドジョブがキックされて実行されます。
pool: vmImageは、Linuxや、低いバージョンのWindowsでは動かないようです。AzureFileCopyの制約かと思います。
The Microsoft-hosted agent pool provides 7 virtual machine images to choose from:
- Visual Studio 2019 Preview on Windows Server 2019 (
windows-2019
)- Visual Studio 2017 on Windows Server 2016 (
vs2017-win2016
)- Visual Studio 2015 on Windows Server 2012R2 (
vs2015-win2012r2
)- Windows Server 1803 (
win1803
) - for running Windows containers- macOS X Mojave 10.14 (
macOS-10.14
)- macOS X High Sierra 10.13 (
macOS-10.13
)- Ubuntu 16.04 (
ubuntu-16.04
)Microsoft-hosted agents for Azure Pipelines - Azure Pipelines | Microsoft Docs
task: AzureFileCopy が今回の処理のキモです。いつくかパラメータがあります。
azureSubscriptionと storage は、あらかじめ Azure上で作成したBlobストレージの情報を書き込みます。
sourceはちょっとハマったのですが、全部消すとビルドのローカルパスになると気づいて、消したらうまくいったのでそのままにしています。
ドキュメントによると $(Build.Repository.LocalPath)¥hogehoge とかやると Github 上のサブディレクトリが指定できそうです。
Source | Required. The source of the files to copy. Pre-defined system variables such as $(Build.Repository.LocalPath) can be used. Names containing wildcards such as *.zip are not supported. |
Azure File Copy task - Azure Pipelines | Microsoft Docs
さて実行
右上の [Run] を押すと実行されます。GitHub で masterになにか push しても実行されます。私の場合は、azure-pipeline.yml でエラーになったので何度か書き換えたらそのつど実行されて解析が楽でした。
まずAzureのクラウド内にある待機中のエージェント(VM)がアサインされます。
リポジトリからチェックアウト(ダウンロード)して...
AzureFileCopyコマンドが実行されます。
黄色い文字で警告(Warning)が出ていますがこれは後で調べるとして...
下の白い文字「Uploading files from ...」 の行でコピーができたことがわかります。
エラーの場合はここが赤文字になってエラー内容が表示されます。
ジョブ終了。前述の2個の警告は気になりますが、ジョブは全て成功です。
Azure Storage の Blob にファイルがコピーされていることを確認!
今回の作業にどれくらいかかったか
ちなみにいろいろ調べながら、10回くらいで成功したみたいです。エラーの原因はVMが Linux だったこと、パス指定が違っていたことでした(消したらすんなりいった)。更新予定のないサイトですが、いつでも直せるのは気持ちいいし、引っ越しも簡単(と思いたい)。
(備忘録) 試しに作ったビルドを消すとき
ビルドを消すときは、ビルドの名前を全部入力します。(1) の入力どうするんだろ、ってドギマギしたのですが、kawagutiの部分を入力していないことに気づきました。
余談: Sam Guckenheimer さんの Agile2014の基調講演
余談ですが、Sam Guckenheimer さんの「マイクロソフトがいかにしてクラウド時代にシフトしたか」というAgile2014の基調講演は、私の中でもピカイチに衝撃を受けたスピーチでした。