しばやん雑記

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

Azure Functions の Precompiled Functions が改善されたので GitHub 連携でデプロイを行ってみる

以前にぶちぞう RD が試した時にはまだまだ初期実装で、一度アセンブリを読み込むとロックされて更新できなくなってましたが、今朝 Azure Functions のランタイムがアップデートされて解消したみたいです。

App Service を確認すると、既に最新のバージョンがインストールされていました。すぐに試せます。

ブラウザだけで開発できる手軽さは素敵ですが、やはり俺達には Visual Studio のエディターが必要でした。csx はまだまだ発展途上で、ツールの対応が追い付いていない感じです。

とまあ、個人的にはコンパイルして動かしたい派だったので、早速試すことにします。GitHub 上のリリースノートにある Shadow copy assemblies と Automatic runtime restart というのが重要です。

  • Shadow copy assemblies (#1169)
    • addresses file locking deployment issues for .NET languages
  • Automatic runtime restart on managed dependency updates
    • addresses issues where a manual restart was required to reflect assembly updates (#1023)
Release Functions 1.0.10756 · Azure/azure-webjobs-sdk-script · GitHub

Shadow copy assembiles の Pull Request は同じようにアセンブリを実行時に読み込んで、いろいろしたい人には参考になるコードという感じでした。

実行時のアップデートを確認

とりあえず、まずは手動で Function のコンパイルを行って、実行時のアップデートが行えるか確認します。利用したコードは Wiki に書いてあるものをそのまま使いました。

Precompiled functions · Azure/azure-webjobs-sdk-script Wiki · GitHub

Visual Studio でビルドして、Kudu を使って Function をデプロイします。

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

Azure Portal での Precompiled Functions の表示も改善されていました。

使っているのが Preview Portal だからかも知れませんが、前までは dll を読み込んで無理やり表示していましたが、今は function.json が表示されます。

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

サクッと動作を確認します。まずはアセンブリを読み込ませるために、適当にクエリパラメータを指定してテスト実行します。

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

問題なく dll が読み込まれて実行されているようです。

次に Function を修正し、ビルドを行ったものを Kudu から直接上書きしてアップデートしてみます。実際に実行されているアセンブリは別の場所にあるので、問題なく上書きできます。そして同じく実行してみます。

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

Azure Functions のランタイムが変更を検知して、自動的に新しいアセンブリを読み込んで実行してくれました。これで GitHub などからデプロイを行う準備が出来ました。

GitHub 連携でデプロイを行う

サンプルとして Azure Functions 向けのデプロイスクリプトを作成したリポジトリを公開しておきました。今のところ Function を追加する度に追記する必要がありますが、工夫次第で何とでもなる気がします。

将来的には KuduScript が Functions のデプロイスクリプトに対応する気がします。

ソリューションの構成は以下のようにしました。csx の時はディレクトリで分離されていましたが、1 プロジェクトが 1 つの Function に相当するように作ります。

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

デプロイスクリプトを抜粋すると、プロジェクトをビルドして特定のディレクトリに出力しているだけです。

:: 2. Build to the temporary path
call :ExecuteCmd "%MSBUILD_PATH%" "%DEPLOYMENT_SOURCE%\HelloWorld\HelloWorld.csproj" /nologo /verbosity:m /t:Build /p:Configuration=Release;OutputPath="%DEPLOYMENT_TEMP%\HelloWorld";UseSharedCompilation=false %SCM_BUILD_ARGS%
IF !ERRORLEVEL! NEQ 0 goto error

元々は WebJob 用スクリプトを修正したものです。もうちょっと上手い方法がある気がします。

GitHub に push すると App Service がプロジェクトをビルドしてくれます。

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

ちゃんと Kudu 上で確認しても、Functions の仕様通りにディレクトリが作られてることが分かります。基本的にディレクトリの規約ベースなので自動でのデプロイがしやすいです。

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

Azure Portal でも作成した Function が認識されています。動作結果は同じなので省略しますが、当然ながら問題なく動作しました。CI 連携済みなので Read only になっています。

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

もちろん GitHub のリポジトリを修正すると、ビルドされてアップデートが行われます。

これで Visual Studio を使って快適な開発を行いつつ、デプロイまで完全に自動で行えるようになりました。これまでに csx で書いた Functions を移行していこうかと思います。