天然パーマのテンパらない開発

自分の開発/勉強記録みたいなもんです

Jenkinsカンファレンスに参加してきました

法政大学で行われたJenkinsカンファレンスに参加してきました。

http://connpass.com/event/467/

 

以下、参加してのメモになります。

何書いてるのかいまいち分からない部分もあるかもですが、とりあえず。

 

Jenkins カンファレンス 20120729

 

**********************

12:30 - 自動受け入れテストから継続デリバリーまで

 

html publisher plugin

結果を通してメンバ全員に周知を徹底させる

 

Cobetura Plugin 

Jenkinsにプロジェクトのルールを自動的に強制させることができる

 

コードをチェックインして、テストを通し、スナップショットビルドを作ります。

そして受け入れテスト、コードメトリックス測定をして、リリース広報の生成まですること。

 

mavenのリリースプラグインでは人間の決めたタイミングでリリース候補バイナリを生成する

mavenのフローでは、場合によっては出戻りが発生してまたテスト実行に時間がかかることがあります

戦略としては、mvn version:set を使うこと

snapshotビルドを作り続けるけれども、これと決めたバージョンをリリースバージョンとしてしまうようなアプローチ

snapshotビルドではなくリリースバージョンと決めたあとは、artifactoryやnexusプラグイン(mavenリポジトリと連携させるためのプラグイン)を使って出力できます

 

ビルドプレセスを可視化、見える化したい

一定のコミットがどのプロセスまで進んだのか、どこで失敗したのかなどを見える化するのが重要

 

まとめ:

品質のテスト重要 => それによって確信を得ることができる。出荷可能であると。

受け入れテストが通っており、その受け入れテストはビジネス価値をもたらすストーリーに基づいている。

なのでコードはビジネス価値をもたらすことが保証されている。

 

----

経験的に自動化できないテストは、ユーザシナリオ、受け入れテストで「マニュアル」とマークしておくが、

その「マニュアル」とマークされているテストの割合は非常に少ない。マニュアルテストの結果のフィードバックを自動化することなども重要。

 

アプリケーションの中の設定(log4jとか)に依存をアプリケーションに閉じ込められない場合、どういうアプローチが良いか?

ー> 設定を外出しするよう心がける。同じバイナリをデプロイしつつ、デプロイ環境ではそれぞれ別の設定を運用するような。

 

**********************

13:30 - 開発以外でのJenkins活用方法

 

開発者以外の人にJenkins使ってもらう話

DTP -> 割付などの作業をコンピュータ上で行い、プリンタ出力すること

 

dprooFS

PDFをドラッグ&ドロップ

PDFの差分が見える

 

DTPと開発の共通点

人間がやらないといけないこともあるが、人間やらなくてもいいこともある。

イテレーションする

 

プラグインの活用

実行結果を通知:IRC Plugin

成果物をアップロード:Publish over XXX Plugin, Groovy Postbuild Plugin(ビルド履歴にアイコン表示とか)

 

権限周りの設定

 

APIを利用する

WebアプリをフロントエンドにしてバックエンドにJenkinsを使う

Webアプリ側では使いやすいUIの提供やJenkins側で管理しないデータを扱う

Jenkinsのスレーブ機能で処理が増えても簡単にクラスタを増やすことができる

 

リモートAPI(/api, /api/json)

 

CLI(コマンドライン・インタフェース)

$ java -jar jenkins-cli.jar -s http://jenkins-server/ groovy hello.groovy

プログラムからの利用

 

プラグインを作る

特定の処理をプラグイン化

hudson.tasks.Builderを継承して実装

Builderの実装はたくさんあるので、他のプラグインのソースを見ればわかるはず

 

Groovy Remote Control

Jenkinsとの連携をよりやりやすくするためのプラグイン

 

**********************

14:30 - 多段階ビルド事例

 

たくさんのプロジェクト

gitプラグインを使ってなかったので変更の検出が難しかった

変更がないコードなども繰り返しビルドしたり、記録が残るなどしてしまった。

→ ビルドの状況が「見える化」されていなかった。問題発生した際のトラブルシューティングが非常に難しかった

 

今ではコンポネントごと、プラットフォームごとにジョブを分けている。

現在のパッケージはすべてのコンポーネントの最新状態が必ず反映されている。

 

今でもすべてのコンポーネントを週次でフルビルドしている。コンポネントの依存順に。

可能であれば、依存関係のないコンポーネント同士を並行してビルドしている

フルビルドが完了すれば新しいリポジトリが作成される

 

新しいプロセスで助かっているのは、これまではPythonの巨大な1スクリプトであったが、

今では個別にビルド方法を調整できる。

以前より素早くチューニングできる。コードが変更されたらそれだけを個別に自動的にビルドできる。

1つのスクリプトになっていないので、何か失敗したらそこから開始することが容易

 

