かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

Azure Functions でVSTSから継続的デプロイをしてみよう(node.js)

既存のアプリとかなら手動配備とかもあり得るかもしれないけど serverless なプラットフォームを使ってるなら配備とかの自動化は当たり前ですよね?ということで試してみました。

とりあえず VSTS にプロジェクトを作ってgitignoreとかをnodeで作りました。

f:id:okazuki:20170813135256p:plain

git cloneして作業開始です。

Azure 上にリソースの作成

とりあえず配備先ないと始まらないので Azure Functions のリソースを Azure Portal で作りましょう。

f:id:okazuki:20170813140336p:plain

ローカルでプロジェクト作成

とりあえず最初の作業用のブランチ作って作業します。

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にソースが追加されます。

f:id:okazuki:20170813141906p:plain

そして適当にプルリク作って master にマージしておきます。(今回は直接 master にプッシュしてよかったかな…)

継続的デプロイの設定

Azure ポータルの Function App の プラットフォーム機能 の コードデプロイ の 展開オプション を選択します。

f:id:okazuki:20170813142928p:plain

セットアップを押してソースの選択をすると、どこからデプロイするか選べます。今回はVSTSを選びます。

f:id:okazuki:20170813143118p:plain

プロジェクトとブランチを選んでOK。

f:id:okazuki:20170813143818p:plain

プロジェクトが選択肢に出てこない人は Azure と VSTS の紐づけを以下のサイトを参考にやるみたいです。

github.com

そうすると、こんな感じになります。

f:id:okazuki:20170813143959p:plain

暫く待つと、関数が配備されてることが確認できます。因みに継続的デプロイを設定すると関数はポータル上で編集できなくなります。

f:id:okazuki:20170813144215p:plain

確認

では、ソースをこんな感じに編集してみて 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();
};

f:id:okazuki:20170813145450p:plain

暫くすると Azure Portal でマージされたことが確認できます。

f:id:okazuki:20170813145621p:plain

f:id:okazuki:20170813145701p:plain

まとめ

簡単でしたね。迷うことはなさそうです。 デプロイメントスロットは、まだサポートされてないみたいですがstagingブランチに変更があったらデプロイされる Function App をもう1つつくれば似たようなことが出来るよ!ってドキュメントに書いてあるので、暫くはそうやるのがよさそうですね。

docs.microsoft.com

あとは VSTS で master ブランチにロックかけたりマージされるときのポリシーをちゃんと設定すればいい感じになりそう。