11require "eb_fast_deploy/version"
2+ require 'aws-sdk'
3+ require 'dotenv/environment'
24
35def do_cmd ( cmd )
46 print "- - - cmd: #{ cmd } \n "
@@ -10,15 +12,26 @@ def set_vars
1012 ENV [ 'EB_TARGET' ] = ( ENV [ 'EB_TARGET' ] || "STAGE" ) . upcase
1113 @eb_environment = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _ENVIRONMENT" ]
1214 @application_name = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _APPLICATION_NAME" ]
13- ENV [ 'AWS_ACCESS_KEY_ID' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _AWS_ACCESS_KEY_ID" ]
14- ENV [ 'AWS_SECRET_ACCESS_KEY' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _AWS_SECRET_ACCESS_KEY" ]
15+ # ENV['AWS_ACCESS_KEY_ID']= ENV["EB_#{ENV['EB_TARGET']}_AWS_ACCESS_KEY_ID"]
16+ # ENV['AWS_SECRET_ACCESS_KEY'] = ENV["EB_#{ENV['EB_TARGET']}_AWS_SECRET_ACCESS_KEY"]
1517 ENV [ 'EB_ELASTICBEANSTALK_URL' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _ELASTICBEANSTALK_URL" ]
1618 ENV [ 'FOG_DIRECTORY' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _FOG_DIRECTORY" ]
1719 ENV [ 'FOG_DEPLOY_DIRECTORY' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _FOG_DEPLOY_DIRECTORY" ]
1820 @deploy_tmp_dir = "/home/vagrant/tmp/holden-fandom_for_deploy"
1921 @deploy_zip_file_path = "/home/vagrant/tmp/holden-fandom_for_deploy.zip"
2022 @aws_credential_file = "#{ Rails . root } /tmp/aws_credential_file"
2123
24+ @env_file_path = Rails . root . to_s +"/config/eb_environments/#{ ENV [ 'ENVIRONMENT' ] } /ruby_container_options"
25+ if File . exists? ( @env_file_path )
26+ @eb_env = Dotenv ::Environment . new ( @env_file_path )
27+ end
28+
29+ AWS . config (
30+ access_key_id : ENV [ 'AWS_ACCESS_KEY_ID' ] ,
31+ secret_access_key : ENV [ 'AWS_SECRET_ACCESS_KEY' ] ,
32+ region : ENV [ 'FOG_REGION' ]
33+ )
34+
2235 print "--- setting ENV ---\n "
2336 print "ENV['EB_TARGET']: #{ ENV [ 'EB_TARGET' ] } \n "
2437 print "ENV['AWS_ACCESS_KEY_ID']=#{ ENV [ 'AWS_ACCESS_KEY_ID' ] } \n "
@@ -30,6 +43,14 @@ def set_vars
3043 print
3144end
3245
46+ def rails_options
47+ opts = [ ]
48+ @eb_env . each do |k , v |
49+ opts << { :namespace => "aws:elasticbeanstalk:application:environment" , :option_name => k , :value => v }
50+ end
51+ opts
52+ end
53+
3354namespace :eb do
3455 desc "assets compile and upload to S3"
3556 task :assets do
@@ -121,12 +142,10 @@ def set_vars
121142
122143 desc "publish to elastic beanstalk"
123144 task :publish do
124- AWS . config (
125- access_key_id : ENV [ 'AWS_ACCESS_KEY_ID' ] ,
126- secret_access_key : ENV [ 'AWS_SECRET_ACCESS_KEY' ] ,
127- region : ENV [ 'FOG_REGION' ]
128- )
129- version_label = "#{ Time . now } "
145+ set_vars unless @eb_environment
146+
147+ sha1 = do_cmd "git log | head -1|cut -d \" \" -f2"
148+ version_label = "#{ Time . now } -git-#{ sha1 } "
130149 aws_app_opt = {
131150 application_name : @application_name ,
132151 description : "deploy" ,
@@ -169,5 +188,75 @@ def set_vars
169188 Rake ::Task [ 'eb:cleanup' ] . invoke
170189
171190 end
191+
192+ desc "create application on Elastic Beanstalk"
193+ task :create_eb_application do
194+ set_vars unless @eb_environment
195+
196+ [ 'AWS_ACCESS_KEY_ID' , 'AWS_SECRET_ACCESS_KEY' , 'FOG_REGION' , 'APP_NAME' ] . each do |opt |
197+ if ENV [ opt ] . nil?
198+ puts "(Error) #{ opt } not defined"
199+ exit
200+ end
201+ end
202+
203+ apps = AWS . elastic_beanstalk . client . describe_applications ( :application_names => [ ENV [ 'APP_NAME' ] ] )
204+
205+ if apps [ :applications ] . empty?
206+ opts = { }
207+ opts [ :application_name ] = ENV [ 'APP_NAME' ]
208+ opts [ :description ] = ENV [ 'APP_DESC' ] unless ENV [ 'APP_DESC' ] . nil?
209+ AWS . elastic_beanstalk . client . create_application ( opts )
210+ else
211+ print "(Warning) Application \" #{ ENV [ 'APP_NAME' ] } \" already exists"
212+ end
213+ end
214+
215+ desc "create environment on Elastic Beanstalk"
216+ task :create_eb_environment do
217+ set_vars unless @eb_environment
218+ Rake ::Task [ 'eb:create_eb_application' ] . invoke
219+ envs = AWS . elastic_beanstalk . client . describe_environments ( :application_name => ENV [ 'APP_NAME' ] , :environment_names => [ ENV [ 'ENVIRONMENT' ] ] )
220+
221+ if envs [ :environments ] . empty?
222+ #TODO: aggiungere i parametri per RDS, ELB, etc
223+ AWS . elastic_beanstalk . client . create_environment ( :application_name => ENV [ 'APP_NAME' ] ,
224+ :environment_name => ENV [ 'ENVIRONMENT' ] ,
225+ :solution_stack_name => ENV [ 'STACK' ] ,
226+ :option_settings => rails_options )
227+ puts "(Info) Environment \" #{ ENV [ 'ENVIRONMENT' ] } \" created"
228+ else
229+ puts "(Warning) Environment \" #{ ENV [ 'ENVIRONMENT' ] } \" already exists"
230+ end
231+ end
232+
233+ desc "update environment on Elastic Beanstalk"
234+ task :update_eb_environment do
235+ set_vars unless @eb_environment
236+ RAILS_DEFAULT_OPTIONS_KEYS = [ :AWS_ACCESS_KEY_ID , :AWS_SECRET_KEY , :BUNDLE_WITHOUT , :PARAM1 , :PARAM2 , :RACK_ENV , :RAILS_SKIP_ASSET_COMPILATION , :RAILS_SKIP_MIGRATIONS ]
237+ envs = AWS . elastic_beanstalk . client . describe_environments ( :application_name => ENV [ 'APP_NAME' ] , :environment_names => [ ENV [ 'ENVIRONMENT' ] ] )
238+ unless envs [ :environments ] . empty?
239+ rails_options_keys = rails_options . map { |opt | opt [ :option_name ] }
240+ env_config = AWS . elastic_beanstalk . client . describe_configuration_settings ( :application_name => ENV [ 'APP_NAME' ] , :environment_name => ENV [ 'ENVIRONMENT' ] )
241+ options_to_remove = env_config [ :configuration_settings ] . first [ :option_settings ] . select do |opt |
242+ opt [ :namespace ] == "aws:elasticbeanstalk:application:environment" and !rails_options_keys . include? ( opt [ :option_name ] ) and !RAILS_DEFAULT_OPTIONS_KEYS . include? ( opt [ :option_name ] . to_sym )
243+ end
244+
245+ options_to_remove . each { |opt | puts "(Info) options removed:#{ opt [ :option_name ] } =#{ opt [ :value ] } " }
246+
247+ options_to_remove . each { |opt | opt . delete ( :value ) }
248+
249+ AWS . elastic_beanstalk . client . update_environment ( :environment_name => ENV [ 'ENVIRONMENT' ] ,
250+ :option_settings => rails_options ,
251+ :options_to_remove => options_to_remove )
252+
253+ new_env_config = AWS . elastic_beanstalk . client . describe_configuration_settings ( :application_name => ENV [ 'APP_NAME' ] , :environment_name => ENV [ 'ENVIRONMENT' ] )
254+ puts "New env config"
255+ new_env_config [ :configuration_settings ] . first [ :option_settings ] . each { |opt | puts "(Info) #{ opt [ :option_name ] } =#{ opt [ :value ] } " if opt [ :namespace ] == "aws:elasticbeanstalk:application:environment" }
256+ puts " ----- END ----- "
257+ else
258+ puts "(Warning) Environment \" #{ ENV [ 'ENVIRONMENT' ] } \" doesn't exist"
259+ end
260+ end
172261end
173262
0 commit comments