Jenkins@さくらVPSにOctopressのデプロイを任せてみる

2012年7月29日
sakura / octopress / jenkins /

目的

Octopressで記事を書いたあと、 Bitbucketgit push origin source とするだけで Github Pages に勝手にデプロイされるようにする。

イメージ

octopress_deploy

  1. 自分はブログ記事を書き終わったら、Bitbucketに git push だけしてあとは放っておく
  2. Bitbucketは該当リポジトリが更新されると、さくらVPSのJenkinsのURLを叩く
  3. Jenkinsはそれを契機にBitbucketからファイル一式をcloneしてOctopresで記事を作成する
  4. Jenkinsは作成した記事をGithub Pagesにデプロイする

事前準備

Jenkinsに入れておく必要のあるPlugin

JenkinsからBitbucketとGithubにアクセスできるようにする

$ cd /var/lib/jenkins
$ sudo -u jenkins -H /usr/local/bin/git config --global user.email "jenkins@your.domain"
$ sudo -u jenkins -H /usr/local/bin/git config --global user.name "jenkins"
$ sudo -u jenkins -H ssh-keygen -t rsa -C jenkins@your.domain

でJenkins用の秘密鍵と公開鍵を作る。 このとき、パスフレーズを設定しないように注意。

これで /var/lib/jenkins/.ssh/id_rsa.pub という公開鍵ができているはずなので、この公開鍵を GithubBitbucket に登録しておく。

ちなみに公開鍵の中身を

$ sudo -u jenkins -H more .ssh/id_rsa.pub

などで表示し、表示された文字列をそのまま GithubBitbucket にコピペすればOK。

$ sudo -u jenkins mkdir tmp 
$ cd tmp
$ sudo -u jenkins /usr/local/bin/git clone git@bitbucket.org:yourname/yourname.github.com.git
$ sudo -u jenkins /usr/local/bin/git clone git@github.com:yourname/yourname.github.com.git

で実際に BitbucketGithub からcloneをすると、それぞれ一度目に限り yes/no が問われるのでそこでyesとしておく必要がある(そうしないとJenkinsから使えない)。

JenkinsからRVMを使えるようにする

$ cd /var/lib/jenkins
$ sudo -u jenkins -H -s bash -c 'bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )'
$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; rvm pkg install readline zlib openssl' 
$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; rvm install 1.9.2 -C --with-openssl-dir=~/.rvm/usr --with-readline-dir=~/.rvm/usr --with-zlib-dir=~/.rvm/usr'

で、jenkinsユーザでRVMでインストールしたRubyが使えるようになる。

実際にRubyが使えるかどうかは

$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; ruby -v'

などで確認できる。

gemsetを作成して必要なgemのインストール

$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; rvm gemset create octopress'
$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; rvm use 1.9.2@octopress; gem install bundle'

octopress用のoctopressというgemsetを作って、そこに bundle をインストールしておく。

JenkinsのJobの設定

Build a free-style software project をベースに設定した項目は以下のとおり。

export PATH=$PATH:/usr/local/bin

rm -rf octopress
mkdir octopress
cd octopress

git init
git remote add -t source origin git@bitbucket.org:yourname/yourname.github.com.git
git fetch
git checkout source

bundle install

rake setup_github_pages\[git@github.com:yourname/yourname.github.com.git\]
rake generate
rake deploy

最後の Command のところでは、

をしている。

BitbucketからJobの実行ができるように権限の設定を変更をする

BitbucketからJenkinsにアクセスする際に、 http://jenkins.yourdomain/job/deploy-octopress/build?token=a-word-you-like といったURLを叩いてJobを実行することになるので、それが可能なように権限の設定を変更しておく(この方法は簡易的なものでセキュリティの面では良くないので、これを解消するには次の記事を参照して別の設定とするのが良い)。

また、 Manage Jenkins -> Configure System で、

Bitbucketのほうの設定

作成したリポジトリの Admin タブの Services を選択。

Select a service… の中に Jenkins があるのでそれを選択して、 Add service

設定項目には、

