既存のアプリとかなら手動配備とかもあり得るかもしれないけど serverless なプラットフォームを使ってるなら配備とかの自動化は当たり前ですよね?ということで試してみました。
とりあえず VSTS にプロジェクトを作ってgitignoreとかをnodeで作りました。
git cloneして作業開始です。
Azure 上にリソースの作成
とりあえず配備先ないと始まらないので Azure Functions のリソースを Azure Portal で作りましょう。
ローカルでプロジェクト作成
とりあえず最初の作業用のブランチ作って作業します。
git branch feature/init git checkout feature/init
そしてプロジェクトを作りましょう。
func init
設定をサーバーから読み込みます。
func azure functionapp fetch cicdfunctions func settings encrypt
今回は、なんとなく暗号化してみました。大事な情報が生値であるのってちょっとあれなんで。
local.settings.json を gitignore に追加します。.gitignoreにこんな内容を追加しましょう。
# azure functions local settings file local.settings.json
関数の作成
とりあえずfunc new
で関数をEchoという名前で作りました。
POST に対応する HttpTrigger にしました。デフォルトでテーブルストレージに出力するんですね。
module.exports = function (context, req) {var statusCode = 400; var responseBody = "Invalid request object"; if (typeof req.body != 'undefined'&& typeof req.body == 'object') { statusCode = 201; context.bindings.outTable = req.body; responseBody = "Table Storage Created"; } context.res = {status: statusCode, body: responseBody }; context.done(); };
function.json に接続文字列の設定を追加してやりましょう。
{"bindings": [{"type": "httpTrigger", "direction": "in", "name": "req", "methods": ["post"]}, {"type": "http", "direction": "out", "name": "res"}, {"type": "table", "name": "outTable", "tableName": "person", "partitionKey": "functions", "rowKey": "{rand-guid}", "connection": "AzureWebJobsStorage", "direction": "out"}], "disabled": false}
コミット / プッシュ
commit して push しましょう。これでVSTSにソースが追加されます。
そして適当にプルリク作って master にマージしておきます。(今回は直接 master にプッシュしてよかったかな…)
継続的デプロイの設定
Azure ポータルの Function App の プラットフォーム機能 の コードデプロイ の 展開オプション を選択します。
セットアップを押してソースの選択をすると、どこからデプロイするか選べます。今回はVSTSを選びます。
プロジェクトとブランチを選んでOK。
プロジェクトが選択肢に出てこない人は Azure と VSTS の紐づけを以下のサイトを参考にやるみたいです。
そうすると、こんな感じになります。
暫く待つと、関数が配備されてることが確認できます。因みに継続的デプロイを設定すると関数はポータル上で編集できなくなります。
確認
では、ソースをこんな感じに編集してみて push して merge してみます。
module.exports = function (context, req) {var statusCode = 400; var responseBody = "ちょっとおかしいんだけど"; if (typeof req.body != 'undefined'&& typeof req.body == 'object') { statusCode = 201; context.bindings.outTable = req.body; responseBody = "やったね!!上手にできたよ!!"; } context.res = {status: statusCode, body: responseBody }; context.done(); };
暫くすると Azure Portal でマージされたことが確認できます。
まとめ
簡単でしたね。迷うことはなさそうです。 デプロイメントスロットは、まだサポートされてないみたいですがstagingブランチに変更があったらデプロイされる Function App をもう1つつくれば似たようなことが出来るよ!ってドキュメントに書いてあるので、暫くはそうやるのがよさそうですね。
あとは VSTS で master ブランチにロックかけたりマージされるときのポリシーをちゃんと設定すればいい感じになりそう。