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/
参考
-
What would happen if I approached blogging from a software development perspective?
Other Articles
- 13 Oct 2017: 『テスト駆動開発』
- 19 Oct 2016: 『新装版 達人プログラマー 職人から名匠への道』
- 19 Aug 2016: 『プログラミングElixir』
- 20 Oct 2015: Migrating from git-media to git-lfs
- 04 Oct 2015: Git Large File Storageクライアントのインストール
- 12 Aug 2015: isbn.rb
- 22 Apr 2015: 「なるのか、なすのか?」(To Be Or To Do?)