AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

rvm gemset copyするときに注意すること

gemset copyした

rubyバージョンアップにともなって、した。

rvm gemset copy 1.9.3-p551@rails 2.0.0-p648@rails

そもそもメンテナンス切れてるバージョンやんけ!みたいなツッコミは勘弁してくだち……。 んでcopyしたら、gemsetの中にbundler入ってなくてデプロイしたアプリ動かなくて死ぬかと思った。

cannot load such file -- bundler/setup (LoadError)

productionモードだと、nginxのアクセスログに500出すだけで、production.logまで到達しなくて何事かと思った。

        location / {
            passenger_enabled on;
            rails_env development;
        }

developmentで動かすことでエラーが見えたので、gem listしたらbundlerがなくてうわぁぁぁ。 gem install bundlerしてNginx再起動したら無事動作して、めでたしめでたし。

gitでバイナリがコンフリクトして爆発した

うおおおmasterに取り込むときに発生するのはやめろー!心臓に悪い!

爆発した

コンテンツの修正で、feature/modify_images_20160805などというブランチで作業していた所、pushしてgitlabからmerge rewuest出したら「コンフリクトしてだめなんでコマンドラインで解決して?」と言われるなどしたので。

[example@localhost example-temp]$ git push origin master
To git@git.example.co.jp:example/example.git
 ! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'git@git.example.co.jp:example/example.git'
To prevent you from losing history, non-fast-forward updates were rejected
Merge the remote changes before pushing again.  See the 'Note about
fast-forwards' section of 'git push --help' for details.
[example@localhost example-temp]$ git pull
warning: Cannot merge binary files: img/img_main.png (HEAD vs. 114514.......................)

Auto-merging img/img_main.png
CONFLICT (content): Merge conflict in img/img_main.png
Automatic merge failed; fix conflicts and then commit the result.

うおおおおおお?!

どうする

gitlabの提示した解決方法が何も役に立たなくてあーん?みたいになったので、以下のようにcheckout --theirsして解決しました。

[example@localhost example-temp]$ git checkout --theirs img/img_main.png
[example@localhost example-temp]$ git add img/img_main.png
[example@localhost example-temp]$ git commit -m "conflictの解消"
[example@localhost example-temp]$ git push origin master

--theirsだとmasterに元々存在するファイルになるようです。 とりあえずこれで解消できたのでよかった……。 ダメな場合は、reset --hardとかして過去ま戻るしかないかも。

mapyo.hatenablog.com

d.hatena.ne.jp

Sent fileで0バイトのファイルが送られてくる時

わりと忘れがち。

/config/enviroments/production.rb

Apacheの場合は「X-Sendfile」、Nginxの場合は「X-Accel-Redirect」を使う。

  # Specifies the header that your server uses for sending files
  #config.action_dispatch.x_sendfile_header = "X-Sendfile"

  # For nginx:
  #config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect'

Capistrano3で更新が反映されない時

なんか更新が反映されないな?

と思った時に確認するファイル。

  • config/deploy.rb
  • config/deploy/STAGE
  • /path/to/app/repo/FETCH_HEAD
  • /path/to/app/repo/HEAD
  • /path/to/app/repo/config

特にリポジトリ切り替えたり、検証で複数のリポジトリ行ったり来たりする時、FETCH_HEAD/HEAD/configあたり見るとずっと古いリポジトリの情報書いてあって「あびゃあ」って顔になる。 なんかCapistranoの使い方間違ってる気がするけど、前のエントリでも書いたとおり、repoディレクトリをとりあえず削除することで回避できるから何も考えずにそうしてるマン。

stackoverflowに書いてあった

stackoverflow.com

よく読んでないけどrepo消せって書いてあるし、さすがやなって。

その後

既存の本番環境にURL変更してデプロイするときに躓いた。

astj.hatenablog.com

以下のようにして、set-urlすると解決できるので、むやみにrepoディレクトリを消すのはやめようという知見。

cd /path/to/capistrano/repo
git remote -v

変更前のリポジトリが出てくる

git remote set-url origin "新しいgitリポジトリ"
git remote -v

"新しいgitリポジトリ"に変わってることを確認する

rake-cache 1.6.0はもういない!

budnle installでこけた

古いプロジェクトメンテしようとしたらこけるよー。

Could not find rack-cache-1.6.0 in any of the sources

なくなった

yanked!!

All versions of rack-cache | RubyGems.org | your community gem host

yankedじゃないが

github.com

依存関係のあるgemのバージョンは1.6.0→1.6.1で変わらないようなので、そのままbundle upadte rake-cacheすれば大体の人は解決するでしょう!

どうしても1.6.0が無いとダメな場合

多分Gemfileに以下のように書けばgithubから持ってこれるので、なんとかなると思います。

gem 'rack-cache', :git => 'git@github.com:rtomayko/rack-cache.git', :tag => 'v1.6.0'

当然githubと通信しないといけないので、アカウント取って~/.ssh/configあたりに設定書いといてください。なんかhttpsを指定も出来るみたいだけど、そっちは試してないので……。

Capistrano3でデプロイ時に更新が反映されない

なんだよこのレアケース!っていうやつ。

今回ハマったケース

  1. bundle exec cap {STAGE} deployする
  2. あるGemがインストールできなくて、デプロイ先のbundle installが失敗しまくってた
  3. Gemfile.lockをアップデートして問題解消したのを確認した
  4. git pushして、問題のプロジェクトのGemfile.lockを更新
  5. git pullして更新落ちてきたのを見届けて、再度deployを投げると何故か2.と同じエラーが出る
  6. Gemfile.lockを見ると更新されてない

解決方法

deploy先の/path/to/app/以下のディレクトリのうち、Capistranoが自動作成するディレクトリを全部消した。 (多分/path/to/app/repo/消せば解決する気はする。)

なぜ起こったのか

コレガワカラナイ。 中途半端にタスクが消化されて、/path/to/app/以下に残ってた情報が悪さしてたのかもしれん。 ディレクトリ消すときに、sharedとかreleaseも消しちゃうと問題になるので、repo消すだけでも大丈夫かもしんない。

Capistranoで最新のコミットが反映されない

monitでBasic認証されてるサイトを監視したい時

このようには書けぬ

そのままではBasic認証を通過できぬ。

check host WEBSERVER_production with address www.example.com
    if failed port 80 protocol http for 3 cycles then alert
      alert admin@example.com

当然monitのログに、以下のように「401だわー!」と出力される。

[JST Jul 11 11:45:14] error    : 'WEBSERVER_production' failed protocol test [HTTP] at [169.254.169.254]:80/login [TCP/IP] -- HTTP error: Server returned status 401

/loginになってるのは監視先がRailsで作ってあってリダイレクトしておりますゆえ。

のでこのように書く

check host WEBSERVER_production with address www.example.com
    if failed url http://USER:PASS@169.254.169.254/login for 3 cycles then alert
      alert admin@example.com

Basic認証で邪魔されるのはPort80か443を監視したい場合だろうし、まあ大体同じもんだからこれで我慢しようって感じですわ。