水無月の余韻 開発Sc.

プログラミング関連の雑記

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 cleannode_modulesフォルダを削除することで、通りました。