• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Javaだけじゃない入門jenkins
 

Javaだけじゃない入門jenkins

on

  • 4,980 views

 

Statistics

Views

Total Views
4,980
Views on SlideShare
4,972
Embed Views
8

Actions

Likes
12
Downloads
14
Comments
0

3 Embeds 8

https://twitter.com 4
http://s.deeeki.com 3
http://sc.dotbranch.com 1

Accessibility

Categories

Upload Details

Uploaded via as Adobe PDF

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

    Javaだけじゃない入門jenkins Javaだけじゃない入門jenkins Presentation Transcript

    • Javaだけじゃない入門Jenkins実践「継続的インテグレーション」 JJUG Night Seminar 2012/09/26 太田 健一郎 @oota_ken
    • 目次 自己紹介 Java以外でのJenkinsの活用 Lightweight Languageでの活用 環境独立の実現 ユニットテスト テストの並列実行 コードカバレッジ 静的検証 コード重複分析
    • 自己紹介 経歴  社内まったりツール開発 5.5年 (JavaScript & Perl)  お客様デスマソルジャーSE 4年 (主にJava、一部COBOL)  ソーシャルゲームQA 1.5年 (再び、JavaScript & Perl)  QAっていうけど、品質に関わることはほぼ何でもやります><  最近だと、Jenkinsの周り以外にも  JIRAの管理人  Gitブランチ管理設計  ゲームエンジン新バージョン検証  新端末検証 (Android & iOS)  メモリリーク対応&テクスチャバッファ最適化  チート対応  言語  RubyとかF#が好きだけど  仕事では、  シェルスクリプト 8割  Perl 1割  JavaScript 1割
    • Java以外でのJenkinsの活用 Jenkinsの活用の定番は  JavaEE だけど、現在はもっと色々なところで使われている  スマートフォンクライアントアプリ開発  iOS  Android  LLを使ったWebアプリ開発 (クライアント&サーバー)  Ruby on Rails  Catalyst  Node.js  JQuery
    • Java以外でのJenkinsの活用 ですが、情報が散在していてまとまったものがない ので、4人で本を書きました 入門Jenkins – 実践「継続的インテグレーション」 入門という題ですが、全然入門じゃなくてマニアック  Androidでの活用  Gerrit連携  Ruby on Rails  Catalyst
    • LLでの活用 本日は本の中から、LL言語での活用をお話します 題材  Ruby on Rails  Catalyst LLでのJenkinsの活用の特徴  一般にコンパイルがないので、長時間コンパイルをJenkinsに してもらうという分かりやすい導入効果がない  コンパイル以外の何か、たとえばユニットテストとかになる  実はJavaほど環境独立性が高くない場合がある  Javaほどプラグインが充実していないので、変換スクリプトを 書く必要が結構ある
    • 環境独立性の実現 Javaだと  環境独立性を実現できる優れたビルドツールが存在する  Maven  Gradle  Ant はちょっと・・・>< RubyとPerlだとどうなんだろう?  キーワード  RVM (Ruby Version Manager, Ruby enVironment Manager)  Bundler  Perlbrew  cpanm
    • 環境独立性の実現 Ruby on Rails RVM  Rubyの処理系とRubyGems環境を管理するツール Bundler  RubyGemsのバージョンと依存関係を管理するツール Jenkinsでの環境独立性  二つを組み合わせると、アプリケーションごとなど任意の単位 でRubyの処理系とRubyGems環境を管理できる  ジョブ内でBundlerを使用してRubyGems環境を同期化する
    • RVM Rubyの処理系とRubyGems 環境を管理するツール コマンド  ~$ rvm install 1.9.3-p194  ~$ rvm gemset create blog  ~$ rvm use --default 1.9.3- p194@blog  http://www.machu.jp/diary/ 20110521.html#p01  より拝借  上記のURLで詳しく説明さ れています
    • Bundler RubyGemsのバージョンと依存関係を管理するツール 任意の単位でRubyGems環境の管理ができる  アプリケーション  Ruby処理系名+RubyGems環境名 Gemfile group :test, :development do gem rspec-rails, ~> 2.0 gem database_cleaner end group :test do gem headless end コマンド  blog$ bundle install [ディレクトリ]  ディレクトリ指定をしないと $GEM_FILEで指定されたディレクトリにgemがインストールされるので注 意
    • RVM Plugin + Bundler Jenkins上でRVMの設定をするプラグイン Rubyの処理系を自動的にJenkins環境にインストールで きる gemのインストールとアップデートはシェルの実行を追加 し、Bundlerで行う
    • Jenkins Rake plugin Apache Antのようにタスク指定ができる RVMと連携してRuby処理系とgemセットの指定ができる
    • 環境独立性の実現 Catalyst Perlbrew  OSと独立して処理系とCPANモジュールを管理できる仕組み  RubyのRVMに相当 cpanm  root権限がなくてもCPANモジュールの管理が可能 Catalyst  Railsと同じく、依存するCPANモジュール以外はアプリケー ション内で完結 Jenkinsでの環境独立性  Railsのように便利なプラグインはなかったので、自分でセット アップ+CPANモジュールアップデートスクリプトを書いてみた
    • Perlbrew + cpanm Perlの処理系とCPANモジュールを個別管理できる JenkinsのジョブとしてPerlbrewのセットアップジョブを書 けば、各個人の開発環境と同じにできる 以下では直接書いてしまっているが、スクリプト化して バージョン管理するのがお勧め
    • cpanmによるCPANモジュールの同期 アプリケーションで使うCPANモジュールを常にJenkinsと 同期させるジョブを書く RVM + Bundlerによる同期を擬似的に実現する エクスポートスクリプト#!/bin/shMODULES_LIST=$1perl -MExtUtils::Installed -e print "$_¥n" for ExtUtils::Installed->new->modules |grep -e "^Perl" -v > $MODULES_LIST インポートジョブ
    • ユニットテスト RSpec & ci_reporter 設定  Rake pluginでタスク”spec”を指定すればOK  Test::UnitよりRSpecを使うことが多い  Jenkinsで取り込めるようにci_reporterを使用する group :test, :development do gem rspec-rails, ~> 2.0 gem database_cleaner gem rails_best_practices, :require => false gem yard, :require => false gem ci_reporter end
    • ユニットテスト RSpec & ci_reporter レポート  時系列推移  ジョブ別詳細
    • ユニットテスト TAP::Harness::JUnit 設定  proveを使う  “-harness TAP::Harness::JUnit”でJUnit形式出力  Jenkins上でレポートが見られる
    • ユニットテスト TAP::Harness::JUnit レポート  時系列推移  ジョブ別詳細
    • テストの並列実行 prove –j proveはオプション “-j 数字”で並列実行できる ジョブ内で並列実行できるため、CPUコアが多ければ多 いほどテストの時間を短くできる ただし、各テストファイルは並列実行できるように作って おかなければならない
    • テストの並列実行 Test::mysqld データベースのインスタンスをテストクラスごとに生成、 破棄し、並列実行を可能にする sub startup : Test(startup) { my $self = shift; $self->{mysqld} = Test::mysqld->new( my_cnf => { skip-networking => , } ); $self->{schema} = Todo::Schema->connection($self->{mysqld}->dsn); $self->{schema}->deploy; } sub txn_helper { my ($self, $func) = @_; try { $self->{schema}->txn_begin; $func->(); } finally { $self->{schema}->txn_rollback; }; }
    • JUnitライクな独立したテスト Test::Class テストが失敗しても、以後のテストに影響を与えないよう にする use base Todo::DatabaseIntegrationTest; sub test_age : Test { my $self = shift; $self->txn_helper(sub { my $resultset = $self->{schema}->resultset(User); 略 is($oota->age($day_20130206), 37, "ootakens age is 37 on 2013/02/06"); }); } sub test_get_all_todoes_memo_character_length : Test { my $self = shift; $self->txn_helper(sub { my $resultset = $self->{schema}->resultset(User); 略 is($oota->get_all_todoes_memo_character_length, 8, "all_todoes_memo_character_length should be 8"); }); }
    • コードカバレッジ ruby metrics plugin 設定  spec_helper.rbでSimpleCovを仕込んでおく  Jenkinsで取り込めるようにSimpleCov Rcov FormatterでRcov の出力形式を指定 require simplecov‘ require simplecov-rcov‘ SimpleCov.formatter = SimpleCov::Formatter::RcovFormatter SimpleCov.start rails レポート  ソースコード一行一行までドリルダウンできる
    • コードカバレッジ Jenkins Clover plugin 設定  Devel::Coverを使用する  JavaのClover形式に変換しJenkinsで取り込み レポート
    • 静的検証 Rails Best Practice & Plot plugin 設定  JenkinsではPlot pluginによる総数の可視化のみ #!/bin/sh OUTDIR=reports TMPFILE=$OUTDIR/rails_best_practices.tmp OUTFILE=$OUTDIR/rails_best_practices.properties cd `dirname $0`/.. mkdir $OUTDIR 2> /dev/null rails_best_practices > $TMPFILE STATUS=$? if [ $STATUS -eq 0 ]; then echo "YVALUE=0" > $OUTFILE else NUM=`awk /^Found [0-9]+/{ print $2; } < $TMPFILE` echo "YVALUE=$NUM" > $OUTFILE fi レポート  時系列推移
    • 静的検証 Perl Best Practice 設定  Jenkinsで取り込めるようにTAP形式変換 #!/bin/sh DIR=$1 TEMP_FILE=`mktemp` trap "rm -fv $TEMP_FILE" EXIT perlcritic -3 $DIR | nl -nln | sed s/¥(.*source OK¥)$/ok ¥1/ | sed /source OK$/!s/^.*$/not ok &/ > $TEMP_FILE echo 1..`wc -l < $TEMP_FILE` | cat - $TEMP_FILE > perlcritic_tap.results レポート  ジョブ別詳細
    • 静的検証 Perl::Metrics::Lite 設定  コード行数とサイクロマチック数の閾値を設定  JavaのCheckstyle形式に変換しJenkinsで取り込み レポート  時系列推移
    • コード重複分析 CPD for Ruby 設定  PMDの一部であるCPDを使用する <?xml version="1.0" encoding="UTF-8" ?> <project name="blog"> <path id="pmd.classpath"> <fileset dir="pmd/lib"> <include name="*.jar"/> </fileset> </path> <taskdef name="cpd" classname="net.sourceforge.pmd.cpd.CPDTask" classpathref="pmd.classpath"/> <target name="cpd"> <cpd minimumTokenCount="10" outputFile="../reports/cpd.xml" language="ruby" format="xml" encoding="UTF-8"> <fileset dir="../"> <include name="**/*.rb"/> </fileset> </cpd> </target> </project>
    • コード重複分析 Duplicate Code Scanner Plug-in レポート  ソースコード一行一行までドリルダウンできる
    • まとめ JavaEE以外でもJenkinsは活用できる  プラグインも沢山ある  ただし、ちょっと変換スクリプトを書いたりという工夫が必要  最初からRailsやCatalystのような環境独立性が高いフレーム ワークの流儀に沿っておくとJenkinsに乗せやすい その他、Androidでの活用、他の開発支援ツールとの連 携については  是非、「入門Jenkins」を買って下さい>< ありがとうございました