lib/nanoc/extra/deployers/fog.rb in nanoc-3.7.5 vs lib/nanoc/extra/deployers/fog.rb in nanoc-3.8.0
- old
+ new
@@ -6,10 +6,14 @@
# @example A deployment configuration with public and staging configurations
#
# deploy:
# public:
# kind: fog
+ # bucket: nanoc-site
+ # cdn_id: XXXXXX
+ # preprod:
+ # kind: fog
# provider: local
# local_root: ~/myCloud
# bucket: nanoc-site
# staging:
# kind: fog
@@ -23,18 +27,20 @@
# Get params, unsetting anything we don't want to pass through to fog.
src = File.expand_path(source_path)
bucket = config.delete(:bucket) || config.delete(:bucket_name)
path = config.delete(:path)
+ cdn_id = config.delete(:cdn_id)
config.delete(:kind)
# Validate params
error 'The path requires no trailing slash' if path && path[-1, 1] == '/'
# Mock if necessary
if self.dry_run?
+ puts 'Dry run - simulation'
::Fog.mock!
end
# Get connection
puts 'Connecting'
@@ -49,10 +55,11 @@
end
should_create_bucket = true if directory.nil?
# Create bucket if necessary
if should_create_bucket
+ puts 'Creating bucket'
directory = connection.directories.create(key: bucket, prefix: path)
end
# Get list of remote files
files = directory.files
@@ -61,10 +68,11 @@
set = directory.files.all(marker: files.last.key)
truncated = set.is_truncated
files += set
end
keys_to_destroy = files.all.map(&:key)
+ keys_to_invalidate = []
# Upload all the files in the output folder to the clouds
puts 'Uploading local files'
FileUtils.cd(src) do
files = Dir['**/*'].select { |f| File.file?(f) }
@@ -73,16 +81,32 @@
directory.files.create(
key: key,
body: File.open(file_path),
public: true)
keys_to_destroy.delete(key)
+ keys_to_invalidate.push(key)
end
end
# delete extraneous remote files
puts 'Removing remote files'
keys_to_destroy.each do |key|
directory.files.get(key).destroy
+ end
+
+ # invalidate CDN objects
+ if cdn_id
+ puts 'Invalidating CDN distribution'
+ keys_to_invalidate.concat(keys_to_destroy)
+ cdn = ::Fog::CDN.new(config)
+ # fog cannot mock CDN requests
+ unless self.dry_run?
+ distribution = cdn.get_distribution(cdn_id)
+ # usual limit per invalidation: 1000 objects
+ keys_to_invalidate.each_slice(1000) do |paths|
+ cdn.post_invalidation(distribution, paths)
+ end
+ end
end
puts 'Done!'
end