Class: Prebake::Backends::S3

Inherits:
Base
  • Object
show all
Defined in:
lib/prebake/backends/s3.rb

Instance Method Summary collapse

Methods inherited from Base

#checksums_supported?

Constructor Details

#initialize(bucket:, region: "us-east-1", prefix: "prebake") ⇒ S3

Returns a new instance of S3.



11
12
13
14
15
16
17
18
19
# File 'lib/prebake/backends/s3.rb', line 11

def initialize(bucket:, region: "us-east-1", prefix: "prebake")
  @bucket = bucket
  @region = region
  @prefix = prefix

  require "aws-sdk-s3"
rescue LoadError
  raise Prebake::Error, "aws-sdk-s3 gem is required for S3 backend"
end

Instance Method Details

#delete(cache_key) ⇒ Object



67
68
69
70
71
72
73
74
75
# File 'lib/prebake/backends/s3.rb', line 67

def delete(cache_key)
  client.delete_object(bucket: @bucket, key: object_key(cache_key))
  client.delete_object(bucket: @bucket, key: checksum_key(cache_key))
  Logger.info "Deleted #{cache_key} from S3"
  true
rescue StandardError => e
  Logger.debug "S3 delete failed for #{cache_key}: #{e.message}"
  false
end

#exists?(cache_key) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
63
64
65
# File 'lib/prebake/backends/s3.rb', line 60

def exists?(cache_key)
  client.head_object(bucket: @bucket, key: object_key(cache_key))
  true
rescue StandardError
  false
end

#fetch(cache_key) ⇒ Object



21
22
23
24
25
26
27
28
29
# File 'lib/prebake/backends/s3.rb', line 21

def fetch(cache_key)
  response = client.get_object(bucket: @bucket, key: object_key(cache_key))
  path = File.join(Dir.tmpdir, "prebake-#{SecureRandom.hex(16)}.gem")
  File.binwrite(path, response.body.read)
  path
rescue StandardError => e
  Logger.debug "S3 fetch failed for #{cache_key}: #{e.message}"
  nil
end

#fetch_checksum(cache_key) ⇒ Object



31
32
33
34
35
36
37
# File 'lib/prebake/backends/s3.rb', line 31

def fetch_checksum(cache_key)
  response = client.get_object(bucket: @bucket, key: checksum_key(cache_key))
  response.body.read.strip
rescue StandardError => e
  Logger.debug "S3 checksum fetch failed for #{cache_key}: #{e.message}"
  nil
end

#push(gem_path, cache_key, checksum) ⇒ Object



39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
# File 'lib/prebake/backends/s3.rb', line 39

def push(gem_path, cache_key, checksum)
  gem_key = object_key(cache_key)
  File.open(gem_path, "rb") do |file|
    client.put_object(bucket: @bucket, key: gem_key, body: file)
  end

  begin
    client.put_object(bucket: @bucket, key: checksum_key(cache_key), body: checksum)
  rescue StandardError => e
    Logger.warn "S3 checksum push failed for #{cache_key}: #{e.message}, removing gem"
    client.delete_object(bucket: @bucket, key: gem_key)
    return false
  end

  Logger.info "Pushed #{cache_key} to S3"
  true
rescue StandardError => e
  Logger.warn "S3 push failed for #{cache_key}: #{e.message}"
  false
end