はじめての circleci

57
はじめての 2015-08-04 . Demand Side Science 社内勉強会 . Yosuke Mizutani

Upload: yosuke-mizutani

Post on 17-Aug-2015

547 views

Category:

Engineering


12 download

TRANSCRIPT

Page 1: はじめての CircleCI

はじめての

2015-08-04 . Demand Side Science 社内勉強会 . Yosuke Mizutani

Page 2: はじめての CircleCI

Circle CI とは

はじめてのビルド

ビルドのカスタマイズ

DEMO

Agenda

Page 3: はじめての CircleCI

https://circleci.com

Page 4: はじめての CircleCI

https://circleci.com

Page 5: はじめての CircleCI

GitHub の OAuth認証をするだけ

組織の単位はGitHub 上の Organization に従う

サインアップ

Page 6: はじめての CircleCI

https://ja.wikipedia.org/wiki/継続的インテグレーション

CI とは

継続的インテグレーション、CI(英: continuous integration)とは、主にプログラマーのアプリケーション作成時の品質改善や納期の短縮のための習慣のことである。エクストリーム・プログラミング (XP) のプラクティスの一つで、狭義にはビルドやテスト、インスペクションなどを継続的に実行していくことを意味する。特に、1990年代後半以降の開発においては、継続的インテグレーションをサポートするソフトウェアを使用する傾向が強まってきた。

Page 7: はじめての CircleCI

近年、低価格 & 高品質のSaaS (Software as a Service) 型 CIサービスが続々登場 OSS 開発者・GitHub ユーザを中心にJenkins から乗り換えの流れ

今回は、主に Scala プロジェクトに対する

ビルド + テストの継続的実行にフォーカス

SaaS型 CIサービス

Page 8: はじめての CircleCI

http://stackshare.io/continuous-integration

1. Jenkins 2. Travis CI 3. Codeship 4. CircleCI 5. TeamCity 6. wercker 7. Drone.io 8. Semaphore 9. Shippable 10. Solano CI

11. Appveyer 12. Buildkite 13. Go.CD 14. Test Kitchen 15. Strider 16. Magnum CI 17. Snap CI 18. Buildbot 19. Testling 20. DotCI

2015-08-01現在

今後、ブレイクの予感?

投資家評価高い

Page 9: はじめての CircleCI

http://qiita.com/search

2015-08-01現在

No. ツール・サービス ヒット数1 Jenkins 10492 Travis CI 4143 CircleCI 1724 wercker 835 Drone.io 526 Codeship 7

Page 10: はじめての CircleCI

以下のサービスを比較 Travis CI Codeship CircleCI

いずれも基本的な機能は兼ね備えている GitHub 連携

Scala (sbt) のサポート (wercker はやや不十分)

LXC (コンテナ型) 実行環境

ビルド前後に任意のコマンドを実行可能 (sudo可) 各種主要データベースがセットアップ済み ビルド時間制限なし (一部、個別要件あり)

CI サービスの比較

Page 11: はじめての CircleCI

https://travis-ci.org/

Page 12: はじめての CircleCI

ユーザ数最大の最古参CIサービス(12万~ユーザ、20万~OSSリポジトリ)

複数のマシン環境・言語バージョンでのビルドを標準でサポート 設定ファイル「.travis.yml」の記述が必要

Travis CI の特徴

Page 13: はじめての CircleCI

OSS は無料 プライベートリポジトリは同時実行数課金

Travis CI の料金

Page 14: はじめての CircleCI

https://codeship.com/

Page 15: はじめての CircleCI

Bitbucket サポート ビルド環境がハイスペック 並列テスト可能 SSH ログイン可能

Docker 対応可

OSS でもビルドログが非公開

設定は全て WebUI で行う

Codeship の特徴

Page 16: はじめての CircleCI

OSS は無料

プライベートリポジトリは5 プロジェクト、100 ビルド/月 まで無料

個人アカウント: $49/月 プライベートリポジトリ無制限 同時実行数: 1

並列テスト: 2

