91
継続的デリバリーと読み解く Web 開発あるあるとその対策 山邉 哲生

継続的デリバリーと読み解く Web 開発あるあるとその対策

Embed Size (px)

DESCRIPTION

これまで Web 開発の現場で経験してきたあるあるを継続的デリバリー片手に振り返ってみます。また最近どういったツールを現場で活用しているかについてもご紹介します。 ※ どんな主旨で作ったスライドかはてなブログに書きました。 http://beniyama.hatenablog.jp/entry/2014/06/18/011411

Citation preview

Page 1: 継続的デリバリーと読み解く Web 開発あるあるとその対策

継続的デリバリーと読み解く Web 開発あるあるとその対策

山邉 哲生

Page 2: 継続的デリバリーと読み解く Web 開発あるあるとその対策

某外資系携帯メーカーの研究所 ↓

解散になったので大学に出戻り ↓

フィンランドで1年 ↓

渋谷で Web エンジニア(今ココ)

Page 3: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Web 開発の現場で起きている問題 と

カイゼンの取り組み

Page 4: 継続的デリバリーと読み解く Web 開発あるあるとその対策

継続的デリバリー 信頼できるソフトウェアリリースのためのビルド・テスト・デプロイメントの自動化 (アスキー・メディアワークス)

Page 5: 継続的デリバリーと読み解く Web 開発あるあるとその対策

いつまで手動で デプロイしているんですか?

Page 6: 継続的デリバリーと読み解く Web 開発あるあるとその対策

2年前の話

Page 7: 継続的デリバリーと読み解く Web 開発あるあるとその対策

とあるサービス開発現場

Page 8: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Apache Tomcat

Struts / Java MySQL

Page 9: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)個人の開発環境 (local)

SVN リポジトリ

チェックアウト

開発&確認

コミット

アップデート

ビルド&確認

Page 10: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)

SVN リポジトリ

チェックアウト

ビルド&デプロイ (rsync)

本番用サーバー群 (live)

リリース

確認

Page 11: 継続的デリバリーと読み解く Web 開発あるあるとその対策

何か問題でも?

Page 12: 継続的デリバリーと読み解く Web 開発あるあるとその対策

ありすぎました

Page 13: 継続的デリバリーと読み解く Web 開発あるあるとその対策

1. 君と僕の開発環境は違う

Page 14: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー個人の開発環境

SVN リポジトリ

チェックアウト

開発&確認

コミット

アップデート

ビルド&確認

Wiki に書かれた不完全な手順 誰もがはまるインストールエラー 構築するたびに変わるバージョン

Page 15: 継続的デリバリーと読み解く Web 開発あるあるとその対策

『僕の環境なら動くんですけど』

© 地獄のミサワ (http://jigokuno.com/)

Page 16: 継続的デリバリーと読み解く Web 開発あるあるとその対策

『僕の環境では動きません』

© 地獄のミサワ (http://jigokuno.com/)

Page 17: 継続的デリバリーと読み解く Web 開発あるあるとその対策

君と僕の開発環境は違うし 開発用サーバーも違うし

なんなら本番だって違うかもしれない

Page 18: 継続的デリバリーと読み解く Web 開発あるあるとその対策

止まらない不信感 終わらないデバッグ

Page 19: 継続的デリバリーと読み解く Web 開発あるあるとその対策

あるプロジェクトで、本番環境へのデプロイメントが謎の失敗を起こすことがあった。デプロイメント用のスクリプトがハングしたのだ。原因を追跡した結果わかったのは、運用サーバーのログインシェルが sh に設定されているのに対してステージングサーバーでは bash になっているということだった …(中略)… 本当に微妙な違いを見つけるのは、これよりもずっと難しいことだ。総合的な構成管理は必須である。

コラム『構成管理がまずいとリリース当日にデバッグ作業をするはめになる』 (p351)

( ゚∀゚)・∵.グハッ!!

Page 20: 継続的デリバリーと読み解く Web 開発あるあるとその対策

よくあることだが、開発者自身の作業端末はおろか開発チームの継続的インテグレーション環境でさえも職人芸になってしまっており、長期間にわたって粗雑な管理が続けられている。 これらの環境は、アプリケーションが実際に動作する環境と関連があるとはとても言えない状態だ。 非効率の根源にもなり得る。

11.4.1 サーバーのプロビジョニング (p349)

( ゚∀゚)・∵.グハッ!!

Page 21: 継続的デリバリーと読み解く Web 開発あるあるとその対策

『構成管理』 『プロビジョニング』

Page 22: 継続的デリバリーと読み解く Web 開発あるあるとその対策

2. 気まぐれなテスト

Page 23: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)個人の開発環境 (local)

SVN リポジトリ

チェックアウト

開発&確認

コミット

アップデート

ビルド&確認

勘と経験による打鍵テスト 既存機能を破壊する新機能

IE/Chrome/FF/iOS/Android … という多様な 機種をカバーする限界

trunk に混入し続ける動作しないコード

Page 24: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)

