大人数でBoxen使うならboxen-webが断然便利

[Boxen](https://boxen.github.com)をWebアプリケーションとして配布できる[boxen-web](https://github.com/boxen/boxen-web)を使ってみた。

# 簡単なまとめ

boxen-webは...

- Boxenのインストールから実行までを1行のシェルコマンドでできるようにする
  - デザイナなどの非エンジニアに優しい
- Boxenを使う上で**必須ではない**
- OAuthを用いた認証によりメンバーのみアクセス可能
- Heroku上で動作するのでサーバを用意する必要はない
- GitHubの利用が必須
- デプロイすると下記のようなサイトができる

![Boxen Web](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20130316/20130316204344.png?1363434245)

## この記事で分かること

- boxen-webをデプロイする方法
- 新しいMacをboxen-webを使ってセットアップする方法

## この記事で分からないこと

- Boxenの使い方
- Herokuの詳しい使い方

## 注意事項

Boxen自体はGitHub外のプライベートリポジトリでホストできるが、boxen-webを使う場合はGitHub上でホストされていなければならない。例えば、[Boxen使わなくても許されるのは2012年までだよね](http://qiita.com/items/c6f20de0e4f4c352046c)に従ってBitbucketを使ってプライベートリポジトリを作った場合はboxen-webを使えない。

# boxen-webとは何か

boxen-webはGitHub社が開発しているオープンソースのMac自動設定ツールBoxenを簡単にチームで共有できるようにするツール。中身はRailsで書かれておりHeroku上で動作する。
Webアプリケーションにアクセスすると表示されるワンライナーを実行するだけでセットアップが完了するので非エンジニアでも簡単に使える。（boxen-webを使わずにBoxenを使う場合一旦git-cloneしてきてからスクリプトを叩く必要がある）

GitHubのOAuthによってクライアントを認証し、部外者がアクセスできないようになっている。

現在利用できるのはGitHub上でホストされているBoxenリポジトリのみ。GitHub:Enterpriseのサポートはissueには上がっているがいつになるかは不明。

# 使い方

1. 事前準備
2. GitHub OAuth Applicationの用意
3. boxen-webの用意
4. Herokuにデプロイ
5. 新しいMacをboxen-webでセットアップする手順

## 事前準備

### Boxenを作る

チーム用にBoxenを用意する。詳しくは[Boxen使わなくても許されるのは2012年までだよね](http://qiita.com/items/c6f20de0e4f4c352046c)参照。

### OrganizationとTeamを作る

GitHubにOrganizationとTeamを作る。OrganizationとTeamの関係は一対多、つまり、1つのOrganizationに複数のTeamを作れる。そしてOrganizationのmemberとは少なくとも1つのTeamに所属しているGitHubアカウント。

boxen-webはOrganizationではなくTeam単位で作るものであることに注意。
Boxen自体にプロジェクト単位やチーム単位でセットアップする設定を書けるので、AllみたいなTeamを作って全員このTeamに含めてしまうのがいいのではないだろうか。

OrganizationとTeamの作り方はGoogle先生に聞いてほしい。Teamには固有のID（整数）が割り振られる。それについてはTeamのページのURLを見れば分かる。このIDは後で必要になる。

## GitHub OAuth Applicationの用意

OrganizationのOrganization Applications設定へ行って"Register new application"を押す。
下記の`NAME` はHerokuに作るアプリケーションの名前に置きかえる。

項目             | 値
-----------------|------------------------------------------------------
Application Name | Boxen Web
Main URL         | https://NAME.herokuapp.com
Callback URL     | https://NAME.herokuapp.com/auth/github/callback


## boxen-webを用意

```sh:Terminal
cd ~/src
git clone git://github.com/boxen/boxen-web.git
cd boxen-web
```

### ローカルで動作確認する

boxen-webの動作確認をローカルですることができる。必須ではないので、一旦ここは飛ばしていきなりデプロイしていい。デプロイが上手くいかなかったらここに戻ってくる。

まず、前提としてHerokuなのでDBはPostgreSQLである。またそのPostgreSQLはBoxenでセットアップされたものでなければならない。

```ruby:Puppetfile
# 追記
github "postgresql, "1.0.0"
```

そして下記を実行する。上手くいかなかったら自分のmanifestに`include postgresql`と追記して`script/boxen`を実行する。

```sh:Terminal
cd ~/src/my-boxen
script/boxen postgresql # PostgreSQLをインストール
```

次にboxen-webをインストールする。

```sh:Terminal
script/bootstrap
```

続いて以下の環境変数を設定する。一つでも欠けているとエラーになる。

名前                 | 値
---------------------|------------------------------
REPOSITORY           | GitHub上でのリポジトリの名前
GITHUB_CLIENT_ID     | OAuth Applicationで作ったやつ
GITHUB_CLIENT_SECRET | OAuth Applicationで作ったやつ
GITHUB_TEAM_ID       | アクセスを許可するTeamのID
SECRET_TOKEN         | `$ rake secret` で取得する

```sh:Terminal
rake db:migrate
script/server
```

するとローカルでサーバが立ち上がる。http://localhost:9393 にアクセスしてみる。エラーが起きなければOK。500が発生する場合は環境変数がおかしい可能性が高いので確認する。

## Herokuにデプロイ

### Herokuの準備

1. Herokuのアカウントを持っていない人は http://get.heroku.com でアカウントを作る。
2. https://toolbelt.heroku.com からHeroku Toolbeltをダウンロードしてインストールする。これはHerokuを使うためのCLIツール。
3. `heroku login`を実行するとメールアドレスとパスワードを聞かれるので正しく入力する。

### Herokuにアプリケーションを作る

`NAME`はGitHub OAuth Applicationで設定したものと同じにする。

```sh:Terminal
# ~/src/boxen-webで下記を実行
heroku create NAME
```

これで空のアプリケーションが作られた。gitのremoteが設定されていればOK

```sh:Terminal
git remote -v
#=> heroku git@heroku.com:NAME.git (fetch)
#=> heroku git@heroku.com:NAME.git (push)
#=> origin git://github.com/boxen/boxen-web.git (fetch)
#=> origin git://github.com/boxen/boxen-web.git (push)
```

### デプロイ

Heroku用の環境変数を設定してデプロイする。環境変数の値は前述した「ローカルで動作確認する」参照。

```sh:Terminal
# ~/src/boxen-webで下記を実行
heroku config:set \
  REPOSITORY=user_or_organication/repo_name \
  GITHUB_CLIENT_ID=your_github_client_id \
  GITHUB_CLIENT_SECRET=your_github_client_secret \
  GITHUB_TEAM_ID=team_id \
  SECRET_TOKEN=your_secret_token
git push heroku master
heroku run bundle exec rake db:migrate
```

https::NAME.herokuapp.com にアクセスしたらGitHubにリダイレクトされるのでアクセスを許可。再びherokuapp.comにリダイレクトされて "WELCOME TO BOXEN" という画面が表示されればOK

![Boxen Web](http://cdn-ak.f.st-hatena.com/images/fotolife/y/yuku_t/20130316/20130316204344.png?1363434245)

# 新しいMacをboxen-webでセットアップする手順

## Boxenの管理者がすること

その人の設定が既にBoxenにある場合、例えばMacを新しく買い換えた場合、は特にすることはない。

新しくメンバーが加わった場合は以下を実行する。

1. GitHubアカウントを教えてもらう
2. OrganizationのTeamにその人を追加する
3. Boxenのリポジトリにmodules/people/manifests/ACCOUNT.ppを作る
  - その人のための設定を書く
5. 忘れずにGitHubにgit-pushする

## boxen-web利用者がすること

1. GitHubアカウントを持っていなければ作る
2. 必要に応じて公開鍵を設定する（Boxenでアクセスするプライベートリポジトリに正しくアクセスできるようにするため）
3. Xcodeをインストールする（CLIでもGUIでもどちらでもOK）
4. https://NAME.herokuapp.com にアクセスする
5. ワンライナーを端末にコピペ実行してしばらく待つ
6. .zshrc（や.bashrc）に下記を追記する

```sh:.zshrc
[ -f /opt/boxen/env.sh ] && source /opt/boxen/env.sh
[ -f /opt/boxen/nvm/nvm.sh ] && source /opt/boxen/nvm/nvm.sh
```

# 合わせて読みたい

- [Boxen使わなくても許されるのは2012年までだよね #Mac #Boxen #GitHub - Qiita](http://qiita.com/items/c6f20de0e4f4c352046c)