Organization は異なる料金体系 (次頁)

Codeship の料金

Page 17: はじめての CircleCI

Codeship の料金

Page 18: はじめての CircleCI

https://circleci.com

Page 19: はじめての CircleCI

並列テスト可能 SSH ログイン可能

Docker 対応可 外部サービスとの連携が充実 成果物の保存やデプロイ向け機能も充実 ユーザーサポートが手厚い (英語) 日本語の情報も多い

CircleCI の特徴

Page 20: はじめての CircleCI

コンテナ数課金 コンテナ数 = 並列度 × 同時実行数

OSS は 4 コンテナまで無料

プライベートリポジトリは 1 コンテナ無料

1コンテナ追加するごとに $50/月

Enterprise 契約も可能

CircleCI の料金

Page 21: はじめての CircleCI

Organization アカウントのプライベートリポジトリを使う前提 料金は全て月額

料金比較

サービス名 本社所在地

同時実行数 並列テスト1 2 4 8

Travis CI ドイツ $129 $129 $249 $489 -

Codeship アメリカ $99 $99 $299 $999 ○CircleCI アメリカ Free $50 $150 $350 ○

wercker (β版) オランダ Free Free - - -

Drone.io アメリカ $99 $99 $199 $399 -

Semaphore セルビア $99 $99 $199 問い合わせ -

Shippable アメリカ Free $10 $30 $70 -

Solano CI アメリカ $50~ (稼働時間課金) ○Snap CI アメリカ $80 $80 $180 問い合わせ ○

2015-08-04現在

Page 22: はじめての CircleCI

Scala プロジェクトのビルド時間を比較 使用したリポジトリはこちら

https://github.com/mogproject/example-scalacheck

測定結果 単位は「分:秒」 括弧内の時間はコンパイルおよびテストに費した時間

性能比較

sbt キャッシュ Travis CI Codeship CircleCI (*)

なし 1:36 (1:09)

0:37(0:29)

1:44 (1:27)

あり 1:00 (0:28)

0:32(0:19)

1:10 (0:42)

* テストコード自体が少ないせいか、並列度が 1 でも 4 でも結果変わらず

Page 23: はじめての CircleCI

Codeship を使いましょう

おわり

まとめ

Page 24: はじめての CircleCI

無料でプライベートリポジトリを

使い倒すなら CircleCI

OSS なら Travis CI が安定

コンパイルが遅い Scala のような言語は Codeship vs CircleCI を検討

"CircleCI vs CodeshipCI - Qiita" - http://qiita.com/blueplanet/items/a9e5b93797d4c171619a コンパイル処理がボトルネックなら、並列度を上げても解決しないかも

雑感

Page 25: はじめての CircleCI

Circle CI とは

はじめてのビルド

ビルドのカスタマイズ

DEMO

Agenda

Page 26: はじめての CircleCI

CircleCI の話題に戻ります

https://circleci.com からログイン

ログイン

Page 27: はじめての CircleCI

プロジェクトの作成

Page 28: はじめての CircleCI

最初のビルド

Page 29: はじめての CircleCI

デフォルトのビルド環境

リポジトリ直下に「circle.yml」が存在しない場合、デフォルトの環境設定でビルドが実行される

使用言語は CircleCI によって自動的に判定

sbt プロジェクトの場合はproject/build.properties に記述したバージョンの

sbt が使われる

"Test environment - CircleCI" - https://circleci.com/docs/environment

Page 30: はじめての CircleCI

デフォルトのビルド環境

アーキテクチャー: x86_64

OS: Ubuntu 12.04 (precise) Java: Oracle JDK 7

データベース・サービスデフォルトで起動

couchdb (1.3.0) memcached (1.4.13) mongodb (2.4.13) mysql (5.5.41) postgresql (9.4 with postgis 2.0 extensions) rabbitmq (3.4.4) redis (3.0.2) zookeeper (3.3.5)