http://jenkins.yourdomain/job/deploy-octopress/build?token=a-word-you-like

と叩くべきURLをそのまま設定する (※ yourdomainなどは各自の環境に合わせて変更すること)。

完成!

これでひととおりの設定は完了。
うまくいっていればいつもどおり記事を書いてコミットした後に git push origin source とBitbucketにpushするだけで、あとは勝手にデプロイしてくれる。
このとき、Bitbucketのプライベートリポジトリにファイル一式がバックアップされることにもなる。

なお、sourceブランチがデプロイの対象となっているので、書き途中の記事をBitbucketに保存しておきたい場合には、 draft など別のブランチにコミットしておけば書き途中のものが勝手にデプロイされる心配はない。

課題

このままだと、認証なしで全てのJobが参照できる形になってしまっている。
次の記事ではこれを解消することにトライしたい。

じつは途中ではいろいろと引っかかった

以上、うまくいった手順をまとめたが実際にはいろいろとひっかかったところがあったので、そこも言及しておく。

.rvmrc の実行許可の確認が越えられない

はじめて .rvmrc が設置されたディレクトリに入る際、 .rvmrc の内容を実行して良いか? といった問い合わせが入り、自分で操作しているときは単純に yes と応えるだけなのですが、それをJenkinsさんにやってもらう方法がわからなかった。
rvmrc trust ディレクトリ名とすれば以降その確認がいらなくなるというのは既知なのだが、Git Plugin を使ってソースを取得すると、その時点でcloneしたディレクトリに入ってしまうのでタイミング的にそれも無理。
けっきょくGit Pluginを使うのをあきらめ、ソースのcloneからブランチの切り替えまでコマンドで直接やることとした。

RVMがうまく扱えない

ビルド時のコマンドの中で rvm を使っているわけですが、やたらとこのコマンドがないといったエラーが出まくり「うぎゃー」となった。 これは RVM Plugin を使えば簡単に解決できた。

gemがインストールできない

bundler を使うため、gem install bundleをビルド時のコマンド中に入れたのだが、

ERROR:  Loading command: install (LoadError)
    no such file to load -- zlib

というエラーで先に進めない。

これはRubyのほうの話で、

$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; rvm pkg install readline zlib openssl' 
$ sudo -u jenkins -H -s bash -c 'source ~/.rvm/scripts/rvm; rvm reinstall 1.9.2'

とzlibなどをRVMでインストールした後に、Rubyをreinstallすることで解決。
本記事のほうの手順ではきちんと先に rvm pkg install を済ませておくようにしてある。

rake installに失敗する

Jenkinsでのrake install時に

A theme is already installed, proceeding will overwrite existing files. Are you sure? [y/n]

という確認が出てきたそこでこけていた模様。
よくよく考えてみると、rake installはこのリポジトリには適用済みの状態でpushしてあるので不要だった。

rake generateでエラー

rake generate時に

Building site: source -> public
/var/lib/jenkins/.rvm/gems/ruby-1.9.2-p320@octopress/gems/ffi-1.0.11/lib/ffi/library.rb:121:in `block in ffi_lib': Could not open library 'lib.so': lib.so: cannot open shared object file: No such file or directory (LoadError)

といったエラーが発生。 これは python-devel が入っていない場合のエラーということだったので、さくらVPSのほうで sudo yum install python-devel しておくことで解消。

rake deployでエラー

rake deploy時に

## Pushing generated _deploy website

Host key verification failed.
fatal: The remote end hung up unexpectedly

といったエラーが発生。

公開鍵はきっちり登録してあるはずなのにおかしいなと思ったら、一度めのアクセスの際にアクセス確認の問い合わせが入り、ここでyesとしないと先に進まないという状態で止まっていたというオチ。
これはあらかじめさくらVPSのほうで、

$ sudo -u jenkins /usr/local/bin/git clone git@github.com:yourname/yourname.github.com.git

と一度Githubにアクセスしておけば解消される。

おしまい

じつにJenkinsで自動デプロイするまでにかかったビルド試行回数は25回。

Related Entries
Latest Entries