circle.ymlの書き方

この記事は CircleCI Advent Calendar 2015 - Qiita の 8日目の記事です。
まだCircleCIを触って2週間のペーペーなので、基本的なところについてDove並みの優しさで書いていきたいと思います。
なのでベテランさんは通り過ぎてください。

※2017/11/21追記
この記事はCircleCI 1系の記事なので2系は書き方変わってます。 2.0の書き方は以下のブログを参考にしていただいたら分かりやすいかと思います。

blog.stormcat.io

circle.ymlの基礎

CircleCIの使い方として、まずプロジェクトのrootにcircle.ymlを置くことで、様々な設定を行うことができます。
circle.yml内に記述する主な項目として

  • machine:
  • checkout:
  • dependencies:
  • database:
  • test:
  • deployment:

の6つが用意されています。 用意はされていますが全て記述する必要はありません。
一個づつ説明していきます

machine

CircleCiのコンテナの設定を記述します。
よく使いそうなところで言えば

  • timezone:
  • hosts:
  • environment:
  • services:

といったところでしょうか。

machine:
    timezone: Asia/Tokyo
    
    hosts:   #/etc/hostsを書き換える
        dev.hogehoge.com: 127.0.0.1

    environment:
        DATABASE_URL: mysql://geho:@127.0.0.1:3306/hoge

    services:
        - cassandra
        

timezone,hosts,environmentはそのままの意味で、 servicesはCircleCiがデフォルトでインストールしていないdb serviceをインストールしたい時に記述します。

てかそもそも言語とかインストールしてないけど記述しなくていいのかという疑問があるかもしれません。
安心してください。入ってますよ。 https://circleci.com/docs/environment#languages
リンク先の内容が既にinstallされている設定です。 もし使ってる言語のversionがデフォルトと違うという場合は明示的に

machine:
    ruby:
        version: 2.1.4

というようにversionを指定する必要があります。

checkout

これはCircleCiを始める時にgitのプロジェクトを選択するだけで事足りてるので使ったことないのですが、sampleだとgitのsubmoduleを追加する時などに使うようです。

dependencies

基本的にCircleCiはrootにpackage.jsonやGemfileのようなファイルを置いとくと勝手にnpm installやbundle installを行ってくれます。
なので、何かオプションをつけて実行したい時や、package.jsonに記述していないけど別途なにかinstallしたい時などに記述します。

dependencies:
  override:
    npm install --production
  pre: 
    npm install coffeescript

ここで脱線しますが、override: 、pre: なる新しいキーが出てきました。
これはオプションで付与でき、CircleCiのデフォルトのコマンド実行を上書きしたり、前後に別のコマンドを入れることができます。

  • override: デフォルトのコマンドを上書き

  • pre: CircleCiのデフォルトコマンド実行前
    上で説明した通りデフォルトではnpm installが自動的に呼ばれるのでpreはその前に実行されるということです

  • post: CircleCiの実行後デフォルトコマンド

※ちなみにデフォルトと書いてますが正式にはCircleCiの推測に基づくデフォルトコマンドです。 CircleCi「package.jsonがあるから、npm install 呼んどくか」のような推測だと推測しました。

database

これも使ったことないので、詳しくないのですが、sampleだとテストデータとかをsqlとかでinsertしたい場合に使うようです

database:
  override:
    - mysql -u ubuntu circle_test < my-database-setup.sql

sampleまるまる持ってきましたがこんな感じです。

test

ここも基本的には言語に沿ったtestを実行してくれますが、足りない場合に記述します。

test:
  pre: 
    - echo "-----start test-----"
  override:    
    - go test -cover  
  post: 
    - echo "-----end test-----"

deployment

これもそのままですが、deployのコマンドを記述します。

deployment:
  deploy:
    branch: master
    commands:
      - make build
      - make deploy

branchはCircleCiに登録しているプロジェクトのブランチを。
commandsはそのままで、deployのためのコマンドを記述するだけです。

以上でcircle.ymlの基礎は終了です。 より詳しい情報はドキュメントを参照してください。
公式のsampleのymlはこちらです。

例の言語がgoやらrubyやら混在してたり、後半明らかに失速して雑になってしまいましたが、とりあえず基本的なところは押さえられたんじゃないかと。
何か間違ったこと書いてありましたら指摘していただけると幸いです