forked from mylesmegyesi/jekyll-s3-upload
-
Notifications
You must be signed in to change notification settings - Fork 0
/
s3_upload.rb
92 lines (76 loc) · 3.81 KB
/
s3_upload.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
require 'active_support/all'
module Jekyll
module Commands
class S3Upload < Command
class << self
def init_with_program(prog)
prog.command(:upload) do |c|
c.syntax 'upload [options]'
c.description 'Upload the site to the S3 bucket.'
c.option 'environment', '--environment ENVIRONMENT', 'The environment to upload to.'
c.action do |args, options|
Jekyll::Commands::S3Upload.process(options)
end
end
end
def process(options)
unless options.key?('environment')
Jekyll.logger.error 'No environment specified.'
Jekyll.logger.error 'See `jekyll help upload` for instructions on how to set the upload environment.'
return false
end
jekyll_config = Jekyll.configuration('full_rebuild' => true)
unless jekyll_config.key?('jekyll-s3-upload')
Jekyll.logger.error 'jekyll-s3-upload configuration not found in Jekyll config.'
Jekyll.logger.error 'See README for instructions on how to configure jekyll-s3-upload.'
return false
end
s3_upload_config = jekyll_config.fetch('jekyll-s3-upload')
require 'dotenv'
Dotenv.load('.env', ".env.#{options.fetch('environment')}")
aws_access_key_id, aws_secret_access_key, aws_region, s3_bucket = ENV['AWS_ACCESS_KEY_ID'], ENV['AWS_SECRET_ACCESS_KEY'], ENV['AWS_REGION'], ENV['S3_BUCKET']
unless aws_access_key_id && aws_secret_access_key && s3_bucket
Jekyll.logger.error 'AWS ENV variables not configured correctly.'
Jekyll.logger.error 'See README for instructions on how to configure AWS ENV variables.'
return false
end
site = Jekyll::Site.new(jekyll_config)
if s3_upload_config.fetch('build_before', true)
Jekyll.logger.info 'Rebuilding before upload...'
Jekyll::Commands::Build.build(site, jekyll_config)
end
if upload_validations = s3_upload_config.fetch('validate_upload', nil)
Jekyll.logger.info 'Validating Upload...'
upload_validations.each do |validation_class_name|
Jekyll.logger.info "Running Upload Validation #{validation_class_name}"
validation_class = validation_class_name.constantize
valid = validation_class.validate(jekyll_config, site, Jekyll.logger)
next if valid
Jekyll.logger.error "Upload Validation #{validation_class_name} failed. Halting upload."
return false
end
Jekyll.logger.info 'All Upload Validations passed.'
end
require 'jekyll/s3/upload/s3_website_uploader'
require 'jekyll/s3/upload/uploader_file_config_strategy'
Jekyll.logger.info 'Uploading site...'
uploader = Jekyll::S3::Upload::S3WebsiteUploader.new({
aws_access_key_id: aws_access_key_id,
aws_secret_access_key: aws_secret_access_key,
aws_region: aws_region,
s3_bucket: s3_bucket,
s3_prefix_path: s3_upload_config.fetch('prefix_path', ''),
s3_index_path: s3_upload_config.fetch('index_path', 'index.html'),
s3_error_path: s3_upload_config.fetch('error_path', 'error.html'),
s3_routing_rules_path: s3_upload_config.fetch('routing_rules_path', nil),
build_directory: jekyll_config.fetch('destination'),
file_strategy: Jekyll::S3::Upload::UploaderFileConfigStrategy.new(s3_upload_config),
website_redirect_config_path: s3_upload_config.fetch('website_redirect_config_path', nil),
logger: ActiveSupport::TaggedLogging.new(Jekyll.logger.writer)
})
return uploader.upload!
end
end
end
end
end