Question

I generated a skeleton application using Rails Composer and included Figaro. It runs successfully locally. Before I modify it, I am pushing it down to Heroku. However, the heroku run rake db:seed failed. I've come to find out that the app/config/application.yml is .gitignored. So, I need to use rake figaro:heroku to set the environment variables before I run heroku run rake db:seed. But, the rake Figaro:heroku is failing as follows:

D:\BitNami\rubystack-2.0.0-11\projects\myapp>rake figaro:heroku
 !    Usage: heroku config:set KEY1=VALUE1 [KEY2=VALUE2 ...]
 !    Must specify KEY and VALUE to set.

This looks like it is just ignoring my app/config/application.yml and asking for line directed input to me, but I don't know. Again, the application runs successfully locally, so that application.yml should be correct. Here it is:

MANDRILL_USERNAME: valid.address@gmail.com
MANDRILL_APIKEY: a.valid.apikey
ADMIN_NAME: Admin Name
ADMIN_EMAIL: valid.address@gmail.com
ADMIN_PASSWORD: validpassword
ROLES: [admin, user, VIP]

The failure occurs in seeds when I issue heroku run rake db:seed. The file is:

puts 'ROLES'
YAML.load(ENV['ROLES']).each do |role|
  Role.find_or_create_by_name(role)
  puts 'role: ' << role
end
puts 'DEFAULT USERS'
user = User.find_or_create_by_email :name => ENV['ADMIN_NAME'].dup, :email => ENV['ADMIN_EMAIL'].dup, :password => ENV['ADMIN_PASSWORD'].dup, :password_confirmation => ENV['ADMIN_PASSWORD'].dup
puts 'user: ' << user.name
user.confirm!
user.add_role :admin

It fails on the first access to variable role because ENV['ROLES'] is uninitialized. It would be initialized by application.yml, and is locally, but it is .gitignored. Thus, the need for rake Figaro:heroku to succeed.

This seems so simple, especially since it runs smoothly locally. OBTW, I have tried application.yml as shown and with the strings double-quoted but it doesn't seem to make a difference in any case so...

Ideas? Thanks...

Was it helpful?

Solution

I understand from the path you're mentioning that this is a Windows question. Problem is that the arrays are not correctly dealt with on Windows. Workaround I once made is to override the "vars" method of Heroku in a rake file in lib/tasks, like

module Figaro
  module Tasks
    class Heroku # < Struct.new(:app)
      def vars
        Figaro.env(environment).map { |key, value|
          if value.start_with? "["   
            value = "'#{value.gsub('"', '')}'"
          elsif value.include? " " 
            value = "'#{value}'" 
          end
          "#{key}=#{value}"
        }.sort.join(" ")
    end
    end
  end
end

OTHER TIPS

I'd surmise the problem will likely be with Figaro's processing of your different variable types:

MANDRILL_USERNAME: "valid.address@gmail.com"
MANDRILL_APIKEY: "a.valid.apikey"

ADMIN_NAME: "Admin Name"
ADMIN_EMAIL: "valid.address@gmail.com"
ADMIN_PASSWORD: "validpassword"

ROLES: ["admin", "user", "VIP"]

Try removing any spaces & ensuring you only send KEY: "VALUE" to Figaro. Your spaces are basically going to cause the system to misinterpret it

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top