ジョブを分けることで何が起きているのか、どこに不具合があるのか「見える化」されるのが良い

ビルドの並行化でフルビルド時間が大幅に短縮された。結果、より改善にそそぐ余裕が生まれた。

 

 

可能な限り、広く使われている実績のあるプラグインを使っている。オレオレスクリプトではなく。

ローカルビルド環境を作ってしまえばEC2よりも安い

 

- Parameterized Trigger Plugin

汎用のパッケージングジョブを定義することができる。

コンポーネント×プラットフォームの組み合わせごとにたくさんジョブを定義する必要がない

このプラグインのすごく便利なのは、ビルドステップを定義すれば下層のビルドが自動的に走り、それが終わるのを待ってくれる

→ そして新しいアクションをまた自動的に実行してくれる

我々はすべてのプラットフォームでテストを実行し、その実行結果をまたなければならない。

このプラグインで非常に効率化できる

 

- Conditional Build Step Plugin

条件によって異なるビルドステップを実行させることができる。

色々なプラグインが個別の「token」を持っており、条件によって「token」で識別されるプラグインを実行できる

parametarized trigger plugin で色々なプラットフォームのビルドをするのは楽になったが、

例えばフルビルドでなく特定のコンポーネントだけをビルドしたい場合など便利

 

- jclouds plguin

EC2プラグインと似ているが、あらゆるクラウドプロバイダーに対応している。EC2を使わずプライベートクラウドでテストすることも。

"node pooling"機能でビルドごとにインスタンスをあげたりすることなく、既に起動済みのインスタンスでビルドを

走らせることができ、時間をセーブできる。

 

- Muti-SCM plugin

jenkins git plugin は一つのjobから複数のgitリポジトリからcheck outできない

multi-SCM pluginでは一つのJenkins jobから複数のSCMを参照できる

gitのsubmoduleで別のリポジトリを参照してる場合などに便利

 

- Description Setter plugin

正規表現でビルドログをさらい、jobのdescriptionを設定できる。

単に失敗した、ではなくHadoopが原因で失敗、とか簡単にわかるようになる

 

- Associated Files plugin

ビルドページから、そのビルドに紐付くファイルがどこにあるか一覧できるようになる。

ステージング用のファイルはここにある、とか。

ビルドが削除された場合、関連するファイルを一緒に削除してくれる。

 

Jenkins固有の話ではないが、、

S3を使わないのでバイナリのステージング環境は自分で容易しなければいけない。

 

- Cloudbees Jenkins Enterplise Template plugin

jobのテンプレートを定義できる。テンプレーを変更すればそれが既にあるjobに反映される。

コンポーネントは違うが、ほぼ同じ設定のjobがたくさんある場合便利

 

- All Changes plugin

parameterized Trigger plugin で実行されたビルド結果(の違いのある部分)をまとめて一覧表示してくれる

 

- Github plugin

ビルドをポーリングベースではなく、post-service hook(git pushしたら発動する)で、Jenkinsのjobを開始できる。

 

Q. Jenkinsのバージョンはどこかに記録してますか?

job config history plugin が好きで、どんな変更が行われたのか、誰が変更したのか記録されます。

それと、gitのスクリプトがあって、jenkinsのconfigの履歴を管理します。ただ、そこは改善の余地があると思っています。

 

Q. Cloudbees templateプラグインについて便利そう。高そう・・・

川口さんに聞くべし。高くないはず。他にもCloudbeesから色々便利なのが出てます

 

Q. job config history plugin、jenkinsのconfigをgitで管理する場合、その保存先は?

ソースコードとは違うリポジトリに保存している。Job DSL pluginではgroovyでジョブの設定を管理できる。

それを使わなければいけなかったのは、一箇所に設定を保存しておけば良くなるので楽だから。

単純に設定を保存してgitに保存するだけでは、履歴を確認するのが難しい。

 

**********************

15:30 - 反復可能なデリバリーによる常時新築システム @ohtaket

 

手順書がExcelにあって人間が作業する。。。。のがよく見られる

→ 変更があっても更新されない

 

cleanの既存プラクティス

$make all -> $ make clean all (失敗しにくい)

Win 9xをN月おきにクリーンインストール

 

デプロイ工数がめちゃかかってた

→ さぼり

→ 既存のデプロイには差分だけ適用。新規顧客を探しに行きにくくなる。

→ Jenkinsをデプロイで使うぞ!

 

ExcelをChefに置き換えた(Chef Solo)。記述が簡単。セットアップが簡単。

Jenkins側で必要な事項

1. パッケージの集約

OSバージョンとビットごとにビルドサーバ容易

Matrix Jobでビルド

ビルド後にパッケージ集約ジョブを呼び出す(Parameterized Trigger Plugin)

