RhodecodeにPushしたら自動的にPelicanをmake htmlするためのhook

Posted on 2014/03/19(Wed) 01:35 in technical

さまりーごーるど

タイトルが全てである。

手元の環境では、Rhodecodeのhookが動くことを確認できているのはMercurialを使った場合だけなので、gitではなくhgを使います。

インストール

Rhodecodeのインストールはこれ見れ。

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するスクリプトを書く

今回は、

  1. 記事がpushされる、またはWeb上から編集後にCommitされる
  2. changegroupまたはpretxncommitからhookスクリプトが起動する
  3. fabricを使ってpelicanサーバにログイン
  4. hg clone
  5. make html
  6. 公開ディレクトリにrsync
  7. 完了

と言う方法を取る。サラッと出てきたけど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

のようにして登録しておけばいいだろう。

あとは、手元で書いたファイルをリポジトリにアップロードすればいいだけになる。

とても楽でよい。