Fuzoku実践入門ブログ

Amazon で好評発売中の『Fuzoku実践入門』に関するエピソードなどを紹介するブログです。

電子書籍執筆環境にCIを導入、EPUBをビルドしてDropboxに送る

最近、次の作品の執筆をしているのですが、慣れとは恐しいもので、Rakeを利用した自動ビルドですら面倒になってきてしまい、CIが欲しいと思うようになりました。

複数人のプロジェクトならいざしらず、自分一人の執筆のためにCI環境を整えるのは、どうもやり過ぎな気がしていたのですが、CircleCIが1コンテナまで無料になったとを聞き、気になっていたため、執筆の息抜きにCI環境を簡単に整えてみました。

CircleCIでEPUBをビルドする

既にRakefileを書いているため、CircleCIを利用してEPUBをビルドするのは、とても簡単でした。

test:
  override:
    - rake md2review epub

上記のようなcircle.ymlファイルをコミットしてGitHubへpushしておき、後はCircleCIにログインして、GitHubリポジトリを選択するだけです。

無事にビルドが通れば、Status Successになります。

CircleCI first green

ビルドしたEPUBファイルをDropboxに送る

これだけでは少し面白くありません。どうせなら、ビルドしたEPUBファイルを何かしらの方法で受け取りたいものです。そこで、方法を考えてみた結果、Dropboxにファイルを送るという方法が手軽そうだと感じたので試してみました(他にはGoogleDriveに送るというのも考えました)。

Dropboxが提供しているAPIを調べてみると、Rubyによるドキュメントがあったため、こちらを参考にして、Rakefileに組み込んでみることにしました。

まず、dropbox_sdkのGemをインストールしておく必要がありますので、Gemfileにgem "dropbox-sdk"を追記して、bundle install しておきます。

その上で、Rakefileに次のような内容を追記しました。

require 'bundler/setup'
require 'dropbox_sdk'

desc 'send to dropbox'
task :send_to_dropbox do
  client = DropboxClient.new(oauth2_access_token)
  now = Time.now.strftime("%Y%m%d%H%M%S")
  response = client.put_file("/#{bookname}_#{now}.epub", open("#{bookname}.epub"))
  puts "uploaded:", response.inspect
end

oauth2_access_tokenにはApp Consoleで作成したアプリの、Settingsタブ「OAuth 2」の項目にあるGenerated access token下のGenerateボタンを押して取得できるトークンを記入します。

そしてローカルマシンで、

$ rake md2review epub send_to_dropbox

上記のコマンドを実行すると、無事に~/Dropbox/アプリ/アプリ名ディレクトリに、EPUBファイルが作成されることを確認できました。

そこで、circle.ymlの内容も、

test:
  override:
    - rake md2review epub send_to_dropbox

上記のように書き換えてRakefileと併せてコミットし、GitHubへpushすると、CircleCIが動作してDropboxEPUBファイルが送られてきました。

まとめ

Re:VIEWによる電子書籍執筆環境を整えていた私にとって、CircleCIの導入は拍子抜けするほど簡単であり、またDropboxによるファイル共有もAPIが整備されているため数行のコードで実現でき、とても便利な時代になったと痛感しました。

個人で電子書籍を公開している人であれば、CircleCIが動けばそのままデプロイもできますので、非常に便利だと思います。なお、PDFを作成したい場合はTeX環境が必要なため、おそらく専用マシンを用意することになるかと思います。

これから電子書籍を執筆される方は、ぜひ参考にしてみて下さい。

追記

Fuzoku実践入門のサンプルリポジトリにCirlceCIを導入して、ついでにステータスバッジもつけてみました。

CircleCI status badge

ステータスバッジについては、公式ドキュメントを参照下さい。