capistrano-local-precompile 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gemtest +0 -0
- data/.gitignore +40 -0
- data/.rspec +3 -0
- data/.travis.yml +8 -0
- data/.yardopts +3 -0
- data/Gemfile +17 -0
- data/Guardfile +6 -0
- data/LICENSE.md +20 -0
- data/README.md +52 -0
- data/Rakefile +17 -0
- data/capistrano-local-precompile.gemspec +23 -0
- data/lib/capistrano-local-precompile.rb +1 -0
- data/lib/capistrano-local-precompile/version.rb +3 -0
- data/lib/capistrano/local_precompile.rb +58 -0
- data/spec/configuration_spec.rb +45 -0
- data/spec/integration_spec.rb +79 -0
- data/spec/spec_helper.rb +22 -0
- metadata +87 -0
data/.gemtest
ADDED
File without changes
|
data/.gitignore
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
*.gem
|
2
|
+
*.rbc
|
3
|
+
*.sw[a-p]
|
4
|
+
*.tmproj
|
5
|
+
*.tmproject
|
6
|
+
*.un~
|
7
|
+
*~
|
8
|
+
.DS_Store
|
9
|
+
.Spotlight-V100
|
10
|
+
.Trashes
|
11
|
+
._*
|
12
|
+
.bundle
|
13
|
+
.config
|
14
|
+
.directory
|
15
|
+
.elc
|
16
|
+
.emacs.desktop
|
17
|
+
.emacs.desktop.lock
|
18
|
+
.redcar
|
19
|
+
.yardoc
|
20
|
+
Desktop.ini
|
21
|
+
Gemfile.lock
|
22
|
+
Icon?
|
23
|
+
InstalledFiles
|
24
|
+
Session.vim
|
25
|
+
Thumbs.db
|
26
|
+
\#*\#
|
27
|
+
_yardoc
|
28
|
+
auto-save-list
|
29
|
+
coverage
|
30
|
+
doc
|
31
|
+
lib/bundler/man
|
32
|
+
pkg
|
33
|
+
pkg/*
|
34
|
+
rdoc
|
35
|
+
spec/reports
|
36
|
+
test/tmp
|
37
|
+
test/version_tmp
|
38
|
+
tmp
|
39
|
+
tmtags
|
40
|
+
tramp
|
data/.rspec
ADDED
data/.travis.yml
ADDED
data/.yardopts
ADDED
data/Gemfile
ADDED
data/Guardfile
ADDED
data/LICENSE.md
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2013 Steve Agalloco
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,52 @@
|
|
1
|
+
# Capistrano Local Precompile
|
2
|
+
|
3
|
+
If your Rails apps are anything like mine, one of the slowest parts of your deployment is waiting for asset pipeline precompilation. It's sometimes so slow, it's painful. So I went searching for some solutions. [turbo-sprockets](https://github.com/ndbroadbent/turbo-sprockets-rails3) helped, but it's not a silver bullet. This gem isn't a silver bullet either, but it can help. Capistrano Local Precompile takes a different approach. It builds your assets locally and rsync's them to your web server(s).
|
4
|
+
|
5
|
+
## Usage
|
6
|
+
|
7
|
+
Add capistrano-local-precompile to your Gemfile:
|
8
|
+
|
9
|
+
```ruby
|
10
|
+
group :development do
|
11
|
+
gem 'capistrano-local-precompile', require: false
|
12
|
+
end
|
13
|
+
```
|
14
|
+
|
15
|
+
Then add the following line to your `deploy.rb`:
|
16
|
+
|
17
|
+
```ruby
|
18
|
+
require 'capistrano/local_precompile'
|
19
|
+
```
|
20
|
+
|
21
|
+
If you are using turbo-sprockets, just set it to enabled. Your asset will still compile locally, but they'll use turbosprockets to do so:
|
22
|
+
|
23
|
+
```ruby
|
24
|
+
set :turbosprockets_enabled, true
|
25
|
+
```
|
26
|
+
|
27
|
+
Here's the full set of configurable options:
|
28
|
+
|
29
|
+
```ruby
|
30
|
+
set :precompile_cmd # default: bundle exec rake assets:precompile
|
31
|
+
set :assets_dir # default: "public/assets"
|
32
|
+
set :rsync_cmd # default: "rsync -av"
|
33
|
+
|
34
|
+
set :turbosprockets_enabled # default: false
|
35
|
+
set :turbosprockets_backup_dir # default: "public/.assets"
|
36
|
+
set :cleanexpired_cmd # default: bundle exec rake assets:clean_expired
|
37
|
+
```
|
38
|
+
|
39
|
+
## Acknowledgement
|
40
|
+
|
41
|
+
This gem is derived from gists by [uhlenbrock][] and [keighl][].
|
42
|
+
|
43
|
+
[uhlenbrock]: https://gist.github.com/uhlenbrock/1477596
|
44
|
+
[keighl]: https://gist.github.com/keighl/4338134
|
45
|
+
|
46
|
+
## Contributing
|
47
|
+
|
48
|
+
Pull requests welcome: fork, make a topic branch, commit (squash when possible) *with tests* and I'll happily consider.
|
49
|
+
|
50
|
+
## Copyright
|
51
|
+
|
52
|
+
Copyright (c) 2013 Steve Agalloco. See [LICENSE](LICENSE.md) for detail
|
data/Rakefile
ADDED
@@ -0,0 +1,17 @@
|
|
1
|
+
#!/usr/bin/env rake
|
2
|
+
|
3
|
+
require 'bundler/gem_tasks'
|
4
|
+
|
5
|
+
require 'rspec/core/rake_task'
|
6
|
+
RSpec::Core::RakeTask.new(:spec)
|
7
|
+
|
8
|
+
task :default => :spec
|
9
|
+
task :test => :spec
|
10
|
+
|
11
|
+
require 'yard'
|
12
|
+
namespace :doc do
|
13
|
+
YARD::Rake::YardocTask.new do |task|
|
14
|
+
task.files = ['LICENSE.md', 'lib/**/*.rb']
|
15
|
+
task.options = ['--markup', 'markdown']
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
lib = File.expand_path('../lib', __FILE__)
|
3
|
+
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
|
+
require 'capistrano-local-precompile/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |gem|
|
7
|
+
gem.name = 'capistrano-local-precompile'
|
8
|
+
gem.version = CapistranoLocalPrecompile::VERSION
|
9
|
+
gem.homepage = 'https://github.com/spagalloco/capistrano-local-precompile'
|
10
|
+
|
11
|
+
gem.author = "Steve Agalloco"
|
12
|
+
gem.email = 'steve.agalloco@gmail.com'
|
13
|
+
gem.description = 'Local asset-pipeline precompilation for Capstrano'
|
14
|
+
gem.summary = gem.description
|
15
|
+
|
16
|
+
gem.add_dependency 'capistrano'
|
17
|
+
|
18
|
+
gem.executables = `git ls-files -- bin/*`.split("\n").map{|f| File.basename(f)}
|
19
|
+
gem.files = `git ls-files`.split("\n")
|
20
|
+
gem.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
21
|
+
|
22
|
+
gem.require_paths = ['lib']
|
23
|
+
end
|
@@ -0,0 +1 @@
|
|
1
|
+
require 'capistrano/local_precompile'
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'capistrano'
|
2
|
+
|
3
|
+
module Capistrano
|
4
|
+
module LocalPrecompile
|
5
|
+
|
6
|
+
def self.load_into(configuration)
|
7
|
+
configuration.load do
|
8
|
+
|
9
|
+
set(:precompile_cmd) { "#{fetch(:bundle_cmd, "bundle")} exec rake assets:precompile" }
|
10
|
+
set(:cleanexpired_cmd) { "#{fetch(:bundle_cmd, "bundle")} exec rake assets:clean_expired" }
|
11
|
+
set(:assets_dir) { "public/assets" }
|
12
|
+
|
13
|
+
set(:turbosprockets_enabled) { false }
|
14
|
+
set(:turbosprockets_backup_dir) { "public/.assets" }
|
15
|
+
set(:rsync_cmd) { "rsync -av" }
|
16
|
+
|
17
|
+
before "deploy:assets:precompile", "deploy:assets:prepare"
|
18
|
+
after "deploy:assets:precompile", "deploy:assets:cleanup"
|
19
|
+
|
20
|
+
namespace :deploy do
|
21
|
+
namespace :assets do
|
22
|
+
|
23
|
+
task :cleanup, :on_no_matching_servers => :continue do
|
24
|
+
if fetch(:turbosprockets_enabled)
|
25
|
+
run_locally "mv #{fetch(:assets_dir)} #{fetch(:turbosprockets_backup_dir)}"
|
26
|
+
else
|
27
|
+
run_locally "rm -rf #{fetch(:assets_dir)}"
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
task :prepare, :on_no_matching_servers => :continue do
|
32
|
+
if fetch(:turbosprockets_enabled)
|
33
|
+
run_locally "mkdir -p #{fetch(:turbosprockets_backup_dir)}"
|
34
|
+
run_locally "mv #{fetch(:turbosprockets_backup_dir)} #{fetch(:assets_dir)}"
|
35
|
+
run_locally "#{fetch(:cleanexpired_cmd)}"
|
36
|
+
end
|
37
|
+
run_locally "#{fetch(:precompile_cmd)}"
|
38
|
+
end
|
39
|
+
|
40
|
+
desc "Precompile assets locally and then rsync to app servers"
|
41
|
+
task :precompile, :only => { :primary => true }, :on_no_matching_servers => :continue do
|
42
|
+
servers = find_servers :roles => assets_role, :except => { :no_release => true }
|
43
|
+
servers.each do |srvr|
|
44
|
+
run_locally "#{fetch(:rsync_cmd)} ./#{fetch(:assets_dir)} #{user}@#{srvr}:#{release_path}/#{fetch(:assets_dir)}"
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
if Capistrano::Configuration.instance
|
57
|
+
Capistrano::LocalPrecompile.load_into(Capistrano::Configuration.instance)
|
58
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Capistrano::LocalPrecompile, "configuration" do
|
4
|
+
before do
|
5
|
+
@configuration = Capistrano::Configuration.new
|
6
|
+
Capistrano::LocalPrecompile.load_into(@configuration)
|
7
|
+
end
|
8
|
+
|
9
|
+
it "defines precompile_cmd" do
|
10
|
+
cmd = 'bundle exec rake assets:precompile'
|
11
|
+
expect(@configuration.fetch(:precompile_cmd)).to eq(cmd)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "defines cleanexpired_cmd" do
|
15
|
+
cmd = 'bundle exec rake assets:clean_expired'
|
16
|
+
expect(@configuration.fetch(:cleanexpired_cmd)).to eq(cmd)
|
17
|
+
end
|
18
|
+
|
19
|
+
it "defines assets_dir" do
|
20
|
+
expect(@configuration.fetch(:assets_dir)).to eq('public/assets')
|
21
|
+
end
|
22
|
+
|
23
|
+
it "defines turbosprockets_enabled" do
|
24
|
+
expect(@configuration.fetch(:turbosprockets_enabled)).to be_false
|
25
|
+
end
|
26
|
+
|
27
|
+
it "defines turbosprockets_backup_dir" do
|
28
|
+
dir = 'public/.assets'
|
29
|
+
expect(@configuration.fetch(:turbosprockets_backup_dir)).to eq(dir)
|
30
|
+
end
|
31
|
+
|
32
|
+
it "defines rsync_cmd" do
|
33
|
+
expect(@configuration.fetch(:rsync_cmd)).to eq('rsync -av')
|
34
|
+
end
|
35
|
+
|
36
|
+
it "performs deploy:assets:prepare before deploy:assets:precompile" do
|
37
|
+
expect(@configuration).to callback('deploy:assets:prepare').
|
38
|
+
before('deploy:assets:precompile')
|
39
|
+
end
|
40
|
+
|
41
|
+
it "performs deploy:assets:cleanup after deploy:assets:precompile" do
|
42
|
+
expect(@configuration).to callback('deploy:assets:cleanup').
|
43
|
+
after('deploy:assets:precompile')
|
44
|
+
end
|
45
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Capistrano::LocalPrecompile, "integration" do
|
4
|
+
before do
|
5
|
+
@configuration = Capistrano::Configuration.new
|
6
|
+
Capistrano::LocalPrecompile.load_into(@configuration)
|
7
|
+
end
|
8
|
+
|
9
|
+
describe 'cleanup task' do
|
10
|
+
it 'removes the asset files from public/assets' do
|
11
|
+
expect(@configuration).to receive(:run_locally).
|
12
|
+
with('rm -rf public/assets')
|
13
|
+
|
14
|
+
@configuration.find_and_execute_task('deploy:assets:cleanup')
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
describe 'prepare task' do
|
19
|
+
it 'invokes the precompile command' do
|
20
|
+
expect(@configuration).to receive(:run_locally).
|
21
|
+
with('bundle exec rake assets:precompile').once
|
22
|
+
|
23
|
+
@configuration.find_and_execute_task('deploy:assets:prepare')
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
describe 'precompile task' do
|
28
|
+
let(:servers) { %w(10.0.1.1 10.0.1.2) }
|
29
|
+
|
30
|
+
before do
|
31
|
+
allow(@configuration).to receive(:run_locally).
|
32
|
+
with('bundle exec rake assets:precompile').once
|
33
|
+
allow(@configuration).to receive(:run_locally).
|
34
|
+
with('rm -rf public/assets').once
|
35
|
+
|
36
|
+
|
37
|
+
allow(@configuration).to receive(:user).and_return('root')
|
38
|
+
allow(@configuration).to receive(:assets_role).and_return('app')
|
39
|
+
allow(@configuration).to receive(:find_servers).and_return(servers)
|
40
|
+
allow(@configuration).to receive(:release_path).and_return('/tmp')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'rsyncs the local asset files to the server' do
|
44
|
+
expect(@configuration).to receive(:run_locally).with(/rsync -av/).twice
|
45
|
+
|
46
|
+
@configuration.find_and_execute_task('deploy:assets:precompile')
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
context 'with turbosprockets enabled' do
|
51
|
+
before do
|
52
|
+
@configuration.set :turbosprockets_enabled, true
|
53
|
+
end
|
54
|
+
|
55
|
+
describe 'cleanup task' do
|
56
|
+
it 'moves assets to the configured turbosprockets backup dir' do
|
57
|
+
expect(@configuration).to receive(:run_locally).
|
58
|
+
with('mv public/assets public/.assets')
|
59
|
+
|
60
|
+
@configuration.find_and_execute_task('deploy:assets:cleanup')
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe 'prepare task' do
|
65
|
+
it 'invokes the precompile command' do
|
66
|
+
expect(@configuration).to receive(:run_locally).
|
67
|
+
with('mkdir -p public/.assets').once
|
68
|
+
expect(@configuration).to receive(:run_locally).
|
69
|
+
with('mv public/.assets public/assets').once
|
70
|
+
expect(@configuration).to receive(:run_locally).
|
71
|
+
with('bundle exec rake assets:clean_expired').once
|
72
|
+
expect(@configuration).to receive(:run_locally).
|
73
|
+
with('bundle exec rake assets:precompile').once
|
74
|
+
|
75
|
+
@configuration.find_and_execute_task('deploy:assets:prepare')
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# coding: utf-8
|
2
|
+
unless ENV['CI']
|
3
|
+
require 'simplecov'
|
4
|
+
SimpleCov.start do
|
5
|
+
add_group 'Capistrano', 'lib/capistrano'
|
6
|
+
add_group 'Specs', 'spec/*'
|
7
|
+
add_filter '.bundle'
|
8
|
+
end
|
9
|
+
end
|
10
|
+
|
11
|
+
require 'capistrano-local-precompile'
|
12
|
+
require 'rspec'
|
13
|
+
require 'capistrano-spec'
|
14
|
+
|
15
|
+
RSpec.configure do |config|
|
16
|
+
config.include Capistrano::Spec::Matchers
|
17
|
+
config.include Capistrano::Spec::Helpers
|
18
|
+
|
19
|
+
config.expect_with :rspec do |c|
|
20
|
+
c.syntax = :expect
|
21
|
+
end
|
22
|
+
end
|
metadata
ADDED
@@ -0,0 +1,87 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: capistrano-local-precompile
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Steve Agalloco
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-10-04 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: capistrano
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
description: Local asset-pipeline precompilation for Capstrano
|
31
|
+
email: steve.agalloco@gmail.com
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- .gemtest
|
37
|
+
- .gitignore
|
38
|
+
- .rspec
|
39
|
+
- .travis.yml
|
40
|
+
- .yardopts
|
41
|
+
- Gemfile
|
42
|
+
- Guardfile
|
43
|
+
- LICENSE.md
|
44
|
+
- README.md
|
45
|
+
- Rakefile
|
46
|
+
- capistrano-local-precompile.gemspec
|
47
|
+
- lib/capistrano-local-precompile.rb
|
48
|
+
- lib/capistrano-local-precompile/version.rb
|
49
|
+
- lib/capistrano/local_precompile.rb
|
50
|
+
- spec/configuration_spec.rb
|
51
|
+
- spec/integration_spec.rb
|
52
|
+
- spec/spec_helper.rb
|
53
|
+
homepage: https://github.com/spagalloco/capistrano-local-precompile
|
54
|
+
licenses: []
|
55
|
+
post_install_message:
|
56
|
+
rdoc_options: []
|
57
|
+
require_paths:
|
58
|
+
- lib
|
59
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
60
|
+
none: false
|
61
|
+
requirements:
|
62
|
+
- - ! '>='
|
63
|
+
- !ruby/object:Gem::Version
|
64
|
+
version: '0'
|
65
|
+
segments:
|
66
|
+
- 0
|
67
|
+
hash: -3750338883934434309
|
68
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
69
|
+
none: false
|
70
|
+
requirements:
|
71
|
+
- - ! '>='
|
72
|
+
- !ruby/object:Gem::Version
|
73
|
+
version: '0'
|
74
|
+
segments:
|
75
|
+
- 0
|
76
|
+
hash: -3750338883934434309
|
77
|
+
requirements: []
|
78
|
+
rubyforge_project:
|
79
|
+
rubygems_version: 1.8.23
|
80
|
+
signing_key:
|
81
|
+
specification_version: 3
|
82
|
+
summary: Local asset-pipeline precompilation for Capstrano
|
83
|
+
test_files:
|
84
|
+
- spec/configuration_spec.rb
|
85
|
+
- spec/integration_spec.rb
|
86
|
+
- spec/spec_helper.rb
|
87
|
+
has_rdoc:
|