Docker/Droneを試してみる

:D な会社の友達たちが「いみゅーたぶるいんふらなんちゃらの合宿やるわー」って話してたので、そんな面白いことはぜひ外部からの参加も可能にするべきだ!って憤慨しながら突っ込んだら「くればおk」って言ってくれたので合宿参加しました。

概要はこんな感じ

Immutable Infrastructure 的ななにかをやる

キーワード
・Vagrant
・Docker
・Mesos
・Serf
・Sensu ?
・Jenkins
・とかとか

やること
・上のキーワードをてきとうに組み合わせるとなにかおもしろいの出てくるかも
・Jenkins × Docker とか
・Mesos × Vagrant とか
・ただ触ってみるだけでも良いとおも

主催者の @sonots さんは上記のような概要書いたくせに全然関係ないfocuslight(の主にドキュメントページ)をやってた

僕は、とりあえずdockerだけ予習してから参加した。 (ちなみに実家から母が来てたんだけど、いろいろあってリスケとかしてもらったのもあって妻にまるなげして参加した。なので、帰りにヒカリエでケーキ買って帰った)

やろうと思ってたこと

  • focuslightのRRDToolAPIからデータを抜いてD3化→brew installできなかったのでやめた
  • droneを試す→まあ、動いた。gitlabとか追加できるようにコードを読み漁ってたところで終わり

focuslight

  • brew install rrdtool→こける
  • brew install gobject-introspection が原因ぽい
Warning: No developer tools installed.
You should install the Command Line Tools.
Run `xcode-select --install` to install them.
==> Downloading http://ftp.gnome.org/pub/GNOME/sources/gobject-introspection/1.38/gobject-introspection-1.38.0.tar.xz
Already downloaded: /Library/Caches/Homebrew/gobject-introspection-1.38.0.tar.xz
==> ./configure --prefix=/usr/local/Cellar/gobject-introspection/1.38.0
==> make
./g-ir-scanner: line 29: `    def on_exception(exctype, value, tb):'
make[2]: *** [GLib-2.0.gir] Error 2
make[2]: *** Waiting for unfinished jobs....
make[1]: *** [all-recursive] Error 1
make: *** [all] Error 2

READ THIS: https://github.com/mxcl/homebrew/wiki/troubleshooting

/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:277:in `open_http': 404 Not Found (OpenURI::HTTPError)
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:616:in `buffer_open'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:164:in `open_loop'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `catch'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:162:in `open_loop'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:132:in `open_uri'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:518:in `open'
    from /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/1.8/open-uri.rb:26:in `open'
    from /usr/local/Library/Homebrew/utils.rb:264:in `open'
    from /usr/local/Library/Homebrew/utils.rb:281:in `each_issue_matching'
    from /usr/local/Library/Homebrew/utils.rb:293:in `issues_for_formula'
    from /usr/local/Library/Homebrew/exceptions.rb:178:in `issues'
    from /usr/local/Library/Homebrew/exceptions.rb:209:in `dump'
    from /usr/local/Library/brew.rb:118

このあと、mac os xのboot2docker使って ubunturrdtool入れようとしたけど、それでもこけてたので、時間もったいないし辞めた

drone

f:id:muddydixon:20140223150138p:plain

docker daemonが必要らしい

  • 参考
  • sudo sudo docker -H 0.0.0.0:4243 -d
  • sudo DOCKER_HOST="tcp://localhost:4243" start drone わーい

f:id:muddydixon:20140223150147p:plain

ログ

/var/log/upstart/drone.log

droneのsqlite3

/var/lib/drone/drone.sqlite

ubuntu@~$ sqlite3 /var/lib/drone/drone.sqlite 
SQLite version 3.7.17 2013-05-20 00:56:22
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
builds     members    repos      teams    
commits    migration  settings   users    
sqlite> 

table

table 備考
builds ビルドのログが入っている。stdoutの中に全文保持
members 所属チームと役割を保持
repos リポジトリ設定
teams チーム設定
commits リポジトリのコミットログを保持
migration よくわからない
settings drone自体の設定
users ユーザ
  • users
