動機
Sphinxを使って翻訳作業をしたりしているんですが、いちいち自分でビルドして、サイトに公開するのが面倒。そこで WebSocketのRFCの日本語訳を公開した時と同様にGoogle App Engineへ定期的にSphinxでビルどしたhtmlディレクトリをupするという方法を試してみた。
プロジェクト作成
まずはGoogle App Engine(以下GAE)のプロジェクト作成をする準備。今回はUbuntu 9.04上で環境を作ってみる。自分は一回作ったアプリケーションがあるのでいいけど、0から始める場合はまずアプリケーションの登録から。
まずダッシュボードで適当にアプリケーション作成。アプリケーション作ったらSDKをダウンロード
$ wget http://googleappengine.googlecode.com/files/google_appengine_1.3.1.zip $ unzip google_appengine_1.3.1.zip
展開されてできたgoogle_appengineディレクトリはとりあえず置いといて、適当にディレクトリ作成。アプリケーション名にした方がわかりやすくていい。(例えばymotongpoo)
$ mkdir ymotongpoo $ touch ymotongpoo/app.yaml $ vim ymotongpoo/app.yaml application: hoge version: 1 runtime: python api_version: 1 handlers: - url: /websocket_jp static_dir: websocket_jp - url: /jython25_ja static_dir: jython25_ja - url: .* script: main.py
上の例ではWebSocketのRFC和訳をおいてるymotongpooっていうアプリケーションの例。static_dirを指定して静的ファイルを置くディレクトリを明記。今回はこの下に新しい翻訳ドキュメントプロジェクトでSphinxの_build/htmlのシンボリックリンクを張るという作戦。とりあえずここまでできたら一区切り。
bitbucket + Sphinxの自動ビルド & GAEへの自動デプロイ
bitbucket + Sphinxのビルド
まずSphinxのインストール。
$ sudo easy_install sphinx
次にbitbucketから該当するプロジェクトを取ってくる。環境によってディレクトリパス変えてください。
$ cd ~/src/docs $ hg clone https://[email protected]/ymotongpoo/jython25_ja
適当にビルドするshellなどを書く。これでビルドできるのを確認したら今度はデプロイの方。
GAEへのデプロイ
さっき作ったレポジトリ内にできたSphinxの_build/htmlのシンボリックリンクを上記のGAEのディレクトリ内に作ってからデプロイをテスト。
$ cd ~/gae/ymotongpoo $ ln -s /home/ymotongpoo/src/docs/jython25_ja/_build/html jython25_ja $ cd ~/gae $ /path/to/google_appengine/appcfg.py update ymotongpoo Application: ymotongpoo; version: 1. Server: appengine.google.com. Scanning files on local disk. Scanned 500 files. Initiating update. Could not guess mimetype for websocket_jp/objects.inv. Using application/octet-stream. Cloning 35 static files. Cloning 949 application files. Cloned 100 files. Cloned 200 files. Cloned 300 files. Cloned 400 files. Cloned 500 files. Cloned 600 files. Cloned 700 files. Cloned 800 files. Cloned 900 files. Uploading 932 files and blobs. Processed 500 out of 932. Uploaded 932 files and blobs Deploying new version. Checking if new version is ready to serve. Will check again in 1 seconds. Checking if new version is ready to serve. Will check again in 2 seconds. Checking if new version is ready to serve. Will check again in 4 seconds. Checking if new version is ready to serve. Will check again in 8 seconds. Checking if new version is ready to serve. Will check again in 16 seconds. Checking if new version is ready to serve. Closing update: new version is ready to start serving. Uploading index definitions.
というわけで、無事にデプロイできました。あとは先程作ったスクリプトにデプロイの部分を追加してcronに追加して終わり。
#!/bin/bash HG_PROJECT_NAME=jython25_ja DOCS_HOME=${HOME}/src/docs GAE_SDK_HOME=${HOME}/tool/google_appengine GAE_APP_HOME=${HOME}/gae/ GAE_APP_NAME=ymotongpoo GAE_USER=<user mail address> GAE_PASS=<password> PASSWD_MSG="Password for "${GAE_USER} cd ${DOCS_HOME}/${HG_PROJECT_NAME} hg pull sleep 30 hg update sleep 30 make html sleep 60 cd ${GAE_APP_HOME} expect -c " spawn $GAE_SDK_HOME/appcfg.py update --email=$GAE_USER --passin $GAE_APP_NAME set timeout -1 expect $PASSWD_MSG send $GAE_PASS interact "
おわりに
とりあえず適当に作っちゃったので、今度はhg pullして更新がなかったらビルドしないように設定しなきゃ。