Skip to content

Instantly share code, notes, and snippets.

@nandomoreirame
Created September 16, 2016 17:36
Show Gist options
  • Save nandomoreirame/f32044c09aa89b026f475cdb4c17ab84 to your computer and use it in GitHub Desktop.
Save nandomoreirame/f32044c09aa89b026f475cdb4c17ab84 to your computer and use it in GitHub Desktop.
deploy to aws s3 with Rake tasks
require 'aws-sdk'
require 'pathname'
require 'yaml'
CONFIG = {
"distPath" => "public/dist",
"stylesheetsPath" => "public/dist/stylesheets",
"javascriptsPath" => "public/dist/javascripts",
"fontsPath" => "public/dist/fonts"
}
def log(params, what)
puts "\033[33;32m [Site LKD #{params[:version]}] step:\033[0m #{what}"
end
namespace :deploy do
desc "Deploys a new version"
task :run, [:env, :version] do |_t, params|
Rake::Task["deploy:precompile"].invoke(params[:env], params[:version])
Rake::Task["deploy:s3_upload"].invoke(params[:version])
end
desc "Upload new files to S3"
task :s3_upload, :version do |_t, params|
@version = params[:version]
log params, "Uploading files to S3..."
setup_s3
upload_css
upload_js
upload_images
upload_fonts
log params, "Upload done."
end
desc 'Precompile'
task :precompile, [:env, :version] do |_t, params|
log params, 'Building project...'
sh "gulp build --env #{params['env']} --releaseFolder #{params['version']}"
log params, 'Project builded.'
end
# http://docs.aws.amazon.com/sdkforruby/api/Aws/S3/Object.html
def setup_s3
secrets = YAML.load_file("s3.secrets.yml")
@s3 = Aws::S3::Resource.new(
region: secrets["region"],
access_key_id: secrets["access_key_id"],
secret_access_key: secrets["secret_access_key"]
)
@bucket = @s3.bucket(secrets["bucket"])
end
def upload_css
upload_dir("#{CONFIG["stylesheetsPath"]}/*.css", { prefix: "stylesheets", gzip: true })
end
def upload_js
upload_dir("#{CONFIG["javascriptsPath"]}/*.js", { prefix: "javascripts", gzip: true })
end
def upload_images
upload_dir("#{CONFIG["distPath"]}/**/*.{jpg,png,jpeg,gif,svg,ico}")
end
def upload_fonts
upload_dir("#{CONFIG["fontsPath"]}/**/*.*", { prefix: "fonts" })
end
def upload_dir(dir, params = {})
Dir[dir].each do |file|
upload_file(file, params)
end
end
def upload_file(file, params = {})
name = Pathname.new(file)
aws_options = { acl: "public-read" }
if params[:gzip]
aws_options[:content_encoding] = "gzip"
end
ext = ['.jpg', '.png', '.jpeg', '.gif', '.svg', '.ico']
if ext.include?(name.extname)
name = name.sub('public/dist/', '')
else
name = name.basename
end
upload_to = ["dist", @version, params[:prefix], name]
@bucket.object(upload_to.compact.join("/")).upload_file(file, aws_options)
puts "\e[93m -> #{file}\e[0m \e[96m-> #{upload_to.compact.join("/")}\e[0m"
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment