class Fanforce::PluginFactory::CLI::Iron include Fanforce::PluginFactory::CLI::Utils require_gem 'iron_worker', 'iron_worker' attr_reader :plugin def initialize(plugin) @plugin = plugin end def workers_dir "#{plugin.dir}/workers" end def upload(environment, worker_filename=nil) return log "#{'Skipped '.format(:bold)} no workers folder was found" if !File.directory?(workers_dir) worker_filename = worker_filename.gsub('.worker', '') if worker_filename env = Fanforce::PluginFactory::CLI::Env.new(plugin) vars = env.vars(environment) || {} #factory_version = current_factory_version return puts "#{'Skipped '.format(:bold)} #{environment.to_s.titleize} is missing IRON_TOKEN and/or IRON_PROJECT_ID env variables" if vars['IRON_TOKEN'].blank? or vars['IRON_PROJECT_ID'].blank? # puts "#{'Updating Env'.format(:green,:bold)} #{environment.to_s.titleize}... and workers have #{vars.size} env variables" # env.push_to(environment, vars, true) iron_worker = IronWorker::Client.new(:token => vars['IRON_TOKEN'], :project_id => vars['IRON_PROJECT_ID']) Dir.chdir(workers_dir) do workers = Dir['*.rb'] return puts "#{'Skipped '.format(:bold)} #{environment.to_s.titleize} has 0 workers" if workers.size == 0 upload_processes = [] workers.each do |filename| next if worker_filename and !filename.include?(worker_filename) compile_worker(filename, environment) end upload_processes.each { |pid| Process.waitpid(pid) } end end def compile_worker(filename, environment) puts "#{'Compiling'.format(:green,:bold)} #{filename.gsub('.rb', '')} to #{environment.to_s.titleize}..." code_name = filename.gsub('.rb', '') absolute_dir = "#{workers_dir}/#{code_name}" relative_dir = "workers/#{code_name}" if !File.directory?(absolute_dir) puts "Creating #{relative_dir}/" Dir.mkdir(absolute_dir) end if File.exists?("#{plugin.dir}/Gemfile") and !File.exists?("#{absolute_dir}/Gemfile") puts "Copying /Gemfile to #{relative_dir}/Gemfile" contents = File.read("#{plugin.dir}/Gemfile").gsub("ruby '2.1.6'", "ruby '2.1.4'") File.open("#{absolute_dir}/Gemfile", 'w') {|f| f.write(contents) } end if File.directory?("#{plugin.dir}/lib") and !File.directory?("#{absolute_dir}/lib") puts "Copying /lib/ to #{relative_dir}/lib/" FileUtils.copy_entry("#{plugin.dir}/lib", "#{absolute_dir}/lib") end if File.directory?("#{plugin.dir}/mailers") and !File.directory?("#{absolute_dir}/mailers") puts "Copying /mailers/ to #{relative_dir}/mailers/" FileUtils.copy_entry("#{plugin.dir}/mailers", "#{absolute_dir}/mailers") end puts "Dockerizing #{File.expand_path(absolute_dir)}" puts `docker run --rm -v "#{File.expand_path(absolute_dir)}":/worker -w /worker iron/images:ruby-2.1 sh -c 'bundle install --standalone'` end def upload_worker(filename) # code_name = filename.gsub('.rb', '') # puts "#{'Uploading'.format(:green,:bold)} #{filename.gsub('.rb', '')} to #{environment.to_s.titleize}..." # # code = IronWorker::Code::Ruby.new(:workerfile => "#{plugin.dir}/workers/#{filename}") # code.gem('fanforce-plugin-factory', factory_version) # code.remote # code.name = code_name # code.file("#{plugin.dir}/workers/.env/#{environment}.rb", '.env') # # upload_processes << upload_iron_worker(iron_worker, code, filename, environment) end def current_factory_version `bundle list`.lines.each do |line| return $1 if line =~ /fanforce-plugin-factory \(([A-Za-z0-9.-]+)\)/ end error 'fanforce-plugin-factory version was not found in `bundle list`' end def upload_iron_worker(iron_worker, code, filename, environment) fork do begin iron_worker.codes.create(code, max_concurrency: 5) rescue Exception => e puts "#{'Aborted '.format(:red,:bold)} upload of #{filename.gsub('.worker', '')} to #{environment.to_s.titleize}..." puts e.message puts e.backtrace puts '' end end end end