Heroku и MongoDB обеспечивают рабочий процесс без трений devops, которого хочет каждая зрелая организация программного обеспечения, и тратят кучу денег. Он начинается с установки для одного разработчика, в которой я могу получить исходный код и быть готовым начать разработку после установки пакета, и продолжить с помощью git push в промежуточную среду Heroku, которая развертывает приложение для тестирования интеграции в последнюю минуту и, наконец, , производство. Каждый отдельный экземпляр Heroku имеет свою конфигурацию и ресурсы. Мой код также нуждается в разумных настройках по умолчанию для разработки. Например, mongoid.yml перечисляет localhost: 27017 в качестве хоста базы данных разработки и ENV [‘MONGOHQ_HOST_LIST’] для производства.
Тем не менее, в настоящих разработчиках я хочу иметь возможность программно получать доступ к удаленной среде, запускать команды удаленно или соединять две среды вместе, если у нас есть доступ к ним. В этом посте я предлагаю выполнить три задачи, которые стали частью повседневной жизни одного из моих проектов.
- Выполните задачу Rake с изменениями локального кода и настройкой производственной среды.
- Откройте оболочку для основного узла MongoDB в моей среде разработки Heroku.
- Перед тем как сделать что-то страшное, создайте дамп отдельной таблицы из производственной базы данных.
Мы выполним вышесказанное с помощью двух новых драгоценных камней: mongoid-shell и heroku-commander . Добавьте их в свой Gemfile в разделе : development .
И, пожалуйста, помните, что с большой силой (и словом «производство» во многих из последующих) приходит большая ответственность.
Выполните задачу Rake с изменениями локального кода и настройкой производственной среды.
Это стало возможным благодаря героку-командиру . Библиотека обернет CLI Heroku (введение здесь ) и запустит конфигурацию heroku . Теперь легко получить доступ к приложению Heroku и получить его конфигурацию программно, не беспокоясь о ключах API (по умолчанию оно будет использовать приложение Heroku, определенное с помощью пульта GIT «heroku»). Нам также понадобится немного кода, чтобы применить соглашение об именах нашего приложения. Это позволяет мне изменить среду выполнения на среду удаленного приложения Heroku в Ruby.
module Heroku
class Config < Hash
def self.set_env_from!(env)
app = case env.to_sym
when :heroku, :development then nil
else "app-#{env}"
end
require 'heroku-commander'
config = Heroku::Commander.new({ :app => app }).config
config.each do |k, v|
ENV[k] = v
end
end
end
end
Итак, как мне запустить задачу локально, но настроить как производственную ? Со следующей задачей Rake.
namespace :heroku do
desc "Load environment vars from Heroku config into ENV."
task :config_from_env do
env = ENV['RAILS_ENV'] || Rails.env
raise "RAILS_ENV or Rails.env must be specified" unless env
Heroku::Config.set_env_from! env
end
end
Запустите RAILS_ENV = производственные грабли герою: config_from_env my: task .
Откройте оболочку для основного узла MongoDB в моей среде разработки Heroku.
Сначала выясните конфигурацию удаленного MongoDB, затем выполните команду оболочки mongo . Важно знать, что встроенная системная команда не вызывает ошибку, когда процесс возвращает ненулевой код состояния. Давайте добавим систему! функция, которая исправляет это.
def system!(cmdline)
logger.info("[#{Time.now}] #{cmdline}")
rc = system(cmdline)
fail "failed with exit code #{$?.exitstatus}" if (rc.nil? || ! rc || $?.exitstatus != 0)
end
Вместо того, чтобы создавать командные строки MongoDB вручную, я использовал новый гем под названием mongoid-shell (введение здесь ).
namespace :db do
[ :staging, :production, :heroku ].each do |env|
namespace env do
task :shell do
require 'mongoid-shell'
Heroku::Config.set_env_from!(env)
config = File.join(Rails.root, "config/mongoid.yml")
Mongoid.load! config, env
system! Mongoid::Shell::Commands::Mongo.new.to_s
end
end
end
end
Запустите грабли db: production: shell .
Перед тем как сделать что-то страшное, создайте дамп отдельной таблицы из производственной базы данных.
Мы все делаем резервные копии и другие важные вещи, ежедневно. Но при манипулировании производственными данными я хочу иметь последнюю защиту с самыми свежими данными из коллекции, которую я собираюсь
. Дамп коллекции MongoDB локально.
случайно удалить
namespace :db do
[ :production, :staging, :heroku ].each do |env|
namespace env do
task :dump, [ :collections ] => :environment do |t, args|
require 'mongoid-shell'
Heroku::Config.set_env_from!(env)
config = File.join(Rails.root, "config/mongoid.yml")
Mongoid.load! config, env
collections = args[:collections].split(/[\s|,]+/)
collections.each do |collection|
system! Mongoid::Shell::Commands::Mongodump.new({ collection: collection }).to_s
end
end
end
end
end
Точки
Спасибо @joeyAghion и @fancyremarker , которые отвечают за многие из основных концепций, описанных выше.