Upgrade to Pro — share decks privately, control downloads, hide ads and more …

開発環境を Immutable infrastructure にした話

開発環境を Immutable infrastructure にした話

開発環境を Immutable infrastructure にした話

NAVITIME JAPAN
PRO

June 20, 2017
Tweet

More Decks by NAVITIME JAPAN

Other Decks in Programming

Transcript

  1. 株式会社ナビタイムジャパン
    経路探索エンジン開発グループ
    開発環境を
    Immutable Infrastructure
    にした話
    1

    View Slide


  2. アジェンダ
    C++
    の開発環境構築と
    その上での課題と改善方法について
    2

    View Slide


  3. C++
    開発環境の構築
    3

    View Slide

  4. 抱える問題
    C++
    にはパッケージ管理システムがない
    Java
    でいうところの
    これがない世界を想像できますか?
    4

    View Slide

  5. 課題になること
    C++
    ライブラリのインストール
    1.
    インストール手順をドキュメントにまとめる
    2.
    それを見ながら各自でコンパイル
    3.
    問題にぶつかる
    4.
    作業が続行できない
    非効率ですよね
    5

    View Slide

  6. 解決したいこと
    Maven
    のような仕組みがほしい
    Linux
    にはそれに近いものがある
    CentOS: yum
    Ubuntu: apt
    6

    View Slide

  7. しかし yum, apt
    だけでは不十分
    yum, apt
    で提供されていないライブラリもあるため
    7

    View Slide

  8. さらに問題になること
    CI
    環境の構築も煩雑
    CI
    環境の管理者にインストール依頼を出すのが煩雑
    8

    View Slide

  9. では、どうする?
    9

    View Slide

  10. そうだ Docker
    使おう!
    10

    View Slide

  11. 開発環境をコンテナ化
    Dockerfile
    でライブラリのインストール
    これが手順のコード化につながる
    CI
    環境には Docker
    さえ入っていれば大丈夫
    11

    View Slide

  12. うまく行ってそう、なのだが……
    12

    View Slide

  13. Docker
    の不便なところ
    開発環境がコンテナ上にできていると
    開発環境が CUI
    プログラムのデバッグがしづらい
    GUI/IDE
    をコンテナで用意するのは大変
    開発時はホストマシン上に環境を構築したい
    13

    View Slide

  14. まとめると
    ローカル開発環境
    ホストマシン上に構築したい
    CI
    環境
    コンテナ上に構築したい
    両環境が同じ手順で構築できれば……
    14

    View Slide

  15. そこで Ansible
    がありますね
    15

    View Slide

  16. ホスト上の環境構築
    Ansible
    を使う
    コンテナの構築
    Ansible Container
    を使う
    16

    View Slide


  17. Ansible Container?
    17

    View Slide

  18. Ansible Container
    Ansible
    の純正ツール
    コンテナの構築手順を Playbook
    で管理できる
    2016
    年に誕生したばかり
    github.com/ansible/ansible-container
    18

    View Slide

  19. Ansible Container
    はまだ若い
    バグを踏むことも……(当時 v0.2.0

    サイズの大きなコンテナイメージの作成に失敗する
    docker commit
    がタイムアウトするのが原因
    (報告して解決済み)
    19

    View Slide

  20. Ansible Container
    Ansible
    を使えば……
    構築対象 Docker Ansible
    ホスト NO YES
    コンテナ YES YES
    コンテナ・ホストの構築差分が無くせる!
    20

    View Slide


  21. 解決したこと
    Ansible
    を使うと環境構築は楽になる
    21

    View Slide


  22. 残課題
    開発マシンの管理は
    どうやっていこう?
    22

    View Slide


  23. 開発マシンの管理
    23

    View Slide

  24. 開発マシンの管理
    環境は時間が経てば元の状態から遠ざかる
    各々が設定を自由にいじる
    新規にライブラリをインストールする
    「私のところでは動くけど、君のところでは動かないの?」
    という問題が起こる
    24

    View Slide


  25. Immutable Infrastructrue
    を推進しよう
    25

    View Slide

  26. 抑えておくこと
    開発環境の構築はデプロイの一種である
    (The Twelve-Factor App
    より)
    なのでプロダクション環境と同じように
    Immutable
    性を追求する
    26

    View Slide

  27. 必要なもの
    Vagrant
    仮想環境構築ツール
    環境のスナップショットが容易に取れるため
    Immutable
    性を実現しやすい
    27

    View Slide

  28. 開発マシンは Immutable

    開発環境はこう作れ!
    1. Vagrant
    でベース Linux
    仮想マシンを用意
    2. Ansible
    で環境構築
    3.
    それ以上はいじらない
    28

    View Slide

  29. 寄せられる質問
    いじるなと言うけど……
    Q.
    新規ライブラリを入れたい時はどうするの?
    Q.
    開発ソースが保存できないのでは?
    29

    View Slide


  30. Q.
    新規ライブラリを入れたい時は
    どうするの?
    30

    View Slide

  31. A.
    普通に入れて下さい
    ただしスナップショットを取ってから
    1.
    仮想マシンの状態を保存しておく
    2.
    ライブラリをインストール
    3.
    満足したら仮想マシンを元に戻す
    $ vagrant snapshot push
    $ vagrant snapshot pop
    31

    View Slide

  32. 4.
    最後に Ansible Playbook
    を作る!
    32

    View Slide

  33. Immutable
    性を保つ努力
    Playbook
    にするほどじゃない場合
    本当にちょとだけ環境をいじりたい場合は
    Playbook
    を作ることがオーバースペックになることも
    そういう時は小さな仮想化をしてあげる
    33

    View Slide

  34. 小さな仮想化の例
    pyenv, rbenv, nvm
    Python, Ruby, Node.js
    のバージョン切り替えツール
    ホームディレクトリ配下にインストールされるので
    環境が汚れにくい
    autoenv, direnv
    あるディレクトリにいるときだけ
    環境変数の設定やスクリプトの実行を行う
    stow
    ローカルインストールしたファイルを
    システムワイドに使えるようシンボリックリンクを張る
    34

    View Slide

  35. Immutable Infrastructrue
    の原則
    好きな状態にできる(戻せる)ことが重要
    35

    View Slide

  36. 設定変更は基本 Playbook

    環境を変えられるのは Ansible
    だけにする
    いますぐ開発環境を破壊できるか?
    それが重要
    36

    View Slide

  37. 環境をいじるスコープが狭ければ
    多少は安全
    グローバルに設定を変えなければもとに戻しやすい
    小さな仮想化で対応
    37

    View Slide

  38. 開発環境を
    git
    リポジトリのように
    好きな状態にできるようにしておく
    38

    View Slide

  39. Immutable Infrastructrue

    不変な基盤というより
    ある状態であることを保証する基盤
    39

    View Slide


  40. Q.
    開発ソースが保存できないのでは?
    40

    View Slide

  41. A.
    ホスト上に保存、そしてマウント
    ホストマシン
    ソースコードを保存
    仮想マシン
    ホストマシンにマウント
    ホストマシンのソースコードを参照
    41

    View Slide


  42. 変化するデータは外部から参照する
    それが Immutable Infrastructrue
    42

    View Slide

  43. まとめ
    開発の流れ
    1. Vagrant
    で Linux
    仮想マシンを用意
    2. Ansible
    で仮想マシンの環境構築
    3. Immutable Infrastructrue
    の思想で開発
    4.
    コミット
    5. CI
    環境で Ansible
    を使いコンテナ作成
    6.
    ビルド・テスト
    43

    View Slide

  44. 今日の話を図で説明
    44

    View Slide


  45. C++
    はかなり開発しづらい言語
    だけど Immutable Infrastructrue

    綺麗に整備されました
    45

    View Slide

  46. Thank You!
    実際に使っている Vagrantfile, Playbook
    github.com/rinatz/ubuntu-desktop-ja
    46

    View Slide