SVN リポジトリ

チェックアウト

ビルド&デプロイ (rsync)

本番用サーバー群 (live)

リリース

確認

リリースしてから気づいてバージョンを 戻して再デプロイ

Page 25: 継続的デリバリーと読み解く Web 開発あるあるとその対策

機能が増える度に低下する サービス品質

Page 26: 継続的デリバリーと読み解く Web 開発あるあるとその対策

機能が増える度に低下する コード品質

≒ 怖くてできないリファクタリング

Page 27: 継続的デリバリーと読み解く Web 開発あるあるとその対策

明確でない受け入れ条件 (機能・品質)

Page 28: 継続的デリバリーと読み解く Web 開発あるあるとその対策

『継続的に実行されるテスト』 『既存の振る舞いを保証する』

『不純物の混入を避けるプロセス』 『受け入れ条件』

Page 29: 継続的デリバリーと読み解く Web 開発あるあるとその対策

3. オレオレデプロイ

Page 30: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)

SVN リポジトリ

チェックアウト

ビルド&デプロイ (rsync)

本番用サーバー群 (live)

リリース

確認

対象サーバーに入って rsync -> ビルド -> AP 再起動を行う独自スクリプト

似たような名前の様々なスクリプトが存在 (html_deploy.sh, app_deploy.sh, template_deploy.sh …)

Page 31: 継続的デリバリーと読み解く Web 開発あるあるとその対策

作った人しかわからない 亜種スクリプトが量産される (e.g., html_deloy_bk_20140616.sh)

Page 32: 継続的デリバリーと読み解く Web 開発あるあるとその対策

エラー検知が甘かったり rsync が同期しきれて

いなかったりする

Page 33: 継続的デリバリーと読み解く Web 開発あるあるとその対策

各サービス・各サブシステムの デプロイがオレオレすぎてつらい

Page 34: 継続的デリバリーと読み解く Web 開発あるあるとその対策

『手順どこでしたっけ?』

Page 35: 継続的デリバリーと読み解く Web 開発あるあるとその対策

そこで取り組んでみたこと

Page 36: 継続的デリバリーと読み解く Web 開発あるあるとその対策

個々人が、他者に影響されない 本番環境と同じ構成の開発環境を持つ

Page 37: 継続的デリバリーと読み解く Web 開発あるあるとその対策

個々人が、他者に影響されない 本番環境と同じ構成の開発環境を持つ

Page 38: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)個人の開発環境 (local)

Web

AP DB

Web

AP

Web

APWeb/AP の動作環境を

揃えるのが大変

Page 39: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)個人のPC

Web

AP

DB

リモートログイン

何か障害や大きな負荷があると開発できなくなる

DB 共有するとスキーマの変更やテストがしづらい

Page 40: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発用サーバー (dev)個人のPCWeb

AP

DB

Web

AP

DB

仮想環境

リポジトリ (git)

