上記エントリのスライドでもちらっと書きましたが、YARDドキュメントホスティングアプリを作りました。
名前の読み方と由来
Gem + Grimoire (グリモワール = 魔導書) = Gemoire (ジェモワール)
gemの魔導書(取扱説明書)を多数集めた本棚をイメージしています
背景
仕事では各種gemを作ったりメンテすることが多いのですが、ドキュメントを手軽に公開できる環境がないのが難点でした。
今自分がメンテしてるgemだとJenkinsのpost build taskでspec実行後にyardを生成して外部から見れるところにコピーしています。
ただ、
- アプリごとに野良Jenkinsが乱立してるのでドキュメント化を全社に展開しづらい *1
- 公開用のドキュメントを作るだけでJenkinsを使うのも大げさ
- ドキュメント生成のためだけにdependencyにyardを追加するのも違和感がある
のような事情で RubyDoc.info のクローンを目指して作りました。
全体像
- ホスティングリポジトリにpush
- pushを受けてホスティングリポジトリがGemoireにwebhookに通知
- Gemoireがホスティングリポジトリからソースをclone
- yardドキュメントを生成してブラウザから見える場所に配置
図にもありますがGithub, bitbucket, gitlabに対応しています *2
特徴
必要なもの
- Ruby 2.1.3
- MySQL, PostgreSQL, sqlite3に対応
- git 1.6以上
- redis (必要なバージョンは詳しく調べてないけど2.4以上であれば問題ないはず)
- sshを使う場合にはSidekiqを動かすユーザの公開鍵をGithubなどにDeploy Keyとして登録する必要があります
Herokuで使う場合に注意すること
- デプロイする度にドキュメントが消えます
- git cloneしたリポジトリや生成したドキュメントをアプリ配下に置いているため
- リモートURLにsshが使えません
- Dynoが1つだとSidekiqによる非同期処理ができません
社内に立てた時に変えたこと
ドキュメントとサテライトリポジトリ(cloneしたリポジトリの置き場所)は別ボリュームにした
config/global/gemoire.yml はこんな感じ
default: doc_root_dir: public/doc satellite_root_dir: tmp/satellite time_zone: Tokyo doc_path: /doc # doc_path: http://doc.example.com/ development: test: production: doc_root_dir: /data/doc satellite_root_dir: /data/satellite time_zone: Tokyo doc_path: /doc
public/doc は/data/doc へのシンボリックリンクです
リポジトリのサイズがでかくなることを想定してrootパーティションではなく念の為別ボリュームの dataパーティションを作ってますが、普通にsharedでよかったかもしれない
capistrano追加
padrino用のcap taskがなかったので lib/capistrano/tasks/padrino.cap にこんなのを作った
namespace :deploy do set :db_environmental_variables, -> { { rack_env: fetch(:rack_env), } } namespace :ar do desc "ar:migrate" task :migrate do on roles(:app) do within release_path do with fetch(:db_environmental_variables) do execute :rake, 'ar:migrate' end end end end end end
その他細かいところ
その他
- 今回初めてPadrinoでアプリを作りきりましたが、起動が早いのでHerokuとの相性がいいですね
- capistrano便利なんだけど初期セットアップめんどい