SlideShare a Scribd company logo
JenkinsとAnsibleを用いた
サーバー運用効率化のススメ
APC勉強会
アジェンダ
・Jenkins導入
・コードの統一化
・Jenkinsによるビルド・テスト
・Jenkinsによる分析
・導入の実例
アジェンダ
・Jenkins導入
・コードの統一化
・Jenkinsによるビルド・テスト
・Jenkinsによる分析
・導入の実例
Jenkins導入
Jenkinsおさらい(主な使用用途)
・コンパイルやテストを自動的に行なってく
れる。
・コンパイル、テスト失敗などを通知してく
れる。
・いろいろな分析結果を出してくれる
Jenkins導入
インストール
各OSでのインストール方法
公式サイト http://jenkins-ci.org/
対応OSが多いので余ってるサーバや開発者PCにも入れられます。
Jenkins導入
インストール 例
wget -q -O - http://pkg.jenkins-ci.org/debian/jenkins-ci.org.key | sudo apt-key add -
deb http://pkg.jenkins-ci.org/debian binary/
sudo apt-get update
sudo apt-get install jenkins
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import http://pkg.jenkins-ci.org/redhat/jenkins-ci.org.key
yum install jenkins
Ubuntu/Debian
Red Hat/Fedora/CentOS
公式サイトより
Jenkins導入
インストール 例
choco install jenkins
brew install jenkins
Windows (Chocolatey使用)
OSX (Homebrew使用)
公式ではないが下記のパッケージ管理ソフトでも入れられる
Jenkinsは週1くらいの頻度で最新版が出るので
パッケージ管理の方が更新が楽
Jenkins導入
インストール 例
Webブラウザからでもインストールできます!
https://wiki.jenkins-ci.org/display/JA/Meet+Jenkins#MeetJenkins-
TestDrive
Jenkins導入
インストール 例
デフォルト設定では
http://localhost:8080
後は設定でポートやパスを変えたり、
Webサーバからリバースプロキシさせたり
アジェンダ
・Jenkins導入
・コードの統一化
・Jenkinsによるビルド・テスト
・Jenkinsによる分析
・導入の実例
コードの統一化
こんなことありませんか?
・コミットする度に
改行コードが変わってたり
スペースがタブに、タブがスペースに
(スペースも2だったり4だったり)
最後に改行が入ったり入らなかったり
・文字コードが統一されてなかったり
・{}や, && ||の位置が統一されていない。修正の度にフォーマットが変わる。
実際の修正と関係ないところが履歴として残って差分が見づらい。
何故か?
・開発者それぞれの好き嫌い
・使っているOSやエディタ、エディタ設定が違うから
コードの統一化
コーディング規約
どうすれば
・開発者それぞれの好き嫌い
開発前に話し合って統一しておこう。
コーディング規約は作るのが大変ならそれそれの言語標準・水晶のものや
公開されてるものをそのまま流用するなど。
簡単でもいいので何かしか決めておくと後でもめにくい
好き嫌いはあるけど仕事だから・・・
簡単な構文チェックならツールを使おう
コードの統一化
コーディング規約
JavaならCheck Style
Rubyならruby-lint
PHPならphpling
JavaScriptならjslint、jshint
などなど
Jenkinsで定期的に出力する。
既存プロダクトが大量の警告を出すようなら
一気に片を付けずに少しずつ減らすように
&増やさないように注意して
無理なくコーディングしていく。
減らすのが難しい問題に関しては除外設定を
適宜行う
コードの統一化
テキストエディタやIDE設定
どうすれば
・使っているOSやエディタ、エディタ設定が違うから
開発者全員の開発環境をすべて統一しよう!それで全て解決!
だけど・・・やっぱり使い慣れた環境で開発したい
→ではどうするか
コードの統一化
テキストエディタやIDE設定
SCMの設定で解決できる問題もある
Gitの場合
・改行コード問題はgit configのcore.autocrlf、core.safecrlf
SVNの場合
・改行コード問題はsvn propsetのsvn:eol-style
とりあえずの解決策
SCMに各エディタの設定ファイルも入れておく
→みんなが同じエディタならそれで解決
→バラバラのエディタが使いたければ各エディタの設定を全部入れる?
→設定を変えるとき全エディタ分変えないといけない
→各エディタの設定が同じであるか管理するのが大変
コードの統一化
テキストエディタやIDE設定
EditorConfigを使おう http://editorconfig.org/
・ルートディレクトリに.editorconfigというファイルを入れ、
それに設定を書いておけば良い。
・Emacs,Vim,SublimeText,Atom,VisualStudio,
IntelliJ等のJetBrains製IDEなどのエディタで対応。
(各エディタでEditorConfig対応Pluginを入れる必要があります。)
※Eclipse系はまだない?
これで各々好きなエディタが使える!
一々プロダクトごとにスタイルを覚えなくても
エディタが勝手にやってくれる!
※コード規約までは面倒を見てくれません。
アジェンダ
・Jenkins導入
・コードの統一化
・Jenkinsによるビルド・テスト
・Jenkinsによる分析
・導入の実例
Jenkinsによるビルド・テスト
Jenkinsビルドのながれ
1.ビルド対象の設定
ソース取得先のSCMまたはファイルの場所を指定
2.ビルドトリガー設定
・一定の時間間隔でビルド(crontab的な設定が可能)
・SCMをポーリングし変更があればビルド
・WebUIから実行または、APIを叩いて実行
など
3.ビルド設定
ここがメイン!(後述)
4.ビルド後の設定
・結果をメールする(失敗のときだけなど)
・結果を集計する
・成果物を保存する、どこかへアップロードする
など
Jenkinsによるビルド・テスト
JenkinsのビルドJenkinsは自動であれこれやってくれるが
ビルドが出来る状態にするのは開発者の仕事
ソースがあるだけではビルドできない
なにかしらビルドできる仕組みを入れる必要がある。
ビルドの際は対応するPluginがあると便利
PluginがなくてもシェルスクリプトやMS-DOSでもできる。
Maven → Maven Plugin
Grunt、Gulp→NodeJS plugin
Bundle → Ruby Plugin
必要なコンパイラやビルドツールのインストール、パスの設定も必要。
Jenkinsを動かしているユーザで実行できるようにする必要がある。
※インストールやパス設定はある程度jenkins上でもできる。
なるべくそちらを使ったほうがパス関連の面倒が少ない。
Jenkinsによるビルド・テスト
Jenkinsスレーブ
チーム共有のJenkins上でうまくビルドできない・・・
俺のローカルではビルドできるのに!!!
→他の環境でもビルドできるように頑張る(でもおそらく大変)
→自分のPCをスレーブ化してビルドしよう!
Jenkinsによるビルド・テスト
Jenkinsスレーブ
チーム共有の
Jenkins
俺のPC上のJenkins
スレーブ
ビルドしなさい
結果でました
Jenkinsによるビルド・テスト
Jenkinsスレーブ設定
設定はとっても簡単
Jenkinsマスターから
Jenkinsの管理>ノードの管理>新規ノードの作成
スレーブ側はJreだけあればOK
・Jenkinsマスター(この場合はチーム共有Jenkins)からスレーブ側へssh
接続が可能な場合
sshの設定をノードに設定しておくだけ
・Jenkinsマスターから直接接続できないが、スレーブ側からhttp接続可
能な場合
表示されたことをするだけ
Jenkinsによるビルド・テスト
Jenkinsスレーブ
チーム共有のJenkins
チームメンバーの開発PC
(Windows)
検証用サーバ等(Linux)
チームメンバーの開発PC
(Mac)
検証用サーバ等(Windows
Server)
ジョブごとにビルドするスレーブを決めておけば
Jenkinsマスターが勝手に選んでビルドさせる
オフラインのスレーブ
があっても他のスレー
ブを選んでくれる
アジェンダ
・Jenkins導入
・コードの統一化
・Jenkinsによるビルド・テスト
・Jenkinsによる分析
・導入の実例
Jenkinsによる分析
テスト結果
Jenkinsは標準でJUnit結果の集計Pluginがある。
AntやMavenでtest実行するとJUnit結果がXMLで吐かれるので
それが集計される。
※JenkinsはJavaで作られているのでJavaにやさしい
Java以外の言語でもJUnit結果のXMLフォーマットのレポートを
出力できれば結果を取得できる。(そのようなライブラリがある)
Pluginを入れれば他の形式も集計可能
・NUnit Plugin
・TAP(Test Anything Protocol) Plugin
など
Jenkinsによる分析
テスト以外の分析
・コードカバレッジ
・未解決タスク(コード上のTODO、FIXMEなどの集計)
・
アジェンダ
・Jenkins導入
・コードの統一化
・Jenkinsによるビルド・テスト
・Jenkinsによる分析
・導入の実例
導入の実例1
Webアプリケーション
Java、Maven使用
内容
・コンパイル
・テスト
・CheckStyle
・FindBugs
・テストカバレッジ
・未解決(TODO)タスク集計
はじめはテストを書いていないプロダクトだったので
コードカバレッジ計測を導入。
テストを書いていないクラスがどの
程度残っているかの指標にして共通関数系を中心に
テストを増やしていくようにしている
導入の実例2
Webアプリケーション(UIなし、XML-RPC)
Java、Maven使用
内容
・コンパイル
・テスト
・CheckStyle
・FindBugs
・テストカバレッジ
・未解決(TODO)タスク集計
このアプリケーション自体が多数の外部APIから情報を取得するので
外部APIはダミーを作成。
そのダミーが期待の値を返すかのテストもやってる。
導入の実例3
Webアプリケーション
Java、Maven使用
フロント側にはGrunt使用
内容
・フロント側lessのコンパイル(Grunt)
・フロント側jsのテスト(Grunt)
・フロント側jsのcss,minify化(Grunt)
・Java側のwebappに配置(Grunt)
・Java側コンパイル、テスト(Maven)
・warファイル作成(Maven)
・検証用環境へデプロイ(ShellScript)
検証環境はCloudnのPaaSを使用(本番も同じ環境)。
PaaSにデプロイするツールもコードに含めShellScriptでデプロイ処理を
実行している。
gitへpushするだけで検証環境へ上がってくれるので一度構築すると非常
に楽
導入の実例4
Webアプリケーション
Node.js Grunt使用
内容
・sassのコンパイル(Grunt)
・クライアント・サーバのjsテスト(Grunt)
・フロント側jsのcss,minify化(Grunt)
・tar.gzに固める(Grunt)
・デプロイスクリプトと一緒にscpで検証サーバへアップロード
・sshで検証サーバのデプロイスクリプトを叩く。
こちらもgitへpushで検証環境へデプロイされる
導入の実例5
Webアプリケーション
Node.js Grunt使用
本番サーバへデプロイ
内容
・検証サーバにあるtar.gzとデプロイスクリプトを
本番サーバ達へコピー
・sshで本番サーバのデプロイスクリプトを叩く。(必要なサーバ分)
検証環境で確認がとれたtar.gzを本番に上げるだけ。
こちらは手動ビルド
手動ビルドと言ってもWebUI上の「ビルド実行」を押すだけの簡単なお
仕事
導入の実例6
Webアプリケーション
Node.js Grunt使用
vagrant ansible使用
内容
・vagrant upを叩いてビルド・テスト用の仮想環境作成
・vagrantのプロビジョニングでansible-playbookを実行させ、
必要な環境を構築する。
・ビルドテスト実行
・vagrant halt
vagrantさえ動けばスレーブの環境に依存せずどこでも実行可能。
ここで使う仮想環境は開発にもそのまま使える。
初回vagrant up がものすごく時間がかかるという問題がある。
導入の実例7
各サーバへ同じコマンドを打つだけ
内容
・ansible-playbookを叩いて各サーバで同じことをさせる。
Heart bleedやShell shockなどで地道に各サーバで
アップデートコマンドを打つ日々を改善すべく作成
必要なタスクを追加しSCMへコミット
WebUI上の「ビルド実行」を押すだけの簡単なお仕事化に成功
導入の実例 例外
別にjenkinsでなくてもいいけど
こんな使い方もできるよというお話。
内容
・SCM上にコミットされたらメールを送る。
とある理由で変更があったら通知が欲しいため設定。
内容
・バッチを定期実行
crontab代わりに使用。
今後やってみたいこと
今後やってみたいこと
・UIのテストをやらせたい。
Seleniumの勉強会が今度あるらしい。
・vagrant、ansibleではなくdockerを使ってみるとどうか。
・Herokuへのデプロイ

More Related Content

JenkinsとAnsibleを用いたサーバー運用効率化のススメ_"8a1"20141205発表資料