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

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

さまりーごーるど

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

Rhodecodeのインストールは Rhodecodeインストールほか を参照

hookスクリプトの確認

rhodecodeでリポジトリを作った場合、特に何もしなければ repos/repository-name が作られるはずである。
リポジトリ種別はhgを選んでくださいね。

その後は、基本的に普段のMercurialと動作は同じなので、hgrcファイルに [hook] を書けばhookからスクリプト実行が可能になる。
試しに、どのタイミングで何が発行されるかを確認しておこう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
$ 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した時

1
Tue Feb 11 19:52:50 JST 2014 pretxncommit

Pull時

1
Tue Feb 11 19:59:37 JST 2014 preoutgoing

Push時

1
2
3
4
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の設定をする。

1
2
3
4
$ 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
Tip
fabコマンドは極力フルパスを書いておきましょう。

次にfabfile.pyを書く。ここではnginxを使っている場合で書いてみる。

/home/rhodecode/pelican_deploy/fabfile.py

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
# -*- 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パスワードをファイルに書いておきたい場合は、更に

1
2
from fabric.api import env
env.password = "password"

を書けばいいし、ファイルにパスワードを書いておきたくないのであれば、

1
$ ssh-copy-id 192.168.0.17

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

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

Hugo で構築されています。
テーマ StackJimmy によって設計されています。