Class: Bosh::Cli::PackageBuilder

Inherits:
Object
  • Object
show all
Includes:
PackagingHelper
Defined in:
lib/cli/package_builder.rb

Defined Under Namespace

Classes: GlobMatch

Instance Attribute Summary collapse

Attributes included from PackagingHelper

#dry_run

Class Method Summary collapse

Instance Method Summary collapse

Methods included from PackagingHelper

#build, #checksum, #dry_run?, #file_checksum, #final?, #generate_tarball, #init_indices, #new_version?, #notes, #older_version?, #tracked_permissions, #upload_tarball, #use_dev_version, #use_final_version

Methods included from VersionCalc

#major_version, #minor_version, #version_cmp, #version_greater, #version_less, #version_same

Constructor Details

#initialize(spec, release_dir, final, blobstore, sources_dir = nil, blobs_dir = nil, alt_src_dir = nil) ⇒ PackageBuilder

Returns a new instance of PackageBuilder.



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
118
# File 'lib/cli/package_builder.rb', line 73

def initialize(spec, release_dir, final, blobstore,
    sources_dir = nil, blobs_dir = nil, alt_src_dir = nil)
  spec = load_yaml_file(spec) if spec.is_a?(String) && File.file?(spec)

  @name = spec["name"]
  @globs = spec["files"]
  @dependencies = Array(spec["dependencies"])

  @release_dir = release_dir
  @sources_dir = sources_dir || File.join(@release_dir, "src")
  @alt_sources_dir = alt_src_dir || File.join(@release_dir, "src_alt")
  @blobs_dir = blobs_dir || File.join(@release_dir, "blobs")

  @final = final
  @blobstore = blobstore
  @artefact_type = "package"

  @metadata_files = %w(packaging pre_packaging)

  if @final && File.exists?(@alt_sources_dir)
    err("Please remove `#{File.basename(@alt_sources_dir)}' first")
  end

  if @name.blank?
    raise InvalidPackage, "Package name is missing"
  end

  unless @name.bosh_valid_id?
    raise InvalidPackage, "Package name should be a valid BOSH identifier"
  end

  unless @globs.is_a?(Array) && @globs.size > 0
    raise InvalidPackage, "Package '#{@name}' doesn't include any files"
  end

  @dev_builds_dir = File.join(@release_dir, ".dev_builds",
                              "packages", @name)
  @final_builds_dir = File.join(@release_dir, ".final_builds",
                                "packages", @name)

  FileUtils.mkdir_p(package_dir)
  FileUtils.mkdir_p(@dev_builds_dir)
  FileUtils.mkdir_p(@final_builds_dir)

  init_indices
end

Instance Attribute Details

#dependenciesObject (readonly)

Returns the value of attribute dependencies.



36
37
38
# File 'lib/cli/package_builder.rb', line 36

def dependencies
  @dependencies
end

#globsObject (readonly)

Returns the value of attribute globs.



36
37
38
# File 'lib/cli/package_builder.rb', line 36

def globs
  @globs
end

#nameObject (readonly)

Returns the value of attribute name.



36
37
38
# File 'lib/cli/package_builder.rb', line 36

def name
  @name
end

#tarball_pathObject (readonly)

Returns the value of attribute tarball_path.



36
37
38
# File 'lib/cli/package_builder.rb', line 36

def tarball_path
  @tarball_path
end

#versionObject (readonly)

Returns the value of attribute version.



36
37
38
# File 'lib/cli/package_builder.rb', line 36

def version
  @version
end

Class Method Details

.discover(directory, options = {}) ⇒ Object

Parameters:

  • directory (String)

    Release directory

  • options (Hash) (defaults to: {})

    Package build options



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
# File 'lib/cli/package_builder.rb', line 46

def self.discover(directory, options = {})
  builders = []

  Dir[File.join(directory, "packages", "*")].each do |package_dir|
    next unless File.directory?(package_dir)
    package_dirname = File.basename(package_dir)
    package_spec = load_yaml_file(File.join(package_dir, "spec"))

    if package_spec["name"] != package_dirname
      raise InvalidPackage,
            "Found `#{package_spec["name"]}' package in " +
            "`#{package_dirname}' directory, please fix it"
    end

    is_final = options[:final]
    blobstore = options[:blobstore]
    dry_run = options[:dry_run]

    builder = new(package_spec, directory, is_final, blobstore)
    builder.dry_run = true if dry_run

    builders << builder
  end

  builders
end

Instance Method Details

#build_dirObject



135
136
137
# File 'lib/cli/package_builder.rb', line 135

def build_dir
  @build_dir ||= Dir.mktmpdir
end

#copy_filesObject



143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/cli/package_builder.rb', line 143

def copy_files
  copied = 0

  glob_matches.each do |match|
    destination = File.join(build_dir, match.path)

    if File.directory?(match.full_path)
      FileUtils.mkdir_p(destination)
    else
      FileUtils.mkdir_p(File.dirname(destination))
      FileUtils.cp(match.full_path, destination, :preserve => true)
      copied += 1
    end
  end

  in_package_dir do
    @metadata_files.each do |filename|
      destination = File.join(build_dir, filename)
      next unless File.exists?(filename)
      if File.exists?(destination)
        raise InvalidPackage, "Package '#{name}' has '#{filename}' file " +
          "which conflicts with BOSH packaging"
      end
      FileUtils.cp(filename, destination, :preserve => true)
      copied += 1
    end
  end

  pre_package
  copied
end

#fingerprintObject



127
128
129
# File 'lib/cli/package_builder.rb', line 127

def fingerprint
  @fingerprint ||= make_fingerprint
end

#glob_matchesObject



131
132
133
# File 'lib/cli/package_builder.rb', line 131

def glob_matches
  @resolved_globs ||= resolve_globs
end

#package_dirObject



139
140
141
# File 'lib/cli/package_builder.rb', line 139

def package_dir
  File.join(@release_dir, "packages", name)
end

#pre_packageObject



175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
# File 'lib/cli/package_builder.rb', line 175

def pre_package
  pre_packaging_script = File.join(package_dir, "pre_packaging")

  if File.exists?(pre_packaging_script)

    say("Pre-packaging...")
    FileUtils.cp(pre_packaging_script, build_dir, :preserve => true)

    old_env = ENV

    begin
      ENV.delete_if { |key, _| key[0, 7] == "BUNDLE_" }
      if ENV["RUBYOPT"]
        ENV["RUBYOPT"] = ENV["RUBYOPT"].sub("-rbundler/setup", "")
      end
      ENV["BUILD_DIR"] = build_dir
      ENV["RELEASE_DIR"] = @release_dir
      in_build_dir do
        pre_packaging_out = `bash -x pre_packaging 2>&1`
        unless $?.exitstatus == 0
          pre_packaging_out.split("\n").each do |line|
            say("> #{line}")
          end
          raise InvalidPackage, "`#{name}' pre-packaging failed"
        end
      end

    ensure
      ENV.delete("BUILD_DIR")
      old_env.each { |k, v| ENV[k] = old_env[k] }
    end

    FileUtils.rm(File.join(build_dir, "pre_packaging"))
  end
end

#reloadObject

Mostly for tests



120
121
122
123
124
125
# File 'lib/cli/package_builder.rb', line 120

def reload # Mostly for tests
  @fingerprint    = nil
  @resolved_globs = nil
  init_indices
  self
end