Heroku 部署错误;预编译资产失败(注意 devise.rb 中的行)

Posted

技术标签:

【中文标题】Heroku 部署错误;预编译资产失败(注意 devise.rb 中的行)【英文标题】:Heroku deploy error; precompiling assets failed (noting line in devise.rb) 【发布时间】:2020-11-28 19:15:20 【问题描述】:

我的本​​地机器上似乎有一个工作应用程序,并实现了 google_oauth2 和 github oauth。但是,当我将 master 推送到 Heroku 时,它被拒绝,并显示一个错误,指出资产的预编译失败(并表明 devise.rb 有问题)。所以,我在本地运行了我的生产环境的预编译,并且完成了没有错误。然后我在 Heroku 上运行预编译并收到一个错误。我被难住了。

以下是日志的相关部分,显示将 master 推送到 Heroku 被拒绝:

remote:        Bundle completed (1.76s)
remote:        Cleaning up the bundler cache.
remote: -----> Installing node-v12.16.2-linux-x64
remote: -----> Installing yarn-v1.22.4
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
...
remote:        rake aborted!
remote:        NoMethodError: undefined method `[]' for nil:NilClass
remote:        /tmp/build_ae858012/config/initializers/devise.rb:276:in `block in <main>'
remote:        /tmp/build_ae858012/vendor/bundle/ruby/2.7.0/gems/devise-4.7.2/lib/devise.rb:307:in `setup'
remote:        /tmp/build_ae858012/config/initializers/devise.rb:11:in `<main>'
...

remote:  !
remote:  !     Precompiling assets failed.
remote:  !
remote:  !     Push rejected, failed to compile Ruby app.
remote: 
remote:  !     Push failed
remote: Verifying deploy...
remote: 
remote: !       Push rejected to aristutor.
remote: 
To https://git.heroku.com/aristutor.git
 ! [remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'https://git.heroku.com/aristutor.git'

当我尝试在 Heroku 上预编译资产时(在本地成功预编译后),以下是日志的相关部分(带有跟踪):

Everything's up-to-date. Nothing to do
rabs-MacBook-Pro-2:lms rab$ heroku run RAILS_ENV=production rake assets:precompile --trace
Running RAILS_ENV=production rake assets:precompile --trace on ⬢ aristutor... up, run.1642 (Free)
** Invoke assets:precompile (first_time)
** Invoke assets:environment (first_time)
** Execute assets:environment
** Invoke environment (first_time)
** Execute environment
** Invoke yarn:install (first_time)
** Invoke webpacker:yarn_install (first_time)
** Execute webpacker:yarn_install
yarn install v1.22.4
[1/4] Resolving packages...
[2/4] Fetching packages...
...
remote:        Bundle complete! 39 Gemfile dependencies, 99 gems now installed.
remote:        Gems in the groups development and test were not installed.
remote:        Bundled gems are installed into `./vendor/bundle`
remote:        Removing bundler (2.0.2)
remote:        Bundle completed (1.76s)
remote:        Cleaning up the bundler cache.
remote: -----> Installing node-v12.16.2-linux-x64
remote: -----> Installing yarn-v1.22.4
remote: -----> Detecting rake tasks
remote: -----> Preparing app for Rails asset pipeline
remote:        Running: rake assets:precompile
remote:        rake aborted!
remote:        NoMethodError: undefined method `[]' for nil:NilClass
remote:        /tmp/build_ae858012/config/initializers/devise.rb:276:in `block in <main>'
remote:        /tmp/build_ae858012/vendor/bundle/ruby/2.7.0/gems/devise-4.7.2/lib/devise.rb:307:in `setup'
remote:        /tmp/build_ae858012/config/initializers/devise.rb:11:in `<main>'

我昨天刚刚让omniauth 为google_oauth2 和github 登录工作。这一切似乎都在我的本地机器上运行。 重要的是,当我在 devise.rb 中注释掉以下行时,我能够成功推送到 Heroku(但我不知道这些行是什么导致资产无法在 Heroku 上预编译) :

  config.omniauth :github, Rails.application.credentials[:github][Rails.env.to_sym][:client_id], Rails.application.credentials[:github][Rails.env.to_sym][:client_secret], scope: 'user,public_repo'
  config.omniauth :google_oauth2, Rails.application.credentials.dig(:google_oauth2, :client_id), Rails.application.credentials.dig(:google_oauth2, :client_secret), 

编辑:我刚刚发现是第二行(:google_oauth2 行)导致了问题。将其注释掉后,对 Heroku 的推送就成功了。

我认为在检索客户端 ID 和机密时没有任何错误 - 我在 rails 控制台中测试了这些语句,它们返回了正确的值。

任何帮助将不胜感激。

【问题讨论】:

你检查过生产环境的rails控制台吗? :D 是的。而且,我刚刚发现导致问题的是第二行(config.omniauth :google ...)。当它被注释掉时,推送到 Heroku 成功。当第一行注释掉时,同样的错误。我将编辑我的帖子以更新它。 有趣,你有没有注意到获取凭证值的方法是两行之间的差异 是的,但是让我再次调整它们,看看是否有什么不同。 你确定这是 google auth 行吗?当您取消引用嵌套哈希并且缺少父键时,该错误是我所期望的。我只是将您的代码放入我的应用程序中(没有创建匹配的键)。 google_oauth 行静默失败,但 GitHub 行给出了与您看到的相同的错误。 【参考方案1】:

我未能在 Heroku 环境变量设置中设置主密钥。

【讨论】:

以上是关于Heroku 部署错误;预编译资产失败(注意 devise.rb 中的行)的主要内容,如果未能解决你的问题,请参考以下文章

推送到 heroku 时出现“预编译资产失败”错误

预编译资产失败的 Rails

使用 webpack 部署到 Heroku 时预编译资产时出错

远程:!预编译资产失败。在heroku上(Rails 6和语义UI)

Rails 4 Heroku 资产:预编译失败

Capistrano在部署时失败:资产:使用SSHKit预编译:: Command :: Failed:rake退出状态:1