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

Jenkins ユーザ・カンファレンス 2015 東京に参加してきた。 #jenkinsja #juc2015

今年もマイペースに更新していきますので、よろしくお願いします。
今年は参加したイベントのレポートを忘れずに書くことを目標にしたいと思います。ということで早速、今年最初の参加イベントである「Jenkins ユーザ・カンファレンス 2015 東京」についての参加レポートです。
2012年の夏頃に開かれた前回に引き続いての参加でした。

概要

  • 日時
    • 2015/01/11 (日)
  • 場所
    • 法政大学 市ヶ谷キャンパス 外濠校舎
  • 参加セッション
    • 基調講演: Jenkinsプロジェクトの現状とワークフロー
    • はてなにおける継続的デプロイメントの現状とDockerの導入
    • JenkinsとPuppet+ServerspecでインフラCI

※ 諸事情により残りのセッションとLTは参加できず。。

■ 募集時の事前アンケート結果

到着して間もなく、基調講演の開始が12時30分からになるからとのアナウンスが。
どうやらconpassの開始時刻の案内が13:00になっていたみたいで、そのことを考慮してとの措置とのことでした。

私はホームページの情報しか見ていなかったので、本来の開始時刻少し前に到着し、無事に最初から聴くことができました。
基調講演開始までの空いた時間のつなぎと、基調講演の頭で、イベント募集時の事前アンケート結果について紹介がありました(後で資料は公開されるとのこと)

目についた結果のメモだけ。

  • 使用言語
    • Javaが頭一つ(二つくらい?)抜けていた(まぁ納得)。
    • 後はJavaScript, C, C++, C#, Ruby, Pythonあたりが続く。
    • Groovyは選択肢になかったが、実際の利用者はもっと多いと予測される。
  • Jenkinsの利用経験
    • 6割強が初心者、3割強が中級者、残り1%がエキスパートといった分布。
  • Jenkinsの用途
    • ビルドに使っている人の数とデプロイに使っている人の数にあまり差がなかった(CDも当たり前になっている?)

■ 基調講演 Jenkinsプロジェクトの現状とワークフロー

Jenkinsの現状

  • 前年比で大幅に伸びている(インストール数、スレーブ数、ジョブ数)

DotCI

https://github.com/groupon/DotCi

Jenkinsのロードマップ

  • UIの刷新(互換性を保ちつつ)
    • レスポンシブデザイン
  • 継続的デリバリー
    • 典型的なデプロイの流れ: Repository -> Jenkins -> S3/Artifactory等 -> デプロイ先サーバ
    • いつ何がデプロイされたのかをJenkinsが把握するために、デプロイ先サーバからJenkinsにファイル指紋をトラックバックする。
  • Docker
    • Docker内のコンテナ(クリーンなスレーブ)でビルド
    • docker run -p 8080:8080 jenkins
  • 受け入れテスト & ハーネス
  • 通信のNIO化
  • Maven2ジョブの高速化

Jenkins Workflow Plugin

http://jenkins-ci.org/content/workflow-plugin-10

  • 最近1.0がリリースされた。川口さんが個々最近で力を入れて取り組んでいたプロジェクトとのこと。
  • モチベーション
    • 複雑な継続デリバリーチェインに対応する
      • ブルー・グリーンデプロイメント
      • 要所要所で人間の判断が必要な処理(スキーマの変更の確認をDBAが行う、など)に対するフローの中断、確認、再開
      • 分岐や並列実行
    • 似たようなジョブがたくさんできてしまう問題
      • ジョブ(の設定)を再利用できるようにする
  • プラグイン
    • Groovyを土台にしたDSLでワークフローを定義する
    • プラグインの状態をセーブポイント(チェックポイント)を設定しておくことで、最初からやり直さずに再実行することができる。
    • Jenkinsの再起動をしても実行中のジョブがエラー終了せずに、再起動後に継続して実行されていること(デモ)
  • 実装技術
    • カスタムGroovyインタプリタを実装
    • 継続渡し方式(CPS: Continuation Passing Style)
    • Jenkinsサーバ上でGitリポジトリを作っている → デプロイ・アンデプロイなどで成果物の再利用ができる)

はてなにおける継続的デプロイメントの現状とDockerの導入

  • Jenkinsの利用ケース
  • Chef
    • Jenkins環境の構築もChefで
  • Jenkinsを使う時の方針
    • 設定を複雑にしない(秘伝のタレ問題)
    • ジョブの設定としては、 script/jenkins.sh を実行するだけ、くらいのシンプルなもの。
  • チャットツール
    • IRCからSlackに乗り換えた
  • タスク管理ツール
    • Trello
  • 開発と本番で自分がどちらのアプリを見ているか勘違いしないようにするための工夫としてfavionを変えている。

