Skip to content

Commit f668f27

Browse files
committed
eb deploy
1 parent d6679d4 commit f668f27

1 file changed

Lines changed: 70 additions & 105 deletions

File tree

lib/tasks/eb_fast_deploy.rb

Lines changed: 70 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
require "eb_fast_deploy/version"
22
require 'aws-sdk'
33
require 'dotenv/environment'
4+
require 'fog'
45

56
def do_cmd(cmd)
67
print "- - - cmd: #{cmd}\n"
@@ -9,70 +10,65 @@ def do_cmd(cmd)
910
end
1011

1112
def 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
4443
end
4544

4645
def 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
5251
end
5352

5453
namespace :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

Comments
 (0)