利用可能 beanstalkd (1.4.6) cassandra (2.1.3) couchbase-server (2.0.0) elasticsearch (0.90.2) neo4j (2.2.2) riak (1.4.8-1) solr (4.3.1) sphinx (2.0.4-release)

Page 31: はじめての CircleCI

デフォルトのビルド環境

MySQL, PostgreSQL では以下のデータベースを使用可能

データベース名: circle_test

ユーザ: ubuntu

パスワード: なし

主な環境変数は以下 HOME=/home/ubuntu LANG=en_US.UTF-8 PATH: /home/ubuntu/bin を含む

最初のビルドの後は、GitHub にコミットが push される

たびに CircleCI でもビルドが実行される

Page 32: はじめての CircleCI

sbt プロジェクトのビルドの流れ

コンテナ起動 デバッグ用SSHポートの有効化

キャッシュの復元 (S3 からダウンロード)

GitHub からコードをチェックアウト

sbt test:compile キャッシュの保存 (S3 へアップロード)

sbt test:test JUnit などのメタデータの収集

成果物(アーティファクト)の収集 コンテナ停止

Page 33: はじめての CircleCI

通知設定 (メール)WebUI から個人で設定

Page 34: はじめての CircleCI

通知設定 (Slack / HipChat)WebUI からプロジェクト単位で設定

Page 35: はじめての CircleCI

通知設定 (Slack / HipChat)

Page 36: はじめての CircleCI

SSH を利用したデバッグ

Page 37: はじめての CircleCI

SSH を利用したデバッグ表示されるアドレス・ポートに SSH でログイン可能

GitHub に接続可能な SSH 鍵が必要

ssh [email protected] でチェック

ビルド完了後、30分経過するとコンテナは停止

Page 38: はじめての CircleCI

SSH を利用したデバッグ

SSH 接続例

コンテナが複数起動している場合はssh node0, ssh node1, …で他のコンテナに直接アクセス可能

$ ssh -p 64758 [email protected] authenticity of host '[54.146.12.94]:64758 ([54.146.12.94]:64758)' can't be established.RSA key fingerprint is 5a:43:6d:7d:cb:a0:e6:26:cf:a3:fd:e6:8d:16:5f:3c.Are you sure you want to continue connecting (yes/no)? yesWarning: Permanently added '[54.146.12.94]:64758' (RSA) to the list of known hosts.Last login: Sat Aug 1 13:46:33 2015 from 10.155.246.48ubuntu@box1234:~$ ssh node2Warning: Permanently added '[54.159.70.222]:64646' (ECDSA) to the list of known hosts.Last login: Sat Aug 1 13:46:46 2015 from 10.155.246.48ubuntu@box952:~$

Page 39: はじめての CircleCI

ステータスバッジの追加Project Settings -> Notifications -> Status Badges

Page 40: はじめての CircleCI

Circle CI とは

はじめてのビルド

ビルドのカスタマイズ

DEMO

Agenda

Page 41: はじめての CircleCI

ビルドのカスタマイズ

WebUI circle.yml リポジトリ直下に置く YAML形式のファイル

"Configuring CircleCI - CircleCI" - https://circleci.com/docs/configuration

"Sample circle.yml file - CircleCI" - https://circleci.com/docs/config-sample

Page 42: はじめての CircleCI

キャッシュディレクトリの追加

「~/.ivy2」など一般的なビルドツールのディレクトリは

デフォルトでキャッシュ対象になっている。

Scala プロジェクトの場合

「~/.sbt/boot/scala-${SCALA_VERSION}」

だけをキャッシュ対象にするのが望ましいがTravis CI とは異なり、Scala のバージョンが環境変数に入っていない。どうしたら良いものか。

dependencies: cache_directories: - "~/.sbt"

Page 43: はじめての CircleCI

環境変数のカスタマイズ

machine: environment: foo: bar baz: 123

Page 44: はじめての CircleCI

環境変数のカスタマイズ

リポジトリに置きたくない環境変数は WebUI で設定

Project Settings -> Tweaks -> Environment variables 同じ変数が circle.yml にもあれば、circle.yml 優先

