Compare commits

...

296 commits

Author SHA1 Message Date
Glenn Y. Rolland 0cc4a27f32 Update 'README.md' 2023-02-21 10:29:07 +00:00
Fabio 7e885eb8a4
Update README.md 2022-12-05 19:16:19 -03:00
Fabio 39bd2a8704
Update README.md 2022-12-05 19:16:03 -03:00
Fabio e4cc2f91a4
Update README.md 2022-11-22 18:14:16 -03:00
Fabio ceb4d98a22
Update README.md 2022-11-22 18:14:02 -03:00
Roman Mohr a0cdcb05a2 Merge pull request #180 from rmohr/dnf
dnf plugin
2016-11-22 16:10:02 +01:00
Roman Mohr fad6bbf6a0 Yum is replaced by DNF in newer Fedora releases
Check if yum is really present on a 'redhat' machine.  Only if it is,
enable the Yum bucket. The same for DNF since older versions of CentOS
and Fedora do not ship DNF.
2016-09-26 14:03:23 +02:00
Roman Mohr 5141e1305a Add support for DNF
If the folder `/car/cache/dnf` is present, the content will be cached
like in the Yum plugin.

A possible configuration to enable it:

Vagrant.configure(2) do |config|
   config.vm.box = "fedora/24-cloud-base"
  if Vagrant.has_plugin?("vagrant-cachier")
    config.cache.scope = :machine
    config.cache.auto_detect = false
    config.cache.enable :dnf
  end
end
2016-09-23 12:10:29 +02:00
Fabio Rehm 959ac6fbcc Update README.md 2016-07-18 23:01:42 -07:00
Fabio Rehm da0eff6a71 Merge pull request #165 from legal90/parallels
Announce compatibility with Parallels provider
2015-11-20 10:06:56 -02:00
Mikhail Zholobov c42420ec7c Announce compatibility with Parallels provider 2015-11-19 23:14:37 +02:00
Mehran Kholdi 8615b7495e Merge pull request #154 from BayanGroup/master
Add pip cache bucket
2015-07-28 10:21:39 +04:30
AmirAli Moinfar 6deb452f0d Add documentation for caching pip packages 2015-07-05 14:44:27 +04:30
AmirAli Moinfar 1c3fcd2768 Add support for caching pip packages
These directories are chached for pip packages:
$HOME/.cache/pip/http
$HOME/.cache/pip/wheels
2015-07-05 13:56:18 +04:30
Patrick Connolly 40dddfb368 v1.2.1 2015-07-03 14:51:55 -04:00
Patrick Connolly dd32f2472e Add chef_zero provisioner support. 2015-06-03 13:45:22 -04:00
Fabio Rehm 3b18f4a5ec Update README.md 2015-05-08 19:50:53 -03:00
Fabio Rehm 2c2411721b Merge pull request #141 from strzibny/fix-spelling
Fix spelling
2015-04-07 08:46:26 -03:00
Josef Stribny 92b95824ba Fix spelling 2015-04-07 09:19:26 +02:00
Fabio Rehm 2bb7f21273 v1.2.0 2015-01-14 23:11:54 -02:00
Fabio Rehm 00e2d858da Merge branch 'vagrant_1-7-1_fix' of https://github.com/Yserz/vagrant-cachier
Conflicts:
	lib/vagrant-cachier/cap/linux/chef_file_cache_path.rb
