CircleCIで簡単にepubcheckを導入する
これまで、電子書籍執筆環境を改善すべく、
とステップを踏んできましたが、
@akinomurasame epubcheckもはよ
— ろす軍曹@電書ちゃんねる (@lost_and_found) 2014, 12月 12
というリクエストを受けたので、色々試してみた結果、自分で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が通らないとテストが失敗するようになります。
テストがこけるブランチを作成してみたので、どう失敗するか気になる方はこちらを参照下さい。
成功した場合は次のようになります。
まとめ
今回の作業記録は、PRとして処理しましたので、詳しくはこちらを参照して下さい。
いよいよ、残るはCIでPDFビルドしか残らなくなってきましたが、ぼちぼちとやっていきたいと思います。