Page 41: 継続的デリバリーと読み解く Web 開発あるあるとその対策

環境設定を手作業でやっているせいで個々の環境が微妙に異なってしまい、それが原因で問題が発生するということについてはすでに議論してきた。仮想化技術を使えば、本章で紹介してきたテクニック (サーバーや環境のプロビジョニングの自動化)の恩恵をさらに膨らませることができる。

11.7 仮想化 (p364)

Page 42: 継続的デリバリーと読み解く Web 開発あるあるとその対策

http://www.vagrantup.com/

Page 43: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Vagrant

• VirtualBox や VMWare といった仮想化技術を開発用途に使いやすくするためのツール

Page 44: 継続的デリバリーと読み解く Web 開発あるあるとその対策

vagrant init

Page 45: 継続的デリバリーと読み解く Web 開発あるあるとその対策

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "chef/centos-6.5"

config.vm.network :private_network, ip: "192.168.33.10"

end

Page 46: 継続的デリバリーと読み解く Web 開発あるあるとその対策

vagrant up/halt

Page 47: 継続的デリバリーと読み解く Web 開発あるあるとその対策

vagrant destroy

Page 48: 継続的デリバリーと読み解く Web 開発あるあるとその対策

おかしくなったら すぐ壊してやり直せる

Page 49: 継続的デリバリーと読み解く Web 開発あるあるとその対策

個々人が、他者に影響されない 本番環境と同じ構成の開発環境を持つ

Page 50: 継続的デリバリーと読み解く Web 開発あるあるとその対策

『構成管理』 『プロビジョニング』

Page 51: 継続的デリバリーと読み解く Web 開発あるあるとその対策

http://www.getchef.com/chef/ | http://www.ansible.com/home

Page 52: 継続的デリバリーと読み解く Web 開発あるあるとその対策

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

config.vm.box = "chef/centos-6.5"

config.vm.network :private_network, ip: "192.168.33.10"

config.vm.provision :ansible do |ansible|

ansible.playbook = "./roles/web/site.yml"

ansible.inventory_path = "./roles/web/hosts.local"

ansible.limit = 'all'

end

end

Page 53: 継続的デリバリーと読み解く Web 開発あるあるとその対策

vagrant provision

Page 54: 継続的デリバリーと読み解く Web 開発あるあるとその対策

• Ruby の DSL を利用

• opscode に登録された第三者のrecipe を再利用できる

• 結構タイトに構造化されている

Chef

Page 55: 継続的デリバリーと読み解く Web 開発あるあるとその対策

• YAML でデータをいじるので Python を意識しないで良い

• ほぼ全部入でクライアントレス

• 柔軟なディレクトリ構造

Ansible

Page 56: 継続的デリバリーと読み解く Web 開発あるあるとその対策

一元化された手順で 『自動的に』 環境構築する

Page 57: 継続的デリバリーと読み解く Web 開発あるあるとその対策

ローカルで仮想マシンを立てて 何度もプロビジョニングして 最後まで通るようになったら

リポジトリに push する

Page 58: 継続的デリバリーと読み解く Web 開発あるあるとその対策

環境のコーディング

Page 59: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Code as Infrastructure

Page 60: 継続的デリバリーと読み解く Web 開発あるあるとその対策

http://serverspec.org/

Page 61: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Serverspec

• プロビジョニングコードをテストするためのツール

Page 62: 継続的デリバリーと読み解く Web 開発あるあるとその対策
Page 63: 継続的デリバリーと読み解く Web 開発あるあるとその対策

開発から本番まで一気通貫で 仮想マシンを活用した開発を

行うための試み

Page 64: 継続的デリバリーと読み解く Web 開発あるあるとその対策

http://www.docker.com/

Page 65: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Docker• コンテナ型仮想化による軽量な仮想環境の提供

• 設計思想として1コンテナ1サービス

• 状態を保持しない ”使い捨て” イメージ (Immutable Infrastructure)

