CircleCIってなに?
SasS
Software as a Service
- 必要な機能だけサービスとして切り出したソフトウェア
- インターネット経由でサービスを提供するのが一般的
CI
Continuous Integration 継続的インテグレーション
ビルドやテストを継続的に実行していく為の習慣
Jenkins じゃダメなの?
Jenkins ツライ
- 設定がめんどいので属人化しがち
- ダウンタイムがあったりするとリリースできなくなるので大変
- それを自社サーバで管理とか、監視やら運用に人的コストがかかってつらい
- サーバ環境が同一なので、異なる環境で動作するアプリのテストができない
そこでCricleCIですよ
- テスト毎に仮想環境を立ち上げられる
- 他サービスとの連携が豊富
- HitHub
- Slack
- heroku 等...
- それなりに安定している
ちなみにステータス情報は以下
お値段
- 1コンテナ無料
- 2コンテナ目以降、50$/コンテナ
コンテナって?
テストに時間が掛かったり、複数のプロジェクトをごりごりcommitする場合などは課金してコンテナを増やしたほうが良い
試してみる
プロジェクトの追加
https://circleci.com/add-projects
2. Choose a repo
からリポジトリを選択
後は勝手に環境を判断して、bundle install
してテストを実行してくれる
- 賢い!!
ブランチをPRすると、勝手にテストを実行してPRにテスト結果を貼り付けてくれる
- 賢い!!
結果をslackに通知したい
プロジェクトの歯車マーク → Chatroom Integrations → Slack に webhook の URL を入れる
- webhook取得ページ → https://my.slack.com/services/new/incoming-webhook/
おんなじテストをもっかい実行したい
対象のバージョンを選んで「Rebuild」ボタンを押下
テストが失敗したbranchのマージを禁止したい
githubにprotected branchesなる機能がある
settingsから設定可能。指定したbranchに以下の制限を追加できる
- テストが通っていないbranchのマージ禁止
- force push 禁止
上から
- force push の禁止
- ステータスチェックを通らないbranchのマージ禁止
- 管理者でも禁止
- ステータスチェック : ci/circleci
こんな感じに、テスト失敗するとマージボタンが押せない
環境変数を設定したい
- リポジトリに残したくない系の環境変数はwebページから、 Project settings > Environment Variables で設定
- リポジトリに残せる系の環境変数は、circle.yml の machine -> environment に書く
# circle.yml machine: environment: FLEX_HOME: /home/ubuntu/.flex PATH: $FLEX_HOME/bin:$PATH
参考
ついでに、circle.yml の話
circle.yml ってなに?
CircleCI環境独自の設定を書くところ
6個のセクションを持つ
- machine : VM環境の設定
- checkout : コードチェックアウト後の処理
- dependencies : 依存関係。環境作成時の処理
- database : DBの初期処理
- test : テストコマンド
- deployment : テスト正常終了後に実行されるデプロイコマンドを設定
machine 以外では、以下の設定が共通
pre
: それの前にやる処理post
: それの後やる処理override
: その処理をまるっと上書き
例えば、checkout の post ならば、「コードをチェックアウトした後にやる処理」になる
machine
VM環境の設定
- environment : 環境変数
- timezone
- hosts
machine: hosts: dev.circleci.com: 127.0.0.1
checkout
コードチェックアウト後の処理
post
のみ設定可能
checkout: post: - git submodule sync - git submodule update --init - mv config/.app.yml config/app.yml
dependencies
依存関係。環境作成時の処理
bundler
:without
でGemfileにあるけど、使わない dependency groups を設定cache_directories
: キャッシュするディレクトリを指定
Rubyだと、デフォルトで入っている bundler のバージョンを最新にするのをよくやる
dependencies: pre: - gem uninstall bundler - gem install bundler --pre bundler: without: [production, osx]
database
DBの初期処理
datbase.yml に独自の設定を使いたい場合
database: override: - mv config/database.ci.yml config/database.yml - bundle exec rake db:create db:schema:load --trace
test
テストコマンド
rubocopも一緒にやりたい場合
test: pre: - bundle exec rubocop
override
でテストコマンドそのものも変更できる
deployment
オプション。テスト正常終了後に実行されるデプロイコマンドを設定できる
- 長くなるので別記事で
TODO
- RuboCopの実行結果をPRに追記したい
- masterリポジトリのテスト通ったらherokuにデプロイしたい