Method: CiCd::Builder::Repo::S3#uploadToRepo

Defined in:
lib/cicd/builder/mixlib/repo/S3.rb

#uploadToRepo(artifacts) ⇒ Object




47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
# File 'lib/cicd/builder/mixlib/repo/S3.rb', line 47

def uploadToRepo(artifacts)
  @logger.info CLASS+'::'+__method__.to_s
  s3 = getS3()
  artifacts.each{|art|

    s3_obj = maybeS3Object(art[:key], s3)
    upload = false
    if art[:data][:data]
      # md5 = Digest::MD5.hexdigest(art[:data][:data])
      tempArtifactFile('artifact', art[:data])
    end
    if s3_obj.nil?
      upload = true
      etag   = ''
    else
      @logger.info "s3://#{ENV['AWS_S3_BUCKET']}/#{art[:key]} exists"
      etag = s3_obj.etag.gsub(/"/, '')
    end
    md5 = if art[:data].has_key?(:file)
            # md5 = Digest::MD5.file(art[:data][:file]).hexdigest
            calcLocalETag(etag, art[:data][:file])
          else
            raise "Internal error: No :file in #{art[:data].ai}"
          end
    unless s3_obj.nil?
      unless etag == md5
        checksum = s3_obj.[:checksum]
        unless checksum and checksum == md5
          @logger.warn "s3://#{ENV['AWS_S3_BUCKET']}/#{art[:key]} is different from our #{art[:key]}(#{s3_obj.etag} <=> #{md5})"
          upload = true
        end
      end
    end

    if upload
      @logger.info "Upload new s3://#{ENV['AWS_S3_BUCKET']}/#{art[:key]}"
      # Get size before upload changes our object
      body = nil
      if art[:data].has_key?(:file)
        size = File.size(art[:data][:file])
        body = File.open(art[:data][:file], 'r')
      else
        # size = art[:data][:data].length
        # body = art[:data][:data]
        raise "Internal error: No :file in #{art[:data].ai}"
      end
      art[:data][:metadata] = {checksum: md5, digest: "md5=#{md5}"}
      # art[:data][:'x-amz-meta-digest'] = "md5=#{md5}"
      res = s3.put_object(        bucket: ENV['AWS_S3_BUCKET'],
                                     key: art[:key],
                                    body: body,
                                   # acl: 'authenticated-read',
                          content_length: size,
                                metadata: art[:data][:metadata],
                          )
      s3_obj = maybeS3Object(art[:key], s3)
      raise "Failed to upload '#{art[:key]}'" unless s3_obj
      if art.has_key?(:public_url)
        @vars[art[:public_url]] = s3_obj.public_url
      end
      if art.has_key?(:read_url)
        @vars[art[:read_url]]   = s3_obj.presigned_url(:get, expires_in: 86400)
        @logger.info "#{art[:label]}: #{@vars[art[:read_url]]}"
      end
    end
    if art[:data][:temp]
      File.unlink(art[:data][:file])
    end
  }
  0
end