Use environment variables in Rake task
Asked Answered
M

2

7
task :some_task, :environment do |t, args|
  puts Rails.env #=> development, production, etc
  puts ENV #=> {}
end

I set some environment variables (either via a local .env, or via Heroku Config via Herokusan), such as which AWS bucket to use, and I want to reference them in the rake task, but ENV is an empty hash. I know something related to environment gets done because of the :environment task dependency and that Rails.env has a value, but I'm not clear on the details.

So, how can I use ENV in a Rake task?

Manila answered 28/3, 2013 at 19:6 Comment(3)
How are you running this task? ENV is a core Ruby thing, so it should always reflect your available environmental variables.Bust
$ rake some_task in the app directory. Some of ENV is in .env, and I may need to do $ foreman run rake task for the Heroku stuff.Manila
@Manila you should answer this as an actual answer so I can upvote you. Doing $ foreman run rake some_task is the correct answerKelcey
M
6

Two good ways to do it:

Use Heroku's "Foreman" tool. Put all your environment variables into .env:

VAR=value

and run foreman run rake some_task.

Or (and, I'd recommend this way), using the "Figaro" gem. Put your vars into config/application.yml:

VAR: value

and that's it; rake some_task.

I'd recommend the latter, if only because rake figaro:heroku will push your env up as it's specified in application.yml

Manila answered 18/12, 2013 at 6:0 Comment(4)
I know this is an old question, but how does putting them in a .env file or application.yml keep your passwords / keys out of the codebase? I thought that was an important reason for using ENV variables. Isn't there some call we can make from Rake which will fetch them?Graziano
You (generally) don't check your application.yml or .env into the repo; that's what I meant by "codebase", and putting them directly into the host computer's ENV runs into its own issues. My question is basically asking for some call we can make from Rake, but I didn't find one.Manila
More experienced devs at my company decided to use this pattern: config = YAML.load("application.yml"), but they also decided not to explain why. YMMV; I use it in some situations (ie, sinatra) and not in others (ie, rails).Manila
Good to know. Thanks for the update. Sometimes a workaround is the best you can do.Graziano
A
2

Just in case somebody searches for another decision. I had a trouble getting ENV variable within rake task on production server. So I had application.yml file, but ENV['variable'] was just blank

My original command:

/usr/local/rvm/bin/rvm use 2.5.1 do bundle exec rake upload_source_maps_to_rollbar

Adding RAILS_ENV=production solved the issue:

RAILS_ENV=production /usr/local/rvm/bin/rvm use 2.5.1 do bundle exec rake upload_source_maps_to_rollbar
Adrenalin answered 20/8, 2023 at 5:26 Comment(1)
Thanks - this solved it for me! e.g. my line in Profile is now worker: PROCESS_TYPE=WORKER RAILS_ENV=production bundle exec rake service:startAvaricious

© 2022 - 2024 — McMap. All rights reserved.