jekyllを使ってウェブサイトを作ってみた。git over sshでソースを転送して、 gitのpost-updateフックでjekyllを呼んでページを生成する。

Gitリポジトリのセットアップ

remoteで作業

2つのリポジトリを作る。

  • src.git
    bareなリポジトリ。localからのpush先として使う。
  • src
    普通のリポジトリ。src.gitからpullしてHEADの作業コピーを作るための場所。

まずリポジトリsrc.gitを用意する。

% mkdir src.git
% cd src.git
% git init --bare
% cd -

そしてそれをcloneして作業コピー用のリポジトリsrcを作る。

% git clone src.git src

src.gitのフックを設定する。pushされた後で呼ばれるのはpost-updateフック。 フック中で、一時的にsrcにcdしてsrc.gitからpullする。

% cp src.git/hooks/post-update{.sample,}
% vi src.git/hooks/post-update
...
# git-update-server-info
...
# generate example.org
# see /etc/apache2/sites-available/example.org.
echo "post-update: cwd is `pwd`"
# (cd $HOME/src/; git pull -v; cd -)
(
  echo "post-update: cd to working copy"
  cd $HOME/src/
  echo "post-update: cwd is `pwd`"
  echo "post-update: status:"
  GIT_DIR=$HOME/src/.git git status -v | head
  echo "post-update: log:"
  GIT_DIR=$HOME/src/.git git log -v | head
  echo "post-update: pulling source:"
  GIT_DIR=$HOME/src/.git git pull -v
  echo "post-update: cd back"
  cd -
  echo "post-update: cwd is `pwd`, leaving subshell"
)
echo "post-update: cwd is `pwd`"
export GEM_HOME=$HOME/lib/ruby/gems/1.8
export RUBYLIB=$HOME/lib/ruby:$HOME/lib/site_ruby/1.8
export PATH=$HOME/lib/ruby/gems/1.8/bin:$PATH
echo "post-update: generating site from $HOME/src/ to $HOME/public_html/:"
jekyll --rdiscount $HOME/src/ $HOME/public_html/
...
% chmod +x src.git/hooks/post-update

注意点など:

  • echoでメッセージを表示させているのはデバグの名残りで、実際は不要。ただ しgitはあくまで対話的に使うことを前提にしているらしく、非対話的に呼ぶ 際はやや注意が必要。

  • 最初はgitの–git-dirオプションで絶対パスを指定して、cdせずに操作しよう としたけれど、どこかで暗黙のうちにcwdが参照されているようでうまくいか なかった。

    なお–git-dirオプションに指定する値は、普通のリポジトリを指す場合、 foo ではなくfoo/.gitなどとなる。bareなリポジトリを指す場合はfoo.gitな どとなる。(gitでいうリポジトリとは、普通の作業ツリー付きのリポジトリ でいうところの.git/を指す模様。bareなリポジトリは作業コピーがなく、ルー ト直下にhooks などの制御ファイル群がある。)

  • テスト実行した時に次のように言われたら、src.gitにlocalから何かpushした 時点で、一度src内でpullしておくとよいかもしれない。

    fatal: bad default revision 'HEAD'
    

    こんな感じで。

    % cd src
    % git pull
    % cd -
    
  • localからpushしたときに

    fatal: Not a git repository: '.'
    

    などと言われることがある。ここではとりあえず環境変数GIT_DIRでリポジ トリの位置を指定して回避している。

  • 現時点では、MarukuよりもRDiscountのほうがMarkdownの箇条書きの解釈に強い 様子。

localで作業

% git clone ssh://xxx.xxx.xxx.xxx/~jdoe/src.git

% cat .git/config
...
[remote "origin"]
        url = ssh://example.org/~jdoe/src.git

jekyllのセットアップ

RubyGemsをセットアップ

RubyGemsの影響がユーザ環境内に限定されるように、localとremoteのアカウン トに環境変数を設定。

% vi ~/.zshrc
...
# RubyGems
export GEM_HOME=$HOME/lib/ruby/gems/1.8
export RUBYLIB=$HOME/lib/ruby:$HOME/lib/site_ruby/1.8
export PATH=$HOME/lib/ruby/gems/1.8/bin:$PATH
...
% source ~/.zshrc
% rehash

localとremoteのアカウントにRubyGemsをインストール。 rubyはとりあえず1.8.

% sudo apt-get install rubygems rubygems1.8
% sudo apt-get install ruby1.8 ruby1.8-dev

gemが拡張ライブラリをビルドするときにmkmf.rbが必要なので、rubyx.y-devも入 れる。

jekyllをインストール

localとremoteのアカウントにjekyllをインストール。

% gem install --no-rdoc mojombo-jekyll -s http://gems.github.com/
% gem install --no-rdoc rdiscount
% gem install --no-rdoc hoe
% gem install --no-rdoc bones
% rehash

最新のjekyllのgemはRubyForgeではなくGitHubにあるようなので注意。

Webサイトのセットアップ

DNSの設定

example.orgという名前がremoteホストのIP addressを指すように。

example.org:

A xxx.xxx.xxx.xxx
www cname example.org

Webサーバのセットアップ

remoteにapache2をインストールしてサイトを設定。 http://localhost/~jdoe/ がhttp://example.org/として見えるように。

% sudo apt-get install apache2-mpm-prefork
% sudo a2enmod userdir
% sudo cp /etc/apache2/sites-available/{default,example.org}
% sudo vi /etc/apache2/sites-available/example.org
<VirtualHost example.org:80>
...
  DocumentRoot /home/jdoe/public_html/
...
  ErrorLog /var/log/apache2/example.org-error.log
...
  CustomLog /var/log/apache2/example.org-access.log combined
...
% sudo a2enmod userdir
% sudo a2ensite example.org
% sudo /etc.init.d/apache2 restart
%

テスト

local:

% cd src
% echo hello world > hello.txt
% git commit -am "Add hello.txt."
% git push -v
...
% vi hello.txt
...
% git push -v
Pushing to ssh://xx.xx.xx/~jdoe/src.git
Enter passphrase for key '/home/jdoe/.ssh/id_rsa':
...
To ssh://xx.xx.xx/~jdoe/src.git
   xx..xx  master -> master
>From /home/jdoe/src
   xx..xx  master     -> origin/master
Updating xx..xx
Fast forward
 hello.txt |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)
Successfully generated site in /home/jdoe/public_html/
% w3m http://example.org/

参考