Windows + Vagrant + Chef-soloでAndroidの開発環境を自動構築してみたよ

WindowsでのAndroidはVM Playerでやっていたけど、最近調子が悪くなってきているようだったので、この機会にChefでAndroid環境構築できるようにしてみた。今回はUbuntu 13.04で構築した。

コマンド書かれてるところはコマンドプロンプト上で実行する。

# Vagrantの準備

## Vagrantのインストール

- 公式サイトから最新版のVagrantをインストールする
 - http://www.vagrantup.com/
- 再起動した後にコマンドプロンプトからVagrantが認識されているか確認する

```
C:\> vagrant -v
Vagrant 1.4.1
```

## VirtualBoxのインストール

公式サイトから最新版のVirtualBoxをインストールする

- https://www.virtualbox.org/wiki/Downloads

## Vagrantfileの準備

- 任意のフォルダに\移動してVagrantfileを作成する
 - `vagrant init`
- Vagrantfileに必要な設定を書く

```rb
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu-13.04"
  config.vm.box_url = "http://cloud-images.ubuntu.com/vagrant/raring/current/raring-server-cloudimg-amd64-vagrant-disk1.box"
  config.vm.provider :virtualbox do |vb|
    vb.gui = true
    vb.name = "ubuntu"
    vb.customize ["modifyvm", :id, "--memory", "4096"]
    vb.customize ["modifyvm", :id, "--cpus", 4]
  end
end
```

- Vagrantfileのあるディレクトリにいる状態で仮想OSを起動する
 - `vagrant up`
 - config.vm.box_urlにboxのURLを書いておくと、vagrant upした時にboxをダウンロードしてきてくれる

# Chefの準備

## Rubyのインストール

- インストーラーから 入れる
 - http://rubyinstaller.org/
- Rubyが認識されているかコマンドプロンプトから確認する

```
C:\> ruby -v
ruby 2.0.0p353 (2013-11-22) [x64-mingw32]
```

### Development Kitのインストール
- http://rubyinstaller.org/downloads/
 - 自分の環境ではFor use with Ruby 2.0 (x64 – 64bits only)をインストールする
- インストール先のディレクトリに移動してコマンドを実行する

```
C:\ruby-develoment-kit> ruby dk.rb init
Initialization complete! Please review and modify the auto-generated
'config.yml' file to ensure it contains the root directories to all
of the installed Rubies you want enhanced by the DevKit.

C:\ruby-develoment-kit> ruby dk.rb install
[INFO] Updating convenience notice gem override for '{rubyのインストール場所}'
[INFO] Installing '{rubyのインストール場所}/lib/ruby/site_ruby/devkit.rb'
```

- うまくいかなかった場合はconfig.ymlを書き換えてもう一度`ruby dk.rb install`を実行

```config.yml
---
- {rubyのインストール場所}
```

Chefのインストール
---------------------------

gemからインストール

- Chefを入れる
 - `gem install chef --no-ri --no-rdoc`
- knife soloを入れる
 - `gem install knife-solo --no-ri --no-rdoc`
- win32-processを入れる
 - `gem install win32-process --no-ri --no-rdoc`
- windows-prを入れる
 - `gem install windows-pr --no-ri --no-rdoc`

Chefが認識されているか確認する

```
C:\> knife -v
Chef: 11.8.2
```

## cwRsyncのインストール
- インストーラーから入れる
 - https://www.itefix.no/i2/cwrsync
- {cwRsyncのインストールディレクトリ}/binを環境変数のPathに追加する
 - [環境変数の追加の仕方](http://next.matrix.jp/20111224.html)

# Chefで料理する
Chefで使うレポジトリはあらかじめ作っておいたものを使用する

- https://github.com/chuross/chef-android-repository

## Gitのインストール
[Git](http://git-scm.com/)からインストールするのも良いけど、個人的にはGithub for windowsに入ってるGit Shellが使いやすいのでGithub for windowsをインストールする

- http://windows.github.com/

Git Shellを起動してGitが認識されているか確認する

```
C:\>git --version
git version 1.8.4.msysgit.0
```

## 料理前の準備
Git Shellを起動して以下のコマンドを実行する
あらかじめVagrantfileのあるディレクトリに移動して`vagrant up`しておくこと

```
c:\>git clone https://github.com/chuross/chef-android-repository.git
c:\>cd chef-android-repository
c:\>git submodule init
C:\>git submodule update
C:\>knife solo prepare vagrant@127.0.0.1 -p 2222
```

※Git ShellからだとChefがうまく動かなかったのでGitのインストールとこの前準備の項目だけGit Shellで実行した

## chef-android-repositoryがやってくれること
- Git
- java
 - Oracle JDK 7u45
- maven
 - 3.1.1
- eclipse
 - kepler
 - m2e
 - m2e-android
 - android SDK　plugin
 - android NDK plugin
- eclipseの日本語化
- Android SDK
- GUI(日本語化)

## 料理開始
ここまできたら後はコマンド一個実行したあと放置。known_hostsに追加するかどうか聞かれた場合はyesで進める。

- cloneしてきたchef-android-repositoryのディレクトリに移動する
- `knife solo prepare -i {.vagrand.dがあるディレクトリ}/insecure_private_key vagrant@127.0.0.1 -p 2222`
 - .vagrant.dは多分ここらへんにあるはず
`C:\Users\インストールしたユーザ\.vagrand.d`

## 終わったら
あとは`vagrant halt`した後に、`vagrant up`もしくはVirtual Boxから直接起動して使うだけ

# 補足

## chef-android-repositoryの今後
- 現状だとユーザの追加に関するレシピを書いてないので、手動で追加する必要があるので自動化する
- eclipseのプラグインは今後も追加していくかも
- Android NDKも自動化する

## 日本語化しない方法
- eclipseを英語のままで使いたい場合
 - この行を`recipe[eclipse]`に変える
 - https://github.com/chuross/chef-android-repository/blob/master/roles/default.json#L59
- Ubuntuを英語のまま使いたい場合
 - この行を`recipe[chef-gui]`に変える
 - https://github.com/chuross/chef-android-repository/blob/master/roles/default.json#L61