年末に Crowi への pull request を出したんだけど、それを実装する前には手元に Crowi の開発環境が無かった。年末に新規購入した MacBook Pro には Crowi の環境を作っていなかったのだ。
以前にそうしていたように、Mac 上に MongoDB やら Node.js やらをインストールして環境構築しても良かったんだけど、どうせなら「捨てられる開発環境」であり、「再構築できる開発環境」を用意したいなと思って、少しいじったことがある Vagrant と全くいじったことがない Ansible を組み合わせて環境構築をしてみた。
少しずつ試してみて、なんとなく出来上がったのは、Vagrantfile ひとつと playbook.yml がひとつのシンプルな内容。というか、このくらいしかできなかった。これで、VM を用意して、nvm をインストールして、指定バージョンの node をインストールして、Crowi をインストールして、npm install まで実行する。
Vagrantfile はこんな感じ。
Vagrant.configure(2) do |config|
config.ssh.forward_agent = true
config.vm.box = "ubuntu/trusty64"
config.vm.network 'forwarded_port', guest: 3000, host: 8080
Config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook.yml"
ansible.verbose = "vv"
ansible.raw_ssh_args = ['-o ForwardAgent=yes', '-o ControlMaster=auto', '-o ControlPersist=1800s']
end
end
config.vm.network 'forwarded_port', guest: 3000, host: 8080
を設定しておくと、Mac 上のブラウザで http://localhost:8080/ を参照すると Crowi の画面が見られる。
ansible.raw_ssh_args
でいろいろ設定しているのは、Crowi の初回の npm install でコケてしまっていたので ControlPersist の時間をデフォルトよりも伸ばしてみている。
playbook.yml はこっち。
# Crowi installer for Vagrant
- hosts: all
remote_user: vagrant
vars:
nvm_version: v0.29.0
node_version: v0.10.41
repo_dir: /vagrant/crowi
branch: master
tasks:
- name: apt-get update
sudo: yes
apt: update_cache=yes
- name: install packages
sudo: yes
apt: name={{ item }} install_recommends=no
with_items:
- curl
- g++
- git
- mongodb
- name: setup nvm using 'raw' module. this is dangerous !!
raw: /usr/bin/curl -o- https://raw.githubusercontent.com/creationix/nvm/{{ nvm_version }}/install.sh | bash
- name: install nodejs
raw: . ~/.nvm/nvm.sh && nvm install {{ node_version }} && nvm alias default {{ node_version }}
- git: repo=ssh://git@github.com/crowi/crowi.git
dest={{ repo_dir }}
version={{ branch }}
accept_hostkey=yes
- raw: . ~/.nvm/nvm.sh && cd {{ repo_dir }} && export CI=true && npm install
nvm をインストールしているところでは、curl で直接 URL を叩いていて、ちょっとイマイチ感。もっとうまく書く方法がありそうだったけど、今回はこれでお茶を濁した。
あと、npm install
の前に CI=true
を付けるのがミソなようだ。これを入れておかないと、bower の初回インストール(npm install の中で bower のインストールも行っている)の時に「利用情報をリモートに送信しますか?」みたいな質問が出てきて、それに手動で yes / no を入力して答える必要がある。
最初は yes コマンドを利用して回避しようと思ったけど、うまく行かずに悩んでいたら、この方法を見つけてこちらで回避した。この動作の詳細は、bower のドキュメント「Running on a continuous integration server」に書かれている。
これで vagrant up
をすると、/vagrant/crowi
に Crowi が起動可能な状態でインストールされているはず。もし途中でコケたら vagrant provision
を実行するとうまく行くかもしれない。
インストールがうまくいったら vagrant ssh
でログインして、Crowi を起動する。
$ cd /vagrant/ssh
$ node app.js
この状態で、Mac のブラウザで http://localhost:8080/ へアクセスすれば、Crowi の初期画面が表示されるはず。
上記の Vagrantfile などは GitHub へ上げている。
あー、でも、node のバージョンとか変えなきゃだな。最新版の Crowi は 0.10.x から 4.2.x へアップグレードしているので。