おもしろwebサービス開発日記

Ruby や Rails を中心に、web技術について書いています

rails-assets の調子が悪い時の回避策

皆さん、rails-assets は使っていますか?

rails-assets は、Gemfile で js や css のライブラリを指定して、バージョン管理や依存の解決などをしてくれるとても便利なサービスです。

しかし最近ではその役目を終えたとして、最大で今年末でサポートを終了するとしています。

Future of rails-assets · Issue #291 · rails-assets/rails-assets

そしてもう閉じることが決まったプロジェクトだからなのか、あまり活発にメンテナンスをしていないような印象を受けます。昨年からrails-assets を運営しているサーバが不安定になることが多く、rails-assets に依存しているプロジェクトを持つ会社さんは、bundle update やデプロイに失敗して辛い日々を過ごしたのではないでしょうか。

そんな折、明日 2016/1/19 にサーバのSSL証明書の期限が切れることがわかりました。証明書の期限延長対応がされるまで、困ったことになりますね…><

f:id:willnet:20160118191355p:plain

(追記) 証明書は lets'encrypt を利用しており、(おそらく)自動で更新されるようになっているようです。よかったですね。 SSL certificate for rails-assets.org will expire soon · Issue #306 · rails-assets/rails-assets

僕がお手伝いしているクリニカルプラットフォームさんでも rails-assets を利用しており、昨年 rails-assets が不安定になった際に、非常用として回避策を用意しておきました。

その回避策をシェアしておきますので、僕たち同様に困っている方がいらっしゃったらご利用下さい。以下は クリニカルプラットフォームさんの esa@masa_iwasaki がまとめてくれた記事を改変したものです。

rails-assets.org が不安定な場合

rails-assets.org へ接続ができない場合、 bundle install が終了せず最悪デプロイができない状況に陥ります。

急いでいる場合は、rails-assetsのリポジトリからソースコードを手に入れ、開発環境でgemパッケージをビルドし、外部に公開してそのURLをGemfileで参照するという手段があります。ただし、多少の時間はかかりますので、時間に余裕を持って取り組むのがベストです。

rails-assetsでgem生成

rails-assetsREADMEに従ってセットアップします。redis さえ動いていれば、最後の foreman start は必要ありません。

git clone git@github.com:rails-assets/rails-assets.git && cd rails-assets
bundle install && npm install
cp config/database{.sample,}.yml
cp config/application{.sample,}.yml
# edit config/database.yml and config/application.yml if necessary.
bin/rake db:setup
foreman start

手元でgemを以下のようにビルドします。各assetのバージョンは各プロジェクトのGemfile.lockを参照して取得してください。

bundle exec rake 'component:convert[jquery, 2.1.4]'
bundle exec rake 'component:convert[jquery-ui, 1.11.4]'

↑の作業を楽にするために、Gemfile.lock をパースして、実行すべき rake タスクを出力する簡単なスクリプトを書きましたのでご利用下さい。parse_gemfile_lock.rb のように保存して ruby parse_gemfile_lock.rb Gemfile.lock で実行できます。

files = ARGF.readlines.grep /rails-assets-/
files.map(&:strip!)
files.reject! { |file| file[-1] == '!' || file.match(/[>=<]/) }
files.each do |file|
  name, version = file.split(' ')
  name.gsub!(/rails-assets-/, '')
  version.gsub!(/[\(\)]/, '')
  puts "bundle exec rake 'component:convert[#{name}, #{version}]'"
end

外部への公開

rails-assetsのワーキングコピー直下にあるpublicディレクトリ以下をrsync等を使って外部に公開します(public以下のファイルさえあれば、gem serverとして機能します)。公開先はどこでもいいですが、最も簡単なのはAWS S3を利用することでしょう。

gem sourceの変更

プロジェクトのルートディレクトリに移動し、Gemfile 中の https://rails-assets.orghttp://公開URL に変更して、bundle install を走らせれば終了です。

ローカル環境で確認したい場合

localにgemがすでにインストールされている場合、公開URLのものは当然インストールしてくれません。もし、ちゃんとインストールが出来ることをローカル環境で確認したい場合は、インストール済みのrails-assets-*系gemを削除してください。ざっくりと全部抜くのであれば、以下のようなコマンドで削除できます。

$ gem list --no-version | grep rails-assets- | xargs gem uninstall

最後に

役に立った!と思ったら下記エントリの応援や応募などをお願いします (\( ⁰⊖⁰)/)

犬の手も借りたい!ヘルスケアITのスタートアップがRubyエンジニア募集! - クリニカル・プラットフォーム株式会社の求人 - Wantedly

合わせて読みたい

最近のお仕事について - おもしろwebサービス開発日記