Class: Cutlass::LocalBuildpack

Inherits:
Object
  • Object
show all
Defined in:
lib/cutlass/local_buildpack.rb

Overview

Converts a buildpack in a local directory into an image that pack can use natively

MY_BUILDPACK = LocalBuildpack.new(directory: "/tmp/muh_buildpack").call
puts MY_BUILDPACK.name #=> "docker:://cutlass_local_buildpack_abcd123"

Cutlass.config do |config|
  config.default_buildapacks = [MY_BUILDPACK]
end

Note: Make sure that any built images are torn down in in your test suite

config.after(:suite) do
  MY_BUILDPACK.teardown

  Cutlass::CleanTestEnv.check
end

Instance Method Summary collapse

Constructor Details

#initialize(directory:) ⇒ LocalBuildpack

Returns a new instance of LocalBuildpack.



28
29
30
31
32
33
34
# File 'lib/cutlass/local_buildpack.rb', line 28

def initialize(directory:)
  @built = false
  @directory = Pathname(directory)
  @image_name = "cutlass_local_buildpack_#{SecureRandom.hex(10)}"

  @mutex_file = Tempfile.new
end

Instance Method Details

#built?Boolean

Returns:

  • (Boolean)


118
119
120
# File 'lib/cutlass/local_buildpack.rb', line 118

def built?
  @built
end

#callObject



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/cutlass/local_buildpack.rb', line 60

def call
  file_lock do
    return if built?
    raise "must be directory: #{@directory}" unless @directory.directory?
    @built = true

    call_build_sh
    call_pack_buildpack_package
  end

  self
end

#exist?Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/cutlass/local_buildpack.rb', line 44

def exist?
  @directory.exist?
end

#file_lockObject



36
37
38
39
40
41
42
# File 'lib/cutlass/local_buildpack.rb', line 36

def file_lock
  file = File.open(@mutex_file.path, File::CREAT)
  file.flock(File::LOCK_EX)
  yield
ensure
  file.close
end

#nameObject



55
56
57
58
# File 'lib/cutlass/local_buildpack.rb', line 55

def name
  call
  "docker://#{image_name}"
end

#teardownObject



48
49
50
51
52
53
# File 'lib/cutlass/local_buildpack.rb', line 48

def teardown
  return unless built?

  image = Docker::Image.get(image_name)
  image.remove(force: true)
end