CodeBuildでGitbookのPDFを作成する話

こんにちは。(ほ)です。

前回、GitbookのプロジェクトをCodePipeline, CodeBuildを使用してビルドをする方法について記載しました。
しかし、PDFのビルドについては触れていませんでしたので、今回はPDFを作成したいと思います。

GitbookのPDF作成で発生するエラーと対処

GitbookでPDFを作成する場合は下記のようなコマンドを使用します。

しかし、CodeBuildで実行すると下記の4つのエラーが発生するため対処が必要です。

1. ebook-convertが未インストール

GitbookでPDFを作成するにはcalibreというebook-converterが必要です。
未インストールの場合は下記のようなエラーが出力されます。

下記のコマンドでcalibreをインストールすることで対処できます。

2. X server がない

GitbookでPDFを作成するにはディスプレイバッファが必要なのですが、CodeBuildなどのヘッドレス環境では存在しないため下記のようなエラーが出力されます。

これはエラーメッセージにも出力されているとおり “xvfb” を使用することで対処できます。

3. 日本語が文字化けする

CodeBuildの環境には日本語フォントが含まれていないため文字化けしてしまいます。

下記のようにフォントをインストールすることで対処できます。

4. Apple iTunes interface プラグインの初期化エラー

Calibreのプラグインの初期化時にエラーが発生します。

ログを見ると “_thread” が import出来なくて発生しているようです。

別件ですが、同様のエラーが下記でも報告されています。

ImportError: cannot import name _thread #161

どうも、python-dateutilの2.6.0以降で発生するようですので、下記のように古いバージョンをインストールすることで回避できます。

buildspec.yml

上記の4つのエラーに対処すると、下記のようなbuildspec.ymlが出来上がります。

このbuildspec.ymlを使用することで日本語を含むPDFを作成することが出来たのですが、HTMLのビルドに比べてinstall phaseに時間がかかってしまいます。
(当然、それに合わせて使用料も上がります。一番安い環境で $0.005/分)

そこで、CodeBuildで用意されている標準の環境イメージではなく、PDF作成用のイメージを作成してみたいと思います。

Docker Imageの作成

Docker Imageを作成する方法はいくつかあるのですが、CodeBuildで使用する必要があるため、下記で公開されているCodeBuildの標準イメージのDockerfileを参考にするのが良いと思います。

https://github.com/aws/aws-codebuild-docker-images

Dockerfile

私の場合はnodejs:7.0.0環境をベースに下記のようなDockerfileを作成しました。
(&などがエスケープされています)

作成したDocker Imageは、DockerHubで公開したり、Amazon EC2 Container Registryに登録することでCodeBuildから使用することができます。

CodeBuildの設定

CodeBuildの「環境: ビルド方法」を下記のように変更します。

  • 環境イメージ : Docker イメージの指定
  • 環境タイプ : Linux
  • カスタムイメージタイプ : Other(DockerHub) or Amazon ECR(Container Registry)
  • カスタムイメージ ID : repo-name/image-name:tag

カスタムイメージ ID の tag は latest の場合は不要ですが、その他の場合は必須です。

まとめ

Docker ImageをCodeBuildで使用すると、buildspec.ymlの時よりも install phase分を短くすることができます。

buildspec.yml(3分28秒)

Docker Image(1分34秒)

install phaseに時間がかかっている場合は、Docker Imageを使用することを考えてみてください。

  • このエントリーをはてなブックマークに追加