かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

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 ブランチにロックかけたりマージされるときのポリシーをちゃんと設定すればいい感じになりそう。