しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

AppVeyor と CircleCI 2.0 を使って Azure Functions v2 の CI/CD を行う

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 デプロイについての解説があるので、参照しておくと良さそうです。

https://blogs.msdn.microsoft.com/appserviceteam/2017/10/16/zip-push-deployment-for-web-apps-functions-and-webjobs/

デプロイする 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 でビルドを実行しました。

f:id:shiba-yan:20180211015609p:plain

ビルド自体は 1 分以内で完了するので非常に早いです。

ビルドが成功したのを確認した後に、Azure Portal で確認するとちゃんと作成した Function が確認できます。

f:id:shiba-yan:20180211015718p:plain

当然ながらちゃんと動作します。デプロイ後に 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 イメージはキャッシュ済みのようで、一瞬で環境の構築が完了しました。

f:id:shiba-yan:20180211024925p:plain

ビルドは AppVeyor よりも早く感じました。デプロイが完了後は Azure Portal から確認できます。

.NET Core になってからはビルド環境の構築が非常に楽になり、プラットフォームも気にする必要がほぼなくなったため SaaS の選択肢が大幅に広がり便利になりました。