ブランチモデル

  • master, staging, devel, feature branch(随時)
  • develブランチは常にリリース可能な状態に保つ
  • 開発中にプルリクを立てるかは任意、ただしレビュー時は必須
  • レビュー後にdevelへマージする
    • コンフリクトがあるとGH;Eからボタン一発でマージできないので、コンフリクトが解消されていることが強制される。
  • pushされる度にテストを実行し、GH;Eに通知(通知としては弱いのでXFD等も使ってみたい、とのこと)

Docker

  • 環境を分離する
  • イメージ作成時にブランチ名を対応させておく
  • イメージのビルドに時間がかかる(30分以上)
    • apt-get, perlのインストール, 等
    • 解決策(キャッシュの活用)
      • コマンドはデフォルトでキャッシュされる。
      • COPYすると効かない。

質疑応答

  • 開発時のDBは確認用のDBがあってDockerコンテナ内からは全てそれを参照している。
  • スキーマの変更は、既存のものとの互換性を保つようにして更新するようにしている。

■ JenkinsとPuppet+ServerspecでインフラCI

GMOペパボ株式会社の常松さん(@tnmt)の発表。資料は以下。

質疑応答

  • 商用ソフトなど対話型インストールが必要なソフトへの対応について
    • ウィザードでのインストールでも、やっていることは設定ファイル等の成果物の生成・配置なので、成果物を配置することでインストール後の状態と見なす。
  • Serverspecでテストを書く時はどれくらい突っ込んだテストを書く
    • 絶対に逃せない仕様から確実にテストしていき、徐々に膨らませていく。
  • Serverspecで全てのインフラのテストは可能?
    • 大体はできるが、他の機能との連携などはできない(苦手?)なものもある。
  • サーバ群としてのテストは自動化しているか?ロードバランシングやDBのフェールオーバなど。
    • Serverspecはあくまで単体のテストに使い、それらはロードバランサの死活監視などでやるのがベター。

■ 感想

基調講演 Jenkinsプロジェクトの現状とワークフロー

  • ビルドだけに限らずデプロイまでJenkinsで行っている人が多かったので、Capistrano以外を使った方法など、色んな事例がありそうなので聞いてみたいと思った。
  • Jenkins Workflow Pluginはすごい便利そう。
    • 実プロジェクトでデプロイメントパイプラインを組んでいて、10個近いジョブがチェインされているので、このプラグインを使って組み直してみたい。
  • (ちょっとした疑問1)一つのジョブに集約される分、ジョブの実行時間は長くなりそうだけど、頻繁なコミットの度にデプロイを行っているようなケースで同一ジョブをうまく多重実行できる?
  • (ちょっとした疑問2)既存プラグインで拡張されたビルド処理とかも記述できる?まぁ sh が使えれば何ともでなりそうではあるけど…。
  • 実際に使う場合、ワークフロースクリプトが秘伝のタレ化しないように注意しないとならなそう。
    • バージョン管理とレビュー必須?

はてなにおける継続的デプロイメントの現状とDockerの導入

  • 会場が超満員で、関心の強さを感じた。
  • ブランチモデルとかは、世の流れに数年遅れて、SubversionからGitへのシフト中でもあるため、参考になった。
  • DockerでのインフラCIとかはうまく仕組みが作れるとすごい便利そうだなと思い、一時期取り組んでいたけど、保留中なのできちんと形にしたい…。

JenkinsとPuppet+ServerspecでインフラCI

  • 最近Dockerが流行りなのか、Vagrant聞くことが少なくなったなぁと感じてたけど、実機の環境に近いのは完全仮想化であるVirtualBoxとのことで、その事例が聴けてよかった。
  • 仕事ではChef+Vagrant+ServerspecでインフラCIっぽいことをしているので、それと比較しながら聴けた。こっちも後でブログにまとめたい。

全体通して

すでに業務でのJenkinsとの付き合いは5年以上(Hudson時代から)となり、Jenkinsは開発に欠かせないツールになっています。
Jenkinsのバージョンアップ自体は1ヶ月に1, 2回くらいのペースで行っているのですが、新しいプラグインなどは最近キャッチアップできてなかったので、とても刺激になりました。
イベントの資料は最近は(大変ありがたいことに)後からでも見ることができますが、生で聞くとやはりモチベーションアップになりますね。
あとはChef, Puppet, Docker関連の話が多かったのも印象。単なるビルドやテストを越えてJenkinsは色んなことに使えるので、もっと色々な仕事をJenkinsに任せられるよう、模索したいと思います。

スタッフ、発表者、参加者の方々、おつかれさまでした。とても参考になるイベントでした。ありがとうございました。