GitHub を使って Azure Functions の管理をしている場合には、やはりデプロイは自動化しておきたいです。VSTS は標準で対応してるみたいですが、AppVeyor は見た記憶がないので試しました。
少し試した感じでは WebDeploy Package を Azure Functions プロジェクトで作るのは難しそうだったので、dotnet publish を実行してから普通の zip を作るようにします。
dotnet publish -c Release
Azure Functions v2 は .NET Core なので dotnet publish を実行すれば良いです。
最近は zip をプッシュするだけでデプロイ出来るようになったので利用します。App Service Team のブログに zip デプロイについての解説があるので、参照しておくと良さそうです。
デプロイする zip を作ってしまえば、後は curl を使って Kudu の API を呼び出すだけです。
AppVeyor
AppVeyor は App Service に zip でのデプロイを行うプロバイダーが追加されているので、これまでの WebDeploy とは異なり、非常に簡単に行えるようになっています。
今回作成した appveyor.yml は以下のようになりました。
dotnet publish で生成したファイルは自前で zip にしないといけないのが少し面倒ですが、1 行追加で済むので妥協します。Artifacts に設定しないと後続のデプロイがめんどくさくなるので注意。
version: 1.0.{build} image: Visual Studio 2017 build_script: - cmd: dotnet publish -c Release -o ..\publish after_build: - cmd: 7z a artifact.zip .\publish\* artifacts: - path: artifact.zip deploy: - provider: AzureAppServiceZipDeploy website: <FUNCTION_NAME> username: <USERNAME> password: secure: <ENCRYPTED_PASSWORD>
AzureAppServiceZipDeploy に指定する値は発行プロファイルに書いてある値なので簡単です。
実際に GitHub にリポジトリを作成して、AppVeyor でビルドを実行しました。
ビルド自体は 1 分以内で完了するので非常に早いです。
ビルドが成功したのを確認した後に、Azure Portal で確認するとちゃんと作成した Function が確認できます。
当然ながらちゃんと動作します。デプロイ後に Azure Functions Runtime のバージョンを変更できないので、そこだけは予め変更しておかないとはまります。
CircleCI 2.0
CircleCI を使う場合も AppVeyor とやることはほぼ同じですが、CircleCI 2.0 では Docker が使えるので Microsoft の公式 SDK イメージを利用してビルドを行います。
作成した config.yml は以下のようになりました。7z が入っていないのでインストールします。
version: 2 jobs: build: docker: - image: microsoft/dotnet:sdk steps: - checkout - run: name: Install 7zip command: apt-get update && apt-get install -y p7zip-full - run: name: Build Azure Function command: dotnet publish -c Release -o ../publish - run: name: Pack to Zip command: 7z a artifact.zip ./publish/* - run: name: Push to App Service command: curl -X POST -u $SITE_USER:$SITE_PASS --data-binary @artifact.zip https://***.scm.azurewebsites.net/api/zipdeploy
App Service へのデプロイは curl を使って 1 発で終わります。
CircleCI 2.0 の対応言語には .NET Core がありませんでしたが、今回利用した SDK イメージはキャッシュ済みのようで、一瞬で環境の構築が完了しました。
ビルドは AppVeyor よりも早く感じました。デプロイが完了後は Azure Portal から確認できます。
.NET Core になってからはビルド環境の構築が非常に楽になり、プラットフォームも気にする必要がほぼなくなったため SaaS の選択肢が大幅に広がり便利になりました。