bricks-deploy 0.6.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 23761d79c1dd42c598f5a2fa0c89207ee15ebaff
4
+ data.tar.gz: 2984300c55c2848d2dcb19b0b449c7e9e6f22cb1
5
+ SHA512:
6
+ metadata.gz: 7125ee77947a9290be0e8927d4dc8f48a921c78c2f42d5cd71aef3876843dcac5471545708ef3e4d644c9c27def07e772da1b15d010b947e216d51e25b89c041
7
+ data.tar.gz: f6ad55bd2b166e9f1c015103a174aea035da2a2c3e118f958663a86abbe4ebe0dbd83309e53e5192b68a237b1b22b43e45d6c951082c488ee0f6a0ab87028537
data/LICENSE ADDED
@@ -0,0 +1,18 @@
1
+ Copyright (c) 2009 Mislav Marohnić
2
+
3
+ Permission is hereby granted, free of charge, to any person obtaining a copy of
4
+ this software and associated documentation files (the "Software"), to deal in
5
+ the Software without restriction, including without limitation the rights to
6
+ use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
7
+ the Software, and to permit persons to whom the Software is furnished to do so,
8
+ subject to the following conditions:
9
+
10
+ The above copyright notice and this permission notice shall be included in all
11
+ copies or substantial portions of the Software.
12
+
13
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
15
+ FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
16
+ COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
17
+ IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
18
+ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.markdown ADDED
@@ -0,0 +1,134 @@
1
+ Easy git deployment
2
+ ===================
3
+
4
+ Straightforward, [Heroku][]-style, push-based deployment. Your deploys can become as simple as this:
5
+
6
+ $ git push production master
7
+
8
+ To get started, install the "bricks-deploy" gem.
9
+
10
+ gem install bricks-deploy
11
+
12
+ Only the person who is setting up deployment for the first time needs to install
13
+ the gem. You don't have to add it to your project's Gemfile.
14
+
15
+
16
+ Which app languages/frameworks are supported?
17
+ ---------------------------------------------
18
+
19
+ Regardless of the fact that this tool is mostly written in Ruby, bricks-deploy can be useful for any kind of code that needs deploying on a remote server. The default scripts are suited for Ruby web apps, but can be edited to accommodate other frameworks.
20
+
21
+ Your deployment is customized with per-project callback scripts which can be written in any language.
22
+
23
+ The assumption is that you're deploying to a single host to which you connect over SSH using public/private key authentication.
24
+
25
+
26
+ Initial setup
27
+ -------------
28
+
29
+ 1. Create a git remote for where you'll push the code on your server. The name of this remote in the examples is "production", but it can be whatever you wish ("online", "website", or other).
30
+
31
+ ```sh
32
+ git remote add production "user@example.com:/apps/mynewapp"
33
+ ```
34
+
35
+ `/apps/mynewapp` is the directory where you want your code to reside on the
36
+ remote server. If the directory doesn't exist, the next step creates it.
37
+
38
+ 2. Run the setup task:
39
+
40
+ ```sh
41
+ git deploy setup -r "production"
42
+ ```
43
+
44
+ This will initialize the remote git repository in the deploy directory
45
+ (`/apps/mynewapp` in the above example) and install the remote git hook.
46
+
47
+ 3. Run the init task:
48
+
49
+ ```sh
50
+ git deploy init
51
+ ```
52
+
53
+ This generates default deploy callback scripts in the `deploy/` directory.
54
+ You should check them in git because they are going to be executed on the
55
+ server during each deploy.
56
+
57
+ 4. Push the code.
58
+
59
+ ```sh
60
+ git push production master
61
+ ```
62
+
63
+ 3. Login to your server and manually perform necessary one-time administrative operations. This might include:
64
+ * set up the Apache/nginx virtual host for this application;
65
+ * check your `config/database.yml` and create the production database.
66
+
67
+
68
+ Everyday deployments
69
+ --------------------
70
+
71
+ If you've set your app correctly, visiting <http://example.com> in your browser
72
+ should show it up and running.
73
+
74
+ Now, subsequent deployments are done simply **by pushing to the branch that is
75
+ currently checked out on the remote**:
76
+
77
+ git push production master
78
+
79
+ Because the deployments are performed with git, nobody else on the team needs to
80
+ install the "bricks-deploy" gem.
81
+
82
+ On every deploy, the default `deploy/after_push` script performs the following:
83
+
84
+ 1. updates git submodules (if there are any);
85
+ 2. runs `bundle install --deployment` if there is a Gemfile;
86
+ 3. runs `rake db:migrate` if new migrations have been added;
87
+ 4. clears cached CSS/JS assets in "public/stylesheets" and "public/javascripts";
88
+ 5. restarts the web application.
89
+
90
+ You can customize all this by editing generated scripts in the `deploy/`
91
+ directory of your app.
92
+
93
+ Deployments are logged to `log/deploy.log` in your application's directory.
94
+
95
+
96
+ How it works
97
+ ------------
98
+
99
+ The `git deploy setup` command installed a `post-receive` git hook in the remote
100
+ repository. This is how your code on the server is kept up to date. This script
101
+ checks out the latest version of your project from the current branch and
102
+ runs the following callback scripts:
103
+
104
+ * `deploy/setup` - on first push.
105
+ * `deploy/after_push` - on subsequent pushes. It in turn executes:
106
+ * `deploy/before_restart`
107
+ * `deploy/restart`
108
+ * `deploy/after_restart`
109
+ * `deploy/rollback` - executed for `git deploy rollback`.
110
+
111
+ All of the callbacks are optional. These scripts are ordinary Unix executables.
112
+ The ones which get generated for you by `git deploy init` are written in shell
113
+ script and Ruby.
114
+
115
+
116
+ Extra commands
117
+ --------------
118
+
119
+ * `git deploy hooks` - Updates git hooks on the remote repository
120
+
121
+ * `git deploy log [N=20]` - Shows last 20 lines of deploy log on the server
122
+
123
+ * `git deploy rerun` - Re-runs the `deploy/after_push` callback as if a git push happened
124
+
125
+ * `git deploy restart` - Runs the `deploy/restart` callback
126
+
127
+ * `git deploy rollback` - Undo a deploy by checking out the previous revision,
128
+ runs `deploy/rollback` if exists instead of `deploy/after_push`
129
+
130
+ * `git deploy upload <files>` - Copy local files to the remote app
131
+
132
+
133
+
134
+ [heroku]: http://heroku.com/
data/bin/bricks-deploy ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env ruby
2
+ require 'bricks_deploy'
3
+ BricksDeploy.start
@@ -0,0 +1,83 @@
1
+ require 'uri'
2
+ require 'cgi'
3
+ require 'forwardable'
4
+
5
+ class BricksDeploy
6
+ module Configuration
7
+ private
8
+
9
+ extend Forwardable
10
+ def_delegator :remote_url, :host
11
+ def_delegator :remote_url, :port, :remote_port
12
+ def_delegator :remote_url, :path, :deploy_to
13
+
14
+ def remote_user
15
+ @user ||= begin
16
+ user = remote_url.user
17
+ user ? CGI.unescape(user) : `whoami`.chomp
18
+ end
19
+ end
20
+
21
+ def branch
22
+ 'master'
23
+ end
24
+
25
+ def git_config
26
+ @git_config ||= Hash.new do |cache, cmd|
27
+ git = ENV['GIT'] || 'git'
28
+ out = `#{git} #{cmd}`
29
+ if $?.success? then cache[cmd] = out.chomp
30
+ else cache[cmd] = nil
31
+ end
32
+ cache[cmd]
33
+ end
34
+ end
35
+
36
+ def remote_urls(remote)
37
+ git_config["remote -v"].to_s.split("\n").
38
+ select {|l| l =~ /^#{remote}\t.+/ }.
39
+ map {|l| l.split("\t")[1].sub(/\s+\(.+?\)$/, '') }
40
+ end
41
+
42
+ def remote_url(remote = options[:remote])
43
+ @remote_url ||= {}
44
+ @remote_url[remote] ||= begin
45
+ url = remote_urls(remote).first
46
+ if url.nil?
47
+ abort "Error: Remote url not found for remote #{remote.inspect}"
48
+ elsif url =~ /(^|@)github\.com\b/
49
+ abort "Error: Remote url for #{remote.inspect} points to GitHub. Can't deploy there!"
50
+ else
51
+ url = 'ssh://' + url.sub(%r{:/?}, '/') unless url =~ %r{^[\w-]+://}
52
+ begin
53
+ url = URI.parse url
54
+ rescue
55
+ abort "Error parsing remote url #{url}"
56
+ end
57
+ end
58
+ url
59
+ end
60
+ end
61
+
62
+ def current_branch
63
+ git_config['symbolic-ref -q HEAD']
64
+ end
65
+
66
+ def tracked_branch
67
+ branch = current_branch && tracked_for(current_branch)
68
+ normalize_branch(branch) if branch
69
+ end
70
+
71
+ def normalize_branch(branch)
72
+ branch.sub('refs/heads/', '')
73
+ end
74
+
75
+ def remote_for(branch)
76
+ git_config['config branch.%s.remote' % normalize_branch(branch)]
77
+ end
78
+
79
+ def tracked_for(branch)
80
+ git_config['config branch.%s.merge' % normalize_branch(branch)]
81
+ end
82
+ end
83
+ end
@@ -0,0 +1,28 @@
1
+ require 'thor/group'
2
+
3
+ class BricksDeploy::Generator < Thor::Group
4
+ include Thor::Actions
5
+
6
+ def self.source_root
7
+ File.expand_path('../templates', __FILE__)
8
+ end
9
+
10
+ def copy_main_hook
11
+ copy_hook 'after_push.sh', 'deploy/after_push'
12
+ end
13
+
14
+ def copy_restart_hook
15
+ copy_hook 'restart.sh', 'deploy/restart'
16
+ end
17
+
18
+ def copy_restart_callbacks
19
+ copy_hook 'before_restart.rb', 'deploy/before_restart'
20
+ end
21
+
22
+ private
23
+
24
+ def copy_hook(template, destination)
25
+ copy_file template, destination
26
+ chmod destination, 0744 unless File.executable? destination
27
+ end
28
+ end
@@ -0,0 +1,102 @@
1
+ class BricksDeploy
2
+ module SSHMethods
3
+ private
4
+
5
+ def sudo_cmd
6
+ "sudo -p 'sudo password: '"
7
+ end
8
+
9
+ def system(*args)
10
+ puts "[local] $ " + args.join(' ').gsub(' && ', " && \\\n ")
11
+ super unless options.noop?
12
+ end
13
+
14
+ def run(cmd = nil, opt = {})
15
+ cmd = yield(cmd) if block_given?
16
+ cmd = cmd.join(' && ') if Array === cmd
17
+
18
+ if opt.fetch(:echo, true)
19
+ puts "[#{options[:remote]}] $ " + cmd.gsub(' && ', " && \\\n ")
20
+ end
21
+
22
+ unless options.noop?
23
+ status, output = ssh_exec cmd do |ch, stream, data|
24
+ case stream
25
+ when :stdout then $stdout.print data
26
+ when :stderr then $stderr.print data
27
+ end
28
+ ch.send_data(askpass) if data =~ /^sudo password: /
29
+ end
30
+ output
31
+ end
32
+ end
33
+
34
+ def run_test(cmd)
35
+ status, output = ssh_exec(cmd) { }
36
+ status == 0
37
+ end
38
+
39
+ def ssh_exec(cmd, &block)
40
+ status = nil
41
+ output = ''
42
+
43
+ channel = ssh_connection.open_channel do |chan|
44
+ chan.exec(cmd) do |ch, success|
45
+ raise "command failed: #{cmd.inspect}" unless success
46
+ # ch.request_pty
47
+
48
+ ch.on_data do |c, data|
49
+ output << data
50
+ yield(c, :stdout, data)
51
+ end
52
+
53
+ ch.on_extended_data do |c, type, data|
54
+ output << data
55
+ yield(c, :stderr, data)
56
+ end
57
+
58
+ ch.on_request "exit-status" do |ch, data|
59
+ status = data.read_long
60
+ end
61
+ end
62
+ end
63
+
64
+ channel.wait
65
+ [status, output]
66
+ end
67
+
68
+ # TODO: use Highline for cross-platform support
69
+ def askpass
70
+ tty_state = `stty -g`
71
+ system 'stty raw -echo -icanon isig' if $?.success?
72
+ pass = ''
73
+ while char = $stdin.getbyte and not (char == 13 or char == 10)
74
+ if char == 127 or char == 8
75
+ pass[-1,1] = '' unless pass.empty?
76
+ else
77
+ pass << char.chr
78
+ end
79
+ end
80
+ pass
81
+ ensure
82
+ system "stty #{tty_state}" unless tty_state.empty?
83
+ end
84
+
85
+ def scp_upload(files)
86
+ channels = []
87
+ files.each do |local, remote|
88
+ puts "FILE: [local] #{local.sub(LOCAL_DIR + '/', '')} -> [#{options[:remote]}] #{remote}"
89
+ channels << ssh_connection.scp.upload(local, remote) unless options.noop?
90
+ end
91
+ channels.each { |c| c.wait }
92
+ end
93
+
94
+ def ssh_connection
95
+ @ssh ||= begin
96
+ ssh = Net::SSH.start(host, remote_user, :port => remote_port)
97
+ at_exit { ssh.close }
98
+ ssh
99
+ end
100
+ end
101
+ end
102
+ end
@@ -0,0 +1,17 @@
1
+ #!/usr/bin/env bash
2
+ set -e
3
+ oldrev=$1
4
+ newrev=$2
5
+
6
+ run() {
7
+ [ -x $1 ] && $1 $oldrev $newrev
8
+ }
9
+
10
+ echo files changed: $(git diff $oldrev $newrev --diff-filter=ACDMR --name-only | wc -l)
11
+
12
+ umask 002
13
+
14
+ git submodule sync && git submodule update --init --recursive
15
+
16
+ run deploy/before_restart
17
+ run deploy/restart && run deploy/after_restart
@@ -0,0 +1,39 @@
1
+ #!/usr/bin/env ruby
2
+ oldrev, newrev = ARGV
3
+
4
+ def run(cmd)
5
+ exit($?.exitstatus) unless system "umask 002 && #{cmd}"
6
+ end
7
+
8
+ RAILS_ENV = ENV['RAILS_ENV'] || 'production'
9
+ use_bundler = File.file? 'Gemfile'
10
+ rake_cmd = use_bundler ? 'bundle exec rake' : 'rake'
11
+
12
+ if use_bundler
13
+ bundler_args = ['--deployment']
14
+ BUNDLE_WITHOUT = ENV['BUNDLE_WITHOUT'] || 'development:test'
15
+ bundler_args << '--without' << BUNDLE_WITHOUT unless BUNDLE_WITHOUT.empty?
16
+
17
+ # update gem bundle
18
+ run "bundle install #{bundler_args.join(' ')}"
19
+ end
20
+
21
+ if File.file? 'Rakefile'
22
+ tasks = []
23
+
24
+ num_migrations = `git diff #{oldrev} #{newrev} --diff-filter=A --name-only -z -- db/migrate`.split("\0").size
25
+ # run migrations if new ones have been added
26
+ tasks << "db:migrate" if num_migrations > 0
27
+
28
+ # precompile assets
29
+ changed_assets = `git diff #{oldrev} #{newrev} --name-only -z -- app/assets`.split("\0")
30
+ tasks << "assets:precompile" if changed_assets.size > 0
31
+
32
+ run "#{rake_cmd} #{tasks.join(' ')} RAILS_ENV=#{RAILS_ENV}" if tasks.any?
33
+ end
34
+
35
+ # clear cached assets (unversioned/ignored files)
36
+ run "git clean -x -f -- public/stylesheets public/javascripts"
37
+
38
+ # clean unversioned files from vendor/plugins (e.g. old submodules)
39
+ run "git clean -d -f -- vendor/plugins"
@@ -0,0 +1,3 @@
1
+ #!/bin/sh
2
+ touch tmp/restart.txt
3
+ echo "restarting Passenger app"
@@ -0,0 +1,104 @@
1
+ require 'thor'
2
+ require 'net/ssh'
3
+ require 'net/scp'
4
+
5
+ class BricksDeploy < Thor
6
+ LOCAL_DIR = File.expand_path('..', __FILE__)
7
+
8
+ require 'bricks_deploy/configuration'
9
+ require 'bricks_deploy/ssh_methods'
10
+ include Configuration
11
+ include SSHMethods
12
+
13
+ class_option :remote, :aliases => '-r', :type => :string, :default => 'origin'
14
+ class_option :noop, :aliases => '-n', :type => :boolean, :default => false
15
+
16
+ desc "init", "Generates deployment customization scripts for your app"
17
+ def init
18
+ require 'bricks_deploy/generator'
19
+ Generator::start([])
20
+ end
21
+
22
+ desc "setup", "Create the remote git repository and install push hooks for it"
23
+ method_option :shared, :aliases => '-g', :type => :boolean, :default => false
24
+ method_option :sudo, :aliases => '-s', :type => :boolean, :default => false
25
+ def setup
26
+ sudo = options.sudo? ? "#{sudo_cmd} " : ''
27
+
28
+ unless run_test("test -x #{deploy_to}")
29
+ run ["#{sudo}mkdir -p #{deploy_to}"] do |cmd|
30
+ cmd << "#{sudo}chown $USER #{deploy_to}" if options.sudo?
31
+ cmd
32
+ end
33
+ end
34
+
35
+ run [] do |cmd|
36
+ cmd << "chmod g+ws #{deploy_to}" if options.shared?
37
+ cmd << "cd #{deploy_to}"
38
+ cmd << "git init #{options.shared? ? '--shared' : ''}"
39
+ cmd << "sed -i'' -e 's/master/#{branch}/' .git/HEAD" unless branch == 'master'
40
+ cmd << "git config --bool receive.denyNonFastForwards false" if options.shared?
41
+ cmd << "git config receive.denyCurrentBranch ignore"
42
+ end
43
+
44
+ invoke :hooks
45
+ end
46
+
47
+ desc "hooks", "Installs git hooks to the remote repository"
48
+ def hooks
49
+ hooks_dir = File.join(LOCAL_DIR, 'hooks')
50
+ remote_dir = "#{deploy_to}/.git/hooks"
51
+
52
+ scp_upload "#{hooks_dir}/post-receive.sh" => "#{remote_dir}/post-receive"
53
+ run "chmod +x #{remote_dir}/post-receive"
54
+ end
55
+
56
+ desc "restart", "Restarts the application on the server"
57
+ def restart
58
+ run "cd #{deploy_to} && deploy/restart 2>&1 | tee -a log/deploy.log"
59
+ end
60
+
61
+ desc "rerun", "Runs the `deploy/after_push' callback as if a new revision was pushed via git"
62
+ def rerun
63
+ run <<-BASH, :echo => false
64
+ bash -e -c '
65
+ cd '#{deploy_to}'
66
+ declare -a revs=( $(git rev-parse HEAD@{1} HEAD) )
67
+ deploy/after_push ${revs[@]} 2>&1 | tee -a log/deploy.log
68
+ '
69
+ BASH
70
+ end
71
+
72
+ desc "rollback", "Rolls back the checkout to before the last push"
73
+ def rollback
74
+ run <<-BASH, :echo => false
75
+ bash -e -c '
76
+ cd '#{deploy_to}'
77
+ declare -a revs=( $(git rev-parse HEAD HEAD@{1}) )
78
+ git reset --hard ${revs[1]}
79
+ callback=after_push
80
+ [ -x deploy/rollback ] && callback=rollback
81
+ deploy/$callback ${revs[@]} 2>&1 | tee -a log/deploy.log
82
+ '
83
+ BASH
84
+ end
85
+
86
+ desc "log", "Shows the last part of the deploy log on the server"
87
+ method_option :tail, :aliases => '-t', :type => :boolean, :default => false
88
+ method_option :lines, :aliases => '-l', :type => :numeric, :default => 20
89
+ def log(n = nil)
90
+ tail_args = options.tail? ? '-f' : "-n#{n || options.lines}"
91
+ run "tail #{tail_args} #{deploy_to}/log/deploy.log"
92
+ end
93
+
94
+ desc "upload <files>", "Copy local files to the remote app"
95
+ def upload(*files)
96
+ files = files.map { |f| Dir[f.strip] }.flatten
97
+ abort "Error: Specify at least one file to upload" if files.empty?
98
+
99
+ scp_upload files.inject({}) { |all, file|
100
+ all[file] = File.join(deploy_to, file)
101
+ all
102
+ }
103
+ end
104
+ end
@@ -0,0 +1,55 @@
1
+ #!/bin/bash
2
+ set -e
3
+
4
+ if [ "$GIT_DIR" = "." ]; then
5
+ # The script has been called as a hook; chdir to the working copy
6
+ cd ..
7
+ unset GIT_DIR
8
+ fi
9
+
10
+ # try to obtain the usual system PATH
11
+ if [ -f /etc/profile ]; then
12
+ PATH=$(source /etc/profile; echo $PATH)
13
+ export PATH
14
+ fi
15
+
16
+ # get the current branch
17
+ head="$(git symbolic-ref HEAD)"
18
+
19
+ # read the STDIN to detect if this push changed the current branch
20
+ while read oldrev newrev refname
21
+ do
22
+ [ "$refname" = "$head" ] && break
23
+ done
24
+
25
+ # abort if there's no update, or in case the branch is deleted
26
+ if [ -z "${newrev//0}" ]; then
27
+ exit
28
+ fi
29
+
30
+ # check out the latest code into the working copy
31
+ umask 002
32
+ git reset --hard
33
+
34
+ logfile=log/deploy.log
35
+ restart=tmp/restart.txt
36
+
37
+ if [ -z "${oldrev//0}" ]; then
38
+ # this is the first push; this branch was just created
39
+ mkdir -p log tmp
40
+ chmod 0775 log tmp
41
+ touch $logfile $restart
42
+ chmod 0664 $logfile $restart
43
+
44
+ # init submodules
45
+ git submodule update --recursive --init 2>&1 | tee -a $logfile
46
+
47
+ # execute the one-time setup hook
48
+ [ -x deploy/setup ] && deploy/setup $oldrev $newrev 2>&1 | tee -a $logfile
49
+ else
50
+ # log timestamp
51
+ echo ==== $(date) ==== >> $logfile
52
+
53
+ # execute the main deploy hook
54
+ [ -x deploy/after_push ] && deploy/after_push $oldrev $newrev 2>&1 | tee -a $logfile
55
+ fi
@@ -0,0 +1,59 @@
1
+ require 'rspec/autorun'
2
+ require 'bricks_deploy/configuration'
3
+
4
+ describe BricksDeploy::Configuration do
5
+
6
+ subject {
7
+ mod = described_class
8
+ obj = Object.new
9
+ opt = options
10
+ (class << obj; self; end).class_eval do
11
+ include mod
12
+ mod.private_instance_methods.each {|m| public m }
13
+ define_method(:options) { opt }
14
+ end
15
+ obj
16
+ }
17
+
18
+ let(:options) { {:remote => 'production'} }
19
+
20
+ def stub_git_config(cmd, value)
21
+ subject.git_config[cmd] = value
22
+ end
23
+
24
+ def stub_remote_url(url, remote = options[:remote])
25
+ stub_git_config("remote -v", "#{remote}\t#{url} (fetch)")
26
+ end
27
+
28
+ describe "extracting user/host from remote url" do
29
+ context "ssh url" do
30
+ before { stub_remote_url 'ssh://jon%20doe@example.com:88/path/to/app' }
31
+
32
+ its(:host) { should eq('example.com') }
33
+ its(:remote_port) { should eq(88) }
34
+ its(:remote_user) { should eq('jon doe') }
35
+ its(:deploy_to) { should eq('/path/to/app') }
36
+ end
37
+
38
+ context "scp-style" do
39
+ before { stub_remote_url 'git@example.com:/path/to/app' }
40
+
41
+ its(:host) { should eq('example.com') }
42
+ its(:remote_port) { should be_nil }
43
+ its(:remote_user) { should eq('git') }
44
+ its(:deploy_to) { should eq('/path/to/app') }
45
+ end
46
+
47
+ context "pushurl only" do
48
+ before {
49
+ remote = options.fetch(:remote)
50
+ url = 'git@example.com:/path/to/app'
51
+ stub_git_config("remote -v", "#{remote}\t\n#{remote}\t#{url} (push)")
52
+ }
53
+
54
+ its(:host) { should eq('example.com') }
55
+ its(:remote_user) { should eq('git') }
56
+ end
57
+ end
58
+
59
+ end
metadata ADDED
@@ -0,0 +1,100 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: bricks-deploy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.6.2
5
+ platform: ruby
6
+ authors:
7
+ - Mislav Marohnić
8
+ - Helmut Hoffer von Ankershoffen
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2016-12-20 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: thor
16
+ requirement: !ruby/object:Gem::Requirement
17
+ requirements:
18
+ - - '='
19
+ - !ruby/object:Gem::Version
20
+ version: 0.14.6
21
+ type: :runtime
22
+ prerelease: false
23
+ version_requirements: !ruby/object:Gem::Requirement
24
+ requirements:
25
+ - - '='
26
+ - !ruby/object:Gem::Version
27
+ version: 0.14.6
28
+ - !ruby/object:Gem::Dependency
29
+ name: net-ssh
30
+ requirement: !ruby/object:Gem::Requirement
31
+ requirements:
32
+ - - "~>"
33
+ - !ruby/object:Gem::Version
34
+ version: '2.6'
35
+ type: :runtime
36
+ prerelease: false
37
+ version_requirements: !ruby/object:Gem::Requirement
38
+ requirements:
39
+ - - "~>"
40
+ - !ruby/object:Gem::Version
41
+ version: '2.6'
42
+ - !ruby/object:Gem::Dependency
43
+ name: net-scp
44
+ requirement: !ruby/object:Gem::Requirement
45
+ requirements:
46
+ - - "~>"
47
+ - !ruby/object:Gem::Version
48
+ version: '1.1'
49
+ type: :runtime
50
+ prerelease: false
51
+ version_requirements: !ruby/object:Gem::Requirement
52
+ requirements:
53
+ - - "~>"
54
+ - !ruby/object:Gem::Version
55
+ version: '1.1'
56
+ description: A tool to install useful git hooks on your remote repository to enable
57
+ push-based, Heroku-like deployment on your host.
58
+ email: hhva@20steps.de
59
+ executables:
60
+ - bricks-deploy
61
+ extensions: []
62
+ extra_rdoc_files: []
63
+ files:
64
+ - LICENSE
65
+ - README.markdown
66
+ - bin/bricks-deploy
67
+ - lib/bricks_deploy.rb
68
+ - lib/bricks_deploy/configuration.rb
69
+ - lib/bricks_deploy/generator.rb
70
+ - lib/bricks_deploy/ssh_methods.rb
71
+ - lib/bricks_deploy/templates/after_push.sh
72
+ - lib/bricks_deploy/templates/before_restart.rb
73
+ - lib/bricks_deploy/templates/restart.sh
74
+ - lib/hooks/post-receive.sh
75
+ - spec/configuration_spec.rb
76
+ homepage: https://github.com/20steps/bricks-deploy
77
+ licenses:
78
+ - MIT
79
+ metadata: {}
80
+ post_install_message:
81
+ rdoc_options: []
82
+ require_paths:
83
+ - lib
84
+ required_ruby_version: !ruby/object:Gem::Requirement
85
+ requirements:
86
+ - - ">="
87
+ - !ruby/object:Gem::Version
88
+ version: '0'
89
+ required_rubygems_version: !ruby/object:Gem::Requirement
90
+ requirements:
91
+ - - ">="
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ requirements: []
95
+ rubyforge_project:
96
+ rubygems_version: 2.4.5
97
+ signing_key:
98
+ specification_version: 4
99
+ summary: Simple git push-based application deployment
100
+ test_files: []