buildジョブからアーティファクトをコピー(Copy Artifact Plugin)

 

2. マシンの容易

・各種Cloud Plugin

- Amazon EC2 Plugin , Delta Cloud API Plugin, jClouds Plugin , vSphere Cloud Plugin ...

任意のタイミングでのVM制御が必要

Java, Git, Ruby, Chef-soloをインストールしたテンプレートVMを用意

テンプレートからVMを作りそこにデプロイ

電源を入れるジョブの例(Windows PowerShell

 

3. デプロイの実行

ノードをまたがって逐次実行するジョブ

Parameterized Trigger Plugin + NodeLabel Parameter Plugin

親ジョブと子ジョブのパラメータの定義

PaaSバックエンドシステムは複数台

Parameterized Triggerで各スレーブにデプロイ

開発環境以外の環境にも同じスクリプトでデプロイ

 

"スローデプロイ問題"

デプロイに60分かかる

スローテスト問題はテストケースを分割して並列実行が一つの解

 

4. VMスナップショット

VMをテンプレートから作る代わりにスナップショットへの復元

10分から3分に。

制約は増えるが速度のほうが重要

 

5. インターネットからの分離

インターネットからのrpmやgemのダウンロードが遅いので、事前にアーティファクト化

45分から2分に

外部影響の原因追求

インターネット接続がない環境へのデプロイ

 

6. 自前と既成の分割と冪等性

自前パッケージ - 自前のソースからbuildするパッケージ

既成パッケージ - 他者が作ったパッケージ

自前と既成で性質が異なるため、デプロイスクリプトを分割

冪等なデプロイスクリプト

[冪等でない]

$ tar zxf foo.tar.gz

[冪等]

$ rm -rf foo

$ tar zxf foo.tar.gz

 

7. 早い失敗を目指す

パイプラインのなるべく早い段階で黄や赤になるように(Fail fast)

設定ファイルではなく、設定ファイル作成プログラムを作成(Chefのレシピとテンプレートでconfigに失敗が起きない)

 

8. 環境の使い捨て

本番と同じ環境で開発

高速なデプロイと冪等なスクリプトのおかげ

 

9. ブランチごとのデプロイ

毎回新規に作られる環境による安心感

デプロイまで行うので試用ができる

 

まとめ

自動化できるものは自動化

・buildだけでなくデリバリーも自動化しましょう

・クリーンと冪等で反復可能に。

・自動化だけで終わらずに、高速化を検討すべき

・迅速なフィードバック

・速ければ使い方も変わる

・本来はCIサーバだが、CI以外もこなせる。執事を遣い倒そう

 

**********************

16:30 - LT大会

 

■ 書籍執筆で継続的デリバリー @kaorun55

SPHINX - Python Documentation Generator

JenkinsでPDF化とかを。

CloudBeesで。Javaしか動かない。Virtual Python というのがあるらしい。

 

■ The Jenkins English Community

英語圏のコミュニティは英語圏と西ヨーロッパが多い、アメリカ、フランス、ドイツ。

IRCでコミュニケーションが多い。あとML。jenkins-user-devも。

↑ プロジェクトMTGがIRCで行われているから。twitterは英語圏ではコミュニケーション用途としては使われにくい

 

■ Flash[AS3]でもJenkins @uzzu

Jenkins環境で動くの?動く。

Maven3プロジェクト

JenkinsサーバにFlashPlayerインストール

Flexmojosというmavenのプラグインを利用

コンパイルオプション、依存関係はpom.xmlに書く

Headress Serverでは追加作業。ソフトウェア入れたりPlugin追加したり。

vncserver + xvfbを利用

ジョブ開始時にjenkinsユーザでVNCサーバにリモートログイン。FlashPlayer実行

テスト実行時間遅い、64ビット環境で動作が不安定

 

■ ふつうのSIerのJenkinsのある暮らし @setoazusa

ビルドパイプライン

サポートしている環境の組み合わせが多少なことが特徴

Join Pluginを使ってる

WebコンテナへのデプロイはCargoを使用

Seleniumによるテスト実行。スキーママイグレーションも実施。リリース後Seleniumでのスモークテストも。

成果物が1回のビルドで500MB。バックアップのアーカイブが展開できない。。。

 

■ 運用でも使えるJenkins @cynipe

Jenkinsのイメージ

 開発、ビルドに使うもの。テスト走らせるもの

なんらかのイベントトリガーで実行:記録してくれるもの

運用って日次、月次のバッチやバックアップをとったり。

cronでよくあること:エラーが起きてたのに気づかないとか。。処理時間の統計知りたいとか。。

エラー通知:メールはもちろん。IP Messanger、IRC、Yammerでも可能

スレーブ機能を活用することで各ジョブを回すことができる

Join Plugin, Build Flow Pluginとかで色々できる

jenkins-capistrlo?を作ってます