Skip to content

Commit 50c84a2

Browse files
committed
Add support for create app, create env, update env
1 parent b84d028 commit 50c84a2

1 file changed

Lines changed: 97 additions & 8 deletions

File tree

lib/tasks/eb_fast_deploy.rb

Lines changed: 97 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
require "eb_fast_deploy/version"
2+
require 'aws-sdk'
3+
require 'dotenv/environment'
24

35
def 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
3144
end
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+
3354
namespace :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
172261
end
173262

0 commit comments

Comments
 (0)