30歳未経験からエンジニアに転職ブログ

30歳未経験からウェブエンジニアへの転職を目指して個人アプリ作成中です。

CircleCIでRspecが読み込まれない問題の解決

Rspecを並列で書くとダメらしい。

qiita.com

この記事の人はどうやって解決できたのかというと、
この外国人の方のコメントかららしい。

The local error makes sense; when you quote an argument, it gets treated as a single argument, even though there's a space in it. So rspec "spec/foo_spec.rb spec/bar_spec.rb" is interpreted as running rspec with a single argument (spec/foo_spec.rb spec/bar_spec.rb) which RSpec is treating as a filename and attempting to load.

github.com

今日の進捗

いとさんに教えてもらったQiita記事でCircle CICDでパイプライン構築を目指す。 CI/Cdでやるのはビルド、テスト、デプロイの3つ。 Rubocopというまたわからない用語が出てきたので、あとで調べる。

circle ci はcontinuous integrationの略。継続的インテグレーションの略。

継続的インテグレーションてなんだ?

継続的インテグレーションっていうのは、 ・アプリケーション作成時の品質改善や納期の短縮のための習慣(要は効率化ってことか!) ・エクストリーム・プログラミング(XP)のプラクティスの1つ(XPというまーたわからん用語が出てきた・・・)。 ・1990年代後半から流行り出した(結構昔からやってんだ)。 ・バグの早期発見に繋がる(これは確かにいいね!) ・コンパイル/テストというビルド処理を頻繁に繰り返すことで問題の早期発見につながる(これはまだなぜそうなるのかわからん) ・「自分のローカル環境ではテストが通ったけど、他の人の環境ではテストが落ちることを防げる。なぜなら仮想環境という共通の環境でテストできるから」→わかるようでいまいちわからん・・・。いや、仮想環境っていうのは、配布できる物だから、仮想環境でテストが通るってことは仮想環境を渡した側でも渡された側でも同じようにテストが通るってことか! ・jenkinsという別のCIサービスと比較してメリット・デメリットを言えるようにしとく ・jenkinsは自前でサーバーを立てる必要がある。それに対して、circle ciはクラウドAWSみたいなもんかな ・circle ciのアカウント登録はgitbubアカウントとの連携が必須。 ・コンテナ1つは無料だけど、2つめ以降は有料になる ・privateリポジトリでも無料→privateリポジトリってなんだ?publicとどう使い分けるんだ? ・circle ciのVM(仮想環境?)にSSHできる(は?どういうこと?)

circle ciを使う流れ

  1. github上でアカウントを作る→これはOK
  2. github上でciするrepository(circleciでいうプロジェクト)を作成する→これもさっきやった気がする
  3. circleci 上でgithubアカウントと連携する→OK
  4. ローカルでリポジトリに設定ファイルを作る(.circleci/config.yml)→OK
  5. cicleci上でビルドを試してみる→やったけど失敗したぞ。なぜだ?
#!/bin/bash -eo pipefail
bundle install --path vendor/bundle
Could not locate Gemfile

Exited with code exit status 10
CircleCI received exit code 10

こんな感じで出ちゃってる。。。 「bundle installしようとしたけど、Gemfileが見つからんぞ」と怒られたっぽい。。。

rubocopって何よ?

rubyの静的コード解析をするgem(え?まず静的コード解析がわからん・・・) ・静的コード解析とは、実行ファイルを、実行せずに解析すること。逆に、実行して解析することを動的コード解析という。 ・「〜.rb」のコードを検査して「ここのコードは長すぎる」とか「クラス名変えた方がいいよ」とかチェックしてツッコミを入れてくれる。確かにそれは助かるわ。 ・rubocopの警告が全て正しいわけじゃなくて、あくまで「〜した方がいいと思う」という提案な感じ。なので厳しすぎると思ったら、デフォルト設定を帰るのもあり。作業チームで話し合って、rubocopの提案を採用するかどうか決める。 ・Rubocopの警告一覧はチートシートに記載されている

ダメだ。。。中断して集中力が。。。

CircleCIでSystemSpec(RSpec)とRubocopを走らせる - Qiita

CircleCI + Capistrano + AWS(EC2) + Railsで自動デプロイしてみた - Qiita

この2つの記事を元にもうちょっと頑張ろう。。。

自動デプロイしてもアプリが表示されない問題の解決

今回直面した問題

Capistranoで自動デプロイして、一応最後まで通ったが、ブラウザにアプリが表示されない 「We're sorry, but something went wrong.」 と表示されてしまう。

仮説(問題の原因の推測)

unicornのプロセスが2つあるのが問題? masterが2つ出てるのはまずい? これはどういう現象?

naota    20613  0.0  2.0 184500 20552 ?        Sl   04:31   0:00 unicorn master (old) -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20616  6.9 11.1 478752 111876 ?       Sl   04:31   0:01 unicorn worker[0] -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20641  1.4  1.9 182480 19936 ?        Sl   04:31   0:00 unicorn master -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20656  7.3 11.0 478472 110800 ?       Sl   04:31   0:01 unicorn worker[0] -c /var/www/rails/pfc-master/current/config/unicorn.rb -E deployment -D
naota    20713  0.0  0.0 119432   928 pts/3    S+   04:31   0:00 grep --color=auto unicorn

