★ AWSでサイト制作シリーズ
※ 「Railsでサイト制作」シリーズから「AWSでサイト制作」シリーズに改名しました😌
■ 今回のゴール
前回はAWS Cloud9でHello World するところまでできました。
何やら Git に push すると CodeStar が自動デプロイしてくれるらしい。
去年苦労して自動デプロイ環境を自作したけど、そんな必要はないらしい!素晴らしい!
今回はそこまでやってみまつ。
■ git add
$ git add .
$ git status
もしかして?と思って status したら tmp ファイルが大量にステージにあがってました。
あわててステージング取り消し。
$ git reset HEAD
■ .gitignore
.gitignore がなかったのねん。
世の中には .gitignore を生成してくれるサービスがあると知りました。
# Created by https://www.gitignore.io/api/rails
### Rails ###
*.rbc
capybara-*.html
.rspec
/log
/tmp
/db/*.sqlite3
/db/*.sqlite3-journal
/public/system
/coverage/
/spec/tmp
*.orig
rerun.txt
pickle-email-*.html
# TODO Comment out this rule if you are OK with secrets being uploaded to the repo
config/initializers/secret_token.rb
config/master.key
# Only include if you have production secrets in this file, which is no longer a Rails default
# config/secrets.yml
# dotenv
# TODO Comment out this rule if environment variables can be committed
.env
## Environment normalization:
/.bundle
/vendor/bundle
# these should all be checked in to normalize the environment:
# Gemfile.lock, .ruby-version, .ruby-gemset
# unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
.rvmrc
# if using bower-rails ignore default bower_components path bower.json files
/vendor/assets/bower_components
*.bowerrc
bower.json
# Ignore pow environment settings
.powenv
# Ignore Byebug command history file.
.byebug_history
# Ignore node_modules
node_modules/
# End of https://www.gitignore.io/api/rails
とりあえずこれをこのまま master ディレクトリ直下に置きました。
$ git add .
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
new file: .gitignore
new file: Gemfile.lock
modified: app/controllers/application_controller.rb
new file: bin/bundle
new file: bin/rails
new file: bin/rake
new file: bin/setup
new file: bin/update
new file: bin/yarn
modified: config/routes.rb
modified: log/development.log
よしよし、いい感じ。
■ git commit
$ git commit -m "Hello World"
[master 1d948ba] Hello World
Committer: EC2 Default User <ec2-user@ip-xxx-xx-xx-xx.ap-southeast-1.compute.internal>
Your name and email address were configured automatically based
on your username and hostname. Please check that they are accurate.
You can suppress this message by setting them explicitly:
git config --global user.name "Your Name"
git config --global user.email you@example.com
After doing this, you may fix the identity used for this commit with:
git commit --amend --reset-author
11 files changed, 526 insertions(+), 2 deletions(-)
create mode 100644 .gitignore
create mode 100644 Gemfile.lock
create mode 100755 bin/bundle
create mode 100755 bin/rails
create mode 100755 bin/rake
create mode 100755 bin/setup
create mode 100755 bin/update
create mode 100755 bin/yarn
git configしてなかったっす!
$ git config --global user.name "hitomi"
$ git config --global user.email xxx@xxx.xxx
あらためまして…
$ git commit -m "Hello World"
On branch master
Your branch is ahead of 'origin/master' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
■ git push
$ git push
Counting objects: 18, done.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (18/18), 5.70 KiB | 1.14 MiB/s, done.
Total 18 (delta 5), reused 0 (delta 0)
To https://xxxxx master -> master
■ Build失敗
本番環境の方で bundle install してないとかキャッシュがないとかの問題なのかなぁ?
よく分からないなりに CodeBuild を見に行くと、詳細なエラーメッセージが確認できました。
[Container] 2018/08/27 12:29:24 Phase complete: PRE_BUILD Success: false
[Container] 2018/08/27 12:29:24 Phase context status code: COMMAND_EXECUTION_ERROR Message: Error while executing command: rspec. Reason: exit status 1
◆ rspecがない?
rspec っていうコマンドがないからエラーになったよって意味かな。
やっぱ本番環境で bundle install してみたい。
※あとで判明しますが、自分で bundle install する必要はなかったみたいです😌
接続方法は去年まとめたから割愛。
$ cd /var/app/current/
$ bundle install
There was an error while trying to write to
`/var/app/current/.bundle/config`. It is likely that you need to
grant write permissions for that path.
/var/app/current/.bundle/config に書き込み許可を与えろって言ってる。
bundle install が正解かも分からないけど… やってみよ。
その前に今のパーミッションを確認。
$ cd .bundle/
$ ll
合計 4
-rw-r--r-- 1 webapp webapp 39 8月 27 08:49 config
変更前は-rw-r--r--ですね。失敗したらあとで戻そう。よし、変更。
$ chmod 666 config
chmod: `config' のパーミッションを変更しています: 許可されていない操作です
怒られたから sudo で通した。
$ sudo chmod 666 config
$ ll
合計 4
-rwxrw-r-- 1 webapp webapp 39 8月 27 08:49 config
$ bundle install
Using rake 12.3.1
Using concurrent-ruby 1.0.5
Using i18n 1.1.0
Using minitest 5.11.3
Using thread_safe 0.3.6
Using tzinfo 1.2.5
Using activesupport 5.2.0
Using builder 3.2.3
Using erubi 1.7.1
Using mini_portile2 2.3.0
Using nokogiri 1.8.4
Using rails-dom-testing 2.0.3
Using crass 1.0.4
Using loofah 2.2.2
Using rails-html-sanitizer 1.0.4
Using actionview 5.2.0
Using rack 2.0.5
Using rack-test 1.1.0
Using actionpack 5.2.0
Using nio4r 2.3.1
Using websocket-extensions 0.1.3
Using websocket-driver 0.7.0
Using actioncable 5.2.0
Using globalid 0.4.1
Using activejob 5.2.0
Using mini_mime 1.0.1
Using mail 2.7.0
Using actionmailer 5.2.0
Using activemodel 5.2.0
Using arel 9.0.0
Using activerecord 5.2.0
Using mimemagic 0.3.2
Using marcel 0.3.2
Using activestorage 5.2.0
Using bundler 1.16.0
Using coffee-script-source 1.12.2
Using execjs 2.7.0
Using coffee-script 2.4.1
Using method_source 0.9.0
Using thor 0.20.0
Using railties 5.2.0
Using coffee-rails 4.2.2
Using ffi 1.9.25
Using multi_json 1.13.1
Using jbuilder 2.7.0
Using jquery-rails 4.3.3
Using libv8 3.16.14.19 (x86_64-linux)
Using passenger 5.2.3
Using puma 3.7.0
Using sprockets 3.7.2
Using sprockets-rails 3.2.1
Using rails 5.2.0
Using rb-fsevent 0.10.3
Using rb-inotify 0.9.10
Using ref 2.0.0
Using sass-listen 4.0.0
Using sass 3.5.7
Using tilt 2.0.8
Using sass-rails 5.0.7
Using sqlite3 1.3.13
Using therubyracer 0.12.3
Using turbolinks-source 5.2.0
Using turbolinks 5.0.0
Using uglifier 4.1.10
Bundle complete! 19 Gemfile dependencies, 64 gems now installed.
Gems in the groups test and development were not installed.
Use `bundle info [gemname]` to see where a bundled gem is installed.
bundle install はできたけど、こんなやり方でいいのかなぁ?
これだと gem の追加や更新があるたびに bundle install しなきゃいけない気がする。
.gitignore にされてる /.bundle を消せばスムーズなのかしら。
でもわざわざ .gitignore されてる意味がある気もする。今後の課題ということで!
CodeStar に戻って Build 再試行してみましょ。
…全く同じエラーが出ました😂
そもそも bundle install したけど rspec は入ってるんでしょうか。
$ bundle info rspec
Could not find gem 'rspec'.
ないって言われてるじゃん!😭
ちなみに Cloud9 でも確認しましたが rspec は入ってなかったです。
あと、rspec って何者ですか?
RSpec(アールスペック)をご存知でしょうか?
RSpecは、RubyやRubyやRuby on Railsの代表的なテストツールのことで、クラスやメソッド単位でテストするために利用します。
https://www.sejuku.net/blog/47847
ふーん、テストツールか。
Gemfile になんて書かれているか確認。
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platform: :mri
gem 'rspec-rails', '3.7.2'
end
開発環境やテスト環境でのみ rspec-rails をインストールするみたいですね。
っていうか rspec-rails が正式名称なのかな?エラーで言われてる rspec とは別の話?
とりあえず rspec-rails が入ってるか再確認。
$ bundle info rspec-rails
* rspec-rails (3.7.2)
Summary: RSpec for Rails
Homepage: https://github.com/rspec/rspec-rails
Path: /usr/local/rvm/gems/ruby-2.4.1/gems/rspec-rails-3.7.2
$ bundle info rspec-rails
Could not find gem 'rspec-rails'.
Did you mean rspec-rails?
なるほど本番だと rspec-rails が入ってないですね。Gemfile の設定通り。
rspec-rails が入っていないことよりも本番なのに rspec が走ることが問題?
◆ rspec実行中にエラー?
もう一度よーくエラー文を読む。
Error while executing command: rspec
あ、これ「rspecがないよ」じゃなくて「rspec実行中にエラーだよ」って意味だw
bundle install は全く関係なかったかも?
その前に「PRE_BUILDが失敗したよ」って言ってる。
PRE ってことは本番にデプロイする前の、自動でやってるテスト環境のことなのかしら。
jenkins さんとか CircleCI みたいなことやってくれてるのかな。知らんけど。
そのへんの仕組みを調べましょ。
...調べ中...
どうやら buildspec.yml っていうファイルで Build の手順を書いてあるらしいです。
$ vi buildspec.yml
version: 0.2
phases:
install:
commands:
# Upgrade AWS CLI to the latest version
- pip install --upgrade awscli
# Install Ruby dependencies from the Gemfile.
- bundle install
pre_build:
commands:
# Set the SECRET_KEY_BASE environment variable for running tests
- export SECRET_KEY_BASE=$(rake secret)
# Run the tests using RSpec.
- rspec
post_build:
commands:
- aws cloudformation package --template template.yml --s3-bucket $S3_BUCKET --output-template-file template-export.yml
artifacts:
type: zip
files:
- template-export.yml
これ見ると bundle install してくれてますねw
さっきの bundle install は本当に無意味だったwww
そして post_build のところで rspec してますね。ここでコケてるのか。
予想だけど、rspecで必要なテスト用設定ファイルがないからコケてるとかかな?
ちょっと強引だけど、試しにコメントアウトしてみたらどうなるでしょうか。
# Run the tests using RSpec.
# - rspec //試しにコメントアウト
Cloud9 でコメントアウトしてコミット&pushしてみます。
$ git add .
$ git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: buildspec.yml
modified: log/development.log
$ git commit -m "rspecをためしにコメントアウト"
[master b69058d] rspecをためしにコメントアウト
2 files changed, 15 insertions(+), 1 deletion(-)
$ git push
Counting objects: 5, done.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (5/5), 574 bytes | 574.00 KiB/s, done.
Total 5 (delta 3), reused 0 (delta 0)
To https://xxxxx master -> master
■ 成功
今はまだ Hello World だけだからテスト必要ないけど、
のちのちは rspec をちゃんと調べて設定して、
buildspec.yml のコメントアウトももとに戻しましょう😌
★ AWSでサイト制作シリーズ
※ 「Railsでサイト制作」シリーズから「AWSでサイト制作」シリーズに改名しました😌