tmytのらくがき

個人の日記レベルです

Azure Mobile ServicesをVisualStudio Onlineとかに同期させてみる

Windows Store Appsのバックエンドとしてお手軽にAPI作れたりできるAzure Mobile Servicesですが、Webでぽちぽちいじったやつは全部Gitで管理されています。なので、Azure Mobile SerivcesへGitでアクセスしてローカルでいじって、とかもできるんですが、今回はWebでいじったやつをVisualStudio Onlineをはじめとする外部のGitリポジトリに自動Pushしてみようと思います。

とりあえずまず、Azure Mobile Servicesのインスタンスを作ります。各自適当につくってください。ここではできている前提で話を進めます。

次に、VisualStudio Onlineなりなんなりの外部Gitリポジトリを用意します。GithubでもBitbucketでもGitが使えればなんでもいいです。各自適当に用意してください。今回はhttps://git.example.com/repo/mobile.git というリポジトリがあるという前提で話を進めます。 また、このリポジトリはユーザ名user、パスワードpassw0rdというアカウントで認証できるものとします。

さっそく設定してみます。まず、Mobile Servicesのインスタンスを開いて、構成をクリックします。

f:id:tmyt:20140926013714p:plain

次に、デプロイの開始 URLというよくわからん項目のURLをブラウザで開きます。開くとこんなページが出てきます。

f:id:tmyt:20140926014407p:plain

Debug Consoleをクリックして、CMDをクリックします。ここからAzure側のファイルシステムを触れます。結構便利。

f:id:tmyt:20140926014536p:plain

最初に、Azure側のリポジトリにremoteを設定します。リポジトリがあるディレクトリへ移動します

D:\home>cd site\repository

次に、最初に用意しておいた外部のGitサーバの設定を追加します。今回は外部のGitサーバにexternalという名前を付けました。特になんでもかまいません。

D:\home\site\repository>git remote add external https://user:passw0rd@git.example.com/repo/mobile.git

あとはgit hooksを設定します。 とりあえずまずは目的のディレクトリへ移動。

D:\home\site\repository>cd .git\hooks

次にファイル名を変更

D:\home\site\repository\.git\hooks>move post-commit.sample post-commit

ファイル名が変更されると、上のリストも更新されます。更新されたら、post-commitファイルの左側にある鉛筆アイコンをクリックします。 鉛筆アイコンをクリックすると、ファイルの編集画面になります。

f:id:tmyt:20140926015021p:plain

ここではshが使えるのでいい感じに書きます。というのもあれなので、今回ここまで設定した内容で書くとこんな感じでどうでしょうか。

#!/bin/sh

branch=$(git branch | grep '*' | cut -d ' ' -f 2)
if [ "$branch" = "VfsUpdateBranch" ]; then
    git checkout master
    git merge VfsUpdateBranch
    git push external
    git checkout VfsUpdateBranch
fi

VfsUpdateBranchをpushするのもなんなので、とりあえずいったんmasterをチェックアウトして、VfsUpdateBranchをマージしてから、外部Gitサーバへpushするようなコードです。適当な感じでいいと思います。

ここまで設定すると、Webから編集して保存したタイミングでVfsUpdateBranchに編集結果がコミットされます。そのコミットを受けて、最後に書いたシェルスクリプトが実行されます。その結果、gitコマンドで外部のリポジトリに同期されるということです。めでたしめでたし。

と、いろいろめんどくさかったですが、将来的にVisualStudio Onlineと同期できるようになるとうれしいなー。とか。でもそれだとWebSiteでいいんじゃない?という説もあったりなかったり。