前提・実現したいこと
railsアプリケーションをCodePipeline,CodeBuild,CodeCommit,CodeDeploy を用いてデプロイしたい。
###解決したいこと
現在、Code4兄弟の使い方を習得するためにrailsアプリをデプロイしようとしています。
Codebuildでのbuildspec.ymlは成功するのですが、CodeDeployでのappspec.ymlを成功させることができません。
appspec.yml のAfterInstall フック の RAILS_ENV=production bundle exec rake db:migrate
でエラーが発生します。
下記に、 【該当すると考えられるエラー文】 , 【buildspec.yml】 , 【appspec.ymlとシェルスクリプト】 を載せます。
###該当すると考えられるエラー文
エラーログを見るためにcat /opt/codedeploy-agent/deployment-root/<deployment-group-ID>/<deployment-ID>/logs/scripts.log
を実行
2021-09-15 03:04:17 [stderr]ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
###buildspec.yml
yml
1version: 0.2 2 3phases: 4 5 install: 6 runtime-versions: 7 nodejs: 10 8 pre_build: 9 commands: 10 - rbenv install 2.5.9 11 - gem install bundler -v 1.17.3 12 - bundle install --path vendor/bundle 13artifacts: 14 files: 15 - './**/*' 16
###appspec.ymlとそれぞれのhookのシェルスクリプト
#####appspec.yml
yml
1version: 0.0 2os: linux 3files: 4 - source: / 5 destination: /var/www/<アプリ名> 6permissins: 7 - object: /var/www/ 8 pattern: '**' 9 mode: 775 10 owner: ec2-user 11 group: ec2-user 12hooks: 13 ApplicationStop: 14 - location: scripts/stop_server.sh 15 timeout: 300 16 runas: ec2-user 17 BeforeInstall: 18 - location: scripts/clean.sh 19 timeout: 300 20 runas: ec2-user 21 AfterInstall: 22 - location: scripts/after_install.sh 23 timeout: 300 24 runas: ec2-user 25 ApplicationStart: 26 - location: scripts/start_server.sh 27 timeout: 300 28 runas: ec2-user
#####stop_server.sh
#!/bin/bash kill -KILL -s QUIT `cat /var/www/<アプリ名>/tmp/pids/unicorn.pid`
#####clean.sh
#!/bin/bash sudo rm -rf /var/www/<アプリ名>/
#####after_install.sh
#!/bin/bash source ~/.bash_profile cd /var/www/<アプリ名> RAILS_ENV=production bundle exec rake assets:precompile RAILS_ENV=production bundle exec rake db:migrate
#####start_server.sh
source ~/.bash_profile cd /var/www/code4-product-register sudo systemctl reload nginx sudo systemctl start nginx bundle exec unicorn -D -E production -c config/unicorn.rb
###考察
EC2インスタンスの/etc/environment
の中に環境変数としてSECRET_KEY_BASE
を設定しています。railsアプリケーションはしっかり動いています。
それなのになぜsecret_key_base
が必要となるのかわかりません。
これを解決するには、Codebuild上でSECRET_KEY_BASE を$ EDITOR="vi" bin/rails credentials:edit
を行い環境変数を入力するのかと考えましたが、できそうにありません。
appspec.yml
の記述内容は対象のEC2インスタンス上で行うと認識しているのですが違うのでしょうか?
また、それぞれのシェルスクリプトにsource ~/.bash_profile
を書かなかった場合、bundle: command not found
というエラーが出たのも疑問に感じています。
もしよろしければご教授のほどお願いします。
あなたの回答
tips
プレビュー