2011 02-25-jenkinsci study
DESCRIPTION
TRANSCRIPT
Copyright(c) Yusuke Yamamoto All rights reserved.
Jenkinsでリグレッションを起こす方法
2011/2/25山本 裕介 @yusukey
http://samuraism.jp/@yusukey
Copyright(c) Yusuke Yamamoto All rights reserved.
話す内容• Twitter4Jについて
• Jenkinsを使っているのにリグレッション発生
• 原因・ 経緯
• 学んだこと
Copyright(c) Yusuke Yamamoto All rights reserved.
Twitter4Jについて
Copyright(c) Yusuke Yamamoto All rights reserved.
Java用Twitter APIライブラリ30名を超すコントリビュータ• JDK1.4.2~• Google App Engine
• Android
に対応LOC: 5.3万行くらいの規模
Copyright(c) Yusuke Yamamoto All rights reserved.
Twitter4Jの開発で利用しているツールIntelliJ IDEA: github / Jiraに対応
JUnit: テストツール
Maven: ビルドツール
Jira: issue管理ツール
スライドに登場するロゴ、製品名は各社、各コミュニティの登録商標です
Copyright(c) Yusuke Yamamoto All rights reserved.
Twitter4Jの開発で利用しているツール
Maven Central Repository
Hudson / Jenkins: CIツール
github: ソーシャルコーディングハブ
Sonatype Nexus: Mavenプロジェクト管理2010年1月~
2009年4月~
スライドに登場するロゴ、製品名は各社、各コミュニティの登録商標です
2011年2月~2009年3月~
2008年6月~
Copyright(c) Yusuke Yamamoto All rights reserved.
Copyright(c) Yusuke Yamamoto All rights reserved.
Twitter4Jの開発エコシステム
開発マシン CIサーバ github.com
service hook
repo1.maven.org
oss.sonatype.org
release:perform
promote
git push origin master
Copyright(c) Yusuke Yamamoto All rights reserved.
2007年より
3年半リグレッションなし♥♥
Copyright(c) Yusuke Yamamoto All rights reserved.
2010年10月2日リグレッション発生
♥♥
Copyright(c) Yusuke Yamamoto All rights reserved.
発生した問題• Twitter4J 2.1.5
• OAuth署名に失敗してメソッドコールができないとの報告
401:Authentication credentials were missing or incorrect.
Copyright(c) Yusuke Yamamoto All rights reserved.
原因・経緯
Copyright(c) Yusuke Yamamoto All rights reserved.
直接の原因• 文字列の分離を行うStringUtil.split()にバグ
• 特定の条件でOAuth署名に失敗
StringUtil.split(“foo,bar”,”,”); » {“foo”, “bar”}
StringUtil.split(“foobar”,”,”); » new String[0]
public static String[] split(String str, String separator){ String[] returnValue; int index; if(-1 == str.indexOf(separator)){ returnValue = new String[0]; }else{...
Copyright(c) Yusuke Yamamoto All rights reserved.
なぜStringUtil.splitを実装?• 元々String#splitを使用
• J2MEでString#split(@since JDK1.4)がなくエラーが発生するというユーザーがいたため
• J2MEはJDKのサブセット、JDK1.3(?)ベース
Caused by: java.lang.NoSuchMethodError: java.lang.String: method split(Ljava/lang/String;)[Ljava/lang/String; not found at twitter4j.conf.PropertyConfiguration.setFieldsWithTreePath(Ljava/util/Properties;Ljava/lang/String;)V(PropertyConfiguration.java:196) at twitter4j.conf.PropertyConfiguration.<init>(Ljava/lang/String;)V(PropertyConfiguration.java:121)
Copyright(c) Yusuke Yamamoto All rights reserved.
Jenkins使っていればリグレッションは起きないよね?
Copyright(c) Yusuke Yamamoto All rights reserved.
Jenkins使っていればリグレッションは起きないよね?
Copyright(c) Yusuke Yamamoto All rights reserved.
不具合のあるままリリースした原因1
• 当時Twitter4Jはほとんどテストされていなかった!
• なぜ?: 2010年8月末のBasic認証廃止に伴うテストケースのリファクタリングが原因
Copyright(c) Yusuke Yamamoto All rights reserved.
誤ったTestCaseのリファクタリング
TwitterTestUnitテストメソッド
OAuthTestOAuth認証初期化
BasicTestBasic認証初期化
TwitterTestUnitテストメソッド
OAuth初期化
Mavenに認識されない
before
after
Copyright(c) Yusuke Yamamoto All rights reserved.
不具合のあるままリリースした原因2
failしたテストケースを1部無視していた
なぜ?: Twitter APIは不安定なのでAPIの問題と勘違い
TwitterTestUnit AsyncTwitterTest
fail
Copyright(c) Yusuke Yamamoto All rights reserved.
学んだこと
Copyright(c) Yusuke Yamamoto All rights reserved.
学んだこと(1)• failするテストは定期的に確認!
• 特にage欄の確認は重要
Copyright(c) Yusuke Yamamoto All rights reserved.
学んだこと(2)• テストケースのリファクタリングは慎重に• テスト数が異様に減っていたら注意• コードカバレッジにも注目
怪しい兆候
Copyright(c) Yusuke Yamamoto All rights reserved.
ご静聴ありがとうございました
♥♥