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