SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
バージョンアップに負けないための 
プラクティス 
2014/12/13 #optim_study 
14年12月13日土曜日
# 0. はじめに 
14年12月13日土曜日
# 自己紹介 
$ whoami 
tokuda 
$ man tokuda 
name: 徳田 祐二(とくだ ゆうじ) 
company: 株式会社オプティム 
job: Optimal Biz Androidエージェント開発 
+たまにビルド環境メンテナ 
language: 仕事で使うのは日本語/Java/C++ 
JVM上で動く言語(Scala/Groovy)はだいたい友達 
14年12月13日土曜日
# 1. バージョンアップの話 
14年12月13日土曜日
# サービスのバージョンアップ 
# バージョンアップとは 
# 1. 新しい機能をのせること 
# 2. 過去に見つかった問題を改善すること 
# OSやフレームワークのバージョンアップ 
# 機能追加や改善のための手段 
# サービスを「ある程度」以上のバージョンアップをするために必要 
14年12月13日土曜日
# なぜバージョンアップを行うか? 
# 攻めのバージョンアップ(メジャーバージョンアップ) 
# 新しいAPI/構文 
# 対応フレームワーク追加 
# GCやVMなどの性能改善 
# 守りのバージョンアップ(マイナーバージョンアップ or パッチ適用) 
# 脆弱性に対応する 
# Rubyのpatch levelをあげる 
# 公式サポートが切れる 
# Ruby 1.8.7/1.9.2 は2014/08でサポート終了 
14年12月13日土曜日
# 防衛的バージョンアップの特徴 
# 特徴 
#  寝起きで100m走るようなバージョンアップ 
# コード規模 
#  API上はふるまいが変わらないバージョンアップ 
#  コードの修正規模はメジャーバージョンアップより小さい 
# スケジュール 
# 計画外バージョンアップ、突発的に発生することもある 
# 緊急対応が要求される 
14年12月13日土曜日
# 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日土曜日
# Webアプリのアップデート 
# OS / ミドルウェア / フレームワークのバージョンアップ 
# CentOS / Apache, Nginx, Unicorn, MySQL / Rails, RubyGems, ... 
# バージョンアップするためにやること 
# 各種アップデート 
# プロダクションコードやテストコードの修正・リファクタリング 
# 対応ブラウザごとの動作確認 
14年12月13日土曜日
# 複数バージョンの共存 
# 既存のフレームワークを残しつつ、新バージョンの動作をみるには? 
# 1. 言語バージョン管理ツールを使う 
# Ruby/Rails: rvm(Ruby Version Manager) 
# 2. 自力でプロセス/リソース分割 
# MySQL: daemonを別名登録 
# 3. 仮想環境を使う 
# VirtualBox/VMwareでスナップショット作成 
14年12月13日土曜日
# モバイル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日土曜日
# 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日土曜日
# 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日土曜日
# モバイルOSビルド環境の管理 
# iOS 
# 最新バージョンを使う(しか選択肢がない) 
# OSアップデートがスムーズ 
# ビルドツール(Xcode)が古いとAppStore審査リジェクトされる 
# Android 
# 複数バージョンの組み合わせを試す 
# OSバージョンの断片化 
# ビルドツール(Apktool)最新だと古いOSでインストール失敗する 
14年12月13日土曜日
# 実際に起きた事例 
# 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日土曜日
# つまり? 
# アップデート環境はつくっても動かないことが前提 
# 素早く失敗するための工夫が必要 
# やりたいこと 
# アップデート環境を素早く構築したい 
# 失敗結果をロギングしたい 
# アップデート前(運用中)の環境は残しておきたい(ロールバック) 
14年12月13日土曜日
# 2. Jenkins+IRCの導入 
14年12月13日土曜日
# Jenkinsとは 
# 継続的インテグレーション(CI)のためのツール 
# ユーザーへの価値提供を短縮化 
# 集約された依存関係で成果物をつくる 
# 集約されたソースコード 
# 集約されたビルド・テスト環境 
# 自動化された実行手順をJenkinsに集約 
14年12月13日土曜日
# Jenkinsインストール 
# Jenkinsインストール 
$ brew install jenkins 
# 起動ファイル(plist)をコピー 
# シンボリックリンクだとJenkinsバージョンアップでリセットされる 
$ cp -p /usr/local/opt/jenkins/*.plist ~/Library/LaunchAgents 
14年12月13日土曜日
# IRCとは 
# IRC(Internet Relay Chat) 
# 多人数で使うチャットツール 
# なぜIRCを使うか? 
# 社内サーバーのIRCで安全に社外秘の会話を行う 
# TwitterやLINEやSkypeは社外サーバー 
# SSLだけど知らないお友達が話しかけてくる 
# IRCBotの利用 
# 簡単な通知のお仕事 
14年12月13日土曜日
# 3匹のbot(1匹め) 
# Optimal Bizチーム内で利用しているbot 
# miyake_bot_v2 
# Jenkinsはあまり関係ないけど、CIには必要 
# Trac(Bug Tracking System)のチケット概要を教えてくれる 
# pingコマンドがわりに過去の迷言を話す 
14年12月13日土曜日
# miyake-gacha 
# 昨日出現した迷言 
18:00 tokuda_droid: miyake-gacha 
18:00 miyake_bot_v2: yuma.miyake said "圧縮された味" 
14年12月13日土曜日
# 3匹のbot(2匹め) 
# Optimal Bizチーム内で利用しているbot 
# hatopo-pot 
# Jenkinsビルド開始を通知 
# Gemで実現(carrier-pigeon) 
14年12月13日土曜日
# チャーハン 
# 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日土曜日
# 3匹のbot(3匹め) 
# Optimal Bizチーム内で利用しているbot 
# jenkin-sushi 
# Jenkinsビルド終了(成功/失敗)を通知 
# プラグインで簡単に導入できる 
14年12月13日土曜日
# ふつうの通知 
# Jenkinsビルド成功通知(まじめ) 
18:00 jenkin-sushi: Project android_agent build #1: SUCCESS in 
5 分 17 秒 前: http://localhost:8888/job/android_agent/1/ 
14年12月13日土曜日
# IRCサーバー導入 
# ngIRCdインストール 
$ brew install ngircd 
# Windowsの場合はInspIRCDを使う 
http://gigazine.net/news/20080128_inspircd/ 
14年12月13日土曜日
# ローカル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日土曜日
# 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日土曜日
# 3. Dockerの導入 
14年12月13日土曜日
# Docker? 
$ boot2docker ssh 
## . 
## ## ## == 
## ## ## ## === 
/""""""""""""""""___/ === 
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ 
______ o __/ 
  __/ 
__________/ 
_ _ ____ _ _ 
| |__ ___ ___ | |_|___  __| | ___ ___| | _____ _ __ 
| '_  / _  / _ | __| __) / _` |/ _  / __| |/ / _ ' __| 
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < _/ | 
|_.__/__/__/__|______,_|__/___|_|___|_| 
14年12月13日土曜日
# Docker=軽量化された仮想マシン 
# 仮想コンテナ 
# 他のマシン(コンテナ外)との依存関係を分離 
# Dockerfileによる差分管理 
# メタファイルの差分のみ実行 
# 他のメタファイルをベースに拡張作成できる 
# 作成イメージの共有 
# 作成したイメージをDockerHubでパプリック化 
# ソースコードリポジトリで共有も可能 
14年12月13日土曜日
# 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日土曜日
# 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日土曜日
# 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日土曜日
# 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日土曜日
# 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日土曜日
# 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日土曜日
# VM起動確認 
$ boot2docker ssh 
## . 
## ## ## == 
## ## ## ## === 
/""""""""""""""""___/ === 
~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ / ===- ~~~ 
______ o __/ 
  __/ 
__________/ 
_ _ ____ _ _ 
| |__ ___ ___ | |_|___  __| | ___ ___| | _____ _ __ 
| '_  / _  / _ | __| __) / _` |/ _  / __| |/ / _ ' __| 
| |_) | (_) | (_) | |_ / __/ (_| | (_) | (__| < _/ | 
|_.__/__/__/__|______,_|__/___|_|___|_| 
14年12月13日土曜日
# 差分イメージ 
# ツリー表示で差分管理をみてみる 
$ 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日土曜日
# 既存イメージを利用 
# 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日土曜日
# 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日土曜日
# 4. Androidをビルドしてみる 
14年12月13日土曜日
# コンテナによるビルドの流れ 
14年12月13日土曜日
# 追加でやったこと 
# 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日土曜日
# 動作確認 
# 動かない(今日) 
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日土曜日
# その他よく使うプラグイン 
# Parameterized Trigger Plugin 
# 下流(後発)のJobにパラメータを引き渡して実行する 
# ビルドJob->テストJobにリポジトリの情報を引き渡す 
# Rebuild 
# 前回実行時のパラメータを再利用してビルド開始 
# Email-ext plugin 
# ビルド完了時にリリースノートをくっつけてメール通知 
14年12月13日土曜日
# まとめ 
# 依存関係はリポジトリ管理できます 
# 集約されたソースコード => GitHub 
# 集約されたビルド・テスト環境 => Dockerfile 
# 自動化された実行手順 => Jenkins 
# Let’s BUILD FAILED 
14年12月13日土曜日

Contenu connexe

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

Practical Android scripting with Ruby
Practical Android scripting with RubyPractical Android scripting with Ruby
Practical Android scripting with RubyMasahiro Kawato
 
Scala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidScala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidTaisuke Oe
 
Docker Machineを始めるには?
Docker Machineを始めるには?Docker Machineを始めるには?
Docker Machineを始めるには?Masahito Zembutsu
 
10+ Deploys per day at COOKPAD
10+ Deploys per day at COOKPAD10+ Deploys per day at COOKPAD
10+ Deploys per day at COOKPADKengo HAMASAKI
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Masahito Zembutsu
 
20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriver20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriverHiroko Tamagawa
 
Dockerを使ってみよう
Dockerを使ってみようDockerを使ってみよう
Dockerを使ってみようRyo Adachi
 
Dockerで開発環境をデリバる
Dockerで開発環境をデリバるDockerで開発環境をデリバる
Dockerで開発環境をデリバるDaigou Harada
 
Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語
Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語
Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語Takashi Someda
 
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxNVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxTomoki SHISHIKURA
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#Yuta Matsumura
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!Midori Oge
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む2bo 2bo
 
Sugarcubeをはじめよう
SugarcubeをはじめようSugarcubeをはじめよう
SugarcubeをはじめようEihiro Saishu
 
Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)Jun Hosokawa
 
Droidcon London2012 Speaker Experience
Droidcon London2012 Speaker ExperienceDroidcon London2012 Speaker Experience
Droidcon London2012 Speaker ExperienceKenichi Kambara
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版i_yudai
 

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

Practical Android scripting with Ruby
Practical Android scripting with RubyPractical Android scripting with Ruby
Practical Android scripting with Ruby
 
Devsumi2013 gunta 2_pdf
Devsumi2013 gunta 2_pdfDevsumi2013 gunta 2_pdf
Devsumi2013 gunta 2_pdf
 
Scala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in AndroidScala2.10.x bytecode problems in Android
Scala2.10.x bytecode problems in Android
 
Docker Machineを始めるには?
Docker Machineを始めるには?Docker Machineを始めるには?
Docker Machineを始めるには?
 
10+ Deploys per day at COOKPAD
10+ Deploys per day at COOKPAD10+ Deploys per day at COOKPAD
10+ Deploys per day at COOKPAD
 
Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19Docker hands on nifty sakura jul19
Docker hands on nifty sakura jul19
 
20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriver20200516 selenium-meetup-winappdriver
20200516 selenium-meetup-winappdriver
 
Dockerを使ってみよう
Dockerを使ってみようDockerを使ってみよう
Dockerを使ってみよう
 
Dockerで開発環境をデリバる
Dockerで開発環境をデリバるDockerで開発環境をデリバる
Dockerで開発環境をデリバる
 
Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語
Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語
Backlog、Cacoo にみるAWS運用の勘所 - JAWS UG 三都物語
 
NVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 LinuxNVIDIA GPUで作るHeadless X11 Linux
NVIDIA GPUで作るHeadless X11 Linux
 
Sacss sp5
Sacss sp5Sacss sp5
Sacss sp5
 
The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#The Twelve-Factor (A|M)pp with C#
The Twelve-Factor (A|M)pp with C#
 
Aiming study#6pdf
Aiming study#6pdfAiming study#6pdf
Aiming study#6pdf
 
20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!20140612_Docker上でCloudStackを動かしてみる!!
20140612_Docker上でCloudStackを動かしてみる!!
 
Djangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込むDjangoとweb2pyをapacheに組込む
Djangoとweb2pyをapacheに組込む
 
Sugarcubeをはじめよう
SugarcubeをはじめようSugarcubeをはじめよう
Sugarcubeをはじめよう
 
Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)Delphi のひみつ!(2015/01/29 CROSS 2015)
Delphi のひみつ!(2015/01/29 CROSS 2015)
 
Droidcon London2012 Speaker Experience
Droidcon London2012 Speaker ExperienceDroidcon London2012 Speaker Experience
Droidcon London2012 Speaker Experience
 
マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版マスタリング DEA/NG 第2版
マスタリング DEA/NG 第2版
 

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

  • 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日土曜日
  • 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日土曜日