Class: S3Deployer

Inherits:
Spar::Deployer show all
Defined in:
lib/spar/deployers/s3_deployer.rb

Direct Known Subclasses

CloudfrontDeployer

Instance Method Summary collapse

Methods inherited from Spar::Deployer

#run

Instance Method Details

#age_out(old_assets) ⇒ Object



32
33
34
35
36
37
38
# File 'lib/spar/deployers/s3_deployer.rb', line 32

def age_out(old_assets)
  old_assets.flatten.each do |file|
    if Time.now - @bucket.objects[file].last_modified > @age_out
      @bucket.objects[file].delete
    end
  end
end

#deploy(asset) ⇒ Object



40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/spar/deployers/s3_deployer.rb', line 40

def deploy(asset)
  remote_file = @bucket.objects[asset.write_path]
  if remote_file.exists?
    if remote_file.etag.gsub(/\"/,'') != asset.digest
      upload(asset)
      super
    end
  else
    upload(asset)
    super
  end
end

#finishObject



61
62
63
64
65
66
67
68
# File 'lib/spar/deployers/s3_deployer.rb', line 61

def finish
  @bucket.objects['TIMESTAMP.txt'].write(
    :data => Time.now.to_s+"\n",
    :content_type => "text/plain",
    :acl => :public_read
  )
  super
end

#prepare(assets) ⇒ Object



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
# File 'lib/spar/deployers/s3_deployer.rb', line 5

def prepare(assets)
  @aws_key       = Spar.settings['aws_key']
  @aws_secret    = Spar.settings['aws_secret']
  @deploy_bucket = Spar.settings['deploy_bucket']
  unless @aws_key and @aws_secret and @deploy_bucket
    raise "ERROR: You should set :aws_key, :aws_secret, and :deploy_bucket in your config.yml file so you can deploy to S3"
  end
  
  AWS.config(
    :access_key_id      => @aws_key,
    :secret_access_key  => @aws_secret,
  )
  @s3 = AWS::S3.new
  @bucket  = @s3.buckets[@deploy_bucket]
  unless @bucket.exists?
    @bucket = @s3.buckets.create(@deploy_bucket)
  end
  @age_out = 60 * 60 * 24 * 3 # 3 days 

  super

  local_assets = assets.map(&:write_path)
  remote_assets = @bucket.objects.map{ |object| object.key }.reject{ |key| key =~ /\/$/ }

  age_out (remote_assets - local_assets)
end

#upload(asset) ⇒ Object



53
54
55
56
57
58
59
# File 'lib/spar/deployers/s3_deployer.rb', line 53

def upload(asset)
  if asset.write_path =~ /\.html$/ && !(asset.write_path =~ /\/?index\.html$/)
    @bucket.objects[asset.write_path.gsub(/\.html/, '/index.html')].write(asset.headers.merge(:data => asset.data))
  else
    @bucket.objects[asset.write_path].write(asset.headers.merge(:data => asset.data))
  end
end