11require "eb_fast_deploy/version"
22require 'aws-sdk'
33require 'dotenv/environment'
4+ require 'fog'
45
56def do_cmd ( cmd )
67 print "- - - cmd: #{ cmd } \n "
@@ -9,70 +10,65 @@ def do_cmd(cmd)
910end
1011
1112def set_vars
12- ENV [ 'EB_TARGET' ] = ( ENV [ 'EB_TARGET' ] || "STAGE" ) . upcase
13- @eb_environment = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _ENVIRONMENT" ]
14- @application_name = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _APPLICATION_NAME" ]
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"]
17- ENV [ 'EB_ELASTICBEANSTALK_URL' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _ELASTICBEANSTALK_URL" ]
18- ENV [ 'FOG_DIRECTORY' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _FOG_DIRECTORY" ]
19- ENV [ 'FOG_DEPLOY_DIRECTORY' ] = ENV [ "EB_#{ ENV [ 'EB_TARGET' ] } _FOG_DEPLOY_DIRECTORY" ]
20- @deploy_tmp_dir = "/home/vagrant/tmp/holden-fandom_for_deploy"
21- @deploy_zip_file_path = "/home/vagrant/tmp/holden-fandom_for_deploy.zip"
22- @aws_credential_file = "#{ Rails . root } /tmp/aws_credential_file"
13+ return if @is_config_loaded
14+ puts "-------------------------------------------------------------"
15+
16+ @is_config_loaded = true
17+
18+ sha1 = `git log | head -1|cut -d \" \" -f2`
19+ sha1 = sha1 . gsub ( "\n " , "" )
20+ @version_label = "#{ Time . now . to_i } -git-#{ sha1 } "
21+ dirname = "#{ ENV [ 'APP_NAME' ] . gsub ( ' ' , '' ) } _#{ ENV [ 'ENVIRONMENT' ] . gsub ( ' ' , '' ) } "
22+
23+ @deploy_tmp_dir = ENV [ 'COPY_CACHE' ] || "/tmp/#{ dirname } _eb_deploy"
24+ @deploy_zip_filename = "#{ dirname } _#{ @version_label } .zip"
25+ @deploy_zip_file_path = "#{ @deploy_tmp_dir } /#{ @deploy_zip_filename } "
26+
27+ puts "dirname: #{ dirname } "
28+ puts "version_label: #{ @version_label } "
29+ puts "@deploy_tmp_dir: #{ @deploy_tmp_dir } "
30+ puts "@deploy_zip_filename: #{ @deploy_zip_filename } "
31+ puts "@deploy_zip_file_path: #{ @deploy_zip_file_path } "
2332
2433 @env_file_path = Rails . root . to_s +"/config/eb_environments/#{ ENV [ 'ENVIRONMENT' ] } /ruby_container_options"
2534 if File . exists? ( @env_file_path )
26- @eb_env = Dotenv ::Environment . new ( @env_file_path )
35+ @eb_ruby_container_options = Dotenv ::Environment . new ( @env_file_path )
2736 end
2837
2938 AWS . config (
3039 access_key_id : ENV [ 'AWS_ACCESS_KEY_ID' ] ,
3140 secret_access_key : ENV [ 'AWS_SECRET_ACCESS_KEY' ] ,
32- region : ENV [ 'FOG_REGION ' ]
41+ region : ENV [ 'AWS_REGION ' ]
3342 )
34-
35- print "--- setting ENV ---\n "
36- print "ENV['EB_TARGET']: #{ ENV [ 'EB_TARGET' ] } \n "
37- print "ENV['AWS_ACCESS_KEY_ID']=#{ ENV [ 'AWS_ACCESS_KEY_ID' ] } \n "
38- print "ENV['AWS_SECRET_ACCESS_KEY']=#{ ENV [ 'AWS_SECRET_ACCESS_KEY' ] } \n "
39- print "ENV['FOG_DIRECTORY']=#{ ENV [ 'FOG_DIRECTORY' ] } \n "
40- print "ENV['FOG_DEPLOY_DIRECTORY']=#{ ENV [ 'FOG_DEPLOY_DIRECTORY' ] } \n "
41- print "@eb_environment: #{ @eb_environment } \n "
42- print "@aws_credential_file: #{ @aws_credential_file } \n "
43- print
4443end
4544
4645def rails_options
4746 opts = [ ]
48- @eb_env . each do |k , v |
47+ @eb_ruby_container_options . each do |k , v |
4948 opts << { :namespace => "aws:elasticbeanstalk:application:environment" , :option_name => k , :value => v }
5049 end
5150 opts
5251end
5352
5453namespace :eb do
54+ desc "setvars"
55+ task :setvars do
56+ set_vars
57+ end
58+
5559 desc "assets compile and upload to S3"
5660 task :assets do
57- set_vars unless @eb_environment
61+ set_vars
5862
59- do_cmd "rake assets:precompile FOG_DIRECTORY=#{ ENV [ 'FOG_DIRECTORY' ] } AWS_ACCESS_KEY_ID=#{ ENV [ 'AWS_ACCESS_KEY_ID' ] } AWS_SECRET_ACCESS_KEY=#{ ENV [ 'AWS_SECRET_ACCESS_KEY' ] } "
60- do_cmd "mv public/assets/manifest.yml tmp/"
61- do_cmd "rm public/assets/* -Rf"
62- do_cmd "mv tmp/manifest.yml public/assets/"
63+ do_cmd "rake assets:precompile"
6364 end
6465
6566 desc "bundle pack"
6667 task :bundle_pack do
67- set_vars unless @eb_environment
68-
69- do_cmd "rm vendor/cache -Rf"
70- do_cmd "bundle install"
68+ set_vars
7169
72- #gems
73- #call "bundle pack --all" from shell before this rake
74- #because it doesn't pach git gems
75- do_cmd "bundle pack --all"
70+ do_cmd "env RUBYOPT= bundle package --all"
71+ # do_cmd "bundle install"
7672
7773 end
7874
@@ -81,7 +77,7 @@ def rails_options
8177 print "=== upload project to s3 ===\n "
8278 print "\n "
8379
84- set_vars unless @eb_environment
80+ set_vars
8581
8682 do_cmd "mkdir #{ @deploy_tmp_dir } "
8783 do_cmd "rm #{ @deploy_zip_file_path } "
@@ -90,20 +86,20 @@ def rails_options
9086 current_dir = `pwd`
9187 do_cmd "cd #{ @deploy_tmp_dir } && zip -r #{ @deploy_zip_file_path } . && cd #{ pwd } "
9288
93- print "storage = Fog::Storage.new provider: #{ ENV [ 'FOG_PROVIDER' ] } , aws_access_key_id: #{ ENV [ 'AWS_ACCESS_KEY_ID' ] } , aws_secret_access_key: #{ ENV [ 'AWS_SECRET_ACCESS_KEY' ] } \n "
89+ print "storage = Fog::Storage.new provider: AWS , aws_access_key_id: #{ ENV [ 'AWS_ACCESS_KEY_ID' ] } , aws_secret_access_key: #{ ENV [ 'AWS_SECRET_ACCESS_KEY' ] } \n "
9490 storage = Fog ::Storage . new ( {
95- provider : ENV [ 'FOG_PROVIDER' ] ,
96- region : ENV [ 'FOG_REGION ' ] ,
91+ provider : 'AWS' ,
92+ region : ENV [ 'AWS_REGION ' ] ,
9793 aws_access_key_id : ENV [ 'AWS_ACCESS_KEY_ID' ] ,
9894 aws_secret_access_key : ENV [ 'AWS_SECRET_ACCESS_KEY' ]
9995 } )
100- print "bucket = storage.directories.get(#{ ENV [ 'FOG_DEPLOY_DIRECTORY ' ] } )\n "
101- bucket = storage . directories . get ( ENV [ 'FOG_DEPLOY_DIRECTORY ' ] )
96+ print "bucket = storage.directories.get(#{ ENV [ 'AWS_DEPLOY_BUCKET ' ] } )\n "
97+ bucket = storage . directories . get ( ENV [ 'AWS_DEPLOY_BUCKET ' ] )
10298
10399 if File . exist? @deploy_zip_file_path
104100 print "creating new remote file..."
105101 deploy_zip_file = File . open @deploy_zip_file_path , "r"
106- remote_file = bucket . files . new key : "prj.zip" , body : deploy_zip_file
102+ remote_file = bucket . files . new key : @deploy_zip_filename , body : deploy_zip_file
107103 result = remote_file . save
108104 print "remote_file.save: #{ result } \n "
109105 else
@@ -112,97 +108,62 @@ def rails_options
112108
113109 end
114110
115- desc "disable memcache"
116- task :disable_memcache do
117- #assets precompile run in production env and search for memcache server
118- do_cmd "sed -i 's/^ elasticache/# elasticache/' #{ Rails . root } /config/environments/production.rb"
119- do_cmd "sed -i 's/^ config.cache_store/# config.cache_store/' #{ Rails . root } /config/environments/production.rb"
120- end
121-
122- desc "elastic beanstalk config"
123- task :cfg do
124- set_vars unless @eb_environment
125-
126- #create temporary aws_credentials file
127- f = File . new ( @aws_credential_file , "w+" )
128-
129- content = ""
130- content << "AWSAccessKeyId=#{ ENV [ 'AWS_ACCESS_KEY_ID' ] } \n "
131- content << "AWSSecretKey=#{ ENV [ 'AWS_SECRET_ACCESS_KEY' ] } \n "
132- f . write content
133- f . close
134-
135- #eb cfg
136- eb_cfg_path = "#{ Rails . root } /.elasticbeanstalk/config"
137- f = File . new ( eb_cfg_path , "a+" )
138-
139- f . write "ApplicationName=#{ @application_name } \n "
140- f . close
141- end
142-
143111 desc "publish to elastic beanstalk"
144- task :publish do
145- set_vars unless @eb_environment
112+ task :create_and_deploy_version do
113+ set_vars
146114
147- sha1 = do_cmd "git log | head -1|cut -d \" \" -f2"
148- version_label = "#{ Time . now } -git-#{ sha1 } "
149115 aws_app_opt = {
150116 application_name : @application_name ,
151- description : "deploy" ,
117+ # description: "deploy",
152118 source_bundle : {
153- s3_bucket : ENV [ 'FOG_DEPLOY_DIRECTORY ' ] ,
154- s3_key : "prj.zip"
119+ s3_bucket : ENV [ 'AWS_DEPLOY_BUCKET ' ] ,
120+ s3_key : @deploy_zip_filename
155121 } ,
156- version_label : version_label
122+ version_label : @ version_label
157123 }
158124
159125 aws_env_opt = {
160- environment_name : @eb_environment ,
161- version_label : version_label
126+ environment_name : ENV [ 'ENVIRONMENT' ] ,
127+ version_label : @ version_label
162128 }
163129
164130 eb = AWS . elastic_beanstalk
165131 eb . client . create_application_version aws_app_opt
166132 eb . client . update_environment aws_env_opt
167133 end
168134
169- desc "clean modified files"
170- task :cleanup do
171- File . delete ( @aws_credential_file ) if File . exist? ( @aws_credential_file )
172- do_cmd "git checkout .elasticbeanstalk/config"
173- do_cmd "git checkout config/environments/production.rb"
174- # do_cmd "rm vendor/cache -Rf"
175- end
176-
177135 desc "deploy to elastic beanstalk"
178- task :deploy do
136+ task :deploy => [
137+ :assets ,
138+ :bundle_pack ,
139+ :upload ,
140+ :update_eb_environment ,
141+ :create_and_deploy_version
142+ ] do
179143 set_vars
180-
144+ =begin
181145 print "=== deploy to elastic beanstalk ===\n\n"
182146
183- # Rake::Task['eb:cfg'].invoke
184147 Rake::Task['eb:assets'].invoke
185148 Rake::Task['eb:bundle_pack'].invoke
186149 Rake::Task['eb:upload'].invoke
187150 Rake::Task['eb:publish'].invoke
188151 Rake::Task['eb:cleanup'].invoke
189-
152+ =end
190153 end
191154
192155 desc "create application on Elastic Beanstalk"
193156 task :create_eb_application do
194- set_vars unless @eb_environment
157+ set_vars
195158
196- [ 'AWS_ACCESS_KEY_ID' , 'AWS_SECRET_ACCESS_KEY' , 'FOG_REGION ' , 'APP_NAME' ] . each do |opt |
159+ [ 'AWS_ACCESS_KEY_ID' , 'AWS_SECRET_ACCESS_KEY' , 'AWS_REGION ' , 'APP_NAME' ] . each do |opt |
197160 if ENV [ opt ] . nil?
198161 puts "(Error) #{ opt } not defined"
199162 exit
200163 end
201164 end
202165
203- apps = AWS . elastic_beanstalk . client . describe_applications ( :application_names => [ ENV [ 'APP_NAME' ] ] )
204-
205- if apps [ :applications ] . empty?
166+ unless app_exists?
206167 opts = { }
207168 opts [ :application_name ] = ENV [ 'APP_NAME' ]
208169 opts [ :description ] = ENV [ 'APP_DESC' ] unless ENV [ 'APP_DESC' ] . nil?
@@ -212,12 +173,16 @@ def rails_options
212173 end
213174 end
214175
176+ def app_exists?
177+ apps = AWS . elastic_beanstalk . client . describe_applications ( :application_names => [ ENV [ 'APP_NAME' ] ] )
178+ !apps [ :applications ] . empty?
179+ end
180+
215181 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
182+ task :create_eb_environment => :create_eb_application do
183+ set_vars
219184 envs = AWS . elastic_beanstalk . client . describe_environments ( :application_name => ENV [ 'APP_NAME' ] , :environment_names => [ ENV [ 'ENVIRONMENT' ] ] )
220-
185+
221186 if envs [ :environments ] . empty?
222187 #TODO: aggiungere i parametri per RDS, ELB, etc
223188 AWS . elastic_beanstalk . client . create_environment ( :application_name => ENV [ 'APP_NAME' ] ,
@@ -231,8 +196,8 @@ def rails_options
231196 end
232197
233198 desc "update environment on Elastic Beanstalk"
234- task :update_eb_environment do
235- set_vars unless @eb_environment
199+ task :update_eb_environment => :create_eb_environment do
200+ set_vars
236201 RAILS_DEFAULT_OPTIONS_KEYS = [ :AWS_ACCESS_KEY_ID , :AWS_SECRET_KEY , :BUNDLE_WITHOUT , :PARAM1 , :PARAM2 , :RACK_ENV , :RAILS_SKIP_ASSET_COMPILATION , :RAILS_SKIP_MIGRATIONS ]
237202 envs = AWS . elastic_beanstalk . client . describe_environments ( :application_name => ENV [ 'APP_NAME' ] , :environment_names => [ ENV [ 'ENVIRONMENT' ] ] )
238203 unless envs [ :environments ] . empty?
0 commit comments