ScalaのプロジェクトをCircleCIでビルドしようとしたけど依存するツールで心折れかけた話
ScalaもCircleCIも悪くないんです。外部のツールを使うアプリケーションのビルドが面倒だというだけの話。。。
DockerイメージをビルドしてDockerHubにpushするところまではできたので、次の段階としてGithubにpushしたらテスト流してイメージビルドしてDockerHubにpushとかしたいですね。CIとCDをCircleCIで実現してみようと思います。
全体的な流れは、主にこのエントリを参考にしました。
のですが、タイトル通り心折れかけました。
CircleCIでテストを流す
まずは単純にテストを実行してみます。CircleCIの登録やプロジェクトの作り方は割愛。
sbtのバージョンを指定する
参考にしたエントリでは、 project/build.properties にsbtのバージョン指定しておくと拾ってくれるっぽいと書いてますが、公式のドキュメントをみるとデフォルトは0.13.1でそれ以外のバージョンを使いたい時はマニュアルでアップデートすることを推奨されています。
sbtのバージョンの細かいところではまったりするのも嫌なので、ここは素直に circle.yml に追記しておくのが良さそうです。
dependencies:
pre:
- wget -q https://dl.bintray.com/sbt/debian/sbt-0.13.8.deb
- sudo dpkg -i sbt-0.13.8.deb
ちなみに、CircleCI側でsbtのプロジェクトだと判断できればデフォルトで sbt test:compile で依存関係を解決した後 sbt test:test で実行してくれるようです。ただ流すだけであればこれは触る必要がないので、 circle.yml の test セクションは現段階では特に記載しません。
必要なアプリケーションのインストール
しつこいようですが、今回作ってるアプリケーションでは graphviz と pandoc が必要です。テストでもこの状況は変わらないので、テスト実行時にインストールする必要があります。公式に記載があるので参考にしましょう。 dependencies セクションにそのままインストールコマンドを書けばいいようです。
というわけで、 circle.yml に以下を追記します。
dependencies:
pre:
- sudo apt-get update
- sudo apt-get -y install graphviz
- sudo apt-get -y install pandoc
circle.yml をpushしてテストを流す
テストまでたどり着けずにこけた。。。
The following packages have unmet dependencies: graphviz : Depends: libgvc6 but it is not going to be installed sudo apt-get update; sudo apt-get -y install graphviz returned exit code 100
libgvc6 と依存関係があるけど、インストールされていないということかと。libgvc6 をググるとgraph drawing toolsとでてくるので、 graphviz が描画するときに使っているのでしょう。CircleCIで動いているコンテナは特に画像処理することもないので、そもそもインストールされてないのかもしれません。
というわけで追記。
dependencies:
pre:
- sudo apt-get update
- sudo apt-get -y install libgvc6
- sudo apt-get -y install graphviz
- sudo apt-get -y install pandoc
で、その後諸々あって結局インストールできず。様々ググった結果、以下のやり方に落ち着きました。
dependencies:
cache_directories:
- graphviz-2.38.0
- "~/.ivy2"
- "~/.sbt"
pre:
- wget -q https://dl.bintray.com/sbt/debian/sbt-0.13.8.deb
- sudo dpkg -i sbt-0.13.8.deb
- wget -O graphviz.tar.gz --quiet http://www.graphviz.org/pub/graphviz/ARCHIVE/graphviz-2.38.0.tar.gz
- tar -zxf graphviz.tar.gz
- graphviz-2.38.0/configure --silent
- make --silent --ignore-errors && make --silent --ignore-errors install > /dev/null
- echo 'which dot && version:'
- which dot
- dot -V
- sudo apt-get -y install pandoc
graphviz をビルドしてインストールですね。 pandoc は apt-get でインストールできました。
テストも通ったので、ツールの実行に関してもこれで問題ないと思われます。疲れた。。。
まとめ
ツールに依存するアプリケーションをCircleCIで回すの面倒くさい。なんとか方法があってよかったです。おかげでテスト流すのにそれなりの時間がかかってますが。
一時はdocker使えるんだから、graphviz と pandoc のコマンドと同じ名前のシェルスクリプト用意してパスを通し、dockerでイメージ作って実行するという本末転倒感半端ないことまで考えていました。CircleCIがdockerと連携しているので、もしかするとこっちの方がベストプラクティスなのかも?でも、入出力がファイルになるツールのinとoutを指定してあげたりすると、用意するシェルスクリプトのテストが別に必要になりそうだし。標準出力に返せばいいようなやつだったらCircleCIのコンテナにインストールせずにdocker使った方がいいかもしれません。
なんかどうあればいいのかモヤモヤしつつ。ここであまり時間を取りたくないので、この辺で。ベストプラクティス知ってる人は是非教えてください。