Technofara

Golangエンジニア!仕事で必要になって勉強した事とか、新しい事とか色々まとめたりを緩くやります。技術系と思考系だけにしておきます、

Macを買う度にアプリケーション入れたり、環境構築するのが面倒?!ならBoxenを使おう

お詫び

ただのBoxen入れる際に作ったメモを、導入手順書のように書き置こしたものです。

まずはじめに

Macを買い換えるたび、アプリをApple Storeからダウンロードしたり WEB上を徘徊したり、vimの設定をしたりめんうなんですー。何かいい方法はないのですか!!

Boxenって何?

説明しよう!BOXENとは、

GitHub社で使われている、Mac の環境を自動構築するためのツール(フレームワーク)です。GitHub ではローカルの Mac を開発環境として使っているので、新しく人が加わった時に Boxen で開発環境構築してもらっているとのこと。

やってみよう!

とりあえず準備

Command Line Toolを手に入れる

途中cのコンパイルでエラーになるので、そうならない為に必要になるものをいれます。

Xcode

Xcode

Xcode

  • Apple
  • 開発ツール
  • 無料
からダウンロード

次にターミナルを立ち上げて、以下のコマンドを実行

xcode-select --install

「インストール」を押す。

Boxenの雛形を手に入れる

まだ手元にBoxenなんてものは存在しないので、 https://github.com/boxen/our-boxenをforkして、からMacにclone

$ mkdir ~/src
$ git clone git@github.com:{your_name}/our-boxen.git ~/src/boxen
$ cd ~/src/out-boxen

とりあえず、これで最低限必要なものは準備完了かな

初期状態のまま検証開始

実行~! Boxen はデフォルトではディスクの暗号化を要求するらしいから、 システム設定 → セキュリティとプライバシー → FileVault で有効にする

ではでは、実行してみよう 暗号化しなくても以下のコマンドで実行できるらしいけど

$ script/boxen --no-fde

今回は、推奨通り通常実行

$ script/boxen

Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/bin]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/data]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/data/project-sockets]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/data/puppet]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/log]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/Users/sonots/src]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/env.d]/ensure: created
Notice: /Stage[main]/Boxen::Config/File[/opt/boxen/env.d/config.sh]/ensure: defined content as 
...

おお、何か動いてる感がある

処理が終わった時に、作成される /opt/boxen/env.shを実行したらboxenで入れたアプリが使えるようになるので .zshrc や .bashrcなどに以下を追加

[ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh

追加したら、exec $SHELL -Lをしておく。

このとき、Lunchpadに

f:id:shinofara:20131128215958p:plain

が追加される。

本格的にアプリを入れてみよう

まずは手始めに、chromeと、chrome canaryを入れてみる

Puppetfile にgithubを定義

github "chrome",    "1.1.2" 

次に、個人用の設定ファイルを作成 boxenでの個人設定はgithubアカウントにひもづくので、githubアカウントは作っておく それから、以下のファイルに個人用設定を定義します。 /modules/people/manifests/{{github アカウント名}}.pp

class people::{{github アカウント名}} {
    include chrome
    include chrome::canary
}

Puppetfileでchromeのgithubを定義して、個人用ファイルで chromeと、chrome canaryをincludeすると定義

ちゃんと入るか確認してみよう

$ script/boxen

処理が終わってからLunchpadを見たら chromechrome canaryがインストール出来てる事が確認できた!

f:id:shinofara:20131128215905p:plain

楽!!(定義めんどいけど、定義済みだったとしたら楽!!)

次はhomebrew入れれるパッケージを入れてみる

技術ブログ書いてると使いたくなる、treeコマンドとか ファイルを取得する時とかに使いたくなる、wgetコマンドを入れてみる。

さっき作った個人用ファイルに以下を追加 /modules/people/manifests/{{github アカウント名}}.pp

package {        
  [              
    'tree',
    'wget'  
  ]:;            
}

はい、実行

$ script/boxen

treeとwgetが入ってるか確認

$ source ~/.bash_profile
$ which wget
/opt/boxen/homebrew/bin/wget
$ which tree
/opt/boxen/homebrew/bin/tree

おお、入ってる!!

次は、dmgパッケージを指定してみる。今回はgoogle日本語入力で確認

さっき作った個人用ファイルに以下を追加 /modules/people/manifests/{{github アカウント名}}.pp

package { 
  'GoogleJapaneseInput':                                                           
    source => "http://dl.google.com/japanese-ime/latest/GoogleJapaneseInput.dmg",
    provider => pkgdmg;                                                          
}

簡単にsourceでダウンロードURLを指定して、providorでdmg pkgをインストールすると、定義してるのかな に追加します。

はい、実行

$ script/boxen

google日本語入力がLunchpadに追加されてる!!

f:id:shinofara:20131128221649p:plain

最後はちょっと応用すぎるけど、.dotfiles系を構築時に作れるようにしてみる(今回はvim only)

Puppetfile にgithubを定義

github "vim",    "1.0.5"

/modules/people/manifests/{{github アカウント名}}.ppには、以下を追加、編集

package {        
  [              
    'tree',
    'wget',
    'fontforge'
  ]:;            
}

# settings for dotfiles                                                 
$home     = "/Users/${::boxen_user}"                                    
$dotfiles = "${home}/.dotfiles"                                         
                                                                        
file { $home:                                                           
  ensure  => directory                                                  
}       

# $dotfilesパスに、sourceをcloneしますよって定義                                                                
repository {                                                            
  $dotfiles:                                                            
    source   => 'git@github.com:yshinoha/.dotfiles.git',                
    require => File[$home];                                             
}                                                                       
                                                                        
# settings for vim                                                      
include vim                                                             
                                                                        
# Example of how you can manage your .vimrc                             
file { "${vim::vimrc}":                                                 
  target  => "/Users/${::boxen_user}/.dotfiles/.vimrc",                 
  require => Repository[$dotfiles]                                      
}                         

# $dotfilesに依存してます
# .dotfiles/.vimrcを ~/.vimrcにコピー                                              

# いろいろ変数定義                                                                        
$vim      = "${home}/.vim"
$neobundle   = "${vim}/bundle"
$powerline   = "${neobundle}/vim-powerline"
$fontpatcherdir = "${neobundle}/vim-powerline/fontpatcher"
$fontpatcher = "${fontpatcherdir}/fontpatcher"
$inconsolata = "${fontpatcherdir}/Inconsolata.otf"
$wgetInconsolata = "wget http://levien.com/type/myfonts/Inconsolata.otf"
$vimPluginInstall = "yes | vim -c 'q'"   

vim::bundle { [           
  'scrooloose/syntastic', 
  'sjl/gundo.vim'         
]: }                      

repository { $neobundle:                                                               
  source => "git@github.com:Shougo/neobundle.vim",                                     
  path => "${neobundle}/neobundle.vim"                                                 
                                                                                       
  #require => File[$vim]                                                               
}                                                                                      
exec { $vimPluginInstall:                                                              
  creates => "${fontpatcher}",                                                         
  require => Repository[$neobundle],                                                   
}                                                                                      
exec { $wgetInconsolata:                                                               
  cwd => $fontpatcherdir,                                                                 
  creates => "$inconsolata",                                                           
  require => Package['wget'],                                                          
}                                                                                      
exec { "fontforge -script ${fontpatcher} ${inconsolata}":                              
  cwd => $fontpatcherdir,                                                                 
  require => [ Exec[$vimPluginInstall], Exec[$wgetInconsolata], Package['fontforge'] ],
}                                                                                      
                                                                                                                     
                                                                        

NeoBundleInstallとかまでやってるけどこれは https://github.com/yshinoha/.dotfiles を参考にしてください。

ここまで、準備して

$ script/boxen

をしたら、.vimrcが入って、.vimが作成されて vimを一度ひらいて、NeoBundleInstallが走って、vimを閉じる を一気にやります。

vimでファイルを開いてみたら

f:id:shinofara:20131128232354p:plain

ここまで自動で出来たらまじ便利

他になにができるの?(今回は説明を省略して、紹介)

チームで共有

もともとboxenはgithub社が、チームで同じ環境をつくるため 新メンバーが同じ環境を手軽に作る目的で作られた物なので、今回書いた内容とは別に、チームで管理する方法もある その場合は、modules/projects/manifests/いかにファイルを作成するけど、今回は無しで。

modules/projects/manifests でチーム単位で環境を共有して 各々入れたいものがあれば、個別に /modules/people/manifests/{{github アカウント名}}.ppに記述するイメージかな

また今後やってみよう

これでMacを買い換えるのも怖くない!!???

今回使ったソース

今回作ったboxen完全版

yshinoha/our-boxen · GitHub

今回使った.dotfiles完全版(ではない)

yshinoha/.dotfiles · GitHub

参考

Puppet http://docs.puppetlabs.com/references/latest/type.html