The paradigm shift

saboyutaka’s diary なんかかく(ブログn回目)

macOSでの開発環境を全部Docker化したらリストア時間が1時間半になった

f:id:saboyutaka:20180823023857p:plain

どうも、リストア職人のさぼです。みなさんmacOSをどのぐらいの頻度でリストアしてますか?1年に1回はやってますよね?僕は3ヶ月に1回はやるようにしてます。綺麗な状態にしてOSが最大限のパフォーマンスで動いた方がいいし手元に入れたよくわからないアプリがずっと入ってるのって気持ちよくないじゃないですか。なのでMacを定期的にリストア(工場出荷状態に初期化)してます。

前回までは真っ白な状態からだいたい3時間ぐらいで普段開発している環境を構築できるようにしていたのですが今回から開発環境を全部Dockerにしてみようと思ってやってみたところ1時間半で開発環境を終えて作業開始できる状態までの最短記録を更新しました!


おわり(おわらない)






いつもやってる手順を振り返りがてら紹介していきます。

Brewfile

いつもリストア後は brew bundle コマンドでアプリやソフトウェアを入れるようにしていて、今回はその中から言語のRuntimeとMiddlewareを全部取り除きました。 またVagrantも試験的にリストア後には入れずに必要があれば入れる形にします。サブエディタとして使っていたAtomも使うのをやめました、メインはJetBrains系のエディタを使っていますが、サブとしてVisual Studio Codeを使うようにしてます。

少し前まではVagrantでMiddleware, PostgresやRedis を起動してMacのホスト上のRubyのruntimeでRailsを起動して開発したりしてましたが、最近は全部docker-compooseで動かして言語のRuntimeも全部Dockerで行うようになったのでMacに 言語のRuntimeを入れる必要がなくなりました。個人的に rbenvruby-buildMac上に入れなくなったのは時代の転換期を感じます。。

cask_args appdir: '/Applications'
tap 'caskroom/cask'

brew 'ctop'
brew 'curl'
brew 'ghq'
brew 'gist'
brew 'git'
brew 'htop'
brew 'hub'
brew 'jq'
brew 'mackup'
brew 'mas'
brew 'openssl'
brew 'peco'
brew 'rmtrash'
brew 'sshrc'
brew 'telnet'
brew 'tig'
brew 'tree'
brew 'z'
brew 'zsh-completions'
brew 'zsh'

# ココらへんを全部入れないことにした
# tap 'homebrew/php'
# brew 'automake'
# brew 'cmake'
# brew 'ctags'
# brew 'gcc'
# brew 'go'
# brew 'heroku'
# brew 'memcached'
# brew 'mongodb'
# brew 'mysql'
# brew 'node'
# brew 'nodenv'
# brew 'postgresql'
# brew 'pyenv-virtualenv'
# brew 'pyenv'
# brew 'python'
# brew 'rbenv'
# brew 'readline'
# brew 'redis'
# brew 'ruby-build'
# brew 'sqlite'
# brew 'v8'
# brew 'yarn'

cask 'alfred'
cask 'appcleaner'
# cask 'atom'
cask 'bartender'
cask 'bitbar'
cask 'caffeine'
cask 'cyberduck'
cask 'docker'
cask 'fantastical'
cask 'github'
cask 'google-chrome'
cask 'google-japanese-ime'
cask 'grandperspective'
cask 'gyazo'
cask 'iterm2'
cask 'karabiner-elements'
cask 'keycastr'
cask 'ngrok'
cask 'paw'
cask 'postico'
cask 'sequel-pro'
# cask 'vagrant'
# cask 'vagrant-manager'
# cask 'virtualbox'
cask 'visual-studio-code'
cask 'vlc'

mas 'Airmail 3', id: 918858936
mas 'Bandwidth+', id: 490461369
mas 'Be Focused Pro', id: 961632517
mas 'BetterSnapTool', id: 417375580
mas 'LanScan', id: 472226235
mas 'Night Owl', id: 428834068
mas 'Skitch', id: 425955336
mas 'Todoist', id: 585829637
mas 'Wireless Signal', id: 582840059

リストア, 開発環境構築の手順で使うツール

  • DiskMaker X
    • インストールディスク作成
  • Homebrew brew bundle でBrewfileからアプリとツールをダウンロードするのに使います
  • mackup
    • アプリやツールの設定ファイルを指定のフォルダ、デフォルトではDropbox上に作られる、に退避し、それらのファイルが元にあった場所にシンボリックリンクを作ってくれるツール。自分で新たに独自にバックアップするファイルも指定できる。
  • Docker for Mac
    • macOSでDockerを動かす
  • Dropbox
    • mackupで使うフォルダとBrewfileを置く。また基本的にmac上で使うすべてのファイルはDropboxiCloudに置くようにしている。いつMacが動かなくなっても良いようにローカルにしかファイルがない状態は基本的になくす
  • GitHub, または他のGit Repository Hostingサービス
  • 1password
    • パスワードはiCloud keychainと1passwordに両方保持してる。keychainはSafariでは便利。基本的には1passwordを使う。パスワードマネージャー使ってないとリストア後のログインがめちゃくちゃ面倒なので絶対使う。異なるサイトで同じパスワード使うとか絶対にあってはいけない。

リストア手順

  1. リストアして最新OSを入れる。
  2. macOSのシステム環境設定 Dock、トラックパッド、キーボード、言語設定などを好みに変更する。ここはOSが変わっていくと変化する可能性があるので自動化していない
  3. DropboxをインストールしてMacupフォルダとBrewfileを選択同期する。リストア作業に関係ないものは後日時間があるときに同期する。
  4. Homebrew をinstallする
  5. brew bundle でアプリとツールをインストールする
  6. mackup restore でアプリとツールの設定ファイルを復元する
  7. iTerm2を開いてデフォルトのshellをzshに変更する(お好み)
  8. 開発リポジトリgit clone する
  9. docker-compose で開発環境を立ち上げる
  10. JetBrainsのエディタをインストールして立ち上げる

ここまでで所要時間1時間半くらいで構築できるようになりました。

Docker

Dockerの構築を知りたい方は下のリポジトリとかを参考にしてください。Railsのアプリケーションです。最近は開発環境構築を make build とすると終わるようにするのが趣味になってます。

Railsのdocker-composeのサンプル

github.com

Laravelのdocker-composeサンプル

github.com

Dockerを学ぶにはこの本がおすすめです。Dockerやdocker-composeの使い方はこの本を読むことでだいぶ理解が進みました。

Dockerによるアプリケーション開発環境構築ガイド

Dockerによるアプリケーション開発環境構築ガイド

おわりに

リストア環境をちゃんと作っていれば1, 2時間でリストアから開発環境構築完了までいけるようになりました。ここまで来るとOSにほとんど依存しないのでMacである必要ないやんという感じなのですが、ぼく個人としてはApple信者であるためMac使い続けようと思います(今の所は)。LinuxとかWindowsのWSLはDockerサクサク動いていいなぁとは思う。

1時間半でリストアが終わるなら土曜日の午前中に時間があるときにやるか、というぐらい気軽にできるようになるので定期的にリストアをする習慣が作れると思います。新しいOSが1年に1度出るのでそのときにリストアすると良いと思います。リストアせずにOSのメジャーバージョンのアップデートするとだいたい遅くなったり壊れたりします。ツールに愛を持ってメンテンナンスを定期的にしましょう。エンジニアの中でさえOSをアップデートしない人とかがたまにいるんですけど、ほとんどの問題はリストアしたら直るのでやってあげてください。よろしくおねがいします。