読者です 読者をやめる 読者になる 読者になる

YAMAGUCHI::weblog

土足で窓から失礼いたします。今日からあなたの息子になります。 当年とって92歳、下町の発明王、エジソンです。

bitbucket + Sphinx + Google App Engineで自動更新サイトを作成する

動機

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://username@bitbucket.org/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して更新がなかったらビルドしないように設定しなきゃ。