yigarashiのブログ

学んだことや考えていることを書きます

embulk gem installはインストールに失敗してもexit statusが0になる

表題の通りです。Embulkでプラグインをインストールする際にはembulk gem installコマンドをよく使うと思うのですが、このコマンドはパッケージのインストールに失敗してもexit statusが0になりません。本家のissueを見ると、この現象はembulk gemembulk bundle以下の全てで発生するようです1。現在stableのv0.9では直らず、v0.11で直るだろうと書かれています。

これで何が起こるかというと、DockerでEmbulkを動かしている時に、コンテナを動かすまでイメージビルドが失敗していることに気がつけません。つい最近その事故に遭って、依存パッケージのアップデートで依存関係が壊れてembulk-output-bigqueryのインストールに失敗していました2。日時のデータ転送が全て失敗した通知で異変に気付き、ログを追いかけて行った結果embulk gem installがサイレントに失敗していたことに気付きました。幸い復旧は用意だったので、exit status 0は勘弁してよ〜とキャッキャしながら対応しました。エラー自体は以下のような文言がこっそり出力されているという感じです。

ERROR:  Error installing embulk-output-bigquery:
  representable requires Ruby version >= 2.4.0.

イメージが壊れていることに気づけないのは困るので、以下のようになんとも味わい深い1行をDockerfileに加えて応急対応をしました(実際は他のいくつかのgemも||でつないで指定しました)。

RUN bash -c 'l="$(embulk gem list)" && if [[  ! $l =~ "embulk-output-bigquery" ]]; then exit 1; fi'

せめてGemfileとかを使って管理すると良いかもしれないな〜と思いながら放置してあります。差し当たり報告でした。頑張っていきましょう。