冥冥乃志

ソフトウェア開発会社でチームマネージャをしているエンジニアの雑記。アウトプットは少なめです。

follow us in feedly

ScalaのプロジェクトをCircleCIでビルドしようとしたけど依存するツールで心折れかけた話

ScalaもCircleCIも悪くないんです。外部のツールを使うアプリケーションのビルドが面倒だというだけの話。。。

DockerイメージをビルドしてDockerHubにpushするところまではできたので、次の段階としてGithubにpushしたらテスト流してイメージビルドしてDockerHubにpushとかしたいですね。CIとCDをCircleCIで実現してみようと思います。

全体的な流れは、主にこのエントリを参考にしました。

www.todesking.com

のですが、タイトル通り心折れかけました。

CircleCIでテストを流す

まずは単純にテストを実行してみます。CircleCIの登録やプロジェクトの作り方は割愛。

sbtのバージョンを指定する

参考にしたエントリでは、 project/build.properties にsbtのバージョン指定しておくと拾ってくれるっぽいと書いてますが、公式のドキュメントをみるとデフォルトは0.13.1でそれ以外のバージョンを使いたい時はマニュアルでアップデートすることを推奨されています。

circleci.com

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.ymltest セクションは現段階では特に記載しません。

必要なアプリケーションのインストール

しつこいようですが、今回作ってるアプリケーションでは graphvizpandoc が必要です。テストでもこの状況は変わらないので、テスト実行時にインストールする必要があります。公式に記載があるので参考にしましょう。 dependencies セクションにそのままインストールコマンドを書けばいいようです。

circleci.com

というわけで、 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 をビルドしてインストールですね。 pandocapt-get でインストールできました。

テストも通ったので、ツールの実行に関してもこれで問題ないと思われます。疲れた。。。

まとめ

ツールに依存するアプリケーションをCircleCIで回すの面倒くさい。なんとか方法があってよかったです。おかげでテスト流すのにそれなりの時間がかかってますが。

一時はdocker使えるんだから、graphvizpandoc のコマンドと同じ名前のシェルスクリプト用意してパスを通し、dockerでイメージ作って実行するという本末転倒感半端ないことまで考えていました。CircleCIがdockerと連携しているので、もしかするとこっちの方がベストプラクティスなのかも?でも、入出力がファイルになるツールのinとoutを指定してあげたりすると、用意するシェルスクリプトのテストが別に必要になりそうだし。標準出力に返せばいいようなやつだったらCircleCIのコンテナにインストールせずにdocker使った方がいいかもしれません。

なんかどうあればいいのかモヤモヤしつつ。ここであまり時間を取りたくないので、この辺で。ベストプラクティス知ってる人は是非教えてください。