Page 45: はじめての CircleCI

タイムゾーンのカスタマイズ

machine: timezone: Asia/Tokyo

Page 46: はじめての CircleCI

JDK のカスタマイズ

以下から選択可能 oraclejdk8 oraclejdk7 (デフォルト)

oraclejdk6 openjdk7 openjdk6

machine: java: version: openjdk7

Page 47: はじめての CircleCI

データベースのスキーマ設定

database: override: - mysql -u ubuntu circle_test < path/to/setup.sql

スキーマのロード・テスト用データの投入はdatabase.override にコマンドを記述して実現 接続ユーザ、データベース名は固定 アプリに対しては環境変数で指定するとよい

machine: environment: MY_APP_DB_URL: 'jdbc:mysql://localhost:3306/circle_test' MY_APP_USER: 'ubuntu' MY_APP_DB_PASS: ''

Page 48: はじめての CircleCI

データベースのスキーマ設定

MySQL Workbench から DDL を出力する場合はスキーマ修飾子を含めないように注意

Page 49: はじめての CircleCI

ソフトウェアのインストール

dependencies: pre: # Install td-agent - curl -L http://toolbelt.treasure-data.com/sh/install-ubuntu-precise.sh | sh - sudo cp -f circle/td-agent.conf /etc/td-agent/td-agent.conf - sudo /etc/init.d/td-agent stop - sudo /etc/init.d/td-agent start

dependencies.pre にコマンドを順に記述 もしくはインストール用シェルを準備して、そのパスを記述

td-agent をインストールする例

<source> type forward port 24224 bind 0.0.0.0</source><match **> type stdout</match>

circle.yml

circle/td-agent.conf

Page 50: はじめての CircleCI

ソフトウェアのインストール

dependencies: pre: - sudo apt-add-repository -y 'deb http://ppa.launchpad.net/ondrej/mysql-experimental/ubuntu precise main' - sudo apt-get update; sudo DEBIAN_FRONTEND=noninteractive apt-get install -y mysql-server-5.6

MySQL 5.6 をインストールする例

デフォルトでインストールされているのは 5.5

circle.yml

前述の「キャッシュディレクトリ」を適切に追加して不必要なダウンロードやコンパイルを避ける工夫も大切

Page 51: はじめての CircleCI

ブランチを CI 対象外にする

デフォルトでは、全てのブランチがビルド対象 general.branches.ignore でブラックリストを指定(正規表現もOK) ホワイトリスト指定もできるが、非推奨

general: branches: ignore: - gh-pages # list of branches to ignore - /release\/.*/ # or ignore regexes

general: branches: only: - master # list of branches to build - /feature-.*/ # or regexes

Page 52: はじめての CircleCI

コミットを CI 対象外にする

直近のコミットメッセージ (head commit) に文字列

[ci skip] が含まれていれば、ビルドは実行されない

"Skip a build - CircleCI" - https://circleci.com/docs/skip-a-build

$ git log origin/master..HEAD

commit 63ce74221ff899955dd6258020d6cb9accede893Author: Daniel Woelfel <[email protected]>Date: Wed Jan 23 16:48:25 2013 -0800

fix misspelling [ci skip]

commit 463147193b2fe561cfb12a9787434dd726390fcdAuthor: Daniel Woelfel <[email protected]>Date: Wed Jan 23 16:30:24 2013 -0800

add "Skip a build" doc

Page 53: はじめての CircleCI

その他のトピック

成果物の保存 "Build artifacts - CircleCI" - https://circleci.com/docs/build-artifacts

コードカバレッジの取得 "Generating code coverage metrics - CircleCI" - https://circleci.com/docs/code-coverage

Docker 連携

"Continuous Integration and Delivery with Docker - CircleCI" - https://circleci.com/docs/docker

REST API "CircleCI REST API - CircleCI" - https://circleci.com/docs/api

継続的デプロイ "Continuous Deployment with Heroku - CircleCI" - https://circleci.com/docs/continuous-deployment-with-heroku