Page 66: 継続的デリバリーと読み解く Web 開発あるあるとその対策
Page 67: 継続的デリバリーと読み解く Web 開発あるあるとその対策
Page 68: 継続的デリバリーと読み解く Web 開発あるあるとその対策
Page 69: 継続的デリバリーと読み解く Web 開発あるあるとその対策

隔離 検査 破棄

Page 70: 継続的デリバリーと読み解く Web 開発あるあるとその対策

再生成

Page 71: 継続的デリバリーと読み解く Web 開発あるあるとその対策

これは、我々の知る限りで最も強力なリリース管理テクニックである。本番環境としてまったく同じ環境を2組用意するという考え方で、それぞれをブルーおよびグリーンと呼ぶ。

10.4.3 ブルーグリーン・デプロイメント (p319)

Page 72: 継続的デリバリーと読み解く Web 開発あるあるとその対策
Page 73: 継続的デリバリーと読み解く Web 開発あるあるとその対策

(キャッシュ目的とはいえ) ミドルやライブラリを構造化して

管理している Chef や Ansible とは 対象的にコマンドの羅列に なっている点が興味深い

Page 74: 継続的デリバリーと読み解く Web 開発あるあるとその対策

定式化されたデリバリーフローを 定義する

Page 75: 継続的デリバリーと読み解く Web 開発あるあるとその対策

trunk/master ブランチを守る

Page 76: 継続的デリバリーと読み解く Web 開発あるあるとその対策

A successful Git branching model http://nvie.com/posts/a-successful-git-

branching-model/

x

GitLab x

コードレビュー

Page 77: 継続的デリバリーと読み解く Web 開発あるあるとその対策

http://nvie.com/posts/a-successful-git-branching-model/

Page 78: 継続的デリバリーと読み解く Web 開発あるあるとその対策

https://www.gitlab.com/

Page 79: 継続的デリバリーと読み解く Web 開発あるあるとその対策

テスト・デプロイ自動化

Page 80: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Jenkins• 継続的インテグレーションを行うためのツール

• リモートマシン上でのテストを駆動したりメトリクスを可視化したりいろいろできる

Page 81: 継続的デリバリーと読み解く Web 開発あるあるとその対策
Page 82: 継続的デリバリーと読み解く Web 開発あるあるとその対策

Capistrano• デプロイ自動化のためのツール

• デプロイ対象のサーバーとそのロール、処理内容などを記述

• 過去履歴を保持してロールバックを行うこともできる

Page 83: 継続的デリバリーと読み解く Web 開発あるあるとその対策

OS/MW => Chef/Ansible アプリ => Capistrano

Page 84: 継続的デリバリーと読み解く Web 開発あるあるとその対策

http://capistranorb.com/

Page 85: 継続的デリバリーと読み解く Web 開発あるあるとその対策

誰でも統一された手段でデプロイを 実行できる

Page 86: 継続的デリバリーと読み解く Web 開発あるあるとその対策

誰でも安易にデプロイを 実行して既存環境を変更できてしまう

Page 87: 継続的デリバリーと読み解く Web 開発あるあるとその対策

まだまだお話したいこと たくさんありますが

Page 88: 継続的デリバリーと読み解く Web 開発あるあるとその対策

続きは Web で

Page 89: 継続的デリバリーと読み解く Web 開発あるあるとその対策

たとえば 『アジャイル開発手法 (スクラム、

XP) の導入事例』 http://recruit.gmo.jp/engineer/jisedai/blog/20140509_agile/

Page 90: 継続的デリバリーと読み解く Web 開発あるあるとその対策

まとめ• Web 開発の現場で活用されている技術についてご紹介しました

• Web サービスは作って終わりではなく、リリースしてからの開発・運用プロセスをいかに効率的・効果的に回すかが重要 (DevOps)

• 継続的デリバリーに興味を持った方は、ぜひアジャイル開発についても調べてみてください

Page 91: 継続的デリバリーと読み解く Web 開発あるあるとその対策

ご清聴ありがとうございました