CentOS7 + GitBook + GitLab + Hubot で 文書作成環境の構築
はじめに
GitBook は Markdown 形式のドキュメントから電子文書を作成するツールです。 次のような文書作成環境を構築しま す。
- GitBook に使うドキュメントを GitLab でバージョン管理します
- GitLab の push イベントを Hubot でフックします
- GitBook を使って電子文書を作成します
- 作成した電子文書を Apache を使って公開しブラウザで閲覧、ダウンロードできるようにします
- これらをVirtualBox(Windows) で作成した CentOS7 上に実装します
私はWindows10 64bit環境で動作確認しました。
CentOS7 の仮想マシンを作成
VirtualBox の仮想マシンを作成し、CentOS7 を Minimal 構成でインストールします。
使ったのは CentOS7-x86_64-Minimal-1511.iso
です。
インストール後、yum upgrade
を行います。
Guest Additions は入れてません。
SELinux は無効にし、firewalld
をインストールします。
GitLab のインストール
以下のコマンドを実行します。
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
yum -y install gitlab-ce
ホストPCからアクセスしたいので、ホストオンリーアダプタのIP(192.168.56.101) を external_url
に設定して gitlab-ctl reconfigure
を実行します。
ホストPCからブラウザで http://192.168.56.101
にアクセスしてみると...
接続されませんね。ファイアウォールの設定で 80 ポートを開けます。
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
再度アクセスして GitLab の画面が表示されることを確認します。 パスワードを再設定して root でログインできることを確認しましょう。
GitBook のインストール
GitBook は Node.js のアプリケーションです。 まずは Node.js をインストールします。
yum install epel-release -y
yum install nodejs npm -y
次に gitbook-cli
をインストールします。これは Gitbook のコマンドラインツールです。gitbook 自体は含まれていません。
npm install gitbook-cli -g
これで gitbook のコマンドが使えるようになります。 gitbook 自体は gitbook のコマンドを実行しようとすると、自動でインストールされます。
(gitbook をグローバルでインストールすると上手く動作しないのでローカルにインストールすることをオススメします)
gitbook help
上記を実行して本体をインストールします。 適当にフォルダを作って動作確認してみます。
mkdir book
cd book
gitbook init
> warn: no summary file in this book
> info: create README.md
> info: create SUMMARY.md
> info: initialization is finished
gitbook build
> info: 7 plugins are installed
> info: 6 explicitly listed
> info: loading plugin "highlight"... OK
> info: loading plugin "search"... OK
> info: loading plugin "lunr"... OK
> info: loading plugin "sharing"... OK
> info: loading plugin "fontsettings"... OK
> info: loading plugin "theme-default"... OK
> info: found 1 pages
> info: found 0 asset files
> info: >> generation finished with success in 0.4s !
PDF, epub, mobi 形式を作成する場合はそれぞれ gitbook pdf
, gitbook epub
, gitbook mobi
になります。
試しに PDF で作成してみます。
gitbook pdf
> info: 7 plugins are installed
> info: 6 explicitly listed
> info: loading plugin "highlight"... OK
> info: loading plugin "search"... OK
> info: loading plugin "lunr"... OK
> info: loading plugin "sharing"... OK
> info: loading plugin "fontsettings"... OK
> info: loading plugin "theme-default"... OK
> info: found 1 pages
> info: found 0 asset files
>
> InstallRequiredError: "ebook-convert" is not installed.
> Install it from Calibre: https://calibre-ebook.com
"ebook-convert" がインストールされていないので、Calibre をインストールする必要があります。
公式サイトのダウンロードから Unix 用のインストール方法が記載されていますので、それを実行します。
yum install wget -y
sudo -v && wget -nv -O- https://raw.githubusercontent.com/kovidgoyal/calibre/master/setup/linux-installer.py | sudo python -c "import sys; main=lambda:sys.stderr.write('Download failed\n'); exec(sys.stdin.read()); main()"
インストールすると警告が2つ出ます。2つとも ImportError で実行に必要なもの libGL.so と QImage が見つからなかったようです。
試しにここで gitbook pdf
を実行すると「共有オブジェクトファイルを開けません」のようなエラーが表示されます。
これらは qt-creator
パッケージをインストールすることで解決します。
yum install qt-creator -y
再度 gitbook pdf
を実行して問題が出てないことを確認します。
Hubot のインストール
以下のコマンドを実行します
npm install hubot coffee-script generator-hubot yo -g
root で Hubot の作成が出来ないので、Hubot 用のユーザーを作成します。このユーザーは gitbook の変換も兼ねているので gitbook
としました。
useradd gitbook
passwd gitbook
gitbook ユーザーに切り替えて hubot を作成します。
su gitbook
cd ~
mkdir hubot
cd hubot
yo hubot
Hubot 作成の手続きが始まりますので、すべてデフォルトのままで作成します。 作成したら、まず不要なファイルを削除します。
rm scripts/example.coffee
hubot の実行スクリプト run_hubot.sh
を作成し、以下の内容を記述します。
export PORT=5000
bin/hubot
作成したら実行権限を与えておきます。
chmod +x run_hubot.sh
次に Hubot スクリプト scripts/gitlab_gitbook.coffee
を作成します。
内容は次のようになります。
# http://<host>:5000/gitlab_hook/?output_pdf=<pdf_name>
url = require 'url'
querystring = require 'querystring'
module.exports = (robot) ->
push_request = (output_pdf, hook) ->
git_group = hook.project.namespace
git_project = hook.project.name
git_url = hook.project.ssh_url
console.log("hubot: group=#{git_group} name=#{git_project} output=#{output_pdf}")
@exec = require('child_process').exec
command = "sh /home/gitbook/gitbook.sh #{git_url} #{git_project} #{output_pdf}"
@exec command, (error, stdout, stderr) ->
robot.logger.error error if error?
robot.logger.info stdout if stdout?
robot.logger.info stderr if stderr?
robot.router.post '/gitlab_hook', (req, res) ->
hook = req.body
q = querystring.parse(url.parse(req.url).query)
kind = hook['object_kind'] || 'push'
switch kind
when 'push'
push_request q.output_pdf, hook
res.send 200
正常に実行できるか確認します。
./run_hubot.sh
次に hubot から gitbook を実行するスクリプトを作成します。 このスクリプトは gitbook ユーザのホームフォルダのトップに作成します。 ログが欲しいのでスクリプトを2つに分けて、リダイレクトでファイルに書き込むようにしました。 (ここはもっとスマートにやる方法があると思います。このあたりは初心者レベルなのでご容赦を)
vi ~/gitbook.sh
#!/bin/sh
LOGFILE=/tmp/gitbook-script-log
cd ~
./gitbook-exec.sh $1 $2 $3 >>$LOGFILE
実際に実行するスクリプトファイル gitbook-exec.sh
は次のようになります。
#!/bin/sh
cd ~
if [ -e $2 ]; then
cd $2
git pull $1
cd ../
else
git clone $1
fi
gitbook install ./$2
gitbook pdf ./$2 ./$2/$3.pdf
gitbook build ./$2
cp -rf ./$2/_book -T /var/www/html/$2
忘れずに実行権限を与えておきます。
chmod +x gitbook.sh
chmod +x gitbook-exec.sh
sshキー の登録
この gitbook ユーザは GitLab にアクセスしますので、ssh キーを登録しておきます。
ssh-keygen -t rsa