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, #tracked_permissions, #upload_tarball, #use_dev_version, #use_final_version

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
119
# 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"]
  @excluded_globs = spec["excluded_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



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

def build_dir
  @build_dir ||= Dir.mktmpdir
end

#copy_filesObject



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

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



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

def fingerprint
  @fingerprint ||= make_fingerprint
end

#glob_matchesObject



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

def glob_matches
  @resolved_globs ||= resolve_globs
end

#package_dirObject



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

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

#pre_packageObject



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

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



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

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