RhodecodeにPushしたら自動的にPelicanをmake htmlするためのhook
Posted on 2014/03/19(Wed) 01:35 in technical
さまりーごーるど
タイトルが全てである。
手元の環境では、Rhodecodeのhookが動くことを確認できているのはMercurialを使った場合だけなので、gitではなくhgを使います。
hookスクリプトの確認
rhodecodeでリポジトリを作った場合、特に何もしなければ repos/<repository-name> が作られるはずである。
リポジトリ種別はhgを選んでくださいね。
その後は、基本的に普段のMercurialと動作は同じなので、hgrcファイルに[hook]を書けば、hookからスクリプト実行が可能になる。
試しに、どのタイミングで何が発行されるかを確認しておこう。:
$ vi repos/test-repository/.hg/hgrc [hooks] changegroup.date = echo `date && echo 'changegroup'` >> /var/tmp/date.txt commit.date = echo `date && echo 'commit'` >> /var/tmp/date.txt incoming.date = echo `date && echo 'incoming'` >> /var/tmp/date.txt outcoming.date = echo `date && echo 'outcoming'` >> /var/tmp/date.txt prechangegroup.date = echo `date && echo 'prechangegroup'` >> /var/tmp/date.txt precommit.date = echo `date && echo 'precommit'` >> /var/tmp/date.txt preoutgoing.date = echo `date && echo 'preoutgoing'` >> /var/tmp/date.txt pretag.date = echo `date && echo 'pretag'` >> /var/tmp/date.txt pretxnchangegroup.date = echo `date && echo 'pretxnchangegroup'` >> /var/tmp/date.txt pretxncommit.date = echo `date && echo 'pretxncommit'` >> /var/tmp/date.txt preupdate.date = echo `date && echo 'preupdate'` >> /var/tmp/date.txt tag.date = echo `date && echo 'tag'` >> /var/tmp/date.txt update.date = echo `date && echo 'update'` >> /var/tmp/date.txt
この時の出力は、それぞれこうなる。
Web上からcommitした時:
Tue Feb 11 19:52:50 JST 2014 pretxncommit
Pull時:
Tue Feb 11 19:59:37 JST 2014 preoutgoing
Push時:
Tue Feb 11 20:00:25 JST 2014 prechangegroup Tue Feb 11 20:00:25 JST 2014 pretxnchangegroup Tue Feb 11 20:00:25 JST 2014 changegroup Tue Feb 11 20:00:25 JST 2014 incoming
hookにPelicanをmake htmlするスクリプトを書く
今回は、
- 記事がpushされる、またはWeb上から編集後にCommitされる
- changegroupまたはpretxncommitからhookスクリプトが起動する
- fabricを使ってpelicanサーバにログイン
- hg clone
- make html
- 公開ディレクトリにrsync
- 完了
と言う方法を取る。サラッと出てきたけどFabricを使ってデプロイをする。そう、ズルである。
rhodecodeサーバでmake htmlしてアップロードした方が良いと感じた女史の皆様は、僕のことを虫けらを見るような目で見てほしい。
まずは、hookの設定をする。:
$ vi ~/rhodecode/repos/pelican-repository/.hg/hgrc [hooks] pretxncommit.pelican_deploy = /usr/local/bin/fab -f /home/rhodecode/pelican_deploy/fabfile.py -u pelican update changegroup.pelican_deploy = /usr/local/bin/fab -f /home/rhodecode/pelican_deploy/fabfile.py -u pelican update
通報
fabコマンドは極力フルパスを書いておきましょう。
次に、fabfile.pyを書く。ここではnginxを使っている場合で書いてみる。
/home/rhodecode/pelican_deploy/fabfile.py
# -*- coding: utf-8 -*-
from fabric.api import run, cd, hosts, prefix, put
pelican = "192.168.0.17"
repo = "http://pelican:pelican@192.168.0.18:5000/repo/pelican-repository"
@hosts(pelican)
def update():
run("hg clone {}".format(repo))
with cd("pelican-repository"):
with prefix('source /home/pelican/pelican/bin/activate'):
run("make html")
run("rsync -a --delete output/ /usr/share/nginx/www/pelican/")
run("rm -rf pelican-repository")
fabricのsshパスワードをファイルに書いておきたい場合は、更に:
from fabric.api import env env.password = "password"
を書けばいいし、ファイルにパスワードを書いておきたくないのであれば、:
$ ssh-copy-id 192.168.0.17
のようにして登録しておけばいいだろう。
あとは、手元で書いたファイルをリポジトリにアップロードすればいいだけになる。
とても楽でよい。