Fuzoku実践入門ブログ

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

CircleCIで簡単にepubcheckを導入する

これまで、電子書籍執筆環境を改善すべく、

  1. CircleCIの導入
  2. 継続的デプロイメント

とステップを踏んできましたが、

というリクエストを受けたので、色々試してみた結果、自分でepubcheckをビルドしなくても、簡単に導入できることが判明したので、サクっと導入してみました。

epubcheckが使えるRubyGems

EPUBのバリデーターは、IDPF/epubcheckというツールが一般的で、ソースコードmvn installするとビルドできます。

初めは、CircleCI上でビルドしようかと考えたのですが、バージョンさえ気にしなければ、RubyGemsをインストールするだけで、epubcheckコマンドも同梱しているGemが2つもあることが判明しました。

どちらもepubcheck-3.0.1を同梱していて、Rubyから使えるのですが、少しだけepub_validatorの方が便利そうだったので、こちらを採用することにしました。

CircleCIへの組み込み

まずは、Gemfileにepub_validatorを追加して、bundle updateします。

gem "epub_validator"

Rakefileに、epubcheckを実行するタスクを追加します。

require 'bundler/setup'
require 'epub_validator'

epub_file = bookname+'.epub'

def source_exist(source, error_message= nil)
  return true if File.exist?(source)

  puts error_message if error_message
  fail "#{source} does not exist."
  false
end

desc 'validation .epub'
task :epub_validation do
  next unless source_exist(epub_file, 'Cant execute :epub_validation')
  epub = EpubValidator.check(epub_file)
  puts "checking #{epub_file}..."

  if epub.valid?
    puts "OK, #{epub_file} is valid!"
  else
    epub.messages.each do |m|
      puts m
    end
    fail "#{epub_file} is invalid :-("
  end
end

これで、rake epub_validationを実行すると、正しく成功すると、

$ rake epub_validation
checking learning-fuzoku-example.epub...
OK, learning-fuzoku-example.epub is valid!

このようなメッセージになりますが、もし、EPUBファイルが存在しないと、

$ rake epub_validation
Cant execute :epub_validation
rake aborted!
learning-fuzoku-sample.epub does not exist.
/Users/akinomurasame/projects/learning-fuzoku-sample/Rakefile:16:in `source_exist'
/Users/akinomurasame/projects/learning-fuzoku-sample/Rakefile:43:in `block in <top (required)>'
Tasks: TOP => epub_validation
(See full trace by running task with --trace)

という感じのエラーになり、epubcheckがInvalidだと、

$ rake epub_validation
checking learning-fuzoku-sample.epub...
WARNING: learning-fuzoku-sample.epub/OEBPS/learning-fuzoku-sample.opf(6,44): date value '2014-mm-dd' does not follow recommended syntax as per http://www.w3.org/TR/NOTE-datetime: [For input string: "mm"] is not an integer
rake aborted!
learning-fuzoku-sample.epub is invalid :-(
  /Users/akinomurasame/projects/learning-fuzoku-sample/Rakefile:53:in `block in <top (required)>'
  Tasks: TOP => epub_validation
  (See full trace by running task with --trace)

こんな感じでエラーとなりrake abortedになるため、

test:
  override:
    - rake epub epub_validation

上記のようにepub_validationをcircle.ymlに追加しておき、CircleCIで実行すると、epubcheckが通らないとテストが失敗するようになります。

テストがこけるブランチを作成してみたので、どう失敗するか気になる方はこちらを参照下さい。

成功した場合は次のようになります。

epubcheck in CircleCI

まとめ

今回の作業記録は、PRとして処理しましたので、詳しくはこちらを参照して下さい。

いよいよ、残るはCIでPDFビルドしか残らなくなってきましたが、ぼちぼちとやっていきたいと思います。