• Like
バージョンアップに負けないためのプラクティス
Upcoming SlideShare
Loading in...5
×

バージョンアップに負けないためのプラクティス

  • 53 views
Uploaded on

バージョンアップに負けないためのプラクティス

バージョンアップに負けないためのプラクティス

More in: Software
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Be the first to comment
    Be the first to like this
No Downloads

Views

Total Views
53
On Slideshare
0
From Embeds
0
Number of Embeds
0

Actions

Shares
Downloads
0
Comments
0
Likes
0

Embeds 0

No embeds

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
    No notes for slide

Transcript

  • 1. バージョンアップに負けないための プラクティス 2014/12/13 #optim_study 14年12月13日土曜日
  • 2. # 0. はじめに 14年12月13日土曜日
  • 3. # 自己紹介 $ whoami tokuda $ man tokuda name: 徳田 祐二(とくだ ゆうじ) company: 株式会社オプティム job: Optimal Biz Androidエージェント開発 +たまにビルド環境メンテナ language: 仕事で使うのは日本語/Java/C++ JVM上で動く言語(Scala/Groovy)はだいたい友達 14年12月13日土曜日
  • 4. # 1. バージョンアップの話 14年12月13日土曜日
  • 5. # サービスのバージョンアップ # バージョンアップとは # 1. 新しい機能をのせること # 2. 過去に見つかった問題を改善すること # OSやフレームワークのバージョンアップ # 機能追加や改善のための手段 # サービスを「ある程度」以上のバージョンアップをするために必要 14年12月13日土曜日
  • 6. # なぜバージョンアップを行うか? # 攻めのバージョンアップ(メジャーバージョンアップ) # 新しいAPI/構文 # 対応フレームワーク追加 # GCやVMなどの性能改善 # 守りのバージョンアップ(マイナーバージョンアップ or パッチ適用) # 脆弱性に対応する # Rubyのpatch levelをあげる # 公式サポートが切れる # Ruby 1.8.7/1.9.2 は2014/08でサポート終了 14年12月13日土曜日
  • 7. # 防衛的バージョンアップの特徴 # 特徴 #  寝起きで100m走るようなバージョンアップ # コード規模 #  API上はふるまいが変わらないバージョンアップ #  コードの修正規模はメジャーバージョンアップより小さい # スケジュール # 計画外バージョンアップ、突発的に発生することもある # 緊急対応が要求される 14年12月13日土曜日
  • 8. # 2014年は脆弱性の当たり年 # 深刻な脆弱性がいくつかでている # 潜伏期間が長いもの(10年以上)が2014年に集中 # Apache Struts 2 脆弱性: 7年 # OpenSSL 脆弱性(Heartbleed): 2年 # OpenSSL 脆弱性(ChangeCipherSuite Injection): 16年 # GNU bash脆弱性(ShellShock): 25年 # SSL v3.0脆弱性(POODLE): 18年 # Windows IEリモートコード実行の脆弱性(WinShock): 19年 # BIND 9などDNSソフトウェア脆弱性: 1年 14年12月13日土曜日
  • 9. # Webアプリのアップデート # OS / ミドルウェア / フレームワークのバージョンアップ # CentOS / Apache, Nginx, Unicorn, MySQL / Rails, RubyGems, ... # バージョンアップするためにやること # 各種アップデート # プロダクションコードやテストコードの修正・リファクタリング # 対応ブラウザごとの動作確認 14年12月13日土曜日
  • 10. # 複数バージョンの共存 # 既存のフレームワークを残しつつ、新バージョンの動作をみるには? # 1. 言語バージョン管理ツールを使う # Ruby/Rails: rvm(Ruby Version Manager) # 2. 自力でプロセス/リソース分割 # MySQL: daemonを別名登録 # 3. 仮想環境を使う # VirtualBox/VMwareでスナップショット作成 14年12月13日土曜日
  • 11. # モバイルOSアップデート傾向 # iOS # 60%の端末がiOS8 #  新OS発表から国内発売までに約3ヶ月 #  契約2年以内ユーザーのうち、100%が最新OS(iOS 8.1)利用可能 # Android # 30%の端末がAndroid 4.4 #  新OS発表から国内発売(Nexus以外)までに約半年 #  契約2年以内ユーザーのうち、40%が最新OS(Android 5.0)利用不可 14年12月13日土曜日
  • 12. # iOS端末シェア(2014/12時点) # https://developer.apple.com/support/appstore/ # http://qiita.com/tomofusa/items/c795df0ebbaf668116c0 $ ios_share | iOSバージョン | シェア | SDK Betaリリース | 国内端末発売 | | iOS 6以前 | 4 % | 2010/04 (iOS 4) | 2010/06 (+2) | | - | - | 2011/06 (iOS 5) | 2011/10 (+4) | | - | - | 2012/06 (iOS 6) | 2012/09 (+3) | | iOS 7 | 33 % | 2013/06 | 2013/09 (+3) | | iOS 8 | 63 % | 2014/06 | 2014/09 (+3) | 14年12月13日土曜日
  • 13. # Android端末シェア(2014/12時点) # http://developer.android.com/about/dashboards/index.html $ android_share | Androidバージョン | シェア | SDKリリース| 国内端末発売(Nexus除く) | | 2.2 Froyo | 0.5 % | 2010/06 | 2010/10 (+4) | | 2.3 Gingerbread | 9.1 % | 2010/11 | 2011/03 (+4) | | 4.0 Ice Cream Sandwich | 7.8 % | 2011/10 | 2012/04 (+6) | | 4.1 Jelly Bean | 21.3 % | 2012/06 | 2012/12 (+6) | | 4.2 Jelly Bean | 20.4 % | 2012/11 | 2013/05 (+6) | | 4.3 Jelly Bean | 7.0 % | 2013/07 | 2013/10 (+3) | | 4.4 KitKat | 33.9 % | 2013/10 | 2014/05 (+7) | | 5.0 Lollipop | ? % | 2014/10 | ? | 14年12月13日土曜日
  • 14. # モバイルOSビルド環境の管理 # iOS # 最新バージョンを使う(しか選択肢がない) # OSアップデートがスムーズ # ビルドツール(Xcode)が古いとAppStore審査リジェクトされる # Android # 複数バージョンの組み合わせを試す # OSバージョンの断片化 # ビルドツール(Apktool)最新だと古いOSでインストール失敗する 14年12月13日土曜日
  • 15. # 実際に起きた事例 # Android SDKを最新にしたらシェア6割でインストールできない | Androidバージョン | シェア | SDKリリース| 国内端末発売(Nexus除く) | | 2.2 Froyo | 0.5 % | 2010/06 | 2010/10 (+4) | | 2.3 Gingerbread | 9.1 % | 2010/11 | 2011/03 (+4) | | 4.0 Ice Cream Sandwich | 7.8 % | 2011/10 | 2012/04 (+6) | | 4.1 Jelly Bean | 21.3 % | 2012/06 | 2012/12 (+6) | | 4.2 Jelly Bean | 20.4 % | 2012/11 | 2013/05 (+6) | | 4.3 Jelly Bean | 7.0 % | 2013/07 | 2013/10 (+3) | | 4.4 KitKat | 33.9 % | 2013/10 | 2014/05 (+7) | | 5.0 Lollipop | ? % | 2014/10 | ? | 14年12月13日土曜日
  • 16. # つまり? # アップデート環境はつくっても動かないことが前提 # 素早く失敗するための工夫が必要 # やりたいこと # アップデート環境を素早く構築したい # 失敗結果をロギングしたい # アップデート前(運用中)の環境は残しておきたい(ロールバック) 14年12月13日土曜日
  • 17. # 2. Jenkins+IRCの導入 14年12月13日土曜日
  • 18. # Jenkinsとは # 継続的インテグレーション(CI)のためのツール # ユーザーへの価値提供を短縮化 # 集約された依存関係で成果物をつくる # 集約されたソースコード # 集約されたビルド・テスト環境 # 自動化された実行手順をJenkinsに集約 14年12月13日土曜日
  • 19. # Jenkinsインストール # Jenkinsインストール $ brew install jenkins # 起動ファイル(plist)をコピー # シンボリックリンクだとJenkinsバージョンアップでリセットされる $ cp -p /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents 14年12月13日土曜日
  • 20. # IRCとは # IRC(Internet Relay Chat) # 多人数で使うチャットツール # なぜIRCを使うか? # 社内サーバーのIRCで安全に社外秘の会話を行う # TwitterやLINEやSkypeは社外サーバー # SSLだけど知らないお友達が話しかけてくる # IRCBotの利用 # 簡単な通知のお仕事 14年12月13日土曜日
  • 21. # 3匹のbot(1匹め) # Optimal Bizチーム内で利用しているbot # miyake_bot_v2 # Jenkinsはあまり関係ないけど、CIには必要 # Trac(Bug Tracking System)のチケット概要を教えてくれる # pingコマンドがわりに過去の迷言を話す 14年12月13日土曜日
  • 22. # miyake-gacha # 昨日出現した迷言 18:00 tokuda_droid: miyake-gacha 18:00 miyake_bot_v2: yuma.miyake said "圧縮された味" 14年12月13日土曜日
  • 23. # 3匹のbot(2匹め) # Optimal Bizチーム内で利用しているbot # hatopo-pot # Jenkinsビルド開始を通知 # Gemで実現(carrier-pigeon) 14年12月13日土曜日
  • 24. # チャーハン # Jenkinsビルド(チャーハン調理)開始 18:00 hatopo-pot has joined (~hatopo-po@) 18:00 hatopo-pot: (;`・ω・)o━ヽ_。_・_゚_・_フ)) android_agentが http://localhost:8888/job/android_agent/1/で開始されました。 18:00 hatopo-pot has left IRC () 14年12月13日土曜日
  • 25. # 3匹のbot(3匹め) # Optimal Bizチーム内で利用しているbot # jenkin-sushi # Jenkinsビルド終了(成功/失敗)を通知 # プラグインで簡単に導入できる 14年12月13日土曜日
  • 26. # ふつうの通知 # Jenkinsビルド成功通知(まじめ) 18:00 jenkin-sushi: Project android_agent build #1: SUCCESS in 5 分 17 秒 前: http://localhost:8888/job/android_agent/1/ 14年12月13日土曜日
  • 27. # IRCサーバー導入 # ngIRCdインストール $ brew install ngircd # Windowsの場合はInspIRCDを使う http://gigazine.net/news/20080128_inspircd/ 14年12月13日土曜日
  • 28. # ローカルIRCサーバー向け設定 # ngircd.conf編集(変更箇所のみ抜粋) $ vi /usr/local/etc/ngircd.conf [Global] Ports = 6665 Listen = ::,0.0.0.0 MaxConnections = 0 MaxJoins = 0 [Channel] Name = #jenkins 14年12月13日土曜日
  • 29. # Jenkins: IRC通知Plugin # IRC Notification Pluginをインストール # [Jenkinsの管理] > [システムの設定] IRC Notification Hostname: localhost Port: 6665 SSL: off Name: #jenkins # Jobごとの設定 [ビルド後の処理] > [IRC Notification] Name: #jenkins 14年12月13日土曜日
  • 30. # 3. Dockerの導入 14年12月13日土曜日
  • 31. # Docker? $ boot2docker ssh ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ ______ o __/ __/ __________/ _ _ ____ _ _ | |__ ___ ___ | |_|___ __| | ___ ___| | _____ _ __ | '_ / _ / _ | __| __) / _` |/ _ / __| |/ / _ ' __| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < _/ | |_.__/__/__/__|______,_|__/___|_|___|_| 14年12月13日土曜日
  • 32. # Docker=軽量化された仮想マシン # 仮想コンテナ # 他のマシン(コンテナ外)との依存関係を分離 # Dockerfileによる差分管理 # メタファイルの差分のみ実行 # 他のメタファイルをベースに拡張作成できる # 作成イメージの共有 # 作成したイメージをDockerHubでパプリック化 # ソースコードリポジトリで共有も可能 14年12月13日土曜日
  • 33. # Dockerコンテナ化技術: LXC # LXC(Linux Containers)による仮想化 # CPUやメモリの割り当て # cgroups(Control Groups)でLinux上のプロセスをグループ化してリソース配分 # ディレクトリの割り当て # chrootでイメージ内のディレクトリをLinux上のディレクトリに割り当てる # ネットワークの割り当て # DockerのVM全体で仮想NIC(docker0)を割り当て # コンテナごとのNIC(eth0)にdocker0のプライベートIP(172.17.x.x/16)を割り当て 14年12月13日土曜日
  • 34. # Dockerコンテナ化技術: AUFS # AUFS(Another Union FS)によるファイルシステム管理 # read onlyのファイルシステム+read/writeなファイルシステムを # ひとつのファイルシステムとして管理 read/write: A’ C read only: A B --------------------------------- aufs: A’ B C 14年12月13日土曜日
  • 35. # Dockerインストール # Docker + Boot2Docker(VirtualBoxのDocker実行環境) インストール $ brew install docker boot2docker # Dockerインストール確認 (/usr/local/bin) $ docker -v Docker version 1.3.1, build 4e9bbfa $ boot2docker version Boot2Docker-cli version: v1.3.1 14年12月13日土曜日
  • 36. # Docker-VirtualBox連携 # VirtualBox上でDockerを実行するための設定 # Docker用VM設定+起動 $ boot2docker init $ boot2docker up # boot2docker up実行時に設定要求されたパラメータを登録 $ export DOCKER_HOST=tcp://$(boot2docker ip 2>/dev/null):2376 $ export DOCKER_CERT_PATH=~/.boot2docker/certs/boot2docker-vm $ export DOCKER_TLS_VERIFY=1 14年12月13日土曜日
  • 37. # Dockerfileによるイメージ作成 # Dockerイメージ作成 $ docker build -t optim/android:1.0 . # Dockerfile FROM ubuntu:12.10 # ベースイメージ指定 RUN apt-get install -y curl git htop … # Tools準備 RUN apt-get install -y oracle-java7-installer # Java RUN cd /opt && wget -q # Android http://dl.google.com/android/android-sdk_r23.0.2-linux.tgz RUN ... 14年12月13日土曜日
  • 38. # Dockerイメージ # イメージ一覧表示 $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE optim/android 1.0 dd5312be49c0 7 days ago 2.09 GB ubuntu 12.10 c5881f11ded9 5 months ago 172.2 MB ubuntu quantal c5881f11ded9 5 months ago 172.2 MB 14年12月13日土曜日
  • 39. # VM起動確認 $ boot2docker ssh ## . ## ## ## == ## ## ## ## === /""""""""""""""""___/ === ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ ______ o __/ __/ __________/ _ _ ____ _ _ | |__ ___ ___ | |_|___ __| | ___ ___| | _____ _ __ | '_ / _ / _ | __| __) / _` |/ _ / __| |/ / _ ' __| | |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < _/ | |_.__/__/__/__|______,_|__/___|_|___|_| 14年12月13日土曜日
  • 40. # 差分イメージ # ツリー表示で差分管理をみてみる $ docker images --tree Warning: '--tree' is deprecated, it will be removed soon. See usage. └─511136ea3c5a Virtual Size: 0 B └─bac448df371d Virtual Size: 100.9 MB └─5796a7edb16b Virtual Size: 101.2 MB └─c5881f11ded9 Virtual Size: 172.2 MB Tags: ubuntu:12.10, ubuntu:quantal └─690e41881824 Virtual Size: 172.2 MB ・ ・ └─99b2d316e316 Virtual Size: 2.09 GB └─dd5312be49c0 Virtual Size: 2.09 GB Tags: optim/android:1.0 14年12月13日土曜日
  • 41. # 既存イメージを利用 # Ubuntuデスクトップ利用も可能 # http://dockerfile.github.io/#/ubuntu-desktop $ docker pull dockerfile/ubuntu-desktop # RailsならPhusion Passengerが便利 # https://github.com/phusion/passenger-docker $ docker pull phusion/passenger-ruby19 $ docker pull phusion/passenger-ruby20 $ docker pull phusion/passenger-ruby21 14年12月13日土曜日
  • 42. # VirtualBoxインストール # VirtualBoxインストール $ brew tap phinze/cask $ brew install brew-cask $ brew cask install virtualbox # VirtualBoxインストール確認 $ VboxManage Oracle VM VirtualBox Command Line Management Interface Version 4.3.20 14年12月13日土曜日
  • 43. # 4. Androidをビルドしてみる 14年12月13日土曜日
  • 44. # コンテナによるビルドの流れ 14年12月13日土曜日
  • 45. # 追加でやったこと # GitHubに各種リソースを追加 # Androidプロジェクトを作成 # プロジェクト依存関係をGradleで記述 # ビルド環境をDockerfileで記述 # https://github.com/dakuton/android-docker-template # Jenkinsジョブ設定 # Managed Script Pluginを利用ビルド # http://qiita.com/dakuton/items/79e95393809bc4fb68fc # Managed Script Plugin # よく使うシェルスクリプトを登録 14年12月13日土曜日
  • 46. # 動作確認 # 動かない(今日) 14:29 jenkins: Project docker_android_sample build #3: FAILURE in 4.4 秒 前: http:// localhost:8888/job/docker_android_sample/3/ # 原因: dockerコマンドがJenkinsから起動できない # 対応: plistでPATHを指定 $ vi ~/Library/LaunchAgents/homebrew.mxcl.jenkins.plist <key>EnvironmentVariables</key> <dict> <key>PATH</key> <string>/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin</string> </dict> 14年12月13日土曜日
  • 47. # その他よく使うプラグイン # Parameterized Trigger Plugin # 下流(後発)のJobにパラメータを引き渡して実行する # ビルドJob->テストJobにリポジトリの情報を引き渡す # Rebuild # 前回実行時のパラメータを再利用してビルド開始 # Email-ext plugin # ビルド完了時にリリースノートをくっつけてメール通知 14年12月13日土曜日
  • 48. # まとめ # 依存関係はリポジトリ管理できます # 集約されたソースコード => GitHub # 集約されたビルド・テスト環境 => Dockerfile # 自動化された実行手順 => Jenkins # Let’s BUILD FAILED 14年12月13日土曜日