2015 新春 JJUG 特別企画 Jenkins まつりに参加しました #jjug



http://jjug.doorkeeper.jp/events/19259

日時：2015-01-13（火）19:30 - 21:30
会場： オラクル青山センター
主催：日本Javaユーザグループ

---
#はやめぐり

JJUG主催だが、とくにJavaに限定した内容ではなく、３種類の発表。

**Javaユーザに贈るJenkins 25のTips**
http://www.slideshare.net/linoSth/javajenkins-25tips
Jenkins実践入門著者による25のプラグイン、Tips紹介

**継続的インテグレーションから継続的デリバリーへ**
IBM製のCIツールUrbancodeの紹介、Jenkinsとの比較。
https://developer.ibm.com/urbancode/

**Chef/Puppet + Jenkinsによる継続的デリバリ**
Jenkinsというプロジェクト・インフラを継続的デリバリーで実践する。
Puppet社社員と共同でJenkinsプロジェクト周辺環境の継続的デリバリを実現した。
https://github.com/jenkins-infra/jenkins-infra/



　はじめは、[Jenkins実践入門](http://amazon.jp/dp/4774148911)著者によるプラグイン紹介。定番どころから、昨年リリースされたワークフロープラグインまで。個人的にはXvfbプラグインを推したい。以前Windows上にJenkinsを構築したが、ビルド実行時にGUIのシミュレートが出来なくて積んだ経験があるので。（Linuxでビルドを走らせるのが前提）
　次はJenkinsライクなIBM製の自動化ツールUrbanCodeの紹介。自動化導入時、JenkinsがOSSという点を上長に懸念される場合は検討しても良いかもしれない。
＃JenkinsもEnterprise版はあるが、IBM製というバッググラウンドは大きい…
　最後は川口さんのJenkinsによるJenkinsプロジェクトの継続デリバリー。Jenkins開発者によるJenkinsを利用した継続的デリバリーの見本が提示されているのは非常に参考になる。
GitHubで公開されているので、その機能や実装だけではなく、プルリクエストの履歴なども確認することができ、実際の開発プロセスの履歴まで提示されている。




---
#発表メモ

##Javaユーザに贈るJenkins 25のTips
ご登壇者：佐藤聖規氏 (@lino_s)
http://www.slideshare.net/linoSth/javajenkins-25tips

[Jenkins実践入門](http://amazon.jp/dp/4774148911)などを執筆。

**1.Gitプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Git+Plugin
説明不要。Gitがデファクトスタンダードの今必須のプラグイン。
※Enterprise版限定プラグインだが、Validated Mergeプラグインが便利。
https://www.cloudbees.com/products/jenkins-enterprise/plugins/validated-merge-plugin


**2.GitHubプラグイン**
説明不要。GitHubがデファクt（ry
https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin
webhookでプッシュしてビルドすることができる

**3. Gradleプラグイン**
Gradleを使う際、スレーブのOS環境を意識する必要がなくなる。
https://wiki.jenkins-ci.org/display/JENKINS/Gradle+Plugin

**4. CheckStyleプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Checkstyle+Plugin

**5. FindBugsプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Findbugs+Plugin

4.とともに、静的解析結果の表示するプラグイン

**6.TaskScannerプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Task+Scanner+Plugin
ビルド対象のJavaファイルコメント内のTODOやFIX MEを集計してくれる。

**7. JobConfigHistoryプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/JobConfigHistory+Plugin
ジョブの設定の変更履歴を作れる
ビルド履歴とも連携するので、どのビルドから変更したかも管理できる。
※ただビルドスクリプトは原則プロジェクトと一緒に構成管理に突っ込んでおくのがよいみたい。

**8.Timestamper**
https://wiki.jenkins-ci.org/display/JENKINS/Timestamper
コンソール出力の結果にタイムスタンプを付けてくれる。
 

**9.Emotional Jenkinsプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Emotional+Jenkins+Plugin
ジョブ背景のJenkinsおじさんの絵柄がジョブのステータスで変化する。


**10.Green Ballsプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Green+Balls
ジョブの成功時の青信号を緑に変えてくれる
TDDしている人に人気。

**11.Nesteed Viewプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Nested+View+Plugin 
ジョブをディレクトリ管理したように階層構造で表示することができる。

**12.Tips:JUnitのテストレポートを表示することができる。**
JUnit互換のXMLを出力するxUnitフレームワークならば(RSpecやgoogletestなど)JUnitと同様にレポートを表示できる

**13.Tips:マルチ構成プロジェクト**
ジョブを作成するときにマルチ構成にすることでブラウザのバリエーションやOSごとの結果をMatrix表示することができる。

**14.Tips:パンくずメニューでショートカット**
逆三角がでているメニューはだいたいショートカットメニューが表示される。

**15.Tips:コンソールにジャンプ**
ビルド中の青進捗バーをクリックするとコンソール出力に飛べる

**16.Tips:safeRestart**
http://jenkinsurl/safeRestartにアクセスするとリスタートできる。
/safeRestart は実行中のジョブが完了するのを待ってから再起動をかける。/restartは問答無用で今すぐ再起動する。
http://twitter.com/kohsukekawa/status/554953298411659265

**17.Deployプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Deploy+Plugin
user idとpasswordとデプロイ先を指定すればデプロイできる
GlassFish 2.x/3.x JBoss 3.x/4.x Tomcat 4.x/5.x/6.x/7.xに対応。

**18.Xvfbプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/xvfb+Plugin
Xウインドウが無いLinuxでも仮想ディスプレイをエミュレートできる。
Seleniumなどを利用したいときに用いる。

**19. Build Pipline viewプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Build+Pipeline+Plugin

一連のジョブのプロセスの流れを可視化してくれる。

**20. Promoted Buildsプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Promoted+Builds+Plugin
誰かが承認したときのみ昇進することができる。

**21.Workflowプラグイン**
https://github.com/jenkinsci/workflow-plugin
ひとつのジョブでワークフローを実現できる。
Groovyを用いてワークフローを定義。スニペットもある


**22.Slackプラグイン**
Slackに通知するプラグイン

**23.Email-extプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Email-ext+plugin
メール通知をリッチにするプラグイン

**24.Disk Usageプラグイン**
https://wiki.jenkins-ci.org/display/JENKINS/Disk+Usage+Plugin
ワークスペースが利用しているディスク容量などを可視化できる。

**25.Monitoring**
https://wiki.jenkins-ci.org/display/JENKINS/Monitoring
CPUやメモリ、スレッド数の可視化できる。

###Jenkins実践入門は改訂中。
最新のUIに対応するなど、改訂を行なっている。

##継続的インテグレーションから継続的デリバリーへ

ご登壇者：黒川 敦氏(日本アイ・ビー・エム株式会社)

ツールの共有は難しい。
開発と運用部門にわかれた組織だとE2Eのインフラストラクチャーが制限されてしまう可能性がある。部門によって思いが異なるため。

- 開発：できたらすぐにでもデプロイしたい
- 運用：手順をきちんと確認、検証して念入りにデプロイしたい

###DevOps or NoOps

「リリースとデプロイ」作業でよくある課題
エンタープライズだと、開発者が作成したリリース手順書が組織をまたぐたびに変更されてしまう。
また、デプロイ時は様々な承認ルートやコンプライアンスの壁ができる。

**CD(継続的デリバリー)を実現するIBM UrbanCode**
ターゲット環境にデプロイできることが大きな課題である。
デプロイゲートをしっかりクリアするからこそ自動デプロイできる。

- リリースフロー図をドラッグアンドドロップで作成することでリリース手順を定義できる。
- プラグインも多く用意されている
- 各環境のアプリケーションリリース状況の確認もできる。
- 品質ゲートとして様々なチェックリストを設定することもできる。
- リリース承認プロセスをフローの中で定義することもできる。
- ワークフローはGroovyで作成することができる。

JenkinsとIBM UrbanCodeの比較
※あくまでIBMの比較結果

Jenkins|UrbanCode
|---|---|
オープンソース|商用商品
ビルドに焦点をあてる|リリースに焦点をあてる
開発者視点|開発者+運用者視点
ビルド単位の権限|ターゲット環境単位の権限
継続的インテグレーション|継続的デリバリー



##Chef/Puppet + Jenkinsによる継続的デリバリ

ご登壇者：川口 耕介氏 (@kohsukekawa)

より広範なEnd-to-endの自動化の進展。すなわち「継続的デリバリ」
jenkins-ci.org運用上のニーズ

- テスト環境がない
- システム管理者が分散している
- 自分たちの提唱することを自分たちで実践

**Jenkinsというプロジェクト・インフラを継続的デリバリーで実践する。**

https://github.com/jenkins-infra/jenkins-infra/
Puppetのエンジニア公認のPuppetプロジェクト。共同で作成した。

###個々のサービスのコンテナ化
個々をそれぞれ単体でテストをしたい。
Gitで各サービスをコンテナ管理してDockerリポジトリにpushされていく。
ビルドごとにユニークなタグをつけている

###rspec-puppetによるプルリクエストの検証を行う。
puppetマニフェスト内のビルド番号が変更されたらデプロイの検証を行いたい。
puppetマニフェストの変更をインフラチームがプルリクすることで、hookが走りテストが行われる。

どういうテストを行えばいいのか？

- まず文法的なチェックをrspec-puppetで確認する。
- serverspecとVagrantによる動作確認。実際にデプロイ処理を走らせてみる。

###r10k + puppet enterprise
ブランチが自動的にenvironmentになる
依存モジュールの解決とロードを行う
ブランチを環境にマップすることができる。

環境別の差異を吸収するHieraを使っている
Hieraは環境ごとに異なるidやAPIトークンなどのデータを管理するためのPuppetの管理ファイル。

hiera-eyaml　パラメータの個別暗号化

stagingからproductionにデプロイするときもGitHub上のプルリクで行う。
jenkins-infraのプルリクなどを参考のこと。

###継続的デリバリの課題
デプロイは実際にいつ起こったのか？

このサーバで走っているのはどのビルドか？
スタックトレースからソースコードへの正確なマッピング

###end-to-endトラッキング
https://wiki.jenkins-ci.org/display/JENKINS/Deployment+Notification+Plugin

Jenkinsでファイル指紋を付けてビルド、指紋を追跡した結果を基にしたさらなる自動化を実現する。

ファイル指紋。ビルドごとに異なるファイル指紋を記録する。
どのリビジョンが
どこでいつビルドされ、
どこいつテストされ？
どこでデプロイされたのか

puppetのレポート機能でファイル指紋をJenkinsに送り、スモークテストで記録しておく。

### Opes側の変更は最小に
Ops側に必要な変更を最小限にすることを考慮したデザインが行われている。
**Chef**
カスタムレポートハンドラとして実装
**Puppet**
標準レポート形式をJenkinsにPOSTするだけ

Ansibleなどにも今後対応予定。

##今後の予定
さらなるデータの可視化
ファイルじゃないものの指紋も取得したい。
jenkins-ci.orgの運用でもこれを使う