Posted at

capistrano-yarnの設定


はじめに

こんにちは。

株式会社Nexceedにて、学生フルスタックエンジニアとして働いてる若造です。

capistranoでデプロイする際、yarnのインストールでかなり苦戦したので、

今回は、capistrano-yarnの設定のご紹介です。


参考サイト

いろんなサイトを見たんですけど、

結局、github上に上がってる ソースコード を見るのが、一番参考になりました。


内容


サーバー側に yarn、 node をインストール

サーバー側にyarnとnodeをインストールしとかないと、yarn installなどが通らないので、事前にインストールしておきます。

nodeは、ndenvを使って、yarnは、npmを使ってインストールしました。

### ndenv install

$ git clone https://gvim ithub.com/riywo/ndenv ~/.ndenv
$ git clone https://github.com/riywo/node-build.git ~/.ndenv/plugins/node-build
$ ndenv -v
ndenv 0.4.0-4-ga339097

### node install
$ ndenv install -l
$ ndenv install v10.12.0
$ ndenv rehash
$ ndenv global v10.12.0
$ node -v
v10.12.0

### yarn install
$ npm -v
6.4.1
$ npm install -g yarn
$ yarn -v
1.12.3


capistrano-yarnをインストール


Gemfile

# 以下を追加

gem 'capistrano-yarn'

# インストール

$ bundle install


capistranoに設定


Capfile

# 以下を追加

require 'capistrano/yarn'


deploy.rb

# 以下を追加

# --prefer-offline -> 高速化
# --production -> devDependencies にあるパッケージはインストールしなくなる
# --no-progress -> progress bar の非表示
set :yarn_flags, "--prefer-offline --production --no-progress"
set :yarn_roles, :app


デプロイ

$ bundle exec cap deploy_server deploy

ここで、yarn:installの箇所で以下のようなエラーが発生しました。

yarn:install

01 yarn install --prefer-offline --production --no-progress
01 /usr/bin/env: `yarn'
01 そのようなファイルやディレクトリはありません

先程、yarnをインストールしたはずなのですが、

どうやら、どうしても/usr/bin/envを見に行ってしまうので、

これを解決してあげる必要があるようです。

けど、これの修正方法がどこにも載っていなかったので、とても苦戦しました。

最初から公式のソースコードを見とけばよかったと後悔してます...


エラー修正

ここで、元のソースコードの該当となりそうな箇所を確認してみます。

### defalutのオプションっぽい箇所

set :yarn_target_path, nil
set :yarn_flags, '--production'
set :yarn_roles, :all
set :yarn_env_variables, {}
# 公式に紹介されていないオプション
set :yarn_bin, :yarn

yarn_binが原因で、/usr/bin/envを見に行ってるっぽいので、

yarn_binを変更してみる。

サーバー側のyarnのインストール箇所を確認して、deploy.rbを変更する。

$ which yarn

~/.ndenv/shims/yarn


deploy.rb

# 以下を追加

set :yarn_bin, '~/.ndenv/shims/yarn'


再度デプロイ

$ bundle exec cap deploy_server deploy

無事、成功しました。


webpackのビルド

webpackを利用している場合、webpackをビルドする必要があります。

capistranoに、yarnのインストールが完了後、webpackをビルドを行うよう設定します。


deploy.rb

# 以下を追加

namespace :webpack do
after "yarn:install", "webpack:build"
task :build do
on roles(:app) do
execute "cd #{release_path} && #{fetch :yarn_bin} run build:prod"
end
end
end


package.json

"scripts": {

"build:prod": "webpack --mode production --config webpack.config.js",
}

以上で問題なく動作します。


まとめ

今回は、capistrano-yarnの設定について、まとめてみました。

オプションyarn_binを変更することで、

サーバー側にシステムグローバルにyarnをインストールしなくても、

yarnを使えることができました。

実際、公式に紹介されていないオプションなので、少し心配ですが...


質問、指摘、コメントお待ちしてます:bow_tone1::bow_tone1::bow_tone1: