読者です 読者をやめる 読者になる 読者になる

CircleCIで任意のツールをインストールして使う際の定番スニペット

春ですね!というわけで懲りずにCircleCIネタを投下していきます。

CircleCIのコンテナにはJavaやらNodeやらRubyとかのランタイムがあらかじめセットアップされていますが、当然欲しいものがなかったりするので自分でコンテナにセットアップしてやる必要があります。しかし、CircleCIのコンテナはビルドが終われば破棄されてしまうので、毎度コンテナを立ち上げるためにセットアップしてやらなくてはなりません。

独自にツールをインストールする際に留意するべき点は以下のことですね。

  • cache_directoriesを使い、2回目ビルド以降のダウンロードをしない
  • cacheをリストアしたディレクトリが空であれば、ダウンロードしてアーカイブを展開
  • ツールを使うための必要な環境変数を設定

久しぶりにActionScriptを書く用事があったので、Adobe FlexSDKで試してみた。とりあえず完成形は以下の通り。

machine:
  environment:
    FLEX_HOME: /home/ubuntu/.flex
    PATH: $FLEX_HOME/bin:$PATH

dependencies:
  cache_directories:
    - ~/.flex

  pre:
    - |
      mkdir -p ~/.flex
      if [ -z "$(ls -A ~/.flex/)" ]; then
        cd ~/.flex && curl -O http://download.macromedia.com/pub/flex/sdk/flex_sdk_4.6.zip
        ls *.zip | xargs -n 1 unzip
        ls *.zip | xargs -n 1 rm
      fi

  override:
    - echo "TODO build"

環境変数

FlexFLEX_HOMEという環境変数を設定して、そこのbinをPATHに通しておきます。環境変数はexportコマンドを使うのではなく、machineフェーズのenvironmentを使いましょう。 CircleCIではYAMLで定義したコマンドは別シェルで実行されます。つまり、circle.ymlでexportしてあとで参照しようとしても空っぽってことになります。

cache_directories設定

dependenciesフェーズでcache_directoriesを設定します。とりあえず.flexに。

リストアしたキャッシュの存在をチェック

dependenciesフェーズのpreでは、.flexの中身の存在をチェックし、なければダウンロードと解凍を行っています。YAML複数に渡るコマンドを書く場合には、コマンド記述部分をパイプで始めれば書けます(これはYAMLの仕様)。こうすれば、ダウンロードは初回だけということになります。

キャッシュのサイズに注意

キャッシュしたディレクトリが大きなサイズであれば、その分リストアにも時間がかかるということにも注意です(CircleCIではS3からキャッシュをリストアする)。この辺のトレードオフは、利用するツールによって変わってくるでしょう。

/usr/local/binも有効活用しよう

ツールの性質によっては、環境変数の設定とかタルくて/usr/local/binディレクトリにぶっこんだ方が早いってケースもあるでしょう。GoLangツールとかは実行ファイルをパス通ってるディレクトリに放り込めば基本副作用無く動きますし、コンテナ型なので/usr/local/bin汚しても特に問題ないですしね。

というわけで唐突にTerraformセットアップのスニペットがこちら

dependencies:
  cache_directories:
    - ~/.terraform

  pre:
    - |
      mkdir -p ~/.terraform
      if [ -z "$(ls -A ~/.terraform/)" ]; then
        cd ~/.terraform && curl -O https://dl.bintray.com/mitchellh/terraform/terraform_0.3.7_linux_amd64.zip
        ls *.zip | xargs -n 1 unzip
        ls *.zip | xargs -n 1 rm
      fi
      sudo cp -R ~/.terraform/* /usr/local/bin

まとめ

いくら汚しても怒られないビルド環境最高っすね