lib/capistrano/ops/backup/s3.rb in capistrano-ops-0.2.4 vs lib/capistrano/ops/backup/s3.rb in capistrano-ops-0.2.5

- old
+ new

@@ -1,11 +1,11 @@ # frozen_string_literal: true module Backup require 'aws-sdk-s3' class S3 - attr_accessor :endpoint, :region, :access_key_id, :secret_access_key, :s3_client + attr_accessor :endpoint, :region, :access_key_id, :secret_access_key, :s3_resource def initialize(endpoint: ENV['S3_BACKUP_ENDPOINT'], region: ENV['S3_BACKUP_REGION'], access_key_id: ENV['S3_BACKUP_KEY'], secret_access_key: ENV['S3_BACKUP_SECRET']) self.endpoint = endpoint self.region = region @@ -15,38 +15,45 @@ region: region, access_key_id: access_key_id, secret_access_key: secret_access_key } config[:endpoint] = endpoint unless endpoint.nil? - self.s3_client = Aws::S3::Client.new(config) + self.s3_resource = Aws::S3::Resource.new(config) end def upload(backup_file, key) begin - s3_client.put_object( - bucket: ENV['S3_BACKUP_BUCKET'], - key: key, - body: File.open(backup_file) - ) - rescue StandardError => e - puts "Error uploading backup to S3: #{e.message}" + s3_resource.bucket(ENV['S3_BACKUP_BUCKET']).object(key).upload_file(backup_file) + rescue Backup::Error => e + puts "Upload failed: #{e.message}" raise e end 'File uploaded to S3' end def remove_old_backups(basename, keep: 5) - bucket = ENV['S3_BACKUP_BUCKET'] - all_items = s3_client.list_objects_v2(bucket: bucket, prefix: basename).contents + all_items = s3_resource.bucket(ENV['S3_BACKUP_BUCKET']).objects(prefix: basename).map do |item| + { key: item.key, last_modified: item.last_modified } + end + + all_items = all_items.sort_by { |hsh| hsh[:last_modified] }.reverse + count = all_items.count + if count <= keep - p 'Nothing to remove' - return + puts 'Nothing to remove' + exit(0) end - items = all_items.sort_by(&:last_modified).reverse.slice(keep..-1).map(&:key) - items.each do |item| - p "Removing #{item} from S3" - s3_client.delete_object(bucket: bucket, key: item) + + delete_items = all_items.slice(keep..-1) + + delete_items.each do |item_obj| + puts "Removing #{item_obj[:key]} from S3" + s3_resource.bucket(ENV['S3_BACKUP_BUCKET']).object(item_obj[:key]).delete end + puts 'Old backups removed from S3' + rescue Backup::Error => e + puts "Remove failed: #{e.message}" + raise e end end end