試したこと

これらをしてからEC2を再起動

結果

結果的にはunicornのプロセスは1つになったが、どれが影響してそうなったのかわからない。 おそらくEC2の再起動だったと思うのだが、どの変更が再起動によって反映されたのかはわからないままだ。 ただ、ここまでの操作だけではアプリが表示されないままだった。

本当のエラー原因はNginxの設定ミスにあった

log/nginx.error.logを見てみると以下のようなエラー文が出ていた。

2020/10/11 19:53:14 [error] 17522#0: *48 open() "/usr/share/nginx/html/goform/webLogin" failed (2: No such file or directory), client: 213.202.223.223, server: _, request: "POST /goform/webLogin HTTP/1.1", host: "176.34.34.208:80", referrer: "http://176.34.34.208:80/login_inter.asp"

/etc/nginx/conf.d/pfc-master.confの設定にミスがあった。

upstream app_server {
  # sharedの中を参照するよう変更(/shared/tmp/sockets/unicorn.sock;)
  server unix:/var/www/rails/pfc-master/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name pfcmaster.work;

  # currentの中を参照するよう変更(/current/public;)
  root /var/www/rails/pfc-master/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    # currentの中を参照するよう変更(/current/public;)
    root /var/www/rails/pfc-master/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

#location @app { →1つ上にある@unicornと一致してないからダメだった
  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;

}

これでElasticIPでは表示できるようになった。 あとはドメイン名で表示できるようにする。

ドメイン名で表示できるようにする設定

config/deploy/production.rb /etc/nginx/conf.d/pfc-master.conf

これら2つのサーバー名の部分をElastic IPからドメイン名に変更して、これでドメイン名でアプリを表示できるようになった。

2つの疑問が残る

✅手動でのデプロイと自動デプロイはどこを変更したのか?→これはあとでQiita記事書きたい。

unicornのoldプロセスが残ってしまう問題はどうして解決できたのか? 下の3つのどれかが原因と思ったが、どれでもなかった。 config/unicorn/production.rb config/unicorn.rb lib/capistrano/tasks/unicorn.rb

ec2を再起動したから?

cookie(クッキー)とは?

はてなブログで記事を書こうと思ったら、「サードパーティーCookieが無効になっています」と表示された。
サードパーティーCookieはおろか、そもそもcookieすら理解していないので、調べてみた。

cookie(クッキー)とは?

cookie(クッキー)とは、あなたが見ているWebサイトからあなたのスマホやPCの中に保存される情報のことだ。そこにはサイトを訪れた日時や、訪問回数など、さまざまな内容が記録されている。

引用元: 初心者でもわかる『cookie(クッキー)』講座 危険性やスマホでの設定方法もズバリ解説

cookieの存在意義

cookieがあるとどのような意味があるのか?

cookieを使えば買い物の履歴や、ユーザーの関心や話題などをWebサイト側が知ることができるので、企業のマーケティングの解析にも大いに使われているのだ。

FacebookTwitterなど、IDとパスワードを入力して一度ログインしたサイトに、しばらくしてからもう一度アクセスするとIDとパスワードを入力しないでも、すんなり入ることができる。これはログイン情報が保存されたcookieのおかげだ。

cookieを有効にしていないと、うまくWebサイトが表示されなかったり、買い物ができなかったりという不便が生じる。インターネットバンキングの多くもcookieが有効になっていないと使用できない。

引用元: 初心者でもわかる『cookie(クッキー)』講座 危険性やスマホでの設定方法もズバリ解説

cookieの仕組み

cookieは文字情報なのでテキストファイルと変わらない。その仕様には厳格なルールがあり、Webサイト側はその範囲内で、どのような情報を書き込んで保存するかを決め、プログラミングしている。

ちなみにcookieがどんどん溜まっていって、スマホの空き容量が減っていくという心配は無用だ。文字情報であるcookieのファイルサイズはとても小さいので、スマホのメモリを圧迫することはない。

引用元: 初心者でもわかる『cookie(クッキー)』講座 危険性やスマホでの設定方法もズバリ解説

cookieのデメリット・リスクは?

cookieはそれをつくったWebサイトだけが読み込める仕組みになっているので、cookieが不正に盗まれて流用されたりする危険は、原理的にはない

他人にスマホを盗まれたら勝手に買い物をされてしまう可能性がある。防衛法はただひとつ。スマホにしっかりロックをかけて、第三者に不正に使われないようにしておくこと。

引用元: 初心者でもわかる『cookie(クッキー)』講座 危険性やスマホでの設定方法もズバリ解説

cookieとキャッシュの違い

cookieとキャッシュは混同しやすいが、両者はまったくの別もの。キャッシュとは、一度読み込んだWebページのデータを一時的に保存したもののことだ。同じページを再度表示するときに、この一時保存されたデータ、つまりキャッシュを使えば、いちいちWebサーバーと通信しなくてすむので素早く再表示されるというわけだ。

引用元: 初心者でもわかる『cookie(クッキー)』講座 危険性やスマホでの設定方法もズバリ解説