class Bosh::Cli::Command::Release::FinalizeRelease

Public Instance Methods

finalize(tarball_path) click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 15
def finalize(tarball_path)
  options[:final] = true

  # validate preconditions
  check_if_release_dir

  tarball = extract_and_validate_tarball(tarball_path)

  manifest = Psych.load(tarball.manifest)

  dev_release_name = manifest["name"]
  dev_release_ver = manifest["version"]
  final_release_name = options[:name] || dev_release_name

  final_release_dir = File.join('releases', final_release_name)
  @release_index = Bosh::Cli::Versions::VersionsIndex.new(final_release_dir)
  final_release_ver = options[:version] || next_final_version

  if options[:version] && @release_index.version_strings.include?(options[:version])
    raise Bosh::Cli::ReleaseVersionError.new('Release version already exists')
  end

  @progress_renderer = Bosh::Cli::InteractiveProgressRenderer.new

  if !options[:dry_run] then
    release.blobstore # prime & validate blobstore config

    manifest["version"] = final_release_ver
    manifest["name"] = final_release_name

    tarball.replace_manifest(manifest)

    FileUtils.mkdir_p(final_release_dir)
    final_release_manifest_path = File.absolute_path(File.join(final_release_dir, "#{final_release_name}-#{final_release_ver}.yml"))
    File.open(final_release_manifest_path, 'w') do |release_manifest_file|
      release_manifest_file.puts(tarball.manifest)
    end

    @release_index.add_version(SecureRandom.uuid, "version" => final_release_ver)

    final_release_tarball_path = File.absolute_path(File.join(final_release_dir, "#{final_release_name}-#{final_release_ver}.tgz"))
    tarball.create_from_unpacked(final_release_tarball_path)

    upload_package_and_job_blobs(manifest, tarball)

    nl
    say("Creating final release #{final_release_name}/#{final_release_ver} from dev release #{dev_release_name}/#{dev_release_ver}")

    release.latest_release_filename = final_release_manifest_path
    release.save_config

    header('Release summary')
    show_summary(tarball)
    nl

    say("Release name: #{final_release_name.make_green}")
    say("Release version: #{final_release_ver.to_s.make_green}")
    say("Release manifest: #{release.latest_release_filename.make_green}")
    say("Release tarball (#{pretty_size(final_release_tarball_path)}): " + final_release_tarball_path.make_green)
  end
end

Private Instance Methods

archive_builder() click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 131
def archive_builder
  @archive_builder ||= Bosh::Cli::ArchiveBuilder.new(archive_repository_provider,
                                                     :final => true, :dry_run => false)
end
archive_repository_provider() click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 136
def archive_repository_provider
  @archive_repository_provider ||= Bosh::Cli::ArchiveRepositoryProvider.new(work_dir, cache_dir, release.blobstore)
end
extract_and_validate_tarball(tarball_path) click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 95
def extract_and_validate_tarball(tarball_path)
  tarball = Bosh::Cli::ReleaseTarball.new(tarball_path)
  err("Cannot find release tarball #{tarball_path}") if !tarball.exists?

  err("#{tarball_path} is not a valid release tarball") if !tarball.valid?(:print_release_info => false)
  tarball
end
next_final_version() click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 103
def next_final_version
  latest_final_version = Bosh::Cli::Versions::ReleaseVersionsIndex.new(@release_index).latest_version || Bosh::Common::Version::ReleaseVersion.parse('0')
  latest_final_version.increment_release.to_s
end
upload_package_and_job_blobs(manifest, tarball) click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 79
def upload_package_and_job_blobs(manifest, tarball)
  manifest['packages'].each do |package|
    upload_to_blobstore(package, 'packages', tarball.package_tarball_path(package['name']))
  end

  manifest['jobs'].each do |job|
    upload_to_blobstore(job, 'jobs', tarball.job_tarball_path(job['name']))
  end

  if manifest['license']
    # the licence is different from packages and jobs: it has to be rebuilt from the
    # raw LICENSE and/or NOTICE files in the dev release tarball
    archive_builder.build(tarball.license_resource)
  end
end
upload_to_blobstore(artifact, plural_type, artifact_path) click to toggle source
# File lib/cli/commands/release/finalize_release.rb, line 108
def upload_to_blobstore(artifact, plural_type, artifact_path)
  err("Cannot find artifact complete information, please upgrade tarball to newer version") if !artifact['fingerprint']

  final_builds_dir = File.join('.final_builds', plural_type, artifact['name']).to_s
  FileUtils.mkdir_p(final_builds_dir)
  final_builds_index = Bosh::Cli::Versions::VersionsIndex.new(final_builds_dir)

  return artifact if final_builds_index[artifact['fingerprint']]

  @progress_renderer.start(artifact['name'], "uploading...")
  blobstore_id = nil
  File.open(artifact_path, 'r') do |f|
    blobstore_id = @release.blobstore.create(f)
  end

  final_builds_index.add_version(artifact['fingerprint'], {
      'version' => artifact['version'],
      'sha1' => artifact['sha1'],
      'blobstore_id' => blobstore_id
    })
  @progress_renderer.finish(artifact['name'], "uploaded")
end