werckerのRubyのboxにNode.jsをインストールする
Middlemanで構築している静的Webサイトのデプロイにwerckerを使うことにしました。
アプリは、静的HTMLを出力するのにMiddlemanを使い、javascriptは、npm風に別フォルダで管理しています。 そのため、werckerでのビルド時にRubyとNode.jsが必要になりました。
プロジェクトのフォルダ構成はこんな感じです。
project - web - source - images - layouts - index.html.erb - Gemfile - js - src - ... - package.json - wercker.yml
wercker.yml
まずは結論を示します。
WerckerのRubyのboxでGruntを動かす設定を参考に、試行錯誤しました。
↑では、最新のNode.jsを入れるための設定もありますが、それは取り入れていません。
# wercker.yml box: ruby build: steps: # Execute the bundle install step, a step provided by wercker - script: name: set nodejs emvironment code: | sudo apt-get update sudo apt-get -y install nodejs npm sudo update-alternatives --install /usr/bin/node node /usr/bin/nodejs 10 - script: # ref. https://github.com/wercker/step-npm-install/blob/master/run.sh name: custom npm-install code: | cd js mkdir -p "$WERCKER_CACHE_DIR/wercker/npm" npm config set cache "$WERCKER_CACHE_DIR/wercker/npm" sudo npm update #sudo npm cache clean sudo npm install $WERCKER_NPM_INSTALL_OPTIONS - script: name: custom bundle-install code: bundle install --gemfile web/Gemfile # Execute a custom script step. - script: name: test js code: cd js; npm run test - script: name: build js code: cd js; npm run build - script: name: deploy js code: cd js; npm run deploy - script: name: middleman build code: cd web; bundle exec middleman build --verbose deploy: 〜(省略)〜
boxの指定
boxの指定がなかなか通らなくて苦労しました。
はじめは、box: wercker/ruby
としていたのですが、boxのイメージファイルの取得に失敗しました。
wercker directoryで有志によるbox定義を検索して使うことも考えたのですが、これもイメージファイルが取得できずに断念し、別途インストールする方法にしました。
バージョンが書いてあるわけではないので混同したいたのですが、old-devcenter.wercker.comを見ていました。
Docker Hubを使うようになってから、形式が変更になっているようです。
wercker - lean Introduction to the wercker.yml
Ubuntu上の問題
Ubuntuだと、apt-get install
でNode.jsをインストールすると、コマンドがnodejsとなってしまうので、nodeで通るように変更しています。
これをしないと、npmコマンドが動作しませんでした。
Node.jsのキャッシュ
ローカルでboot2docker+VirtualBoxを使って、試していたのですが、繰り返しているとnodejsのモジュールがあやしくなってきます。
npm install
が通らなくなり、npm cache clean
とnode_modules
フォルダを削除することで、通りました。