provisioner/file: support uploading directories [GH-251]
This commit is contained in:
parent
fd0df9ff58
commit
adbb490189
|
@ -25,6 +25,7 @@ IMPROVEMENTS:
|
||||||
* builder/digitalocean: Retry on any pending event errors.
|
* builder/digitalocean: Retry on any pending event errors.
|
||||||
* builder/openstack: Can now specify a project. [GH-382]
|
* builder/openstack: Can now specify a project. [GH-382]
|
||||||
* builder/virtualbox: Can now attach hard drive over SATA. [GH-391]
|
* builder/virtualbox: Can now attach hard drive over SATA. [GH-391]
|
||||||
|
* provisioner/file: Can now upload directories. [GH-251]
|
||||||
|
|
||||||
BUG FIXES:
|
BUG FIXES:
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ type Communicator interface {
|
||||||
// is a trailing slash on the source "/". For example: "/tmp/src" as
|
// is a trailing slash on the source "/". For example: "/tmp/src" as
|
||||||
// the source will create a "src" directory in the destination unless
|
// the source will create a "src" directory in the destination unless
|
||||||
// a trailing slash is added. This is identical behavior to rsync(1).
|
// a trailing slash is added. This is identical behavior to rsync(1).
|
||||||
UploadDir(string, string, []string) error
|
UploadDir(dst string, src string, exclude []string) error
|
||||||
|
|
||||||
// Download downloads a file from the machine from the given remote path
|
// Download downloads a file from the machine from the given remote path
|
||||||
// with the contents writing to the given writer. This method will
|
// with the contents writing to the given writer. This method will
|
||||||
|
|
|
@ -72,6 +72,17 @@ func (p *Provisioner) Prepare(raws ...interface{}) error {
|
||||||
|
|
||||||
func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error {
|
func (p *Provisioner) Provision(ui packer.Ui, comm packer.Communicator) error {
|
||||||
ui.Say(fmt.Sprintf("Uploading %s => %s", p.config.Source, p.config.Destination))
|
ui.Say(fmt.Sprintf("Uploading %s => %s", p.config.Source, p.config.Destination))
|
||||||
|
info, err := os.Stat(p.config.Source)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we're uploading a directory, short circuit and do that
|
||||||
|
if info.IsDir() {
|
||||||
|
return comm.UploadDir(p.config.Destination, p.config.Source, nil)
|
||||||
|
}
|
||||||
|
|
||||||
|
// We're uploading a file...
|
||||||
f, err := os.Open(p.config.Source)
|
f, err := os.Open(p.config.Source)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
|
@ -12,6 +12,8 @@ recommended usage of the file provisioner is to use it to upload files,
|
||||||
and then use [shell provisioner](/docs/provisioners/shell.html) to move
|
and then use [shell provisioner](/docs/provisioners/shell.html) to move
|
||||||
them to the proper place, set permissions, etc.
|
them to the proper place, set permissions, etc.
|
||||||
|
|
||||||
|
The file provisioner can upload both single files and complete directories.
|
||||||
|
|
||||||
## Basic Example
|
## Basic Example
|
||||||
|
|
||||||
<pre class="prettyprint">
|
<pre class="prettyprint">
|
||||||
|
@ -26,10 +28,38 @@ them to the proper place, set permissions, etc.
|
||||||
|
|
||||||
The available configuration options are listed below. All elements are required.
|
The available configuration options are listed below. All elements are required.
|
||||||
|
|
||||||
* `source` (string) - The path to a local file to upload to the machine. The
|
* `source` (string) - The path to a local file or directory to upload to the
|
||||||
path can be absolute or relative. If it is relative, it is relative to the
|
machine. The path can be absolute or relative. If it is relative, it is
|
||||||
working directory when Packer is executed.
|
relative to the working directory when Packer is executed. If this is a
|
||||||
|
directory, the existence of a trailing slash is important. Read below on
|
||||||
|
uploading directories.
|
||||||
|
|
||||||
* `destination` (string) - The path where the file will be uploaded to in the
|
* `destination` (string) - The path where the file will be uploaded to in the
|
||||||
machine. This value must be a writable location and any parent directories
|
machine. This value must be a writable location and any parent directories
|
||||||
must already exist.
|
must already exist.
|
||||||
|
|
||||||
|
## Directory Uploads
|
||||||
|
|
||||||
|
The file provisioner is also able to upload a complete directory to the
|
||||||
|
remote machine. When uploading a directory, there are a few important things
|
||||||
|
you should know.
|
||||||
|
|
||||||
|
First, the destination directory must already exist. If you need to
|
||||||
|
create it, use a shell provisioner just prior to the file provisioner
|
||||||
|
in order to create the directory.
|
||||||
|
|
||||||
|
Next, the existence of a trailing slash on the source path will determine
|
||||||
|
whether the directory name will be embedded within the destination, or
|
||||||
|
whether the destination will be created. An example explains this best:
|
||||||
|
|
||||||
|
If the source is `/foo` (no trailing slash), and the destination is
|
||||||
|
`/tmp`, then the contents of `/foo` on the local machine will be uploaded
|
||||||
|
to `/tmp/foo` on the remote machine. The `foo` directory on the remote
|
||||||
|
machine will be created by Packer.
|
||||||
|
|
||||||
|
If the source, however, is `/foo/` (a trailing slash is present), and
|
||||||
|
the destination is `/tmp`, then the contents of `/foo` will be uploaded
|
||||||
|
directly into `/tmp` directly.
|
||||||
|
|
||||||
|
This behavior was adopted from the standard behavior of rsync. Note that
|
||||||
|
under the covers, rsync may or may not be used.
|
||||||
|
|
Loading…
Reference in New Issue