Class: Bosh::Cli::ReleaseCompiler
Overview
Compiles release tarball based on manifest
Instance Attribute Summary collapse
Class Method Summary collapse
Instance Method Summary collapse
- #compile ⇒ Object
- #exists? ⇒ Boolean
- #find_in_indices(final_index, dev_index, object) ⇒ Object
- #find_job(job) ⇒ Object
- #find_package(package) ⇒ Object
-
#initialize(manifest_file, blobstore, package_matches = [], release_dir = nil) ⇒ ReleaseCompiler
constructor
A new instance of ReleaseCompiler.
-
#remote_job_exists?(local_job) ⇒ Boolean
Checks if local job is already known remotely.
-
#remote_package_exists?(local_package) ⇒ Boolean
Checks if local package is already known remotely.
Constructor Details
#initialize(manifest_file, blobstore, package_matches = [], release_dir = nil) ⇒ ReleaseCompiler
Returns a new instance of ReleaseCompiler.
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
# File 'lib/cli/release_compiler.rb', line 18 def initialize(manifest_file, blobstore, package_matches = [], release_dir = nil) @blobstore = blobstore @release_dir = release_dir || Dir.pwd @manifest_file = File.(manifest_file, @release_dir) @tarball_path = nil @build_dir = Dir.mktmpdir @jobs_dir = File.join(@build_dir, "jobs") @packages_dir = File.join(@build_dir, "packages") @package_matches = Set.new(package_matches) FileUtils.mkdir_p(@jobs_dir) FileUtils.mkdir_p(@packages_dir) @manifest = load_yaml_file(manifest_file) @name = @manifest["name"] @version = @manifest["version"] @packages = @manifest["packages"].map { |pkg| OpenStruct.new(pkg) } @jobs = @manifest["jobs"].map { |job| OpenStruct.new(job) } end |
Instance Attribute Details
#tarball_path ⇒ Object
99 100 101 102 |
# File 'lib/cli/release_compiler.rb', line 99 def tarball_path @tarball_path || File.join(File.dirname(@manifest_file), "#{@name}-#{@version}.tgz") end |
Class Method Details
.compile(manifest_file, blobstore) ⇒ Object
9 10 11 |
# File 'lib/cli/release_compiler.rb', line 9 def self.compile(manifest_file, blobstore) new(manifest_file, blobstore).compile end |
Instance Method Details
#compile ⇒ Object
43 44 45 46 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 |
# File 'lib/cli/release_compiler.rb', line 43 def compile if exists? quit("You already have this version in `#{tarball_path.make_green}'") end FileUtils.cp(@manifest_file, File.join(@build_dir, "release.MF"), :preserve => true) header("Copying packages") @packages.each do |package| say("#{package.name} (#{package.version})".ljust(30), " ") if remote_package_exists?(package) say("SKIP".make_yellow) next end package_filename = find_package(package) if package_filename.nil? err("Cannot find package `#{package.name} (#{package.version})'") end FileUtils.cp(package_filename, File.join(@packages_dir, "#{package.name}.tgz"), :preserve => true) end header("Copying jobs") @jobs.each do |job| say("#{job.name} (#{job.version})".ljust(30), " ") if remote_job_exists?(job) say("SKIP".make_yellow) next end job_filename = find_job(job) if job_filename.nil? err("Cannot find job `#{job.name} (#{job.version})") end FileUtils.cp(job_filename, File.join(@jobs_dir, "#{job.name}.tgz"), :preserve => true) end header("Building tarball") Dir.chdir(@build_dir) do tar_out = `tar -czf #{tarball_path} . 2>&1` unless $?.exitstatus == 0 raise InvalidRelease, "Cannot create release tarball: #{tar_out}" end say("Generated #{tarball_path.make_green}") say("Release size: #{pretty_size(tarball_path).make_green}") end end |
#exists? ⇒ Boolean
95 96 97 |
# File 'lib/cli/release_compiler.rb', line 95 def exists? File.exists?(tarball_path) end |
#find_in_indices(final_index, dev_index, object) ⇒ Object
120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 |
# File 'lib/cli/release_compiler.rb', line 120 def find_in_indices(final_index, dev_index, object) desc = "#{object.name} (#{object.version})" index = final_index build_data = index.find_by_checksum(object.sha1) if build_data.nil? index = dev_index build_data = index.find_by_checksum(object.sha1) end if build_data.nil? say("MISSING".make_red) err("Cannot find object with given checksum") end version = build_data["version"] sha1 = build_data["sha1"] blobstore_id = build_data["blobstore_id"] filename = index.filename(version) if File.exists?(filename) say("FOUND LOCAL".make_green) if Digest::SHA1.file(filename) != sha1 err("#{desc} is corrupted locally") end elsif blobstore_id say("FOUND REMOTE".make_yellow) say("Downloading #{blobstore_id.to_s.make_green}...") tmp_file = Tempfile.new("") @blobstore.get(blobstore_id, tmp_file) tmp_file.close if Digest::SHA1.file(tmp_file.path).hexdigest == sha1 FileUtils.mv(tmp_file.path, filename) else err("#{desc} is corrupted in blobstore (id=#{blobstore_id})") end end File.exists?(filename) ? filename : nil rescue Bosh::Blobstore::BlobstoreError => e raise BlobstoreError, "Blobstore error: #{e}" end |
#find_job(job) ⇒ Object
112 113 114 115 116 117 118 |
# File 'lib/cli/release_compiler.rb', line 112 def find_job(job) final_index = VersionsIndex.new( File.join(@release_dir, ".final_builds", "jobs", job.name)) dev_index = VersionsIndex.new( File.join(@release_dir, ".dev_builds", "jobs", job.name)) find_in_indices(final_index, dev_index, job) end |
#find_package(package) ⇒ Object
104 105 106 107 108 109 110 |
# File 'lib/cli/release_compiler.rb', line 104 def find_package(package) final_index = VersionsIndex.new( File.join(@release_dir, ".final_builds", "packages", package.name)) dev_index = VersionsIndex.new( File.join(@release_dir, ".dev_builds", "packages", package.name)) find_in_indices(final_index, dev_index, package) end |
#remote_job_exists?(local_job) ⇒ Boolean
Checks if local job is already known remotely
179 180 181 |
# File 'lib/cli/release_compiler.rb', line 179 def remote_job_exists?(local_job) false end |
#remote_package_exists?(local_package) ⇒ Boolean
Checks if local package is already known remotely
169 170 171 172 173 174 |
# File 'lib/cli/release_compiler.rb', line 169 def remote_package_exists?(local_package) # If checksum is known to director we can always match it @package_matches.include?(local_package.sha1) || (local_package.fingerprint && @package_matches.include?(local_package.fingerprint)) end |