table|users|users|2|CREATE TABLE users (
   id                INTEGER PRIMARY KEY AUTOINCREMENT
  ,email             VARCHAR(255) UNIQUE
  ,password          VARCHAR(255)
  ,token             VARCHAR(255) UNIQUE
  ,name              VARCHAR(255)
  ,gravatar          VARCHAR(255)
  ,created           TIMESTAMP
  ,updated           TIMESTAMP
  ,admin             BOOLEAN
  ,github_login      VARCHAR(255)
  ,github_token      VARCHAR(255)
  ,bitbucket_login   VARCHAR(255)
  ,bitbucket_token   VARCHAR(255)
  ,bitbucket_secret  VARCHAR(255)
)
  • teams
table|teams|teams|6|CREATE TABLE teams (
  id        INTEGER PRIMARY KEY AUTOINCREMENT
  ,slug     VARCHAR(255) UNIQUE
  ,name     VARCHAR(255)
  ,email    VARCHAR(255)
  ,gravatar VARCHAR(255)
  ,created  TIMESTAMP
  ,updated  TIMESTAMP
)
  • members
table|members|members|9|CREATE TABLE members (
   id      INTEGER PRIMARY KEY AUTOINCREMENT
  ,team_id INTEGER
  ,user_id INTEGER
  ,role    INTEGER
)
  • commits
table|commits|commits|13|CREATE TABLE commits (
   id           INTEGER PRIMARY KEY AUTOINCREMENT
  ,repo_id      INTEGER
  ,status       VARCHAR(255)
  ,started      TIMESTAMP
  ,finished     TIMESTAMP
  ,duration     INTEGER
  ,attempts     INTEGER
  ,hash         VARCHAR(255)
  ,branch       VARCHAR(255)
  ,pull_request VARCHAR(255)
  ,author       VARCHAR(255)
  ,gravatar     VARCHAR(255)
  ,timestamp    VARCHAR(255)
  ,message      VARCHAR(255)
  ,created      TIMESTAMP
  ,updated      TIMESTAMP
)
  • builds
table|builds|builds|15|CREATE TABLE builds (
   id        INTEGER PRIMARY KEY AUTOINCREMENT
  ,commit_id INTEGER
  ,slug      VARCHAR(255)
  ,status    VARCHAR(255)
  ,started   TIMESTAMP
  ,finished  TIMESTAMP
  ,duration  INTEGER
  ,created   TIMESTAMP
  ,updated   TIMESTAMP
  ,stdout    BLOB
)
  • migration
table|migration|migration|28|CREATE TABLE migration (
    revision NUMBER PRIMARY KEY
)
  • repos
table|repos|repos|30|CREATE TABLE repos (
   id          INTEGER PRIMARY KEY AUTOINCREMENT
  , slug        VARCHAR(1024) UNIQUE
  , host        VARCHAR(255)
  , owner       VARCHAR(255)
  , name        VARCHAR(255)
  , private     BOOLEAN
  , disabled    BOOLEAN
  , disabled_pr BOOLEAN
  , privileged  BOOLEAN
  , timeout     INTEGER
  , scm         VARCHAR(25)
  , url         VARCHAR(1024)
  , username    VARCHAR(255)
  , password    VARCHAR(255)
  , public_key  VARCHAR(1024)
  , private_key VARCHAR(1024)
  , params      VARCHAR(2000)
  , created     TIMESTAMP
  , updated     TIMESTAMP
  , user_id     INTEGER
  , team_id     INTEGER
)

droneとJenkinsの違いとかを考えながら触ってたんだけど、Jenkinsは「いまある環境+α」を検証するのには良いと思う。Docker / Vagrantでごにょごにょやってテストする、とかもいいと思うけど、droneは「(そもそも必要な依存関係とかを解決した)コンテナを用意して、その上でテストが必要なやつだけを検証する」のは非常に簡単だし、環境とアプリ・ライブラリのテストを完全に分離できるという意味で俺的エポックメイキングな感じでした。

会社でも使ってみたいと思います。

プロビジョニングとオーケストレーション

@sonotsさんからいろいろ聞きながらの自分の中の理解

  • プロビジョニング:マシン単体における(アプリのインストールも含めた)設定の変更(初期化含む)
  • オーケストレーション:機能を実現する、複数のマシン群の「台数」の変更(構成の変化は今後。例えばDBの水平分割に伴うディスパッチャー層の追加とか)

@sonotsさんまじニフティ

雑感

  • @sonotsさん「Jenkinsみたいにslave/workerは使えるの?」→しらね
  • @tohae さん「ぱーるかけちゃうからよくないわー」
  • @yosuke_furukawa さん → @takus さん 「なに勝手にご飯食べてるんすか?」

:Dの会社、怖い会社