2015-01-14 23:04:32 -02:00
Fabio Rehm e227077008 Merge branch 'patch-1' of https://github.com/cassianoleal/vagrant-cachier 2015-01-14 23:03:29 -02:00
Fabio Rehm 050e9ea464 Merge branch 'cache-chef-gems' of https://github.com/jperville/vagrant-cachier 2015-01-14 23:02:34 -02:00
Fabio Rehm f09af37533 Update bundle 2015-01-14 23:02:15 -02:00
cassiano c6d4e57554 Do not modify Vagrant core object
Using [Array#keep_if](http://www.ruby-doc.org/core-1.9.3/Array.html#method-i-keep_if) on a Vagrant core object can lead to unpredictable behaviour down the line as it modifies the object instead of creating a new one.

An example of such interference is described on https://github.com/cassianoleal/vagrant-butcher/issues/57. The problem with `keep_if` was identified by @sethvargo on this issue: https://github.com/mitchellh/vagrant/issues/5060#issuecomment-68107995
2014-12-25 18:33:34 +01:00
Michael K 15b0039467 Use provisioner type attribute
Vagrant changed the provisioner name attribute to type in version 1.7.1.
2014-12-22 21:08:56 +01:00
Julien Pervillé 4647721f85 Add support for caching chef gems (in /opt/chef/embedded). 2014-10-29 13:09:22 +06:30
Fabio Rehm 9f6b615e84 v1.1.0 2014-10-15 01:28:54 -03:00
Fabio Rehm 1ccdbbeb48 Move bower docs to buckets dir 2014-10-15 01:25:38 -03:00
Fabio Rehm 21f475212c Update bundle 2014-10-15 01:22:11 -03:00
Fabio Rehm 837003ed48 Merge pull request #125 from slecache/bower
Add support for Bower
2014-10-15 01:16:26 -03:00
Fabio Rehm babc7e09ff Merge pull request #124 from neerolyte/composer_home_resolution
Resolve $HOME even if VM spits bogus new lines
2014-10-15 01:15:51 -03:00
Sebastien Lecacheur 1fe3e15c64 Fix Bower menu link in the docs 2014-10-07 00:07:19 +02:00
Sébastien LECACHEUR 973d5d1a8f Add support for Bower 2014-10-04 01:34:44 +02:00
David Schoen e9f4df338a Resolve $HOME even if VM spits bogus new lines
Fixes issue #122
2014-09-28 16:03:51 +10:00
Fabio Rehm b2b0d98dfa 💣 post install message 2014-09-22 22:24:54 -03:00
Fabio Rehm 1333041059 Bump version to 1.0 along with an update to dev dependencies 2014-09-22 22:22:03 -03:00
Fabio Rehm 7acbc815cf Add link to gitter to readme 2014-08-09 16:21:12 -03:00
Fabio Rehm 137bb91eec Add link to gitter chat on docs 2014-08-09 16:16:44 -03:00
Fabio Rehm 25f5582e20 v0.9.0 2014-08-09 16:07:57 -03:00
Fabio Rehm 25b5fa0285 Merge branch 'use_image_for_bucket_name_with_docker' of https://github.com/jbarbuto/vagrant-cachier 2014-08-09 15:39:12 -03:00
Fabio Rehm 4ab1640e7e Add notice about yum bucket and windows hosts (closes GH-117) 2014-08-09 15:36:22 -03:00
John Barbuto b7b3bcb3ed Check if image is set with docker provider
If build_dir is set instead for building images on demand, there's no way to
know what to set the bucket name to, except perhaps parsing it from Dockerfile.
2014-07-24 23:25:36 -07:00
John Barbuto c7c47782cb Use image for bucket name with docker, if box is unset
This allows multiple machines using the image to share the cache
and avoids the following error:

    /Applications/Vagrant/embedded/lib/ruby/2.0.0/pathname.rb:389:in
    `initialize': no implicit conversion of nil into String (TypeError)
2014-07-22 22:54:19 -07:00
Fabio Rehm d94f08a048 v0.8.0 (aka 1.0.0 release candidate) 2014-07-20 23:02:04 -03:00
Fabio Rehm 1a1b108c23 Disable apt-lists bucket for windows hosts
Fixes GH-106
2014-07-20 22:55:32 -03:00
Fabio Rehm 2b6a07d000 Skip chmod 777 for cache bucket root for smb synced folders
Closes GH-107
2014-07-20 22:14:19 -03:00
Fabio Rehm f8314aba52 Update CHANGELOG 2014-07-20 21:13:50 -03:00
Fabio Rehm 871f317ba6 Set composer cache bucket ownership to the configured SSH user 2014-07-20 21:13:35 -03:00
Fabio Rehm 44aa6a6c54 Remove unecessary logic to skip parent folder creation when preparing bucket symlinks 2014-07-20 21:12:28 -03:00
Fabio Rehm c4db3c1ef4 Use $HOME/.composer/cache as the root for the composer bucket
Fixes GH-89
2014-07-20 21:11:20 -03:00
Fabio Rehm 4265f58985 Remove some TODOs that have been around for way too long and havent been an issue for a long time 2014-07-20 20:52:31 -03:00
Fabio Rehm 2b00036484 Update CHANGELOG 2014-07-20 20:36:50 -03:00
Fabio Rehm 82fe74a888 👋 to the deprecated enable_nfs config 2014-07-20 20:36:32 -03:00
Fabio Rehm 5f4a7f1967 Make use of the Vagrantfile configured base box name instead of getting it from the Box object (which might be nil)
Closes GH-86
2014-07-20 20:34:14 -03:00
Fabio Rehm 183b2b55d8 Remove unused locale 2014-07-20 20:28:12 -03:00
Fabio Rehm 2cc7b837db Lets keep this code as it is 2014-07-20 20:15:47 -03:00
Fabio Rehm 2b8a281e8a Whitespace 2014-07-20 20:13:36 -03:00
Fabio Rehm d885c901b9 Up development version 2014-07-20 20:01:28 -03:00
Fabio Rehm 6bca147fb9 Use vagrant cloud base boxes for sanity checks 2014-07-20 19:59:27 -03:00
Fabio Rehm 228cae4a9a Remove Vagrant.require_plugin from sanity checks 2014-07-20 19:58:57 -03:00
Fabio Rehm e6826e6864 Update bundle 2014-07-20 19:25:55 -03:00
Fabio Rehm 2c51c7e636 Merge pull request #112 from glensc/patch-1
fix cache path
2014-07-04 10:23:30 -03:00
Elan Ruusamäe 5dbd5511fa fix cache path
the path used seems to be `/tmp/vagrant-cache`. at least in 0.7.2
2014-07-04 15:53:44 +03:00
Fabio Rehm bbd1e9c901 Make sure people know that synced_folder_opts are optional
I came across a blog post somewhere saying that this was required but I
can't find the link right now.
2014-06-23 18:01:01 -03:00
Fabio Rehm 5598824558 Update compatible providers list 2014-06-23 18:00:32 -03:00
Fabio Rehm 6f275353b8 Update README.md 2014-05-13 21:24:48 -03:00
Fabio Rehm 6e160ba4cb v0.7.2 2014-05-08 10:06:51 -03:00
Fabio Rehm f545717587 Merge pull request #104 from berendt/add_missing_cloud_providers
added missing cloud providers
2014-05-08 10:06:08 -03:00
Christian Berendt f65a1217e9 added missing cloud providers 2014-05-07 20:50:06 +02:00
Fabio Rehm 3997e2abc7 v0.7.1 2014-05-04 23:20:28 -03:00
Fabio Rehm 364876d8e9 Update bundle 2014-05-04 23:01:24 -03:00
Gustavo L. de M. Chaves 8ac8d7f6f6 Fix multi generic bucket set up
The previously documented way to specify multiple generic buckets
doesn't work because vagrant-cachier can't enable a bucket type more
than once.

Here we generalize the configs hash that the generic bucket gets making
it possible to specify multiple buckets with a single hash. The
documentation is changed accordingly.

Note that we keep it backwards compatible for single generic bucket
specification.

Issue: https://github.com/fgrehm/vagrant-cachier/issues/99
2014-04-16 09:04:49 -03:00
Fabio Rehm 184330dfb4 v0.7.0 2014-04-06 22:30:11 -03:00
Fabio Rehm ff5dd72c73 Download a specific version of vagrant-cachier tarball instead of master so that it can be cached properly 2014-04-06 22:28:15 -03:00
Fabio Rehm 7aea5a0ab0 Replace java cookbook usage with a simple remote_file cookbook to simplify testing 2014-04-06 22:23:27 -03:00
Fabio Rehm f10a2d488e Minor tweaks to the dev vagrantfile 2014-04-06 22:08:57 -03:00
Fabio Rehm 12f121e6e4 Properly fix GH-96 2014-04-06 21:47:24 -03:00
Fabio Rehm 20373aa0d7 Fix GH-96 2014-04-06 21:34:58 -03:00
Fabio Rehm 0f3d79e1bc Switch to ruby 1.9+ hash syntax on generic bucket docs 2014-04-06 21:30:34 -03:00
Fabio Rehm 5d9c433326 Add link to generic buckets docs to menu 2014-04-06 21:29:31 -03:00
Fabio Rehm 155821448f Tweak Gemfile for vagrant 1.5+ 2014-04-06 21:28:27 -03:00
Fabio Rehm 890f7c4a56 Update changelog 2014-04-06 21:28:09 -03:00
Fabio Rehm 04102aac8e Some more tweaking to generic bucket docs [GH-94] 2014-04-06 21:27:44 -03:00
Fabio Rehm a4c5f05263 Add missing end to generic bucket and remove capability method [GH-94] 2014-04-06 21:27:06 -03:00
Fabio Rehm 8d48dacf24 Skip bucket auto detection in case the bucket can't be auto detected [GH-94] 2014-04-06 21:25:58 -03:00
Fabio Rehm 2a17bc4f1d Minor tweaks to generic bucket docs [GH-94] 2014-04-06 21:05:13 -03:00
Fabio Rehm ffd6c514dd Merge branch 'generic-bucket' of https://github.com/gnustavo/vagrant-cachier 2014-04-06 21:02:56 -03:00
Fabio Rehm b28da3ab26 Up version to 0.7.0 as we will add a new feature to the plugin 2014-04-06 21:02:37 -03:00
Fabio Rehm ff2bc00ee3 Update bundle 2014-04-06 21:02:15 -03:00
Gustavo L. de M. Chaves a63156e482 Implement generic bucket
This bucket must be explicitly enabled and may be useful for users
wanting a generic caching mechanism that they can use directly instead
of via some predefined packaging system.

For instance, this enables one to implement a cache for packages
downloaded via wget or curl.
2014-03-23 22:29:23 -03:00
Fabio Rehm 2df1e31940 Update bundle 2014-02-27 01:12:35 -03:00
Fabio Rehm 2faa661546 Up dev version 2014-02-26 22:05:35 -03:00
Fabio Rehm ede55cdfaf v0.6.0 2014-02-26 22:03:22 -03:00
Fabio Rehm 33dee6419a Minor dev Vagrantfile tweaks 2014-02-26 22:03:22 -03:00
Fabio Rehm ec96099e25 Change arch dev box url 2014-02-26 22:03:22 -03:00
Fabio Rehm 4bb48baf40 Add docker-provider as compatible provider (next version will be) and remove vagrant-libvirt + vagrant-kvm as I'm not sure if it really works there yet 2014-02-26 22:03:22 -03:00
Fabio Rehm f968e2d458 Improve check for whether we should warm up the cache or not 2014-02-26 22:03:22 -03:00
Fabio Rehm 2db38dfa6e Remove unused var 2014-02-26 22:03:22 -03:00
Fabio Rehm b8394f7e6a Ensure apt partial dirs are created _after_ the symlink is in place, otherwise we would not be able to properly detect whether a bucket is empty or not 2014-02-26 22:03:22 -03:00
Fabio Rehm ac4243d85e Warm up empty buckets with Guest VM files 2014-02-26 22:03:22 -03:00
Fabio Rehm 09966efc26 Clean up the development environment 2014-02-26 22:03:22 -03:00
Fabio Rehm 5d617f2c48 Bump java cookbook used on dev VM 2014-02-26 22:03:22 -03:00
Fabio Rehm ae85e996ed Update CHANGELOG 2014-02-26 22:03:22 -03:00
Fabio Rehm 2a63617e75 Ensure /tmp/vagrant-cache exists before chmodding it 2014-02-26 22:03:22 -03:00
Fabio Rehm 01bef9f407 Fix npm bucket
npm is the only bucket that uses this method
2014-02-26 22:03:22 -03:00
Fabio Rehm 07df936e4a Note GH-85 on CHANGELOG 2014-02-26 22:03:22 -03:00
Fabio Rehm b4d12be2e5 Add docs for apt-lists bucket 2014-02-26 22:03:22 -03:00
Fabio Rehm 437ba6a4cf ⚠️ Massive refactoring of buckets code ⚠️
Doing this is kinda irresponsible because we don't have any unit testing
in place but I've had enough of copy & pasting things around. Although it
doesn't make the codebase GREAT, I believe it'll reach a _nice_ status :)

Thanks to those changes I realized that skipping configuration of
buckets that have already been configured was easier than I thought and
should be enough to close GH-85 \o/
2014-02-26 22:03:22 -03:00
Fabio Rehm 1c2116f317 Support for offline provisioning of apt-packages by caching /var/lib/apt/lists [GH-84] 2014-02-26 22:03:22 -03:00
Fabio Rehm 1fa46ca2d4 Do not attempt chmods when the plugin is disabled 2014-02-26 22:03:21 -03:00
Fabio Rehm 8d6c7c62da Handle nil value for synced_folder_opts 2014-02-26 22:03:21 -03:00
Fabio Rehm 0dd1b20053 chmod /tmp/vagrant-cache on guest VM to 777 to work around some permission issues as explained on GH-74 2014-02-26 22:03:21 -03:00
Fabio Rehm 59887560ed Trigger plugin activation by setting cache scope [GH-17] 2014-02-26 22:03:21 -03:00
Fabio Rehm 849374e0d1 Fix example of removing buckets from machine scoped dirs [GH-82] 2014-02-26 22:03:21 -03:00
Fabio Rehm aaff51fda8 Update usage docs 2014-02-26 22:03:21 -03:00
Fabio Rehm 509872e91b Forgot to update this to reflect whats going on under the hood 2014-02-26 22:03:21 -03:00
Fabio Rehm 29a4c3c45e http://tom.preston-werner.com/2010/08/23/readme-driven-development.html 2014-02-26 22:03:21 -03:00
Fabio Rehm 2296d35251 According to @miurahr on GH-81 we are compatible with vagrant-kvm \o/ 2014-02-26 22:03:21 -03:00
Fabio Rehm 7d7f048dfb We dont have any provider specific code on around anymore so it should be compatible with any "non-cloud provider" 2014-02-26 22:03:21 -03:00
Fabio Rehm 6bf733d8ed Github have analytics now, lets not worry about bitdeli 2014-02-26 22:03:21 -03:00
Fabio Rehm 6df1efd0ba Update CHANGELOG 2014-02-26 22:03:21 -03:00
Teemu Matilainen a8f05e4b11 Fix usage examples 2014-02-26 22:03:21 -03:00
Fabio Rehm ea88562145 Sorry about that, was testing GH-45 2014-02-26 22:03:21 -03:00
Fabio Rehm 0106155a0f Disable the plugin on machines backed by cloud providers (fix GH-45) 2014-02-26 22:03:21 -03:00
Fabio Rehm 09d65c4a3c Ooops 2014-02-26 22:03:21 -03:00
Fabio Rehm 8a4b911678 Extract plugin hooks and capabilities out to separate files 2014-02-26 22:03:21 -03:00
Fabio Rehm b65438007d Update CHANGELOG 2014-02-26 22:03:21 -03:00
Fabio Rehm ca8764f938 Add support for disabling the plugin [GH-72] 2014-02-26 22:03:21 -03:00
Fabio Rehm 6908b94609 Improved logging 2014-02-26 22:03:21 -03:00
Fabio Rehm 2f75ffe692 Clean up InstallBuckets action a bit 2014-02-26 22:03:21 -03:00
Fabio Rehm 0f533a9b30 💣 monkey patch on Builtin::Provision action \o/ (closes GH-60) 2014-02-26 22:03:21 -03:00
Fabio Rehm aa793367b7 Extract cachier's root bucket directory creation out to a separate action [GH-60] 2014-02-26 22:03:21 -03:00
Fabio Rehm e01a78138a Blow up if using vagrant < 1.4.0 2014-02-26 22:03:21 -03:00
Fabio Rehm daf7488bbc Update CHANGELOG 2014-02-26 22:03:20 -03:00
Fabio Rehm d823a97cb8 When specifying NFS synced folders we need to use a symbol (fix GH-76) 2014-02-26 22:03:20 -03:00
Fabio Rehm 4ffb47f838 Display enable_nfs deprecation warning only once 2014-02-26 22:03:20 -03:00
Fabio Rehm e4f6dd69e4 Display a warning using Vagrant's UI in case enable_nfs is set 2014-02-26 22:03:20 -03:00
Fabio Rehm fccd43d8e2 Lock vagrant to 1.4.3 2014-02-26 22:03:20 -03:00
Fabio Rehm 8ae667ead9 Mention synced_folder_opts on CHANGELOG 2014-02-26 22:03:20 -03:00
Fabio Rehm cdf13d3f70 Mark config.enable_nfs as deprecated 2014-02-26 22:03:20 -03:00
Fabio Rehm 3b83867427 Replace enable_nfs and sync_opts config with synced_folder_opts 2014-02-26 22:03:20 -03:00
Fabio Rehm 9c7b02b3ac Update docs to reflect what's going to be implemented 2014-02-26 22:03:20 -03:00
Fabio Rehm ed6c76dedf We'll probably forget to update these guys, better do it now :) 2014-02-26 22:03:20 -03:00
Fabio Rehm 1541f35ef8 This is no longer needed 2014-02-26 22:03:20 -03:00
Fabio Rehm 98c211590c After 5 months I believe it is safe to get rid of this code 2014-02-26 22:03:20 -03:00
Fabio Rehm 5ff8d1013a We'll drop support for Vagrant < 1.4, that means we should be bumping to 0.6.0 2014-02-26 22:03:20 -03:00
Fabio Rehm 1bc96e77d3 Update bundle 2014-02-26 22:03:20 -03:00
Erno Aapa 4668f1d486 Support for extra synced_folder options
Added ability to pass extra synced_folder options through new
config.cache.sync_opts -configuration.
2014-02-26 22:03:20 -03:00
Teemu Matilainen 12f7963d1f Merge pull request #75 from tuminoid/patch-1
README.md - conditional plugin specific configs
2014-01-08 04:31:38 -08:00
Tuomo Tanskanen 949df52a26 Documentation: conditional plugin specific configs
Wrap plugin specific configs into has_plugin checks to avoid breakage when Vagrantfile is shared and/or plugin is removed (for testing/development).
2014-01-08 06:45:52 +02:00
Fabio Rehm 5342a7ce33 🎆 New year 🎆 2014-01-02 00:51:05 -02:00
Fabio Rehm 50f4536ff7 Up version for development 2013-12-20 11:56:14 -02:00
Fabio Rehm 27b87567a5 v0.5.1 2013-12-20 11:55:04 -02:00
Fabio Rehm 4e3d352848 Update CHANGELOG 2013-12-20 11:53:25 -02:00
Fabio Rehm 02ac1769d2 Merge pull request #73 from fgrehm/67-fix-nfs-for-vagrant-1.4
Fix NFS configs for 1.4
2013-12-20 05:51:20 -08:00
Fabio Rehm 3de0118d50 Fix link to auto_detect docs 2013-12-18 03:24:26 -02:00
Fabio Rehm aa46abac37 Fix NFS configs for 1.4 while keeping support for < 1.4 as well 2013-12-18 03:19:15 -02:00
Fabio Rehm ba841b1c53 Remove commented out code from dev Vagrantfile 2013-12-17 22:46:25 -02:00
Fabio Rehm e2da4dd537 Update usage.md 2013-12-13 21:21:46 -02:00
Fabio Rehm 354c9ca2b5 Merge pull request #64 from fgrehm/docs
Yes we have Docs!!!!
2013-12-12 08:10:12 -08:00
Fabio Rehm d8e195bb63 Tweak benchmarks table styling 2013-12-09 10:33:15 -02:00
Fabio Rehm f1618d7d14 Merge pull request #65 from marksteve/docs
Make menu links relative
2013-12-08 17:48:18 -08:00
Mark Steve Samson b28ac072a5 Make menu links relative 2013-12-08 09:24:13 +08:00
Fabio Rehm 3421b4489a Fix GA tracking code 2013-12-07 13:01:24 -02:00
Fabio Rehm 27788c995c Document rvm gotchas
Closes GH-43
2013-12-07 12:57:41 -02:00
Fabio Rehm 5a488a2972 Heads up about bundle install --deployment
Closes GH-62
2013-12-07 12:47:36 -02:00
Fabio Rehm 54407fd2da Improve dev docs 2013-12-07 12:43:49 -02:00
Fabio Rehm c4ba0c9445 Remove my name from output :P 2013-12-07 12:36:55 -02:00
Fabio Rehm fb97820993 Remove docs from readme 2013-12-07 12:36:38 -02:00
Fabio Rehm 16b68e72f1 Improve buckets docs 2013-12-07 12:36:03 -02:00
Fabio Rehm 3c4a20f44d Hide github badges on smaller screens 2013-12-07 03:54:03 -02:00
Fabio Rehm 0340d6e76b docs: Adjust menu 2013-12-07 03:51:10 -02:00
Fabio Rehm 03b2b80121 docs on development 2013-12-07 03:50:47 -02:00
Fabio Rehm 00f4aaa28c docs for buckets 2013-12-07 03:43:37 -02:00
Fabio Rehm 94ba773ce6 docs: usage 2013-12-07 03:26:36 -02:00
Fabio Rehm 2734186347 Benchmarks 2013-12-07 03:09:28 -02:00
Fabio Rehm 94de55a241 docs: How does it work? 2013-12-07 02:42:49 -02:00
Fabio Rehm eb544ae773 docs index 2013-12-07 02:10:11 -02:00
Fabio Rehm fc6819ce00 Import viewdocs-yeti layout 2013-12-07 02:04:41 -02:00
Fabio Rehm 1862eeca61 Merge pull request #63 from ealden/use-precise64-boxes-in-tests
Use precise64 as box for all fixtures
2013-12-05 07:23:40 -08:00
Ealden Esto E. Escañan 5e5070dc14 Vagrant should be able to download precise64 if we don't have it 2013-12-05 22:50:17 +08:00
Ealden Esto E. Escañan e960cdb265 Use precise64 for all fixtures
Should be easier to run the acceptance tests as we now only need to get
1 box instead of 2 before.
2013-12-05 22:42:50 +08:00
Fabio Rehm 56b86a0deb Update README.md 2013-11-12 09:00:55 -02:00
Fabio Rehm 2cb0610cc1 Up version for development 2013-11-08 19:01:24 -02:00
Fabio Rehm a9f41c5f01 v0.5.0 is coming out NOW! 🎆 2013-11-08 18:49:57 -02:00
Fabio Rehm fc9a07dfba Merge pull request #55 from fgrehm/release-0.5.0
Release 0.5.0
2013-11-08 12:48:50 -08:00
Fabio Rehm 4d01bff390 v0.5.0 2013-11-06 19:45:20 -02:00
Fabio Rehm 00c9cce50d [GH-54] Add a suse VM to our dev Vagrantfile so we can try things out 2013-11-06 19:44:11 -02:00
Fabio Rehm 6a8d661e97 [GH-54] Disable yum on suse guests 2013-11-06 19:43:18 -02:00
Fabio Rehm 0704ca2ce2 Make sure dev VMs have different IPs 2013-11-06 19:42:24 -02:00
Fabio Rehm 9e0e0d50b5 [GH-54] Fix zypper cache path 2013-11-06 19:16:54 -02:00
Gordon Franke 93c0c7bf99 add zypper support 2013-11-05 15:10:00 +01:00
Fabio Rehm 536ca7ad54 Up version for dev 2013-10-27 22:16:07 -02:00
Fabio Rehm c85558010a v0.4.1 2013-10-27 22:14:21 -02:00
Fabio Rehm 17a475a688 Update CHANGELOG 2013-10-26 16:35:45 -02:00
Fabio Rehm 7bc70b7d6e Do not attempt to configure apt-cacher-ng bucket if it is not installed on the guest machine 2013-10-26 15:47:31 -02:00
Fabio Rehm 8e40d0c060 Up version for dev 2013-10-23 22:31:43 -02:00
Fabio Rehm d558a0ac7f Merge pull request #47 from fgrehm/0.4.0
Say hi to 0.4.0
2013-10-23 17:28:34 -07:00
Fabio Rehm 64c9b91cf9 v0.4.0 2013-10-23 22:27:22 -02:00
Fabio Rehm 2b56bef572 readme: Add link to npm and mention composer 2013-10-23 22:23:34 -02:00
Fabio Rehm b769618f81 Update CHANGELOG 2013-10-23 22:23:34 -02:00
Fabio Rehm 850841fe0a Break some lines 2013-10-23 22:17:26 -02:00
Fabio Rehm e0eeb125d0 Prevent apt cacher bucket from being installed in case NFS is disabled 2013-10-23 22:17:25 -02:00
Fabio Rehm f38db9efc4 Update CHANGELOG 2013-10-23 22:17:25 -02:00
Fabio Rehm b1aa9a1967 Install node on dev vm so we can try things out 2013-10-23 22:11:21 -02:00
Fabio Rehm 42cd490313 Merge branch 'npm-cache' of github.com:laggyluke/vagrant-cachier
Conflicts:
	lib/vagrant-cachier/bucket.rb
2013-10-23 21:17:32 -02:00
Fabio Rehm 06d80b47f9 Merge pull request #50 from fgrehm/composer-cache
Composer cache
2013-10-23 16:09:32 -07:00
George Miroshnykov ee6174d33c Add npm support 2013-10-23 16:18:42 +03:00
Fabio Rehm f8e419b8b6 "Disable" composer bucket if php is not installed 2013-10-22 13:56:38 -02:00
Fabio Rehm a0a164cf2b Install php-cli on dev box 2013-10-22 13:56:38 -02:00
fh 828793afde removing trailing slashes and chomp() 2013-10-22 16:42:29 +02:00
fh 817d964b8e Adding support for composer cache - http://getcomposer.org/ 2013-10-21 11:17:59 +02:00
Fabio Rehm fa8c59a16c Merge pull request #46 from fgrehm/8-fix-force-halt-when-nonresponsive
Fix GH-8
2013-10-18 14:52:11 -07:00
Fabio Rehm cfabddc7c8 Let users know we will attempt to remove symlinks, otherwise vagrant won't output anything prior to the warn 2013-10-17 14:04:09 -03:00
Fabio Rehm 199a14b61f Let users know we were not able to SSH into the VM to remove symlinks 2013-10-17 13:56:27 -03:00
Fabio Rehm 9ebdc24da4 Bundle update 2013-10-17 13:18:10 -03:00
Fabio Rehm cfa2cc262f Fix GH-8 by doing an extra check whether the VM is SSHable 2013-10-17 13:07:43 -03:00
Fabio Rehm 24c1d3a8ac Clean up Action::Clean a bit and get ready to fix GH-8 2013-10-17 12:58:16 -03:00
Fabio Rehm 88a06626a2 Update CHANGELOG 2013-10-13 17:14:16 -03:00
Fabio Rehm 4e0d1bd8cd Up version for development 2013-10-13 17:14:16 -03:00
Fabio Rehm 4972ec0fa5 Replace apt-cacher error with warning 2013-10-13 17:14:16 -03:00
Fabio Rehm d6066fbde7 Merge pull request #30 from mindreframer/apt-cacher
Apt cacher bucket
2013-10-13 13:14:05 -07:00
Fabio Rehm 11defb0b29 v0.3.3 2013-09-11 20:47:24 -03:00
Fabio Rehm b0180b16d9 Add vagrant-global-status to the mix so we can keep track of VMs left behind 2013-09-11 20:30:00 -03:00
Fabio Rehm f8484f7343 Update CHANGELOG 2013-09-01 19:06:33 -03:00
Fabio Rehm 0b13040888 Create apt bucket partial cache dir [GH-40] 2013-09-01 19:06:33 -03:00
Fabio Rehm 246ab52380 Machine scoped cache is no longer tied to providers! 2013-08-20 01:27:37 -03:00
Fabio Rehm 8e89c0b1d5 Up version for dev 2013-08-15 00:53:07 -03:00
Fabio Rehm 837399cd0f v0.3.2 2013-08-15 00:46:45 -03:00
Fabio Rehm 2e7d6d4f32 Add development section to the readme 2013-08-15 00:46:28 -03:00
Fabio Rehm 079f1fccbb Clean up development vagrantfile a bit 2013-08-15 00:41:59 -03:00
Fabio Rehm 49b36c012a Ensure @env is set at all times during provision action
This fixes the build and closes #41
2013-08-13 23:52:21 -03:00
Fabio Rehm 8efb8daf07 Implement some initial sanity checks using Bats
Somehow related to GH-1
2013-08-13 23:51:13 -03:00
Fabio Rehm 92b36edee9 Up version for development 2013-08-13 13:04:37 -03:00
Fabio Rehm 22528178d4 v0.3.1 2013-08-13 13:03:02 -03:00
Fabio Rehm e46a3c398b Prevent errors when caching is disabled 2013-08-06 17:31:55 -03:00
Fabio Rehm bd847ce053 Up version for development 2013-08-06 17:31:27 -03:00
Fabio Rehm 41ae83f407 Merge pull request #35 from fgrehm/0.3.0
0.3.0
2013-08-05 09:16:08 -07:00
Fabio Rehm 71885845ad v0.3.0 2013-08-05 13:15:02 -03:00
Fabio Rehm 5b5befaa26 Add VMware as a compatible provider with NFS heads up 2013-08-05 13:15:02 -03:00
Fabio Rehm 4a351965da Update changelog 2013-08-03 17:14:39 -03:00
Fabio Rehm 07d34726e2 Clean up plugin.rb 2013-08-03 17:14:39 -03:00
Fabio Rehm 6a8926d04a Improve formatting of the "moving dirs around" message and close #6 2013-08-03 17:14:39 -03:00
Fabio Rehm 9f90f43a21 [GH-6] Move provider specific cache dir to the right path if a single cache dir exists 2013-08-03 17:14:39 -03:00
Fabio Rehm f8d8b2f9cf [GH-6] Error out if multiple provider specific cache dirs are found and prepare to move dirs around in case a single cache dir exists 2013-08-03 16:07:42 -03:00
Fabio Rehm 7ad195776d [GH-6] Setting things up for making sure a single cache root exists 2013-08-03 15:08:20 -03:00
Fabio Rehm 068d9cc8b8 Validate machine scopes from config object and show a nice looking message instead of a stacktrace :)
This should be enough to close #33
2013-08-03 14:53:43 -03:00
Fabio Rehm 20e1176a10 Allow cache scopes to be set as either a symbol or a string 2013-08-03 14:38:02 -03:00
Fabio Rehm b50374162a ProvisionExt is not an action! 2013-08-03 14:38:02 -03:00
Fabio Rehm 18ff01907e Extract "removing symlinks" message out to locale file 2013-08-03 14:28:22 -03:00
Fabio Rehm b109e3c4ad Extract "skipping bucket" message out to a locale file 2013-08-03 14:27:54 -03:00
Fabio Rehm 5f30e3c9da Merge pull request #32 from fgrehm/26-reconfigure-buckets-before-each-provisioner
Reconfigure buckets before each provisioner
2013-08-03 09:38:29 -07:00
Fabio Rehm b07956ee3e Update CHANGELOG 2013-08-03 13:37:05 -03:00
Fabio Rehm 175aba8b43 Update docs 2013-08-03 13:35:59 -03:00
Fabio Rehm e7912fa14a Reconfigure buckets around after each provisioner
Unfortunately I couldn't think of another way of doing this apart from
monkey patching, there is no way to replace a previously defined action
neither we can hook into calls to provisioners themselves.
2013-08-03 13:35:59 -03:00
Fabio Rehm 410872230b Split actions into separate files 2013-08-03 13:35:59 -03:00
Fabio Rehm 0ab8e98862 Indent code 2013-08-03 13:18:30 -03:00
Fabio Rehm c6b568c5f7 Update dependencies 2013-08-03 13:18:14 -03:00
Fabio Rehm c9d9f4b758 Update changelog 2013-08-03 13:18:01 -03:00
Fabio Rehm 35f594e2af Merge pull request #27 from tmatilai/bucket-errors
Don't error out if a bucket is configured for a non-capable guest
2013-08-03 09:10:45 -07:00
Teemu Matilainen 8203161d6d Don't error out if a bucket is configured for a non-capable guest
If a bucket is configured (globally), just print an info level message
when configuring a non-capable guest machine.
2013-08-01 22:35:12 +03:00
Fabio Rehm f5d9ce5072 Update CHANGELOG.md 2013-07-22 18:25:45 -03:00
Patrick Connolly a5b01d2060 Merge pull request #14 from patcon/14-chef-file-cache-path
Adds `file_cache_path` support for Chef
2013-07-22 09:16:51 -07:00
Patrick Connolly 2a7b150fbc Adds chef file_cache_path to README. 2013-07-22 12:16:11 -04:00
Patrick Connolly 82295481db Prepares development Vagrantfile for Chef's file_cache_path testing. 2013-07-22 11:55:09 -04:00
Patrick Connolly 3eede6caf9 Adds basic chef file_cache_path support. 2013-07-22 11:51:27 -04:00
Fabio Rehm 57528f5420 Up version for development 2013-07-21 19:07:06 -03:00
Fabio Rehm 6f25abd4ae Add vagrant-pristine to the mix to ease development 2013-07-18 23:56:42 -03:00
Fabio Rehm 8fad5fafd8 Bump dependencies 2013-07-18 23:54:01 -03:00
Roman Heinrich 8b0b08eace removing misleading warning for apt-cacher in readme 2013-07-17 18:56:26 +02:00
Roman Heinrich fdd6daa5fc readme for apt-cacher 2013-07-17 18:39:15 +02:00
Roman Heinrich b0110897a7 apt-cacher bucket + capability 2013-07-17 13:48:49 +02:00
Roman Heinrich ce6e08fd0d handle MultiWord bucket classes 2013-07-17 13:47:53 +02:00
Roman Heinrich 064160288a handle buckets with "_" in name 2013-07-17 13:47:35 +02:00
Fabio Rehm ae6cb5bcfb v0.2.0 2013-07-10 21:13:06 -03:00
Fabio Rehm 355185b4ce Install RVM for vagrant user and prevent installation if already installed 2013-07-10 20:53:50 -03:00
Fabio Rehm ff23fbaec4 Minor tweak to the readme 2013-07-10 20:53:49 -03:00
Fabio Rehm 5f26cade6c Merge pull request #21 from cromulus/rvm_support
Rvm support
2013-07-10 16:46:16 -07:00
Bill Cromie 9831b198dc adding rvm info to the docs 2013-07-01 17:01:55 -04:00
Bill Cromie 1eccfb2ad4 adding rvm installation to the vagrant file 2013-06-25 16:54:32 -04:00
Bill Cromie d4f96f3f75 renaming rvmdir -> rvm_path 2013-06-25 15:51:59 -04:00
Bill Cromie 58c8b40faf minor changelog updates. 2013-06-25 15:19:55 -04:00
Bill Cromie 3a9ac6140b loading in the rvmdir classes in the plugin file.
This should now work...
2013-06-21 15:09:25 -04:00
Bill Cromie bf10fc4efc adding requires for the rvm files 2013-06-17 17:22:38 -04:00
Bill Cromie e89bd1ca2e first whack at rvm support in vagrant-cachier 2013-06-17 17:17:31 -04:00
Fabio Rehm 6b2169f9d6 Merge pull request #7 from fgrehm/7-nfs-support
Support enabling NFS for root cache folder
2013-06-12 09:43:23 -07:00
Fabio Rehm 5b9edb2b8b Mention NFS support on readme 2013-06-11 20:23:46 -03:00
Fabio Rehm bbdbc5beba Add support for using NFS for root cache folder 2013-06-11 20:17:54 -03:00
Fabio Rehm df79d420c5 Update Gemfile.lock 2013-06-11 20:06:23 -03:00
Patrick Connolly 4cc85837cc Updates gemspec with VagrantPlugins namespacing. 2013-06-10 19:14:53 -04:00
Fabio Rehm 533f9f091f Merge pull request #11 from patcon/11-new-release
New gem release: 0.0.7
2013-06-10 15:17:51 -07:00
Patrick Connolly cd8a925cf6 v0.1.0 2013-06-09 23:14:21 -04:00
Fabio Rehm c9deee0aa7 Merge pull request #9 from patcon/9-vagrantplugins-namespace
Move to VagrantPlugins top-level namespace
2013-06-08 14:52:32 -07:00
Patrick Connolly 292c7d2444 Moves from Vagrant to VagrantPlugins top-level namespace. 2013-06-07 22:37:02 -04:00
Fabio Rehm 5bf87ee49f Shameless plug 2013-05-24 19:18:16 -03:00
80 changed files with 2460 additions and 436 deletions

View file

@ -1 +1,227 @@
# 0.0.2 Initial release
## [1.2.1](https://github.com/fgrehm/vagrant-cachier/compare/v1.2.0...v1.2.1) (July 3, 2015)
IMPROVEMENTS:
- Add chef\_zero support to chef bucket [[GH-153]]
[GH-153]: https://github.com/fgrehm/vagrant-cachier/issues/153
## [1.2.0](https://github.com/fgrehm/vagrant-cachier/compare/v1.1.0...v1.2.0) (Jan 14, 2015)
FEATURES:
- [Chef Gems bucket](http://fgrehm.viewdocs.io/vagrant-cachier/buckets/chef_rubygems) [[GH-129]]
[GH-129]: https://github.com/fgrehm/vagrant-cachier/pull/129
BUG FIXES:
- Fix provisioner resolution on Vagrant 1.7+ [[GH-133]] / [[GH-134]]
- Do not modify Vagrant core object, preventing unpredictable behavior [[GH-135]]
[GH-133]: https://github.com/fgrehm/vagrant-cachier/issues/133
[GH-134]: https://github.com/fgrehm/vagrant-cachier/pull/134
[GH-135]: https://github.com/fgrehm/vagrant-cachier/pull/135
## [1.1.0](https://github.com/fgrehm/vagrant-cachier/compare/v1.0.0...v1.1.0) (Oct 15, 2014)
FEATURES:
- [Bower bucket](http://fgrehm.viewdocs.io/vagrant-cachier/buckets/bower) [[GH-125]]
[GH-125]: https://github.com/fgrehm/vagrant-cachier/pull/125
IMPROVEMENTS:
- Resolve $HOME even if VM spits bogus new lines [[GH-122]] / [[GH-124]]
[GH-122]: https://github.com/fgrehm/vagrant-cachier/issues/122
[GH-124]: https://github.com/fgrehm/vagrant-cachier/pull/124
## [1.0.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.9.0...v1.0.0) (Sep 22, 2014)
Public API is considered stable.
## [0.9.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.8.0...v0.9.0) (Aug 9, 2014)
FEATURES:
- Suport for caching packages for Docker containers that doesn't have a base box specified [[GH-116]]
[GH-116]: https://github.com/fgrehm/vagrant-cachier/pull/116
## [0.8.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.7.2...v0.8.0) (Jul 20, 2014)
BACKWARDS INCOMPATIBILITIES:
- Removed deprecated `config.enable_nfs` config.
- Changed composer cache bucket to use `$HOME/.composer/cache` [[GH-89]]
IMPROVEMENTS:
- Set composer cache bucket ownership to the configured SSH user.
BUG FIXES:
- Automatically disable apt-lists bucket when a Windows host is detected [[GH-106]]
- Skip `chmod 777` for `smb` mounted folders [[GH-107]]
- Do not error if base box has been removed and `:box` is configured as the cache scope [[GH-86]]
[GH-86]: https://github.com/fgrehm/vagrant-cachier/issues/86
[GH-89]: https://github.com/fgrehm/vagrant-cachier/issues/89
[GH-106]: https://github.com/fgrehm/vagrant-cachier/issues/106
[GH-107]: https://github.com/fgrehm/vagrant-cachier/issues/107
## [0.7.2](https://github.com/fgrehm/vagrant-cachier/compare/v0.7.1...v0.7.2) (May 08, 2014)
IMPROVEMENTS:
- Add `azure`, `brightbox`, `cloudstack`, `vcloud` and `vsphere` to the list
of known cloud providers [[GH-104]]
[GH-104]: https://github.com/fgrehm/vagrant-cachier/pull/104
## [0.7.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.7.0...v0.7.1) (May 04, 2014)
BUG FIXES:
- Fix support for using multiple generic buckets [[GH-101]]
[GH-101]: https://github.com/fgrehm/vagrant-cachier/pull/101
## [0.7.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.6.0...v0.7.0) (Apr 06, 2014)
FEATURES:
- ["Generic" cache bucket](http://fgrehm.viewdocs.io/vagrant-cachier/buckets/generic) [[GH-94]] / [[GH-4]].
BUG FIXES:
- Fix apt-cacher bucket undefined method error [[GH-96]]
[GH-94]: https://github.com/fgrehm/vagrant-cachier/pull/94
[GH-4]: https://github.com/fgrehm/vagrant-cachier/issues/4
[GH-96]: https://github.com/fgrehm/vagrant-cachier/issues/96
## [0.6.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.5.1...v0.6.0) (Feb 26, 2014)
BACKWARDS INCOMPATIBILITIES:
- Plugin activation is now triggered by the `cache.scope` config and that config
is now required. Previous versions of the plugin had it set to `:box` but
there is no consensus whether `:box` and `:machine` is better. This is to
highlight that you need to think about the caching strategy you are going
to use. For more information and to discuss this move please check [GH-17](https://github.com/fgrehm/vagrant-cachier/issues/17).
- Because `cache.scope` is now a requirement and in order to reduce the amount of
configuration required by the plugin, we enabled automatic bucket detection by
default. To revert to the old behavior you can disable it globally from your
`~/.vagrant.d/Vagrantfile`.
- Support for Vagrant < 1.4 is gone, please use a previous plugin version if
you are running Vagrant 1.2 / 1.3
- Automatic handling of multiple machine scoped cache dirs from versions
prior to 0.3.0 of this plugin was removed.
- Support for `enable_nfs` has been deprecated and will be removed on 0.7.0,
please use `cache.synced_folder_opts = {type: :nfs}` instead.
FEATURES:
- Warm up cache buckets with files available on guest in case bucket is empty
- Support for offline provisioning of apt-packages by caching `/var/lib/apt/lists` [GH-84]
- Support for specifying custom cache bucket synced folder opts
- Support to force disabe the plugin [GH-72]
- Automatically disable the plugin for cloud providers [GH-45]
- Skip configuration of buckets that have been configured already [GH-85]
BUG FIXES:
- Properly fix NFS support for Vagrant 1.4+ [GH-76]
## [0.5.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.5.0...v0.5.1) (Dec 20, 2013)
BUG FIXES:
- Fix NFS support for Vagrant 1.4+ [GH-67]
## [0.5.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.4.1...v0.5.0) (Nov 8, 2013)
FEATURES:
- Support for [zypper] [GH-54]
## [0.4.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.4.0...v0.4.1) (Oct 27, 2013)
BUG FIXES:
- Do not attempt to configure apt-cacher-ng bucket if it is not installed on guest
machine.
## [0.4.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.3.3...v0.4.0) (Oct 23, 2013)
FEATURES:
- Support for [npm](https://npmjs.org/) [GH-51]
- Support for [Composer](http://getcomposer.org/) [GH-48]
- Support for `apt-cacher-ng` [GH-30]
BUG FIXES:
- Allow halting nonresponsive machine when plugin is installed [GH-8]
## [0.3.3](https://github.com/fgrehm/vagrant-cachier/compare/v0.3.2...v0.3.3) (Sep 11, 2013)
BUG FIXES:
- Automatically create `partial` dir under apt cache bucket dir to allow usage
on Ubuntu 10.04 guests [GH-40]
## [0.3.2](https://github.com/fgrehm/vagrant-cachier/compare/v0.3.1...v0.3.2) (Aug 14, 2013)
BUG FIXES:
- Prevent errors when caching is disabled and a provisioner is enabled [GH-41]
## [0.3.1](https://github.com/fgrehm/vagrant-cachier/compare/v0.3.0...v0.3.1) (Aug 13, 2013)
BUG FIXES:
- Prevent errors when caching is disabled
## [0.3.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.2.0...v0.3.0) (Aug 5, 2013)
BACKWARDS INCOMPATIBILITIES:
- Machine scoped cache dirs are now kept on `.vagrant/machines/MACHINE/cache`
to allow downloaded packages to be reused between providers. If a single cache
directory exists, the plugin will automatically move it to the right place,
if multiple directories are found, it will halt execution and will error out,
letting the user know what has to be done in order to fix things.
FEATURES:
- Add `file_cache_path` support for Chef. [GH-14]
- Reconfigure buckets before each provisioner. [GH-26] / [GH-32]
IMPROVEMENTS:
- Don't error out if a bucket is configured for a non-capable guest. [GH-27]
## [0.2.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.1.0...v0.2.0) (July 10, 2013)
FEATURES:
- Support enabling NFS for root cache folder. [GH-7]
- Support RVM bucket
## [0.1.0](https://github.com/fgrehm/vagrant-cachier/compare/v0.0.6...v0.1.0) (June 9, 2013)
IMPROVEMENTS:
- Moves from `Vagrant` to recommended `VagrantPlugins` top-level
module namespace. [GH-9]
## 0.0.6 (May 22, 2013)
- Initial public release.

13
Gemfile
View file

@ -1,10 +1,13 @@
source 'https://rubygems.org'
# Specify your gem's dependencies in vagrant-cachier.gemspec
gemspec
group :development do
gem 'vagrant', github: 'mitchellh/vagrant'
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
gem 'vagrant', github: 'mitchellh/vagrant', tag: 'v1.7.2'
gem 'rake'
end
group :plugins do
gemspec
gem 'vagrant-lxc', github: 'fgrehm/vagrant-lxc'
gem 'vagrant-pristine', github: 'fgrehm/vagrant-pristine'
gem 'vagrant-omnibus'
end

View file

@ -1,41 +1,119 @@
GIT
remote: git://github.com/fgrehm/vagrant-lxc.git
revision: 2f88a060c911c466d304768dd349708336f8af1c
revision: c9cd671a32f730fff4b6e4fdd3687a531af0663c
specs:
vagrant-lxc (0.3.4)
vagrant-lxc (1.1.0)
GIT
remote: git://github.com/fgrehm/vagrant-pristine.git
revision: 503dbc47848c81d0fbfa6840491856f518d244a1
specs:
vagrant-pristine (0.3.0)
GIT
remote: git://github.com/mitchellh/vagrant.git
revision: ccfd321ef98dc5c12b180cc3a26f12d870c0eff5
revision: 1cd667b243f4a263cd5322b6455165cc676b6f7f
tag: v1.7.2
specs:
vagrant (1.2.3.dev)
childprocess (~> 0.3.7)
vagrant (1.7.2)
bundler (>= 1.5.2, < 1.8.0)
childprocess (~> 0.5.0)
erubis (~> 2.7.0)
hashicorp-checkpoint (~> 0.1.1)
i18n (~> 0.6.0)
json (>= 1.5.1, < 1.8.0)
log4r (~> 1.1.9)
listen (~> 2.8.0)
log4r (~> 1.1.9, < 1.1.11)
net-scp (~> 1.1.0)
net-ssh (~> 2.6.6)
net-sftp (~> 2.1)
net-ssh (>= 2.6.6, < 2.10.0)
nokogiri (= 1.6.3.1)
rb-kqueue (~> 0.2.0)
rest-client (>= 1.6.0, < 2.0)
wdm (~> 0.1.0)
winrm (~> 1.1.3)
PATH
remote: .
specs:
vagrant-cachier (0.0.6)
GEM
remote: https://rubygems.org/
specs:
childprocess (0.3.9)
akami (1.2.2)
gyoku (>= 0.4.0)
nokogiri
builder (3.2.2)
celluloid (0.16.0)
timers (~> 4.0.0)
childprocess (0.5.5)
ffi (~> 1.0, >= 1.0.11)
erubis (2.7.0)
ffi (1.8.1)
i18n (0.6.4)
json (1.7.7)
ffi (1.9.6)
gssapi (1.0.3)
ffi (>= 1.0.1)
gyoku (1.2.2)
builder (>= 2.1.2)
hashicorp-checkpoint (0.1.4)
hitimes (1.2.2)
httpclient (2.6.0.1)
httpi (0.9.7)
rack
i18n (0.6.11)
listen (2.8.5)
celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9)
little-plugger (1.1.3)
log4r (1.1.10)
net-scp (1.1.0)
logging (1.8.2)
little-plugger (>= 1.1.3)
multi_json (>= 1.8.4)
mime-types (2.4.3)
mini_portile (0.6.0)
multi_json (1.10.1)
net-scp (1.1.2)
net-ssh (>= 2.6.5)
net-ssh (2.6.7)
rake (10.0.4)
net-sftp (2.1.2)
net-ssh (>= 2.6.5)
net-ssh (2.9.2)
netrc (0.10.2)
nokogiri (1.6.3.1)
mini_portile (= 0.6.0)
nori (1.1.5)
rack (1.6.0)
rake (10.4.2)
rb-fsevent (0.9.4)
rb-inotify (0.9.5)
ffi (>= 0.5.0)
rb-kqueue (0.2.3)
ffi (>= 0.5.0)
rest-client (1.7.2)
mime-types (>= 1.16, < 3.0)
netrc (~> 0.7)
rubyntlm (0.1.1)
savon (0.9.5)
akami (~> 1.0)
builder (>= 2.1.2)
gyoku (>= 0.4.0)
httpi (~> 0.9)
nokogiri (>= 1.4.0)
nori (~> 1.0)
wasabi (~> 1.0)
timers (4.0.1)
hitimes
uuidtools (2.1.5)
vagrant-omnibus (1.4.1)
wasabi (1.0.0)
nokogiri (>= 1.4.0)
wdm (0.1.0)
winrm (1.1.3)
gssapi (~> 1.0.0)
httpclient (~> 2.2, >= 2.2.0.2)
logging (~> 1.6, >= 1.6.1)
nokogiri (~> 1.5)
rubyntlm (~> 0.1.1)
savon (= 0.9.5)
uuidtools (~> 2.1.2)
PLATFORMS
ruby
@ -45,3 +123,8 @@ DEPENDENCIES
vagrant!
vagrant-cachier!
vagrant-lxc!
vagrant-omnibus
vagrant-pristine!
BUNDLED WITH
1.10.4

View file

@ -1,4 +1,4 @@
Copyright (c) 2013 Fabio Rehm
Copyright (c) 2013-2014 Fabio Rehm
MIT License

211
README.md
View file

@ -1,197 +1,70 @@
🟢 We plan to support and maintain vagrant-lxc, as well as clean it up.<br/>
🟢 Please feel free to contribute Issues and pull requests.<br/>
🟢 P.S: Thanks [Fabio Rehm](https://fabiorehm.com) for the amazing initial project.
--------
# vagrant-cachier
[![Gem Version](https://badge.fury.io/rb/vagrant-cachier.png)](http://badge.fury.io/rb/vagrant-cachier) [![Gitter chat](https://badges.gitter.im/fgrehm/vagrant-cachier.png)](https://gitter.im/fgrehm/vagrant-cachier)
A [Vagrant](http://www.vagrantup.com/) plugin that helps you reduce the amount of
coffee you drink while waiting for boxes to be provisioned by sharing a common
package cache among similiar VM instances. Kinda like [vagrant-apt_cache](https://github.com/avit/vagrant-apt_cache)
or [this magical snippet](http://gist.github.com/juanje/3797297) but targetting
package cache among similar VM instances. Kinda like [vagrant-apt_cache](https://github.com/avit/vagrant-apt_cache)
or [this magical snippet](http://gist.github.com/juanje/3797297) but targeting
multiple package managers and Linux distros.
## Installation
Make sure you have Vagrant 1.2+ and run:
Make sure you have Vagrant 1.4+ and run:
```
vagrant plugin install vagrant-cachier
```
## Usage
The easiest way to set things up is just to enable [cache buckets auto detection](#auto-detect-supported-cache-buckets)
from within your `Vagrantfile`:
## Quick start
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'your-box'
config.cache.auto_detect = true
if Vagrant.has_plugin?("vagrant-cachier")
# Configure cached packages to be shared between instances of the same base box.
# More info on http://fgrehm.viewdocs.io/vagrant-cachier/usage
config.cache.scope = :box
# OPTIONAL: If you are using VirtualBox, you might want to use that to enable
# NFS for shared folders. This is also very useful for vagrant-libvirt if you
# want bi-directional sync
config.cache.synced_folder_opts = {
type: :nfs,
# The nolock option can be useful for an NFSv3 client that wants to avoid the
# NLM sideband protocol. Without this option, apt-get might hang if it tries
# to lock files needed for /var/cache/* operations. All of this can be avoided
# by using NFSv4 everywhere. Please note that the tcp option is not the default.
mount_options: ['rw', 'vers=3', 'tcp', 'nolock']
}
# For more information please check http://docs.vagrantup.com/v2/synced-folders/basic_usage.html
end
end
```
For more information about available buckets, please see the [configuration section](#configurations) below.
For more information please read the documentation available at
http://fgrehm.viewdocs.io/vagrant-cachier.
## Compatible providers
## Providers that are known to work
* Vagrant's built in VirtualBox provider
* Vagrant's built in VirtualBox and Docker providers
* [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc)
* [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See
[GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info)
* [vagrant-parallels](https://github.com/Parallels/vagrant-parallels)
* [vagrant-libvirt](https://github.com/pradels/vagrant-libvirt)
* [vagrant-kvm](https://github.com/adrahon/vagrant-kvm)
* _[Let us know if it is compatible with other providers!](https://github.com/fgrehm/vagrant-cachier/issues/new)_
_It is possibly compatible with the [VMware providers](http://www.vagrantup.com/vmware)
as well but I haven't tried yet._
## How does it work?
Right now the plugin does not make any assumptions for you and you have to
configure things properly from your `Vagrantfile`. Please have a look at
the [available cache buckets](#available-cache-buckets) section below for more
information.
Under the hood, the plugin will hook into calls to `Vagrant::Builtin::Provision`
during `vagrant up` / `vagrant reload` and will set things up for each configured
cache bucket. Before halting the machine, it will revert the changes required
to set things up by hooking into calls to `Vagrant::Builtin::GracefulHalt` so
that you can repackage the machine for others to use without requiring users to
install the plugin as well.
Cache buckets will be available from `/tmp/vagrant-cachier` on your guest and
the appropriate folders will get symlinked to the right path _after_ the machine is
up but _right before_ it gets provisioned. We _could_ potentially do it on one go
and share bucket's folders directly to the right path if we were only using VirtualBox
since it shares folders _after_ booting the machine, but the LXC provider does that
_as part of_ the boot process (shared folders are actually `lxc-start` parameters)
and as of now we are not able to get some information that this plugin requires
about the guest machine before it is actually up and running.
Please keep in mind that this plugin won't do magic, if you are compiling things
during provisioning or manually downloading packages that does not fit into a
"cache bucket" you won't see that much of improvement.
## Configurations
### Auto detect supported cache buckets
As described on the usage section above, you can enable automatic detection of
supported [cache "buckets"](#available-cache-buckets) by adding the code below to
your `Vagrantfile`:
```ruby
Vagrant.configure("2") do |config|
# ...
config.cache.auto_detect = true
end
```
This will make vagrant-cachier do its best to find out what is supported on the
guest machine and will set buckets accordingly.
### Cache scope
By default downloaded packages will get stored on a folder scoped to base boxes
under your `$HOME/.vagrant.d/cache`. The idea is to leverage the cache by allowing
downloaded packages to be reused across projects. So, if your `Vagrantfile` has
something like:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box'
end
```
The cached files will be stored under `$HOME/.vagrant.d/cache/some-box`.
If you are on a [multi VM environment](http://docs.vagrantup.com/v2/multi-machine/index.html),
there is a huge chance that you'll end up having issues by sharing the same bucket
across different machines. For example, if you `apt-get install` from two machines
at "almost the same time" you are probably going to hit a `SystemError: Failed to lock /var/cache/apt/archives/lock`.
To work around that, you can set the scope to be based on machines:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box'
config.cache.scope = :machine
end
```
This will tell vagrant-cachier to download packages to `.vagrant/machines/<machine-name>/<provider-name>/cache`
on your current project directory.
### Available cache "buckets"
#### System package managers
##### APT
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-debian-box'
config.cache.enable :apt
end
```
Used by Debian-like Linux distros, will get configured under guest's `/var/cache/apt/archives`.
_Please note that to avoid re-downloading packages, you should avoid `apt-get clean`
as much as possible in order to make a better use of the cache, even if you are
packaging a box_
##### Yum
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-centos-box'
config.cache.enable :yum
end
```
Used by CentOS guests, will get configured under guest's `/var/cache/yum`. It will
also [make sure](lib/vagrant-cachier/bucket/yum.rb#L20) that `keepcache` is set to
`1` on guest's `/etc/yum.conf`.
##### Pacman
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-arch-linux-box'
config.cache.enable :pacman
end
```
Used by Arch Linux, will get configured under guest's `/var/cache/pacman/pkg`.
#### RubyGems
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-ruby-installed'
config.cache.enable :gem
end
```
Compatible with probably with any type of guest distro, will hook into the `cache`
folder under the result of running `gem env gemdir` as the default SSH user (usualy
`vagrant`) on your guest. If you use rbenv / rvm on the guest machine, make sure
it is already installed before enabling the bucket, otherwise you won't benefit
from this plugin.
## Finding out disk space used by buckets
_TODO_
```shell
$ vagrant cache stats
```
## Cleaning up cache buckets
_TODO_
```shell
$ vagrant cache clean apt
```
_Please note that as of v0.6.0 the plugin will automatically disable any
previously defined configs for [cloud providers](lib/vagrant-cachier/plugin.rb#L19-22)_
## Contributing

6
development/Cheffile Normal file
View file

@ -0,0 +1,6 @@
#!/usr/bin/env ruby
#^syntax detection
site 'http://community.opscode.com/api/v1'
cookbook 'java'

View file

@ -0,0 +1,8 @@
SITE
remote: http://community.opscode.com/api/v1
specs:
java (1.19.2)
DEPENDENCIES
java (>= 0)

View file

@ -1,52 +1,132 @@
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.require_plugin 'vagrant-cachier'
Vagrant.require_plugin 'vagrant-lxc'
Vagrant.configure("2") do |config|
config.vm.synced_folder "../", "/vagrant", id: 'vagrant-root'#, nfs: true
config.vm.synced_folder "../", "/vagrant", id: 'vagrant-root'
config.cache.scope = :machine
config.cache.auto_detect = true
config.cache.synced_folder_opts = { type: :nfs }
debian_like_configs = lambda do |debian|
debian.vm.provision :shell, inline: '
if ! (which bundle > /dev/null); then
sudo gem install bundler --no-ri --no-rdoc
sudo apt-get install -y build-essential libffi-dev ruby1.9.1-dev git
cd /vagrant && bundle
fi'
config.vm.provider :virtualbox do |vb|
vb.customize [ "modifyvm", :id, "--memory", 256, "--cpus", "1" ]
end
config.vm.provider :lxc do |lxc|
lxc.customize 'aa_profile', 'unconfined'
end
configure_private_network = lambda do |node, suffix|
node.vm.network :private_network, ip: "192.168.50.#{suffix}"
end
initial_debian_setup = lambda do |debian, git_pkg = 'git'|
debian.vm.provision :shell, inline: "apt-get update && apt-get install -y #{git_pkg} php5-cli curl wget htop"
end
install_nvm_and_rvm = lambda do |node|
# Installs RVM
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.rvm ]; then
HOME=/home/vagrant su -p vagrant -l -c "curl -L https://get.rvm.io | bash -s stable"
fi
'
# Here we have the RVM cache bucket configured, so we install 2.0.0
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.rvm/rubies/ruby-2.0.0* ]; then
HOME=/home/vagrant su -p vagrant -l -c "rvm install 2.0.0 && rvm use 2.0.0 --default"
fi
'
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.nvm ]; then
apt-get install git -y
HOME=/home/vagrant su -p vagrant -l -c "
curl https://raw.github.com/creationix/nvm/master/install.sh | sh
"
fi
'
node.vm.provision :shell, inline: '
if ! [ -d /home/vagrant/.nvm/v0.10* ]; then
HOME=/home/vagrant su -p vagrant -l -c "
nvm install 0.10
nvm alias default 0.10
"
fi
'
end
config.vm.define :ubuntu do |ubuntu|
ubuntu.vm.box = "quantal64"
debian_like_configs.call ubuntu
ubuntu.vm.box = "raring64"
ubuntu.vm.provider :lxc do |_, override|
override.vm.box = 'fgrehm/raring64-lxc'
end
configure_private_network.call ubuntu, 10
initial_debian_setup.call(ubuntu)
install_nvm_and_rvm.call(ubuntu)
ubuntu.omnibus.chef_version = :latest
ubuntu.vm.provision :chef_solo do |chef|
chef.add_recipe "cachier::default"
end
end
config.vm.define :lucid do |lucid|
lucid.vm.box = "lucid64"
# Disable NFS
lucid.cache.synced_folder_opts = { }
configure_private_network.call lucid, 11
initial_debian_setup.call(lucid, 'git-core')
install_nvm_and_rvm.call(lucid)
end
config.vm.define :debian do |debian|
debian.vm.box = "squeeze64"
debian.vm.box_url = 'http://f.willianfernandes.com.br/vagrant-boxes/DebianSqueeze64.box'
debian_like_configs.call debian
configure_private_network.call debian, 12
initial_debian_setup.call(debian)
install_nvm_and_rvm.call(debian)
end
config.vm.define :centos do |centos|
centos.vm.box = 'centos6_64'
centos.vm.box_url = 'http://developer.nrel.gov/downloads/vagrant-boxes/CentOS-6.4-x86_64-v20130309.box'
configure_private_network.call centos, 13
centos.vm.provision :shell, inline: '
if ! (which bundle > /dev/null); then
time sudo gem install bundler --no-ri --no-rdoc
time sudo yum install -y libffi-devel ruby-devel git
fi'
(
mkdir -p /tmp/epel
cd /tmp/epel
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
sudo rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
)
yum install -y libffi-devel ruby-devel git
'
centos.vm.provision :shell, inline: 'gem install bundler'
end
config.vm.define :arch do |arch|
arch.vm.box = 'arch64'
arch.vm.box_url = 'http://vagrant.pouss.in/archlinux_2012-07-02.box'
arch.vm.provision :shell, inline: '
if ! (which bundle > /dev/null); then
time sudo gem install bundler --no-ri --no-rdoc
time sudo pacman -Syu --noconfirm libffi git
fi'
arch.vm.box_url = 'https://dl.dropboxusercontent.com/u/6750592/Arch_Linux_2013.11_x64.box'
# Disable NFS
arch.cache.synced_folder_opts = { }
arch.vm.provision :shell, inline: 'pacman -Syu --noconfirm libffi git ruby && gem install bundler'
end
config.vm.define :opensuse do |suse|
suse.vm.box = 'opensuse-12'
suse.vm.box_url = 'http://sourceforge.net/projects/opensusevagrant/files/12.3/opensuse-12.3-64.box/download'
# Disable NFS
suse.cache.synced_folder_opts = { }
suse.vm.provision :shell, inline: 'time zypper install -y git'
end
end

View file

@ -0,0 +1,4 @@
zip_filepath = "#{Chef::Config['file_cache_path']}/vagrant-cachier.tar.gz"
zip_url = "https://github.com/fgrehm/vagrant-cachier/archive/v0.6.0.tar.gz"
remote_file(zip_filepath) { source zip_url }

28
docs/benchmarks.md Normal file
View file

@ -0,0 +1,28 @@
# Benchmarks
During the early days of this plugin, [@fgrehm](https://github.com/fgrehm) wrote
a [blog post](http://fabiorehm.com/blog/2013/05/24/stop-wasting-bandwidth-with-vagrant-cachier#show_me_the_numbers)
with some benchmarks on the time that was cut down by using the plugin. If you
are interested on the numbers only, the VMs tested were one of vagrant-lxc's
Ubuntu [dev boxes](https://github.com/fgrehm/vagrant-lxc/wiki/Development#using-virtualbox-for-development),
[rails-dev-box](https://github.com/rails/rails-dev-box), his own [rails-base-box](https://github.com/fgrehm/rails-base-box)
and Discourse's [dev box](https://github.com/discourse/discourse/blob/master/Vagrantfile)
| | First provision | Second provision | Diff. | APT cache |
| --- | :---: | :---: | :---: | :---: |
| rails-dev-box | 4m45s | 3m20s | ~29% | 66mb |
| rails-base-box | 11m56s | 7m54s | ~34% | 77mb |
| vagrant-lxc | 10m16s | 5m9s | ~50% | 124mb |
| discourse | 1m41s | 49s | ~51% | 62mb |
<br>
_Please note that the tests were made on May 24th 2013 and nowadays they might
be a bit different_
<br>
Some people have shared their numbers on Twitter and had experienced even better
results:
<blockquote><p>Holy cow... If you dig Vagrant, and like time - you need Vagrant Cachier. 60% speed increase for me. <a href="https://t.co/225jRH7bDa">https://t.co/225jRH7bDa</a> <a href="https://twitter.com/vagrantup">@vagrantup</a></p>&mdash; Chris Rickard (@chrisrickard) <a href="https://twitter.com/chrisrickard/statuses/400128294479081472">November 12, 2013</a></blockquote>
<blockquote><p>vagrant-cachier saved 3:20 off my <a href="https://twitter.com/search?q=%23vagrant&amp;src=hash">#vagrant</a> <a href="https://twitter.com/search?q=%23provisioning&amp;src=hash">#provisioning</a> <a href="http://t.co/VzRRu1QEwL">http://t.co/VzRRu1QEwL</a></p>&mdash; Joe Ferguson (@svpernova09) <a href="https://twitter.com/svpernova09/statuses/400040517943037952">November 11, 2013</a></blockquote>
<blockquote><p>Tested vagrant-cachier. Saved 60% of vagrant up time installing 10 rpms with chef. Pretty awesome. Check it out! <a href="https://t.co/HfbLJNP7GH">github.com/fgrehm/vagrant…</a></p>&mdash; Miguel. (@miguelcnf) <a href="https://twitter.com/miguelcnf/status/343757107058847746">June 9, 2013</a></blockquote>
<blockquote><p>vagrant-cachier took my vagrant spin up from 30 to 5 minutes and reduced my caffeine intake by 3 cups <a href="http://t.co/V0uYpr3U0y">http://t.co/V0uYpr3U0y</a></p>&mdash; Russell Cardullo (@russellcardullo) <a href="https://twitter.com/russellcardullo/statuses/343070870744494080">June 7, 2013</a></blockquote>

View file

@ -0,0 +1,30 @@
# APT-CACHER
Used by Debian-like Linux distros, will get configured under guest's `/var/cache/apt-cacher-ng`
and only works with NFS-shared folders since `vboxsf` is enforcing `vagrant`-user and `apt-cacher`
is running under `apt-cacher-ng` user.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-debian-box'
config.cache.enable :apt_cacher
end
```
One use case for this bucket is if you are using containers inside your VMs, e.g
VirtualBox -> LXC. This would allow you to reuse packages without sharing folder
inside VirtualBox:
# install apt-cacher on (Host)-VM
$ sudo apt-get install apt-cacher-ng
# get the IP for eth0 interface
$ ifconfig eth0 |grep "inet addr"|awk '{print $2}' |cut -c6-20
# configure mirror on for your docker/LXC instances:
$ echo 'Acquire::http { Proxy "http://X.X.X.X:3142"; };' > /etc/apt/apt.conf.d/10mirror
# check, if working by tailing log on (Host)-VM, while installing packages on (Guest)-VMs
$ tail -f /var/log/apt-cacher-ng/apt-cacher.log

27
docs/buckets/apt-lists.md Normal file
View file

@ -0,0 +1,27 @@
# APT lists
Used by Debian-like Linux distros, will get configured under guest's `/var/lib/apt/lists`.
As explained on [Wikipedia](http://en.wikipedia.org/wiki/Advanced_Packaging_Tool#Files),
`/var/lib/apt/lists` is the "storage area for state information for each package
resource specified in sources.list". By enabling this bucket, `apt` will be able
to install cached packages without hitting the remote repositories for the main
package lists, [being particularly useful when developing offline](https://github.com/fgrehm/vagrant-cachier/pull/84#issue-27311414).
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-debian-box'
config.cache.enable :apt_lists
end
```
## Heads up!
This bucket is automatically disabled for Windows hosts, please have a look at
the following issues for more information:
* https://github.com/fgrehm/vagrant-cachier/issues/106
* https://github.com/fgrehm/vagrant-cachier/issues/109
* https://github.com/fgrehm/vagrant-cachier/issues/113

17
docs/buckets/apt.md Normal file
View file

@ -0,0 +1,17 @@
# APT
Used by Debian-like Linux distros, will get configured under guest's `/var/cache/apt/archives`.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-debian-box'
config.cache.enable :apt
end
```
_Please note that to avoid re-downloading packages, you should avoid `apt-get clean`
as much as possible in order to make a better use of the cache, even if you are
packaging a box since the downloaded packages are actually stored on the host
machine._

13
docs/buckets/bower.md Normal file
View file

@ -0,0 +1,13 @@
# [Bower](http://bower.io/)
Compatible with probably any type of linux guest distro, will cache guests'
`$HOME/.cache/bower` if bower is detected.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-bower-installed'
config.cache.enable :bower
end
```

13
docs/buckets/chef.md Normal file
View file

@ -0,0 +1,13 @@
# Chef
When a Chef provisioner is detected, this bucket caches the default
`file_cache_path` directory, `/var/chef/cache`. Requires Vagrant 1.2.4+.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-using-chef-provisioner'
config.cache.enable :chef
end
```

View file

@ -0,0 +1,18 @@
# Chef RubyGems
When a Chef installation is detected, this bucket caches its embedded gems.
Most of these gems are part of the Chef omnibus package but sometimes cookbooks
need to install extra gems to run within the context of a Chef recipe using the
`chef_gem` resource.
The embedded Chef gem location is returned by running the
`/opt/chef/embedded/bin/gem env gemdir` command.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-using-chef-provisioner'
config.cache.enable :chef_gem
end
```

13
docs/buckets/composer.md Normal file
View file

@ -0,0 +1,13 @@
# [Composer](http://getcomposer.org/)
Compatible with probably any type of linux guest distro, will cache guests'
`$HOME/.composer/cache` if PHP is detected.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-php-installed'
config.cache.enable :composer
end
```

20
docs/buckets/dnf.md Normal file
View file

@ -0,0 +1,20 @@
# DNF
Used by Fedora guests, will get configured under guest's `/var/cache/dnf`. It will
also [make sure](lib/vagrant-cachier/bucket/dnf.rb#L20) that `keepcache` is set to
`1` on guest's `/etc/dnf/dnf.conf`.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-fedora-box'
config.cache.enable :dnf
end
```
### :warning: Notice about Windows hosts :warning:
In case this bucket is enabled and a Windows host is in use, you might see an
ugly stacktrace as described on [this comment](https://github.com/fgrehm/vagrant-cachier/issues/117#issuecomment-50548393)
if some DNF repository is not available during provisioning.

46
docs/buckets/generic.md Normal file
View file

@ -0,0 +1,46 @@
# Generic
This bucket is never enabled by default. You have to enable it explicitly like
this:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :generic, { :cache_dir => "/var/cache/some" }
end
```
The `:cache_dir` parameter is required. It specifies the directory on the guest
that will be cached under the "/tmp/vagrant-cache/generic" bucket.
You may enable more than one generic bucket by giving them different names,
like this:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :generic, {
"one" => { cache_dir: "/var/cache/one" },
"two" => { cache_dir: "/var/cache/two" },
}
end
```
In this case you get two buckets called "one" and "two" under the guest's
`/tmp/vagrant-cache` directory.
The Generic bucket is useful if you want to implement a caching mechanism by
hand. For instance, if you want to cache your wget downloads under
`/var/cache/wget` you can do this:
```ruby
Vagrant.configure("2") do |config|
config.cache.enable :generic, {
"wget" => { cache_dir: "/var/cache/wget" },
}
end
```
Then, you invoke wget like this:
```sh
wget -N -P /var/cache/wget URL
```

18
docs/buckets/npm.md Normal file
View file

@ -0,0 +1,18 @@
# [npm](https://npmjs.org/)
Compatible with probably any type of linux guest distro, will hook into npm's
cache directory under the result of running `npm config get cache` as
the default SSH user (usually `vagrant`) on your guest.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-nodejs-installed'
config.cache.enable :npm
end
```
If you use [nvm](https://github.com/creationix/nvm) / [n](https://github.com/visionmedia/n)
on the guest machine, make sure it is already installed before enabling
the bucket, otherwise you won't benefit from this plugin.

12
docs/buckets/pacman.md Normal file
View file

@ -0,0 +1,12 @@
# Pacman
Used by Arch Linux, will get configured under guest's `/var/cache/pacman/pkg`.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-arch-linux-box'
config.cache.enable :pacman
end
```

15
docs/buckets/pip.md Normal file
View file

@ -0,0 +1,15 @@
# [pip](https://pip.pypa.io/)
Compatible with probably any type of linux guest distro, will hook into pip's
http and wheels cache directory under `$HOME/.cache/pip/http` and `$HOME/.cache/pip/wheels` as
the default SSH user (usually `vagrant`) on your guest.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-pip-installed'
config.cache.enable :pip
end
```

22
docs/buckets/rubygems.md Normal file
View file

@ -0,0 +1,22 @@
# RubyGems
Compatible with probably with any type of guest distro, will hook into the `cache`
folder under the result of running `gem env gemdir` as the default SSH user (usualy
`vagrant`) on your guest. If you use rbenv / rvm on the guest machine, make sure
it is already installed before enabling the bucket, otherwise you won't benefit
from this plugin.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-ruby-installed'
config.cache.enable :gem
end
```
## Heads up about `bundle install --deployment`
Please note that when the `--deployment` flag is passed on to `bundle install`
your gems **will not be cached** since bundler ends up skipping the default gem
cache dir. For more information about this, please check [GH-62](https://github.com/fgrehm/vagrant-cachier/issues/62).

59
docs/buckets/rvm.md Normal file
View file

@ -0,0 +1,59 @@
# [rvm](https://rvm.io/)
Compatible with probably with any type of linux guest distro, will hook into the
`cache` folder under the result of running rvm info as the default SSH user (usualy
`vagrant`) on your guest. If you use rvm on the guest machine, make sure it is
already installed before enabling the bucket, otherwise you won't benefit from
this plugin.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box-with-rvm-installed'
config.cache.enable :gem
end
```
## Heads up!
If you are installing rvm, rubies and gems on a single provisioning step, **you
will not benefit from this bucket**. There is absolutely no way we can "magically"
hook into your provisioning scripts to configure things for leveraging the cache.
For instance, the following shell provisioner **will result in no package cached at
all**:
```ruby
config.vm.provision :shell, privileged: false, inline: %[
curl -L https://get.rvm.io | bash -s stable
rvm install 1.9.3
rvm use 1.9.3 --default
cd /path/to/project
bundle install
]
```
To work around that you can either configure things by hand on your provisioning
scripts or you can enable automatic bucket detection and split your scripts into
multiple stages:
```ruby
# Install RVM so that Ruby tarballs are cached
config.vm.provision :shell, privileged: false, inline: %[
curl -L https://get.rvm.io | bash -s stable
]
# Install Ruby 1.9.3 making use of the RVM cache and configure the RubyGems
# cache afterwards
config.vm.provision :shell, privileged: false, inline: %[
rvm install 1.9.3
rvm use 1.9.3 --default
]
# Install gems making use of the RubyGems cache
config.vm.provision :shell, privileged: false, inline: %[
cd /path/to/project
bundle install
]
```

20
docs/buckets/yum.md Normal file
View file

@ -0,0 +1,20 @@
# Yum
Used by CentOS guests, will get configured under guest's `/var/cache/yum`. It will
also [make sure](lib/vagrant-cachier/bucket/yum.rb#L20) that `keepcache` is set to
`1` on guest's `/etc/yum.conf`.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-centos-box'
config.cache.enable :yum
end
```
### :warning: Notice about Windows hosts :warning:
In case this bucket is enabled and a Windows host is in use, you might see an
ugly stacktrace as described on [this comment](https://github.com/fgrehm/vagrant-cachier/issues/117#issuecomment-50548393)
if some Yum repository is not available during provisioning.

14
docs/buckets/zypper.md Normal file
View file

@ -0,0 +1,14 @@
# Zypper
Used by SuSE guests, will get configured under guest's `/var/cache/zypp/packages`. It will
also [make sure](lib/vagrant-cachier/bucket/zypper.rb#L20) that `keep-packages` is enabled
for all repositories.
To manually enable it:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-suse-box'
config.cache.enable :zypper
end
```

64
docs/development.md Normal file
View file

@ -0,0 +1,64 @@
# Development
## Installing from sources
If you want to install the plugin from sources:
```bash
git clone https://github.com/fgrehm/vagrant-cachier.git
cd vagrant-cachier
bundle install
bundle exec rake build
vagrant plugin install pkg/vagrant-cachier-VERSION.gem
```
## Sanity checks
While we don't get to implement some proper unit testing, there are some basic [Bats](https://github.com/sstephenson/bats)
tests that basically acts as a [sanity check](https://github.com/fgrehm/vagrant-cachier/blob/master/spec/acceptance/sanity_check.bats)
that you can run with `bats spec/acceptance` in case you are planning to submit a
Pull Request. Just keep in mind that it might take a while to run if you are
using the default VirtualBox provider.
## How to create a new bucket?
The concept of a cache _bucket_ is pretty easy to understand, we basically
symlink a folder under the guest's `/tmp/vagrant-cache` into the folder where
other tools keep downloaded packages. For example, in the case of the
[apt bucket](buckets/apt), we symlink `/var/cache/apt/archives` to
`/tmp/vagrant-cache/apt` so that `.deb` packages downloaded with `apt-get install`
can be reused when bringing machines up from scratch.
If you want to see some other package manager supported, you'll first need to
know if it has some sort of caching in place, where does it get stored and if
it needs some extra configuration. For some managers that path will be fixed
(like the canonical apt bucket), for others you might need to read some
configuration by [running a command](https://github.com/fgrehm/vagrant-cachier/blob/master/lib/vagrant-cachier/cap/linux/rvm_path.rb#L10)
on the guest VM (like [rvm](buckets/rvm)) and you might even need to [tweak some configs](https://github.com/fgrehm/vagrant-cachier/blob/master/lib/vagrant-cachier/bucket/yum.rb#L20)
on the guest (like the [yum](buckets/yum) bucket).
There's currently a lot of duplication around the "installation" of cache buckets
so there's plenty of source code for you to read in order to understand how
things work under the hood but if you don't feel comfortable reading / writing
Ruby code you can provide a high level overview of how to do things using plain
old bash.
For example, if you were to explain how to set up the rvm bucket, the script
below should give vagrant-cachier maintainers an overview of how to set things
up:
```bash
# Check is rvm is installed
if ! $(rvm info > /dev/null); then
exit 0
fi
# If it is installed, read the cache dir
RVM_CACHE="${rvm_path}/archives"
# "Install" the bucket!
mkdir -p /tmp/vagrant-cache/rvm/archives
ln -s /tmp/vagrant-cache/rvm/archives $RVM_CACHE
```

31
docs/how-does-it-work.md Normal file
View file

@ -0,0 +1,31 @@
## How does it work?
On vagrant-cachier's _"jargon"_, cached packages are kept in _cache buckets_.
Those _buckets_ are basically directories that are shared between the host machine
and VMs that are kept around between `vagrant destroy`s. Each _bucket_ (or synced
folder if you prefer) is meant to cache specific types of packages, like [apt](buckets/apt)'s
`.deb`s or [RubyGems](buckets/rubygems) `.gem`s. Please have a look at the
"Available Buckets" menu above for more information on each bucket.
Regarding configurations, right now the plugin does not make any assumptions for
you and you have to configure things properly from your `Vagrantfile`. In other
words, _the plugin is disabled by default_.
Cache buckets will always be available from `/tmp/vagrant-cache` on your guest and
the appropriate folders will get symlinked to the right path _after_ the machine is
up but _right before_ it gets provisioned. We _could_ potentially do it on one go
and share bucket's folders directly to the right path if we were only using VirtualBox
because it shares folders _after_ booting the machine but the LXC provider does that
_as part of_ the boot process (synced folders are actually `lxc-start` parameters)
and as of now we are not able to get some information that this plugin requires
about the guest machine / container before it is actually up and running.
Under the hood, the plugin will hook into Vagrant in order to set things up for each
configured cache bucket _before and after_ running each defined provisioner. Before
halting the machine, it will also revert the changes required to set things up by
hooking into calls to `Vagrant::Builtin::GracefulHalt` so that you can repackage
the machine for others to use without requiring users to install the plugin as well.
Please keep in mind that this plugin won't do magic, if you are compiling things
during provisioning or manually downloading packages outside of a bucket you
won't see that much of improvement.

68
docs/index.md Normal file
View file

@ -0,0 +1,68 @@
# vagrant-cachier
A [Vagrant](http://www.vagrantup.com/) plugin that helps you reduce the amount of
coffee you drink while waiting for boxes to be provisioned by sharing a common
package cache among similiar VM instances. Kinda like [vagrant-apt_cache](https://github.com/avit/vagrant-apt_cache)
or [this magical snippet](http://gist.github.com/juanje/3797297) but targetting
multiple package managers and Linux distros.
## Installation
Make sure you have Vagrant 1.4+ and run:
```
vagrant plugin install vagrant-cachier
```
## Quick start
The easiest way to set things up is just to enable [cache buckets auto detection](usage)
from within your `Vagrantfile`:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'your-box'
if Vagrant.has_plugin?("vagrant-cachier")
# Configure cached packages to be shared between instances of the same base box.
# More info on the "Usage" link above
config.cache.scope = :box
# OPTIONAL: If you are using VirtualBox, you might want to use that to enable
# NFS for shared folders. This is also very useful for vagrant-libvirt if you
# want bi-directional sync
config.cache.synced_folder_opts = {
type: :nfs,
# The nolock option can be useful for an NFSv3 client that wants to avoid the
# NLM sideband protocol. Without this option, apt-get might hang if it tries
# to lock files needed for /var/cache/* operations. All of this can be avoided
# by using NFSv4 everywhere. Please note that the tcp option is not the default.
mount_options: ['rw', 'vers=3', 'tcp', 'nolock']
}
end
end
```
For more information please check out the links on the menu above.
## Providers that are known to work
* Vagrant's built in VirtualBox provider
* [vagrant-lxc](https://github.com/fgrehm/vagrant-lxc)
* [VMware providers](http://www.vagrantup.com/vmware) with NFS enabled (See
[GH-24](https://github.com/fgrehm/vagrant-cachier/issues/24) for more info)
* [vagrant-libvirt](https://github.com/pradels/vagrant-libvirt)
* [vagrant-kvm](https://github.com/adrahon/vagrant-kvm)
_Please note that as of v0.6.0 the plugin will automatically disable any
previously defined configs for [cloud providers](lib/vagrant-cachier/plugin.rb#L19-22)_
## Contributing
1. Fork it
2. Create your feature branch (`git checkout -b my-new-feature`)
3. Commit your changes (`git commit -am 'Add some feature'`)
4. Push to the branch (`git push origin my-new-feature`)
5. Create new Pull Request

146
docs/template.html Normal file
View file

@ -0,0 +1,146 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>{{NAME}} :: viewdocs.io</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta charset="utf-8">
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootswatch/3.0.2/yeti/bootstrap.min.css">
<link rel="stylesheet" href="http://fgrehm.github.io/viewdocs-yeti/stylesheets/pygment_trac.css">
<style>
html, body {
height: 100%;
margin: 0;
padding: 0;
/* The html and body elements cannot have any padding or margin. */
}
/* Wrapper for page content to push down footer */
#wrap {
min-height: 100%;
height: auto;
/* Negative indent footer by its height */
margin: 0 auto -60px;
/* Pad bottom by footer height */
padding: 0 0 60px;
}
/* Set the fixed height of the footer here */
footer {
height: 60px;
background-color: #f5f5f5;
padding-top: 9px;
}
footer p {
clear: left;
margin-bottom: 0;
}
#wrap > .container {
padding-top: 60px;
}
.navbar-nav>li>iframe {
margin-top: 12px;
}
th {
padding: 10px;
}
</style>
<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
<!--[if lt IE 9]>
<script src="https://oss.maxcdn.com/libs/html5shiv/3.7.0/html5shiv.js"></script>
<script src="https://oss.maxcdn.com/libs/respond.js/1.3.0/respond.min.js"></script>
<![endif]-->
</head>
<body>
<div id="wrap">
<div class="navbar navbar-default navbar-fixed-top">
<div class="container">
<div class="navbar-header">
<a href="/{{NAME}}" class="navbar-brand">{{NAME}}</a>
<button class="navbar-toggle" type="button" data-toggle="collapse" data-target="#navbar-main">
<span class="icon-bar"></span>
<span class="icon-bar"></span>
<span class="icon-bar"></span>
</button>
</div>
<div class="navbar-collapse collapse" id="navbar-main">
<ul class="nav navbar-nav">
<li>
<a href="usage">Usage</a>
</li>
<li>
<a href="how-does-it-work">How does it work?</a>
</li>
<li>
<a href="benchmarks">Benchmarks</a>
</li>
<li class="dropdown">
<a class="dropdown-toggle" data-toggle="dropdown" href="#">Available Buckets <span class="caret"></span></a>
<ul class="dropdown-menu">
<li><a tabindex="-1" href="buckets/generic">Generic</a></li>
<li><a tabindex="-1" href="buckets/apt">APT</a></li>
<li><a tabindex="-1" href="buckets/apt-lists">apt-lists</a></li>
<li><a tabindex="-1" href="buckets/apt-cacher">apt-cacher</a></li>
<li><a tabindex="-1" href="buckets/chef">Chef</a></li>
<li><a tabindex="-1" href="buckets/chef_rubygems">Chef Gems</a></li>
<li><a tabindex="-1" href="buckets/composer">Composer</a></li>
<li><a tabindex="-1" href="buckets/dnf">DNF</a></li>
<li><a tabindex="-1" href="buckets/bower">Bower</a></li>
<li><a tabindex="-1" href="buckets/pacman">Pacman</a></li>
<li><a tabindex="-1" href="buckets/npm">npm</a></li>
<li><a tabindex="-1" href="buckets/rubygems">RubyGems</a></li>
<li><a tabindex="-1" href="buckets/rvm">rvm</a></li>
<li><a tabindex="-1" href="buckets/yum">Yum</a></li>
<li><a tabindex="-1" href="buckets/zypper">Zypper</a></li>
<li><a tabindex="-1" href="buckets/pip">pip</a></li>
</ul>
</li>
<li>
<a href="development">Development</a>
</li>
<li>
<li><a href="https://gitter.im/fgrehm/vagrant-cachier" target="_blank">Chat</li>
</li>
</ul>
<ul class="nav navbar-nav navbar-right visible-md visible-lg">
<li><iframe src="http://ghbtns.com/github-btn.html?user={{USER}}&repo={{NAME}}&type=watch&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="110" height="20"></iframe></li>
<li><iframe src="http://ghbtns.com/github-btn.html?user={{USER}}&repo={{NAME}}&type=fork&count=true" allowtransparency="true" frameborder="0" scrolling="0" width="95" height="20"></iframe></li>
</ul>
</div>
</div>
</div>
<div class="container">
{{CONTENT}}
</div>
</div>
<footer>
<div class="container">
<div class="row">
<div class="col-lg-12">
<p>Hosted on <a href="http://viewdocs.io">http://viewdocs.io</a>.</p>
<p>Theme based on <a href="http://bootswatch.com/yeti/">Yeti</a> built by <a href="http://thomaspark.me">Thomas Park</a> and adapted to Viewdocs by <a href="http://fabiorehm.com/">Fábio Rehm</a>.</p>
</div>
</div>
</div>
</footer>
<script src="//oss.maxcdn.com/libs/jquery/2.0.3/jquery.min.js"></script>
<script src="//netdna.bootstrapcdn.com/bootstrap/3.0.3/js/bootstrap.min.js"></script>
<script>
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
(i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
})(window,document,'script','//www.google-analytics.com/analytics.js','ga');
ga('create', 'UA-38687494-5', 'viewdocs.io');
ga('send', 'pageview');
</script>
</body>
</html>

152
docs/usage.md Normal file
View file

@ -0,0 +1,152 @@
# Usage
## Being nice to others
It is a good practice to wrap plugin specific configuration with `has_plugin?` checks
so the user's Vagrantfiles do not break if `vagrant-cachier` is uninstalled or
the Vagrantfile is shared with people that don't have the plugin installed:
```ruby
Vagrant.configure("2") do |config|
# ...
if Vagrant.has_plugin?("vagrant-cachier")
# ... vagrant-cachier configs ...
end
end
```
## Cache scope
This is the only required configuration for the plugin to work and should be present
on your project's specific `Vagrantfile` or on your `~/.vagrant.d/Vagrantfile` in
order to enable it.
### `:box` scope
By setting `cache.scope` to `:box`, downloaded packages will get stored on a folder
scoped to base boxes under your `~/.vagrant.d/cache`. The idea is to leverage the
cache by allowing downloaded packages to be reused across projects. So, if your
`Vagrantfile` has something like:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box'
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :box
end
end
```
The cached files will be stored under `$HOME/.vagrant.d/cache/some-box`.
### `:machine` scope
If you are on a [multi VM environment](http://docs.vagrantup.com/v2/multi-machine/index.html),
there is a huge chance that you'll end up having issues by sharing the same bucket
across different machines. For example, if you `apt-get install` from two machines
at "almost the same time" you are probably going to hit a _"SystemError: Failed to
lock /var/cache/apt/archives/lock"_. To work around that, you can set the scope
to be based on machines:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box'
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :machine
end
end
```
This will tell vagrant-cachier to download packages to `.vagrant/machines/<machine-name>/cache`
on your current project directory.
## Cache buckets automatic detection
This is the easiest way to get started with plugin and is enabled by default.
Under the hood, `vagrant-cachier` does its best to find out what is supported on the
guest machine and will set buckets accordingly.
If you want that behavior to be disabled, you can set `cache.auto_detect` to `false`
from your Vagrantfile:
```ruby
Vagrant.configure("2") do |config|
config.vm.box = 'some-box'
if Vagrant.has_plugin?("vagrant-cachier")
config.cache.scope = :machine # or :box
config.cache.auto_detect = false
end
end
```
## Enable buckets as needed
If for whatever reason you need to have a fined grained control over what buckets
are configured, you can do so by "cherry picking" them on your `Vagrantfile`:
```ruby
Vagrant.configure("2") do |config|
config.cache.auto_detect = false
config.cache.enable :apt
config.cache.enable :gem
end
```
_Please refer to the "Available Buckets" menu above to find out which buckets
are supported._
## Custom cache buckets synced folders options
For fine grained control over the cache bucket synced folder options you can use
the `synced_folder_opts` config. That's useful if, for example, you are using
VirtualBox and want to enable NFS for improved performance:
```ruby
Vagrant.configure("2") do |config|
config.cache.synced_folder_opts = {
type: :nfs,
# The nolock option can be useful for an NFSv3 client that wants to avoid the
# NLM sideband protocol. Without this option, apt-get might hang if it tries
# to lock files needed for /var/cache/* operations. All of this can be avoided
# by using NFSv4 everywhere. Please note that the tcp option is not the default.
mount_options: ['rw', 'vers=3', 'tcp', 'nolock']
}
end
```
Please referer to http://docs.vagrantup.com/v2/synced-folders/basic_usage.html for
more information about the supported parameters.
## Finding out disk space used by buckets
At some point we might implement a `vagrant cache stats` command that will give you that
information, but while that does not get implemented you can run the code below
if you are on a Linux machine:
```
# scope = :box (default)
$ du -h -d0 $HOME/.vagrant.d/cache
405M /home/user/.vagrant.d/cache/precise64
1.1G /home/user/.vagrant.d/cache/raring64
448M /home/user/.vagrant.d/cache/quantal64
# scope = :machine
$ du -h -d0 .vagrant/machines/*/cache
16K .vagrant/machines/precise/cache
90M .vagrant/machines/quantal/cache
210M .vagrant/machines/raring/cache
```
## Cleaning up cache buckets
At some point we might implement a `vagrant cache clean [bucket-name]` command that will
take care of things for you, but while that does not get implemented you can run
the code below if you are on a Linux machine:
```
# scope = :box (default)
$ rm -rf $HOME/.vagrant.d/cache/<box-name>/<optional-bucket-name>
# scope = :machine
$ rm -rf .vagrant/machines/<machine-name>/cache/<optional-bucket-name>
```

View file

@ -1,89 +0,0 @@
require_relative 'bucket'
module Vagrant
module Cachier
class Action
class Install
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::install")
end
def call(env)
return @app.call(env) unless env[:machine].config.cache.enabled?
@env = env
FileUtils.mkdir_p(cache_root.to_s) unless cache_root.exist?
env[:machine].config.vm.synced_folder cache_root, '/tmp/vagrant-cache', id: "vagrant-cache"
@app.call env
env[:cache_dirs] = []
if env[:machine].config.cache.auto_detect
Bucket.auto_detect(env)
end
if env[:machine].config.cache.buckets.any?
env[:ui].info 'Configuring cache buckets...'
cache_config = env[:machine].config.cache
cache_config.buckets.each do |bucket_name, configs|
@logger.debug "Installing #{bucket_name} with configs #{configs.inspect}"
Bucket.install(bucket_name, env, configs)
end
data_file = env[:machine].data_dir.join('cache_dirs')
data_file.open('w') { |f| f.print env[:cache_dirs].join("\n") }
end
end
def cache_root
@cache_root ||= case @env[:machine].config.cache.scope
when :box
@env[:home_path].join('cache', @env[:machine].box.name)
when :machine
@env[:machine].data_dir.join('cache')
else
raise "Unknown cache scope: '#{@env[:machine].config.cache.scope}'"
end
end
end
class Clean
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
end
def call(env)
@env = env
if env[:machine].state.id == :running && symlinks.any?
env[:ui].info 'Removing cache buckets symlinks...'
symlinks.each do |symlink|
remove_symlink symlink
end
File.delete env[:machine].data_dir.join('cache_dirs').to_s
end
@app.call env
end
def symlinks
# TODO: Check if file exists instead of a blank rescue
@symlinks ||= @env[:machine].data_dir.join('cache_dirs').read.split rescue []
end
def remove_symlink(symlink)
if @env[:machine].communicate.test("test -L #{symlink}")
@logger.debug "Removing symlink for '#{symlink}'"
@env[:machine].communicate.sudo("unlink #{symlink}")
end
end
end
end
end
end

View file

@ -0,0 +1,66 @@
require 'timeout'
module VagrantPlugins
module Cachier
class Action
class Clean
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
end
def call(env)
@env = env
@machine = env[:machine]
if symlinks.any?
env[:ui].info I18n.t('vagrant_cachier.cleanup')
if sshable?
symlinks.each do |symlink|
remove_symlink symlink
end
end
File.delete @machine.data_dir.join('cache_dirs').to_s
end
@app.call env
end
def sshable?
return if @machine.state.id != :running
# By default Vagrant will keep trying [1] to ssh connect to the VM for
# a long and we've got to prevent that from happening, so we just wait
# a few seconds and assume that the VM is halted / unresponsive and we
# carry on if it times out.
# [1] - https://github.com/mitchellh/vagrant/blob/57e95323b6600b146167f0f14f83b22dd31dd03f/plugins/communicators/ssh/communicator.rb#L185-L200
begin
Timeout.timeout(35) do
while true
return true if @machine.communicate.ready?
sleep 0.5
end
end
rescue Timeout::Error
@env[:ui].warn(I18n.t('vagrant_cachier.unable_to_ssh'))
end
return false
end
def symlinks
# TODO: Check if file exists instead of a blank rescue
@symlinks ||= @machine.data_dir.join('cache_dirs').read.split rescue []
end
def remove_symlink(symlink)
if @machine.communicate.test("test -L #{symlink}")
@logger.info "Removing symlink for '#{symlink}'"
@machine.communicate.sudo("unlink #{symlink}")
end
end
end
end
end
end

View file

@ -0,0 +1,67 @@
require 'timeout'
module VagrantPlugins
module Cachier
class Action
class ConfigureBucketRoot
def initialize(app, env)
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
end
def call(env)
@env = env
if !env[:cache_buckets_folder_configured] && env[:machine].config.cache.enabled?
setup_buckets_folder
env[:cache_buckets_folder_configured] = true
end
@app.call env
end
def setup_buckets_folder
FileUtils.mkdir_p(cache_root.to_s) unless cache_root.exist?
synced_folder_opts = {id: "vagrant-cache"}
synced_folder_opts.merge!(@env[:machine].config.cache.synced_folder_opts || {})
@env[:machine].config.vm.synced_folder cache_root, '/tmp/vagrant-cache', synced_folder_opts
@env[:cache_dirs] = []
end
def cache_root
@cache_root ||= case @env[:machine].config.cache.scope.to_sym
when :box
@box_name = box_name
# Box is optional with docker provider
if @box_name.nil? && @env[:machine].provider_name.to_sym == :docker
@image_name = image_name
# Use the image name if it's set
if @image_name
bucket_name = @image_name.gsub(':', '-')
else
raise "Cachier plugin only supported with docker provider when image is used"
end
else
bucket_name = @box_name
end
@env[:home_path].join('cache', bucket_name)
when :machine
@env[:machine].data_dir.parent.join('cache')
else
raise "Unknown cache scope: '#{@env[:machine].config.cache.scope}'"
end
end
def box_name
@env[:machine].config.vm.box
end
def image_name
@env[:machine].provider_config.image
end
end
end
end
end

View file

@ -0,0 +1,66 @@
require_relative '../bucket'
module VagrantPlugins
module Cachier
class Action
class InstallBuckets
def initialize(app, env, opts = {})
@app = app
@logger = Log4r::Logger.new("vagrant::cachier::action::clean")
@opts = opts
end
def call(env)
@app.call(env)
return unless env[:machine].config.cache.enabled?
chmod_bucket_root(env[:machine]) if @opts[:chmod]
configure_cache_buckets(env)
end
def chmod_bucket_root(machine)
machine.communicate.sudo 'mkdir -p /tmp/vagrant-cache'
# https://github.com/fgrehm/vagrant-cachier/issues/107
if ! smb_synced_folder_enabled?(machine)
@logger.info "'chmod'ing bucket root dir to 777..."
machine.communicate.sudo 'chmod 777 /tmp/vagrant-cache'
end
end
def configure_cache_buckets(env)
if env[:machine].config.cache.auto_detect
Bucket.auto_detect(env)
end
return unless env[:machine].config.cache.buckets.any?
env[:ui].info 'Configuring cache buckets...'
cache_config = env[:machine].config.cache
cache_config.buckets.each do |bucket_name, configs|
@logger.info "Installing #{bucket_name} with configs #{configs.inspect}"
Bucket.install(bucket_name, env, configs)
end
data_file = env[:machine].data_dir.join('cache_dirs')
data_file.open('w') { |f| f.print env[:cache_dirs].uniq.join("\n") }
end
def smb_synced_folder_enabled?(machine)
synced_folder_opts = machine.config.cache.synced_folder_opts
synced_folder_opts ||= {}
# If smb was explicitly enabled
if synced_folder_opts[:type] && synced_folder_opts[:type].to_s == 'smb'
return true
elsif machine.provider_name.to_sym == :hyperv
# If the provider in use is hyperv, the default synced folder is 'smb'
# unless specified
return synced_folder_opts[:type] == nil
end
end
end
end
end
end

View file

@ -1,4 +1,4 @@
module Vagrant
module VagrantPlugins
module Cachier
class Bucket
def self.inherited(base)
@ -8,19 +8,19 @@ module Vagrant
def self.auto_detect(env)
@buckets.each do |bucket|
if env[:machine].guest.capability?(bucket.capability)
if bucket.respond_to?(:capability) && env[:machine].guest.capability?(bucket.capability)
env[:machine].config.cache.enable bucket.bucket_name
end
end
end
def self.bucket_name
# TODO: Handle MultiWord bucket classes
self.name.split('::').last.downcase
class_name = self.name.split('::').last
class_name.scan(/[A-Z][a-z]*/).map{|x| x.downcase}.join("_")
end
def self.install(name, env, configs)
bucket = const_get(name.to_s.capitalize)
bucket = const_get(name.to_s.split("_").map{|x| x.capitalize}.join(""))
bucket.new(name, env, configs).install
end
@ -29,11 +29,77 @@ module Vagrant
@env = env
@configs = configs
end
def machine
@env[:machine]
end
def guest
machine.guest
end
def comm
machine.communicate
end
# TODO: "merge" symlink and user_symlink methods
def symlink(guest_path, bucket_path = "/tmp/vagrant-cache/#{@name}")
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path
comm.execute("mkdir -p #{bucket_path}")
unless symlink?(guest_path)
comm.sudo("mkdir -p `dirname #{guest_path}`")
if empty_dir?(bucket_path) && !empty_dir?(guest_path)
# Warm up cache with guest machine data
comm.sudo("shopt -s dotglob && mv #{guest_path}/* #{bucket_path}")
end
comm.sudo("rm -rf #{guest_path}")
comm.sudo("ln -s #{bucket_path} #{guest_path}")
end
end
def user_symlink(guest_path)
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path
bucket_path = "/tmp/vagrant-cache/#{@name}"
comm.execute("mkdir -p #{bucket_path}")
unless symlink?(guest_path)
comm.execute("mkdir -p `dirname #{guest_path}`")
if empty_dir?(bucket_path) && !empty_dir?(guest_path)
# Warm up cache with guest machine data
comm.execute("shopt -s dotglob && mv #{guest_path}/* #{bucket_path}")
end
comm.execute("rm -rf #{guest_path}")
comm.execute("ln -s #{bucket_path} #{guest_path}")
end
end
def empty_dir?(path)
not comm.test("test \"$(ls -A #{path} 2>/dev/null)\"")
end
def symlink?(path)
comm.test("test -L #{path}")
end
end
end
end
require_relative "bucket/apt"
require_relative "bucket/chef"
require_relative "bucket/gem"
require_relative "bucket/chef_gem"
require_relative "bucket/pacman"
require_relative "bucket/yum"
require_relative "bucket/dnf"
require_relative "bucket/rvm"
require_relative "bucket/apt_cacher"
require_relative "bucket/apt_lists"
require_relative "bucket/composer"
require_relative "bucket/bower"
require_relative "bucket/npm"
require_relative "bucket/zypper"
require_relative "bucket/generic"
require_relative "bucket/pip"

View file

@ -1,4 +1,4 @@
module Vagrant
module VagrantPlugins
module Cachier
class Bucket
class Apt < Bucket
@ -7,25 +7,15 @@ module Vagrant
end
def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:apt_cache_dir)
guest_path = guest.capability(:apt_cache_dir)
@env[:cache_dirs] << guest_path
return if @env[:cache_dirs].include?(guest_path)
machine.communicate.tap do |comm|
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
symlink(guest_path)
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}/partial")
else
# TODO: Raise a better error
raise "You've configured an APT cache for a guest machine that does not support it!"
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'APT')
end
end
end

View file

@ -0,0 +1,28 @@
# Apt-Cacher NG is a caching proxy for software packages which are downloaded by
# Unix/Linux system distribution mechanisms from mirror servers accessible via HTTP.
module VagrantPlugins
module Cachier
class Bucket
class AptCacher < Bucket
def self.capability
:apt_cacher_dir
end
def install
if guest.capability?(:apt_cacher_dir)
if guest_path = guest.capability(:apt_cacher_dir)
synced_folder_type = (machine.config.cache.synced_folder_opts || {})[:type]
if synced_folder_type && synced_folder_type.to_sym == :nfs
symlink(guest_path)
else
@env[:ui].warn I18n.t('vagrant_cachier.nfs_required', bucket: 'apt-cacher')
end
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'apt-cacher')
end
end
end
end
end
end

View file

@ -0,0 +1,28 @@
module VagrantPlugins
module Cachier
class Bucket
class AptLists < Bucket
def self.capability
:apt_lists_dir
end
def install
# Apt lists bucket can't be used on windows hosts
# https://github.com/fgrehm/vagrant-cachier/issues/106
return if Vagrant::Util::Platform.windows?
if guest.capability?(:apt_lists_dir)
guest_path = guest.capability(:apt_lists_dir)
return if @env[:cache_dirs].include?(guest_path)
symlink(guest_path)
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}/partial")
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'apt-lists')
end
end
end
end
end
end

View file

@ -0,0 +1,21 @@
module VagrantPlugins
module Cachier
class Bucket
class Bower < Bucket
def self.capability
:bower_path
end
def install
if guest.capability?(:bower_path)
if bower_path = guest.capability(:bower_path)
user_symlink(bower_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Bower')
end
end
end
end
end
end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
class Bucket
class Chef < Bucket
def self.capability
:chef_file_cache_path
end
def install
if guest.capability?(:chef_file_cache_path)
guest_path = guest.capability(:chef_file_cache_path)
symlink(guest_path) if guest_path
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Chef')
end
end
end
end
end
end

View file

@ -0,0 +1,25 @@
module VagrantPlugins
module Cachier
class Bucket
class ChefGem < Bucket
def self.capability
:chef_gemdir
end
def install
if guest.capability?(:chef_gemdir)
if gemdir_path = guest.capability(:chef_gemdir)
prefix = gemdir_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
gem_cache_path = "#{gemdir_path}/cache"
symlink(gem_cache_path, bucket_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'ChefRubyGems')
end
end
end
end
end
end

View file

@ -0,0 +1,21 @@
module VagrantPlugins
module Cachier
class Bucket
class Composer < Bucket
def self.capability
:composer_path
end
def install
if guest.capability?(:composer_path)
if composer_path = guest.capability(:composer_path)
user_symlink(composer_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Composer')
end
end
end
end
end
end

View file

@ -0,0 +1,27 @@
module VagrantPlugins
module Cachier
class Bucket
class Dnf < Bucket
def self.capability
:dnf_cache_dir
end
def install
if guest.capability?(:dnf_cache_dir)
if guest_path = guest.capability(:dnf_cache_dir)
return if @env[:cache_dirs].include?(guest_path)
# Ensure caching is enabled
comm.sudo("sed -i '/keepcache=/d' /etc/dnf/dnf.conf")
comm.sudo("sed -i '/^[main]/a keepcache=1' /etc/dnf/dnf.conf")
symlink(guest_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'DNF')
end
end
end
end
end
end

View file

@ -1,4 +1,4 @@
module Vagrant
module VagrantPlugins
module Cachier
class Bucket
class Gem < Bucket
@ -7,30 +7,16 @@ module Vagrant
end
def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:gemdir)
if gemdir_path = guest.capability(:gemdir)
prefix = gemdir_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
machine.communicate.tap do |comm|
comm.execute("mkdir -p #{bucket_path}")
prefix = gemdir_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
gem_cache_path = "#{gemdir_path}/cache"
gem_cache_path = "#{gemdir_path}/cache"
@env[:cache_dirs] << gem_cache_path
unless comm.test("test -L #{gem_cache_path}")
comm.sudo("rm -rf #{gem_cache_path}")
comm.sudo("mkdir -p `dirname #{gem_cache_path}`")
comm.sudo("ln -s #{bucket_path} #{gem_cache_path}")
end
end
symlink(gem_cache_path, bucket_path)
end
else
# TODO: Raise a better error
raise "You've configured a RubyGems cache for a guest machine that does not support it!"
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RubyGems')
end
end
end

View file

@ -0,0 +1,26 @@
module VagrantPlugins
module Cachier
class Bucket
class Generic < Bucket
def install
# First we normalize the @configs hash as a hash of hashes
if @configs.has_key?(:cache_dir)
@configs = { @name => @configs }
end
# Now we iterate through all generic buckets's configurations and
# set them up.
@configs.each do |key, conf|
if conf.has_key?(:cache_dir)
symlink(conf[:cache_dir], "/tmp/vagrant-cache/#{key}")
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: "Generic[#{key}]")
end
end
end
end
end
end
end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
class Bucket
class Npm < Bucket
def self.capability
:npm_cache_dir
end
def install
if guest.capability?(:npm_cache_dir)
guest_path = guest.capability(:npm_cache_dir)
user_symlink(guest_path) if guest_path
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'npm')
end
end
end
end
end
end

View file

@ -1,4 +1,4 @@
module Vagrant
module VagrantPlugins
module Cachier
class Bucket
class Pacman < Bucket
@ -7,25 +7,11 @@ module Vagrant
end
def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:pacman_cache_dir)
guest_path = guest.capability(:pacman_cache_dir)
@env[:cache_dirs] << guest_path
machine.communicate.tap do |comm|
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
end
symlink(guest_path)
else
# TODO: Raise a better error
raise "You've configured a Pacman cache for a guest machine that does not support it!"
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Pacman')
end
end
end

View file

@ -0,0 +1,22 @@
module VagrantPlugins
module Cachier
class Bucket
class Pip < Bucket
def self.capability
:pip_cache_dir
end
def install
if guest.capability?(:pip_cache_dir)
if guest_path = guest.capability(:pip_cache_dir)
symlink("#{guest_path}/http", "/tmp/vagrant-cache/#{@name}/http")
symlink("#{guest_path}/wheels", "/tmp/vagrant-cache/#{@name}/wheels")
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'pip')
end
end
end
end
end
end

View file

@ -0,0 +1,25 @@
module VagrantPlugins
module Cachier
class Bucket
class Rvm < Bucket
def self.capability
:rvm_path
end
def install
if guest.capability?(:rvm_path)
if rvm_path = guest.capability(:rvm_path)
prefix = rvm_path.split('/').last
bucket_path = "/tmp/vagrant-cache/#{@name}/#{prefix}"
rvm_cache_path = "#{rvm_path}/archives"
symlink(rvm_cache_path, bucket_path)
end
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'RVM')
end
end
end
end
end
end

View file

@ -1,4 +1,4 @@
module Vagrant
module VagrantPlugins
module Cachier
class Bucket
class Yum < Bucket
@ -7,28 +7,17 @@ module Vagrant
end
def install
machine = @env[:machine]
guest = machine.guest
if guest.capability?(:yum_cache_dir)
guest_path = guest.capability(:yum_cache_dir)
if guest_path = guest.capability(:yum_cache_dir)
return if @env[:cache_dirs].include?(guest_path)
@env[:cache_dirs] << guest_path
machine.communicate.tap do |comm|
# Ensure caching is enabled
comm.sudo("sed -i 's/keepcache=0/keepcache=1/g' /etc/yum.conf")
comm.execute("mkdir -p /tmp/vagrant-cache/#{@name}")
unless comm.test("test -L #{guest_path}")
comm.sudo("rm -rf #{guest_path}")
comm.sudo("mkdir -p `dirname #{guest_path}`")
comm.sudo("ln -s /tmp/vagrant-cache/#{@name} #{guest_path}")
end
symlink(guest_path)
end
else
# TODO: Raise a better error
raise "You've configured a Yum cache for a guest machine that does not support it!"
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Yum')
end
end
end

View file

@ -0,0 +1,25 @@
module VagrantPlugins
module Cachier
class Bucket
class Zypper < Bucket
def self.capability
:zypper_cache_dir
end
def install
if guest.capability?(:zypper_cache_dir)
guest_path = guest.capability(:zypper_cache_dir)
return if @env[:cache_dirs].include?(guest_path)
# Ensure caching is enabled
comm.sudo("zypper modifyrepo --keep-packages --all")
symlink(guest_path)
else
@env[:ui].info I18n.t('vagrant_cachier.skipping_bucket', bucket: 'Zypper')
end
end
end
end
end
end

View file

@ -1,10 +1,9 @@
module Vagrant
module VagrantPlugins
module Cachier
module Cap
module Arch
module PacmanCacheDir
def self.pacman_cache_dir(machine)
# TODO: Find out if there is a config file we can read from
'/var/cache/pacman/pkg'
end
end

View file

@ -1,10 +1,9 @@
module Vagrant
module VagrantPlugins
module Cachier
module Cap
module Debian
module AptCacheDir
def self.apt_cache_dir(machine)
# TODO: Find out if there is a config file we can read from
'/var/cache/apt/archives'
end
end

View file

@ -0,0 +1,23 @@
module VagrantPlugins
module Cachier
module Cap
module Debian
module AptCacherDir
CACHER_CONF = '/etc/apt-cacher-ng/acng.conf'
CACHER_CACHE_DIR = "$(cat #{CACHER_CONF} | grep CacheDir | cut -d' ' -f 2)"
def self.apt_cacher_dir(machine)
cache_dir = nil
machine.communicate.tap do |comm|
return unless comm.test("test -f #{CACHER_CONF}")
comm.execute "echo #{CACHER_CACHE_DIR}" do |buffer, output|
cache_dir = output.chomp if buffer == :stdout
end
end
return cache_dir
end
end
end
end
end
end

View file

@ -0,0 +1,13 @@
module VagrantPlugins
module Cachier
module Cap
module Debian
module AptListsDir
def self.apt_lists_dir(machine)
'/var/lib/apt/lists'
end
end
end
end
end
end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module BowerPath
def self.bower_path(machine)
bower_path = nil
machine.communicate.tap do |comm|
return unless comm.test('which bower')
comm.execute 'echo $HOME' do |buffer, output|
bower_path = output.chomp if buffer == :stdout
end
end
return "#{bower_path}/.cache/bower"
end
end
end
end
end
end

View file

@ -0,0 +1,30 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module ChefFileCachePath
def self.chef_provisioner?(machine)
provisioners = machine.config.vm.provisioners
chef_provisioners = [:chef_solo, :chef_client, :chef_zero]
compat_provisioners = provisioners.select { |p| chef_provisioners.include? p.name || p.type }
if compat_provisioners.size > 1
raise "One machine is using multiple chef provisioners, which is unsupported."
end
using_chef = compat_provisioners.empty? ? false : true
using_chef
end
def self.chef_file_cache_path(machine)
chef_file_cache_path = nil
chef_file_cache_path = '/var/chef/cache' if chef_provisioner?(machine)
return chef_file_cache_path
end
end
end
end
end
end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module ChefGemdir
def self.chef_gemdir(machine)
gemdir = nil
machine.communicate.tap do |comm|
return unless comm.test('test -f /opt/chef/embedded/bin/gem')
comm.execute '/opt/chef/embedded/bin/gem env gemdir' do |buffer, output|
gemdir = output.chomp if buffer == :stdout
end
end
return gemdir
end
end
end
end
end
end

View file

@ -0,0 +1,23 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module ComposerPath
def self.composer_path(machine)
composer_path = nil
machine.communicate.tap do |comm|
return unless comm.test('which php')
# on some VMs an extra new line seems to come out, so we loop over
# the output just in case
composer_path = ''
comm.execute 'echo $HOME' do |buffer, output|
composer_path += output.chomp if buffer == :stdout
end
end
return "#{composer_path}/.composer/cache"
end
end
end
end
end
end

View file

@ -1,4 +1,4 @@
module Vagrant
module VagrantPlugins
module Cachier
module Cap
module Linux

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module NpmCacheDir
def self.npm_cache_dir(machine)
npm_cache_dir = nil
machine.communicate.tap do |comm|
return unless comm.test('which npm')
comm.execute 'npm config get cache' do |buffer, output|
npm_cache_dir = output.chomp if buffer == :stdout
end
end
return npm_cache_dir
end
end
end
end
end
end

View file

@ -0,0 +1,20 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module PipCacheDir
def self.pip_cache_dir(machine)
pip_cache_dir = nil
machine.communicate.tap do |comm|
return unless comm.test('which pip')
comm.execute 'echo $HOME' do |buffer, output|
pip_cache_dir = output.chomp if buffer == :stdout
end
end
return "#{pip_cache_dir}/.cache/pip"
end
end
end
end
end
end

View file

@ -0,0 +1,21 @@
module VagrantPlugins
module Cachier
module Cap
module Linux
module RvmPath
def self.rvm_path(machine)
rvm_path = nil
machine.communicate.tap do |comm|
return unless comm.test('rvm info')
comm.execute 'echo $rvm_path' do |buffer, output|
rvm_path = output.chomp if buffer == :stdout
end
end
return rvm_path
end
end
end
end
end
end

View file

@ -0,0 +1,18 @@
module VagrantPlugins
module Cachier
module Cap
module RedHat
module DnfCacheDir
def self.dnf_cache_dir(machine)
dnf_cache_dir = nil
machine.communicate.tap do |comm|
return unless comm.test('which dnf')
dnf_cache_dir = '/var/cache/dnf'
end
return dnf_cache_dir
end
end
end
end
end
end

View file

@ -1,11 +1,16 @@
module Vagrant
module VagrantPlugins
module Cachier
module Cap
module RedHat
module YumCacheDir
def self.yum_cache_dir(machine)
# TODO: Find out if there is a config file we can read from
'/var/cache/yum'
yum_cache_dir = nil
machine.communicate.tap do |comm|
# In case yum is only forwarding to dnf do not cache
return unless not comm.test('yum --version 2>&1 | grep /usr/bin/dnf')
yum_cache_dir = '/var/cache/yum'
end
return yum_cache_dir
end
end
end

View file

@ -0,0 +1,13 @@
module VagrantPlugins
module Cachier
module Cap
module SuSE
module ZypperCacheDir
def self.zypper_cache_dir(machine)
'/var/cache/zypp/packages'
end
end
end
end
end
end

View file

@ -0,0 +1,84 @@
module VagrantPlugins
module Cachier
class Plugin < Vagrant.plugin('2')
guest_capability 'linux', 'gemdir' do
require_relative 'cap/linux/gemdir'
Cap::Linux::Gemdir
end
guest_capability 'linux', 'chef_gemdir' do
require_relative 'cap/linux/chef_gemdir'
Cap::Linux::ChefGemdir
end
guest_capability 'linux', 'rvm_path' do
require_relative 'cap/linux/rvm_path'
Cap::Linux::RvmPath
end
guest_capability 'linux', 'composer_path' do
require_relative 'cap/linux/composer_path'
Cap::Linux::ComposerPath
end
guest_capability 'linux', 'bower_path' do
require_relative 'cap/linux/bower_path'
Cap::Linux::BowerPath
end
guest_capability 'linux', 'chef_file_cache_path' do
require_relative 'cap/linux/chef_file_cache_path'
Cap::Linux::ChefFileCachePath
end
guest_capability 'linux', 'npm_cache_dir' do
require_relative 'cap/linux/npm_cache_dir'
Cap::Linux::NpmCacheDir
end
guest_capability 'linux', 'pip_cache_dir' do
require_relative 'cap/linux/pip_cache_dir'
Cap::Linux::PipCacheDir
end
guest_capability 'debian', 'apt_cache_dir' do
require_relative 'cap/debian/apt_cache_dir'
Cap::Debian::AptCacheDir
end
guest_capability 'debian', 'apt_cacher_dir' do
require_relative 'cap/debian/apt_cacher_dir'
Cap::Debian::AptCacherDir
end
guest_capability 'debian', 'apt_lists_dir' do
require_relative 'cap/debian/apt_lists_dir'
Cap::Debian::AptListsDir
end
guest_capability 'redhat', 'yum_cache_dir' do
require_relative 'cap/redhat/yum_cache_dir'
Cap::RedHat::YumCacheDir
end
guest_capability 'redhat', 'dnf_cache_dir' do
require_relative 'cap/redhat/dnf_cache_dir'
Cap::RedHat::DnfCacheDir
end
guest_capability 'suse', 'yum_cache_dir' do
# Disable Yum on suse guests
end
guest_capability 'arch', 'pacman_cache_dir' do
require_relative 'cap/arch/pacman_cache_dir'
Cap::Arch::PacmanCacheDir
end
guest_capability 'suse', 'zypper_cache_dir' do
require_relative 'cap/suse/zypper_cache_dir'
Cap::SuSE::ZypperCacheDir
end
end
end
end

View file

@ -1,29 +1,62 @@
module Vagrant
module VagrantPlugins
module Cachier
class Config < Vagrant.plugin(2, :config)
attr_accessor :scope, :auto_detect
attr_accessor :scope, :auto_detect, :synced_folder_opts
attr_reader :buckets
ALLOWED_SCOPES = %w( box machine )
def initialize
@scope = UNSET_VALUE
@scope = UNSET_VALUE
@auto_detect = UNSET_VALUE
@synced_folder_opts = UNSET_VALUE
@ui = Vagrant::UI::Colored.new
end
def enable(bucket, opts = {})
(@buckets ||= {})[bucket] = opts
end
def finalize!
return unless enabled?
def validate(machine)
errors = _detected_errors
@scope = :box if @scope == UNSET_VALUE
@auto_detect = false if @auto_detect == UNSET_VALUE
@buckets = @buckets ? @buckets.dup : {}
if enabled? && backed_by_cloud_provider?(machine)
machine.ui.warn(I18n.t('vagrant_cachier.backed_by_cloud_provider',
provider: machine.provider_name))
disable!
end
if enabled? && ! ALLOWED_SCOPES.include?(@scope.to_s)
errors << I18n.t('vagrant_cachier.unknown_cache_scope',
allowed: ALLOWED_SCOPES.inspect,
cache_scope: @scope)
end
{ "vagrant cachier" => errors }
end
def enabled?
@enabled ||= @auto_detect != UNSET_VALUE ||
@buckets != nil
return @enabled unless @enabled.nil?
@enabled = @scope != UNSET_VALUE
end
def disable!
@enabled = false
end
def finalize!
return unless enabled?
@auto_detect = true if @auto_detect == UNSET_VALUE
@synced_folder_opts = nil if @synced_folder_opts == UNSET_VALUE
@buckets = @buckets ? @buckets.dup : {}
end
private
def backed_by_cloud_provider?(machine)
CLOUD_PROVIDERS.include?(machine.provider_name.to_s)
end
end
end

View file

@ -0,0 +1,27 @@
module VagrantPlugins
module Cachier
class Plugin < Vagrant.plugin('2')
action_hook VagrantPlugins::Cachier::Plugin::ALL_ACTIONS do |hook|
require_relative 'action/configure_bucket_root'
require_relative 'action/install_buckets'
hook.before Vagrant::Action::Builtin::Provision, Action::ConfigureBucketRoot
# This will do the initial buckets installation
hook.after Vagrant::Action::Builtin::Provision, Action::InstallBuckets, chmod: true
end
# This ensure buckets are reconfigured after provisioners runs
action_hook :provisioner_run do |hook|
require_relative 'action/install_buckets'
hook.after :run_provisioner, Action::InstallBuckets
end
clean_action_hook = lambda do |hook|
require_relative 'action/clean'
hook.before Vagrant::Action::Builtin::GracefulHalt, Action::Clean
end
action_hook 'remove-guest-symlinks-on-halt', :machine_action_halt, &clean_action_hook
action_hook 'remove-guest-symlinks-on-package', :machine_action_package, &clean_action_hook
end
end
end

View file

@ -1,46 +1,27 @@
module Vagrant
unless Gem::Requirement.new('>= 1.4.0').satisfied_by?(Gem::Version.new(Vagrant::VERSION))
raise 'vagrant-cachier requires Vagrant >= 1.4.0 in order to work!'
end
# Add our custom translations to the load path
I18n.load_path << File.expand_path("../../../locales/en.yml", __FILE__)
module VagrantPlugins
module Cachier
class Plugin < Vagrant.plugin('2')
name 'vagrant-cachier'
config 'cache' do
require_relative "config"
Config
end
guest_capability 'linux', 'gemdir' do
require_relative 'cap/linux/gemdir'
Cap::Linux::Gemdir
end
guest_capability 'debian', 'apt_cache_dir' do
require_relative 'cap/debian/apt_cache_dir'
Cap::Debian::AptCacheDir
end
guest_capability 'redhat', 'yum_cache_dir' do
require_relative 'cap/redhat/yum_cache_dir'
Cap::RedHat::YumCacheDir
end
guest_capability 'arch', 'pacman_cache_dir' do
require_relative 'cap/arch/pacman_cache_dir'
Cap::Arch::PacmanCacheDir
end
install_action_hook = lambda do |hook|
require_relative 'action'
hook.after Vagrant::Action::Builtin::Provision, Vagrant::Cachier::Action::Install
end
action_hook 'set-shared-cache-on-machine-up', :machine_action_up, &install_action_hook
action_hook 'set-shared-cache-on-machine-reload', :machine_action_reload, &install_action_hook
clean_action_hook = lambda do |hook|
require_relative 'action'
hook.before Vagrant::Action::Builtin::GracefulHalt, Vagrant::Cachier::Action::Clean
end
action_hook 'remove-guest-symlinks-on-machine-halt', :machine_action_halt, &clean_action_hook
action_hook 'remove-guest-symlinks-on-machine-package', :machine_action_package, &clean_action_hook
end
# Keep an eye on https://github.com/mitchellh/vagrant/wiki/Available-Vagrant-Plugins#wiki-providers
# for more.
CLOUD_PROVIDERS = %w( aws cloudstack digitalocean hp joyent openstack rackspace
softlayer proxmox managed azure brightbox cloudstack vcloud
vsphere )
end
end
require_relative "hooks"
require_relative "capabilities"

View file

@ -1,5 +1,5 @@
module Vagrant
module VagrantPlugins
module Cachier
VERSION = "0.0.6"
VERSION = "1.2.1"
end
end

16
locales/en.yml Normal file
View file

@ -0,0 +1,16 @@
en:
vagrant_cachier:
cleanup: |-
Removing cache buckets symlinks...
skipping_bucket: |-
Skipping %{bucket} cache bucket as the guest machine does not support it
unknown_cache_scope: |-
Unknown cache scope '%{cache_scope}' (allowed scopes: %{allowed})
nfs_required: |-
The '%{bucket}' cache bucket requires NFS to be enabled, please add
`config.cache.synced_folder_opts = {type: :nfs}` to your Vagrantfile.
unable_to_ssh: |-
vagrant-cachier was unable to SSH into the VM to remove symlinks!
backed_by_cloud_provider: |-
The machine is backed by a cloud provider (%{provider}), caching
will be disabled.

View file

@ -0,0 +1,14 @@
Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |_, override|
override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
config.cache.auto_detect = true
config.cache.scope = :machine
config.vm.provision :shell, inline: 'apt-get update && apt-get install -y git'
end

View file

@ -0,0 +1,12 @@
Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |_, override|
override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
config.cache.auto_detect = true
config.vm.provision :shell, inline: 'echo Hello!'
end

View file

@ -0,0 +1,8 @@
Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |_, override|
override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
end

View file

@ -0,0 +1,10 @@
Vagrant.configure("2") do |config|
config.vm.provider :virtualbox do |_, override|
override.vm.box = "chef/ubuntu-14.04"
end
config.vm.provider :lxc do |_, override|
override.vm.box = "fgrehm/trusty64-lxc"
end
config.vm.provision :shell, inline: 'echo Hello!'
end

View file

@ -0,0 +1,45 @@
#!/usr/bin/env bats
load test_helper
@test "Vagrantfile without cachier statement does not blow up when bringing the VM up" {
configure_env "no-cachier-simple.rb"
vagrant_up
[ "$status" -eq 0 ]
vagrant_destroy
configure_env "no-cachier-with-provisioning.rb"
vagrant_up
[ "$status" -eq 0 ]
vagrant_destroy
}
@test "Vagrantfile with cachier auto_detect statement does not blow up when bringing the VM up" {
configure_env "auto-detect.rb"
vagrant_up
[ "$status" -eq 0 ]
vagrant_destroy
}
@test "APT cache bucket configures the cache dir properly and keeps cache dir around" {
configure_env "auto-detect-with-provisioning.rb"
# Make sure cache dir does not exist
test ! -d tmp/.vagrant/machines/default/cache/apt
vagrant_up
[ "$status" -eq 0 ]
# Make sure packages are being cached
test -d tmp/.vagrant/machines/default/cache/apt
FILES=(`ls tmp/.vagrant/machines/default/cache/apt/git*.deb`)
[ ${#FILES[@]} -gt 0 ]
vagrant_destroy
# Make sure packages are not removed between machine rebuilds
FILES=(`ls tmp/.vagrant/machines/default/cache/apt/git*.deb`)
[ ${#FILES[@]} -gt 0 ]
empty_cache
}

View file

@ -0,0 +1,26 @@
vagrant_up() {
pushd tmp
run bundle exec vagrant up > /tmp/vagrant-cachier-tests.log
popd
}
vagrant_destroy() {
pushd tmp
run bundle exec vagrant destroy -f
popd
}
configure_env() {
fixture=$1
mkdir -p tmp/
cp spec/acceptance/fixtures/${fixture} tmp/Vagrantfile
vagrant_destroy
[ "$status" -eq 0 ]
rm -rf tmp/.vagrant
}
empty_cache() {
rm -rf tmp/.vagrant/cache
}

View file

@ -5,10 +5,10 @@ require 'vagrant-cachier/version'
Gem::Specification.new do |spec|
spec.name = "vagrant-cachier"
spec.version = Vagrant::Cachier::VERSION
spec.version = VagrantPlugins::Cachier::VERSION
spec.authors = ["Fabio Rehm"]
spec.email = ["fgrehm@gmail.com"]
spec.description = %q{Speed up vagrant boxes provisioning}
spec.description = %q{Caffeine reducer}
spec.summary = spec.description
spec.homepage = "https://github.com/fgrehm/vagrant-cachier"
spec.license = "MIT"