"Continuous Deployment with AWS CodeDeploy - CircleCI" - https://circleci.com/docs/continuous-deployment-with-aws-codedeploy

Page 54: はじめての CircleCI

Circle CI とは

はじめてのビルド

ビルドのカスタマイズ

DEMO

Agenda

Page 55: はじめての CircleCI

DEMO

プライベートリポジトリのビルドを追加

HipChat 連携

コンテナに SSH で接続

「circle.yml」を準備したブランチを push

カスタムインストールの実行確認

Page 56: はじめての CircleCI

DSS版 CircleCI 利用心得

Don't ignore errors 失敗するテストは絶対に放置しない テストコードは常に見直せ

Keep it Small サイズの大きいファイルは置かない 使わないブランチは問答無用で削除

Keep it Short そのライブラリ、本当に必要?

Specs2 よりも ScalaTest

[ci skip] を活用

Page 57: はじめての CircleCI

"Continuous Integration and Deployment - CircleCI" - https://circleci.com/

"Getting Started - CircleCI" - https://circleci.com/docs/gettingstarted

"継続的インテグレーション - Wikipedia" - https://ja.wikipedia.org/wiki/継続的インテグレーション

"Discover and discuss the best dev tools and cloud infrastructure services | StackShare" - http://stackshare.io/

"Continuous Integration | StackShare" - http://stackshare.io/continuous-integration

"Home - Qiita" - http://qiita.com/

"Travis CI - Test and Deploy Your Code with Confidence" - https://travis-ci.org/

"Travis CI: Continuous Integration and Deployment That Just Works" - https://travis-ci.com/plans

"Continuous Delivery with Codeship: Fast, secure and fully customizable." - https://codeship.com/

"Codeship Organization Pricing: Starting at $99" - https://codeship.com/pricing-organizations

"Wercker - automation driven development" - http://wercker.com/

"Continuous Integration · drone.io" - https://drone.io/

"Semaphore - Continuous Integration & Deployment" - https://semaphoreci.com/

"Continuous Integration with Docker | Shippable" - https://app.shippable.com/

"Solano Labs | Continuous Integration and Deployment" - https://www.solanolabs.com/home

"Continuous Integration that Lives and Works in the Cloud | Snap CI by ThoughtWorks" - https://snap-ci.com/

"CIツールのまとめとSide CI - CIツール勉強会@福岡" - http://www.slideshare.net/SumiKoichiro/ci-continuous-integration-servicematome

"CircleCI vs CodeshipCI - Qiita" - http://qiita.com/blueplanet/items/a9e5b93797d4c171619a

"CircleCI導入したのでwerckerとの比較も含めてまとめ - 月曜日までに考えておきます" - http://ryonext.hatenablog.com/entry/2014/05/20/093828

"CircleCI で Playframework のプロジェクトを回そうとしたら OOM Killer に殺される件 - Qiita" - http://qiita.com/kawachi/items/4d4c56fa0f14c57cb220

"Circle Ciでlocalhostへ設定してあるfluentdを使用する方法とcircle.yml - DRY" - http://k16.hatenablog.jp/entry/2014/08/27/163243

"CircleCIの便利な機能 - Qiita" - http://qiita.com/mzp/items/bba3f378e555e1ed586d

"ScalaプロジェクトをCircleCIでビルド+テストして、scoverageで計測したカバレッジをCOVERALLSに送るための諸設定をした -

TODESKING" - http://www.todesking.com/blog/2014-11-18-scala-with-circleci-and-coveralls/

"CircleCIアンチパターン 2015春 - tehepero

note(・ω<)" - http://stormcat.hatenablog.com/entry/2015/03/31/154300

"# 継続的インテグレーションでやってはいけないこと - @numa08 猫耳帽子の女の子" - http://numa08.hateblo.jp/entry/2014/11/07/214314

"大体いい感じになるKeynoteテンプレート「Azusa」作った - MEMOGRAPHIX" - http://memo.sanographix.net/post/82160791768

参考文献