開発環境を Immutable infrastructure にした話
株式会社ナビタイムジャパン経路探索エンジン開発グループ開発環境をImmutable Infrastructureにした話1
View Slide
アジェンダC++の開発環境構築とその上での課題と改善方法について2
C++開発環境の構築3
抱える問題C++にはパッケージ管理システムがないJavaでいうところのこれがない世界を想像できますか?4
課題になることC++ライブラリのインストール1.インストール手順をドキュメントにまとめる2.それを見ながら各自でコンパイル3.問題にぶつかる4.作業が続行できない非効率ですよね5
解決したいことMavenのような仕組みがほしいLinuxにはそれに近いものがあるCentOS: yumUbuntu: apt6
しかし yum, aptだけでは不十分yum, aptで提供されていないライブラリもあるため7
さらに問題になることCI環境の構築も煩雑CI環境の管理者にインストール依頼を出すのが煩雑8
では、どうする?9
そうだ Docker使おう!10
開発環境をコンテナ化Dockerfileでライブラリのインストールこれが手順のコード化につながるCI環境には Dockerさえ入っていれば大丈夫11
うまく行ってそう、なのだが……12
Dockerの不便なところ開発環境がコンテナ上にできていると開発環境が CUIプログラムのデバッグがしづらいGUI/IDEをコンテナで用意するのは大変開発時はホストマシン上に環境を構築したい13
まとめるとローカル開発環境ホストマシン上に構築したいCI環境コンテナ上に構築したい両環境が同じ手順で構築できれば……14
そこで Ansibleがありますね15
ホスト上の環境構築Ansibleを使うコンテナの構築Ansible Containerを使う16
Ansible Container?17
Ansible ContainerAnsibleの純正ツールコンテナの構築手順を Playbookで管理できる2016年に誕生したばかりgithub.com/ansible/ansible-container18
Ansible Containerはまだ若いバグを踏むことも……(当時 v0.2.0)サイズの大きなコンテナイメージの作成に失敗するdocker commitがタイムアウトするのが原因(報告して解決済み)19
Ansible ContainerAnsibleを使えば……構築対象 Docker Ansibleホスト NO YESコンテナ YES YESコンテナ・ホストの構築差分が無くせる!20
解決したことAnsibleを使うと環境構築は楽になる21
残課題開発マシンの管理はどうやっていこう?22
開発マシンの管理23
開発マシンの管理環境は時間が経てば元の状態から遠ざかる各々が設定を自由にいじる新規にライブラリをインストールする「私のところでは動くけど、君のところでは動かないの?」という問題が起こる24
Immutable Infrastructrueを推進しよう25
抑えておくこと開発環境の構築はデプロイの一種である(The Twelve-Factor Appより)なのでプロダクション環境と同じようにImmutable性を追求する26
必要なものVagrant仮想環境構築ツール環境のスナップショットが容易に取れるためImmutable性を実現しやすい27
開発マシンは Immutableに開発環境はこう作れ!1. Vagrantでベース Linux仮想マシンを用意2. Ansibleで環境構築3.それ以上はいじらない28
寄せられる質問いじるなと言うけど……Q.新規ライブラリを入れたい時はどうするの?Q.開発ソースが保存できないのでは?29
Q.新規ライブラリを入れたい時はどうするの?30
A.普通に入れて下さいただしスナップショットを取ってから1.仮想マシンの状態を保存しておく2.ライブラリをインストール3.満足したら仮想マシンを元に戻す$ vagrant snapshot push$ vagrant snapshot pop31
4.最後に Ansible Playbookを作る!32
Immutable性を保つ努力Playbookにするほどじゃない場合本当にちょとだけ環境をいじりたい場合はPlaybookを作ることがオーバースペックになることもそういう時は小さな仮想化をしてあげる33
小さな仮想化の例pyenv, rbenv, nvmPython, Ruby, Node.jsのバージョン切り替えツールホームディレクトリ配下にインストールされるので環境が汚れにくいautoenv, direnvあるディレクトリにいるときだけ環境変数の設定やスクリプトの実行を行うstowローカルインストールしたファイルをシステムワイドに使えるようシンボリックリンクを張る34
Immutable Infrastructrueの原則好きな状態にできる(戻せる)ことが重要35
設定変更は基本 Playbookで環境を変えられるのは Ansibleだけにするいますぐ開発環境を破壊できるか?それが重要36
環境をいじるスコープが狭ければ多少は安全グローバルに設定を変えなければもとに戻しやすい小さな仮想化で対応37
開発環境をgitリポジトリのように好きな状態にできるようにしておく38
Immutable Infrastructrueは不変な基盤というよりある状態であることを保証する基盤39
Q.開発ソースが保存できないのでは?40
A.ホスト上に保存、そしてマウントホストマシンソースコードを保存仮想マシンホストマシンにマウントホストマシンのソースコードを参照41
変化するデータは外部から参照するそれが Immutable Infrastructrue42
まとめ開発の流れ1. Vagrantで Linux仮想マシンを用意2. Ansibleで仮想マシンの環境構築3. Immutable Infrastructrueの思想で開発4.コミット5. CI環境で Ansibleを使いコンテナ作成6.ビルド・テスト43
今日の話を図で説明44
C++はかなり開発しづらい言語だけど Immutable Infrastructrueで綺麗に整備されました45
Thank You!実際に使っている Vagrantfile, Playbookgithub.com/rinatz/ubuntu-desktop-ja46