Add a publisher to package up the generated box
Enabling this post-build step means the wrapper will not destroy the machine, but the publisher will take over responsibility for that instead. Related to #10
This commit is contained in:
parent
6e93b99690
commit
52c5222dd9
|
@ -25,6 +25,7 @@ module Vagrant
|
||||||
end
|
end
|
||||||
|
|
||||||
unless @vagrant.nil?
|
unless @vagrant.nil?
|
||||||
|
build.env[:vagrant_dirty] = true
|
||||||
code = @vagrant.primary_vm.channel.send(vagrant_method, @command) do |type, data|
|
code = @vagrant.primary_vm.channel.send(vagrant_method, @command) do |type, data|
|
||||||
# type is one of [:stdout, :stderr, :exit_status]
|
# type is one of [:stdout, :stderr, :exit_status]
|
||||||
# # data is a string for stdout/stderr and an int for exit status
|
# # data is a string for stdout/stderr and an int for exit status
|
||||||
|
@ -93,6 +94,7 @@ module Vagrant
|
||||||
end
|
end
|
||||||
|
|
||||||
listener.info('Provisioning the Vagrant VM.. (this may take a while)')
|
listener.info('Provisioning the Vagrant VM.. (this may take a while)')
|
||||||
|
build.env[:vagrant_dirty] = true
|
||||||
@vagrant.cli('provision')
|
@vagrant.cli('provision')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
require 'rubygems'
|
||||||
|
require 'vagrant'
|
||||||
|
|
||||||
|
|
||||||
|
module Vagrant
|
||||||
|
class PackagePublisher < Jenkins::Tasks::Publisher
|
||||||
|
display_name "Package Vagrant box"
|
||||||
|
|
||||||
|
attr_accessor :boxname
|
||||||
|
def initialize(attrs)
|
||||||
|
@vagrant = nil
|
||||||
|
@boxname = attrs['boxname']
|
||||||
|
end
|
||||||
|
|
||||||
|
def prebuild(build, listener)
|
||||||
|
# To run packaging, we need to own the destroy of the box
|
||||||
|
build.env[:vagrant_disable_destroy] = true
|
||||||
|
end
|
||||||
|
|
||||||
|
def perform(build, launcher, listener)
|
||||||
|
@vagrant = build.env[:vagrant]
|
||||||
|
if @vagrant.nil?
|
||||||
|
built.halt "OH CRAP! I don't seem to have a Vagrant instance in the publisher"
|
||||||
|
end
|
||||||
|
|
||||||
|
unless build.env[:vagrant_dirty]
|
||||||
|
listener.info("It doesn't appear any changes were made inside the Vagrant VM")
|
||||||
|
listener.info("I'm going to save us all a lot of grief and skip packaging it up then")
|
||||||
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
name = @boxname
|
||||||
|
if name.nil? or name.empty?
|
||||||
|
name = 'package.box'
|
||||||
|
end
|
||||||
|
unless name.end_with? '.box'
|
||||||
|
name = "#{name}.box"
|
||||||
|
end
|
||||||
|
|
||||||
|
listener.info("Preparing to export the current Vagrant box to a file named: #{name}")
|
||||||
|
output = File.expand_path(File.join(build.workspace.to_s, name))
|
||||||
|
@vagrant.cli('package', '--output', output)
|
||||||
|
@vagrant.cli('destroy', '-f')
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
|
@ -68,12 +68,20 @@ module Vagrant
|
||||||
listener.info "Vagrant box is online, continuing with the build"
|
listener.info "Vagrant box is online, continuing with the build"
|
||||||
|
|
||||||
build.env[:vagrant] = @vagrant
|
build.env[:vagrant] = @vagrant
|
||||||
|
# We use this variable to determine if we have changes worth packaging,
|
||||||
|
# i.e. if we have actually done anything with the box, we will mark it
|
||||||
|
# dirty and can then take further action based on that
|
||||||
|
build.env[:vagrant_dirty] = false
|
||||||
end
|
end
|
||||||
|
|
||||||
# Called some time when the build is finished.
|
# Called some time when the build is finished.
|
||||||
def teardown(build, listener)
|
def teardown(build, listener)
|
||||||
listener.info "Build finished, destroying the Vagrant box"
|
if @vagrant.nil?
|
||||||
unless @vagrant.nil?
|
return
|
||||||
|
end
|
||||||
|
|
||||||
|
unless build.env[:vagrant_disable_destroy]
|
||||||
|
listener.info "Build finished, destroying the Vagrant box"
|
||||||
@vagrant.cli('destroy', '-f')
|
@vagrant.cli('destroy', '-f')
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
<%
|
||||||
|
f = taglib("/lib/form")
|
||||||
|
f.block do
|
||||||
|
f.entry(:title => 'Name of .box file (optional)',
|
||||||
|
:field => 'boxname',
|
||||||
|
:description => 'Name to give the .box file packaged by Vagrant') do
|
||||||
|
f.textbox
|
||||||
|
end
|
||||||
|
end
|
||||||
|
%>
|
Loading…
Reference in New Issue