404などのページをassets pipelineを使って作れるgakubuchi gemを使っています。

capistranoでデプロイする時、これのassets:precompileで落ちてデプロイできてないことがよくある。(落ちないこともある)

もう一度デプロイすると動くので騙し騙し使っている。デバッグしないとなあ・・・。

Tasks: TOP => deploy:assets:precompile
(See full trace by running task with --trace)
The deploy has failed with an error: Exception while executing as root@app1.kowabana.jp: rake exit status: 1
rake stdout: I, [2016-09-16T10:01:36.563918 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/blocks-25f0ada07701275b817165481ea227bf448e4b33b160e18e4e4e5ff988e4ec06.css
I, [2016-09-16T10:01:36.565468 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/blocks-25f0ada07701275b817165481ea227bf448e4b33b160e18e4e4e5ff988e4ec06.css.gz
I, [2016-09-16T10:01:48.018613 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/application-ed4db3deeeed188beda19cdd3571fffe28eac2adfd49a4c948d14dee05076639.js
I, [2016-09-16T10:01:48.019534 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/application-ed4db3deeeed188beda19cdd3571fffe28eac2adfd49a4c948d14dee05076639.js.gz
I, [2016-09-16T10:01:56.640992 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/application-36e5ebe3ef6a536d04cf635d1343bbfb50cd9c2de9b70bec0d72b0469565bf1c.css
I, [2016-09-16T10:01:56.641414 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/application-36e5ebe3ef6a536d04cf635d1343bbfb50cd9c2de9b70bec0d72b0469565bf1c.css.gz
I, [2016-09-16T10:01:56.804354 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/404-f5b8eac98ade00d0f719281af5b7b9103e7403700bda2ea175fefb8fff1ccfc5.html
I, [2016-09-16T10:01:56.805071 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/404-f5b8eac98ade00d0f719281af5b7b9103e7403700bda2ea175fefb8fff1ccfc5.html.gz
I, [2016-09-16T10:01:56.848952 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/406-67bca5a0e35c21ad811db2b88cca0ea5537cf59d85269977c274cb94dee913aa.html
I, [2016-09-16T10:01:56.849368 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/406-67bca5a0e35c21ad811db2b88cca0ea5537cf59d85269977c274cb94dee913aa.html.gz
I, [2016-09-16T10:01:56.905607 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/422-ef00dd8611c3e3d04be35eb07806ac98bad01d2e91f1777e01f7bbc340849e49.html
I, [2016-09-16T10:01:56.906426 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/422-ef00dd8611c3e3d04be35eb07806ac98bad01d2e91f1777e01f7bbc340849e49.html.gz
I, [2016-09-16T10:01:56.962076 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/500-cf3665c336cdd9870de6ce60459b74d0d4280ac369f48ef590922fbac639673e.html
I, [2016-09-16T10:01:56.962528 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/500-cf3665c336cdd9870de6ce60459b74d0d4280ac369f48ef590922fbac639673e.html.gz
rake aborted!
Errno::ENOENT: No such file or directory @ rb_sysopen - /srv/kowabana.jp/releases/20160916010102/public/assets/406-1a8f57ba17cdbf23ab495f461eea0f1e844b30e0789aab4c933385017f437c27.html
/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/fileutils.rb:8:in `copy_p'
/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/task.rb:15:in `block in execute!'
/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/task.rb:10:in `each'
/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/task.rb:10:in `execute!'
/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/tasks/after_precompile.rake:3:in `block in <top (required)>'
/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/rake-11.2.2/exe/rake:27:in `<top (required)>'
/usr/local/rbenv/versions/2.3.1/bin/bundle:23:in `load'
/usr/local/rbenv/versions/2.3.1/bin/bundle:23:in `<main>'
Tasks: TOP => assets:precompile
(See full trace by running task with --trace)
rake stderr: Nothing written


** DEPLOY FAILED
** Refer to log/capistrano.log for details. Here are the last 20 lines:


 DEBUG [3390349e]   I, [2016-09-16T10:01:56.905607 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/422-ef00dd8611c3e3d04be35eb07806ac98bad01d2e91f1777e01f7bbc340849e49.html

 DEBUG [3390349e]   

 DEBUG [3390349e]   I, [2016-09-16T10:01:56.906426 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/422-ef00dd8611c3e3d04be35eb07806ac98bad01d2e91f1777e01f7bbc340849e49.html.gz

 DEBUG [3390349e]   

 DEBUG [3390349e]   I, [2016-09-16T10:01:56.962076 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/500-cf3665c336cdd9870de6ce60459b74d0d4280ac369f48ef590922fbac639673e.html

 DEBUG [3390349e]   

 DEBUG [3390349e]   I, [2016-09-16T10:01:56.962528 #30643]  INFO -- : Writing /srv/kowabana.jp/releases/20160916010102/public/assets/500-cf3665c336cdd9870de6ce60459b74d0d4280ac369f48ef590922fbac639673e.html.gz

 DEBUG [3390349e]   

 DEBUG [3390349e]   rake aborted!

Errno::ENOENT: No such file or directory @ rb_sysopen - /srv/kowabana.jp/releases/20160916010102/public/assets/406-1a8f57ba17cdbf23ab495f461eea0f1e844b30e0789aab4c933385017f437c27.html

/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/fileutils.rb:8:in `copy_p'

/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/task.rb:15:in `block in execute!'

/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/task.rb:10:in `each'

/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/gakubuchi/task.rb:10:in `execute!'

/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/gakubuchi-1.2.2/lib/tasks/after_precompile.rake:3:in `block in <top (required)>'

/srv/kowabana.jp/shared/bundle/ruby/2.3.0/gems/rake-11.2.2/exe/rake:27:in `<top (required)>'

/usr/local/rbenv/versions/2.3.1/bin/bundle:23:in `load'

/usr/local/rbenv/versions/2.3.1/bin/bundle:23:in `<main>'

Tasks: TOP => assets:precompile

(See full trace by running task with --trace)

GAEやappengineなど表記が揺れててどうもググラビリティが低いので併記してみました。

環境

homebrewでapp engine sdkを入れています。

% brew list |grep app-engine
app-engine-go-64

GAE用のGOPATH設定

普通のgoと違ってPaaSの性質上GAEでは使えない機能がある。そういったライブラリを読み込んでるとコンパイルできないので、普通のgoとGAEではGOPATHの設定を変える必要がある。ややこしい。

GAE用のGOPATH設定はいくら調べてみてもこれで決まりというのがわからなかった。いくつかある中で、未設定ならばsdk内のデフォルトが使われるようなのでdirenvでunsetするという方法をとることにしました。

通常のGOPATHは~/に設定しています。通常のGO用のライブラリはここに入り、GAE用はsdkの中に入るという認識。

GAE用のプロジェクトの直下に下記を置く。

# .envrc
unset GOPATH
% env | grep GOPATH

もちろん空。

% goapp env | grep GOPATH
GOPATH="/usr/local/Cellar/app-engine-go-64/1.9.31/share/app-engine-go-64/gopath"

goapp経由でみるとsdkの場所が指定されています。

% goapp get goji.io    
# goji.io
/usr/local/Cellar/app-engine-go-64/1.9.31/share/app-engine-go-64/gopath/src/goji.io/mux.go:84: r.URL.EscapedPath undefined (type *url.URL has no field or method EscapedPath)

gojiをgetしようとするとエラーがでる。

/*
ServeHTTPC implements Handler.
*/
func (m *Mux) ServeHTTPC(ctx context.Context, w http.ResponseWriter, r *http.Request) {
    if m.root {
        ctx = context.WithValue(ctx, internal.Path, r.URL.EscapedPath())
    }
    ctx = m.router.route(ctx, r)
    m.handler.ServeHTTPC(ctx, w, r)
}

ソースを読んでみたが、なぜr.URL.EscapePath()がundefinedなんだろう?m.rootとはなんだろう。GAEと関係あるんだろうか。

vim8.0がリリースされたようです。

Vim 8.0 released! - Google グループ

Asynchronous I/Oとchannelが気になります。golangのchannelみたいなものかな?

これでasyncなsyntasticが普通な感じになったら嬉しいです。

というか今それが普通じゃないのがキツイですね。

goのpluginを入れる。

https://gyazo.com/486bdc46a8c2ed8131a07847585c244d

SDKの設定をする。下記はhomebrewで入れたgo。

https://gyazo.com/8505e1ea93e0f7a0828a936853590927

ファイル保存時にgoimpoirtsする

File Watchers pluginを入れる。

https://gyazo.com/c448398e01cf5bb73faacc271978dc71

こんな感じで設定する。

https://gyazo.com/241041379d10e3df5bf1f27563804192

Immediate file synchronizationはonにするとおかしくなるのでoffにしておく。

https://gyazo.com/5c44daa1acd8847ba9002609ab29cbef

とりあえず日本の祝日のデータのyamlのみを含んだ holiday-jp/holiday_jp リポジトリを作りました。

https://github.com/holiday-jp/holiday_jp

従来のgemのreposは holiday-jp/holiday_jp-ruby になります。

holiday-jp/holiday_jp-ruby: Japanese holiday.

holiday_jp-rubyとかholiday_jp-phpとか作ってgit submoduleでyamlのrepoを取り込む感じで。

RubyKaigi中は過去に手をかけられてなかった自分のgemをメンテする絶好のタイミング。

pull requestいただいたmergeしてるけどrubygemsにpushしてないgemがよくあるのでこの機会にリリース。

holiday_jp | RubyGems.org | your community gem host

organizationに移る前に、色々PRを貰ってたのでリリースしました。祝日に山の日が増えてます。

RubyKaigi 1日目、各発表は他所のレポートをみていただくとして、Official Partyはやはり大事ですね。

@k1LoWさんとお話させていただく。

holiday_jpをwootheeみたいにorganization作って、言語非依存のyml(各言語用ライブラリではgit submoduleで読み込む)だけにしてはどうかという話。

それがいいですね。今夜やります。

やりました。

holiday-jp

@morygonzalezさんとお話。

  • Lokkaを今までのしがらみすてて作りなおそう。
  • 2人しかいないのにLokkaKaigiやって沢山人いる風にみせよう。
  • 福岡ダンボール問題。
  • リモートワーク手放しで賞賛するな問題。

ステッカー貰いました。

ss

@toyoshiさんとお話。

  • misocaのチーム構成やマネジメントの話。
  • 企業と連携の仕方。
  • 名古屋は紹介が重い話。(ちょっと親しいぐらいでは紹介しない問題)

僕らも今企業向けのサービスを作っているところなので非常に参考になる話をお聞きしました。

インターン、元インターンの方々とご挨拶。毎年のことですがリモートでやっててはじめましての人も多い。

しょうもない俺達と長く話さず沢山の知らない人にどんどん声をかけようという話。

今回は京都なので5人でAirbnbで一軒家を借りて前乗りしました。

おばあちゃんの家のようなカントリーサイドのティピカルジャパニーズハウスです。

https://gyazo.com/91aad256abf30d78b504f0582e131567

https://gyazo.com/2d1070b02ab578ab03891a0681c0816c

https://gyazo.com/d9ee44f8714982655d2edabfefb7764e

明日に遅れないようにAppleの発表は見ずに寝ることにします。

  1. GCPの管理画面から静的IPアドレスを割り当てる。
  2. Cloud SQLの管理画面からrootユーザーにパスワードを設定する。
  3. Cloud SQLの管理画面から上記IPアドレスを許可する。

接続できることを確認する。

$ mysql -u root -p -h xxx.xxx.xxx.xxx

Google Container RegistryはプライベートなDocker Registryです。Docker HubのPrivateは有料なので受託開発でGCPつかうならアップ場所はここがよい。

GCPにログインして、デフォルトのPROJECT_IDは設定しておく。

$ gcloud auth login
$ gcloud config set project PROJECT_NAME_12345

イメージにタグを付ける。タグ名はリージョン/プロジェクトID/イメージ名

リージョンは日本ならasia.gcr.ioがよい。

$ docker tag xxxxxxx asia.gcr.io/PROJECT_NAME_12345/MY_IMAGE

pushする。

$ gcloud docker push asia.gcr.io/PROJECT_NAME_12345/MY_IMAGE

Google Container Registryに管理画面でアップされていることを確認する。