rsync-deploy 0.0.9

Sign up to get free protection for your applications and to get access to all the features.
data/.gitignore ADDED
@@ -0,0 +1,18 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
18
+ .DS_Store
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in rsync-deploy.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Ross Zurowski
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,70 @@
1
+ **_Note: This tool is still in development and likely will not work in many cases._**
2
+
3
+ # Deploy
4
+
5
+ **Deploy is an rsync deployment tool built using Ruby**
6
+ Essentially acts as a wrapper for the rsync utility, providing a simple YAML based configuration file.
7
+
8
+
9
+ ## Install
10
+
11
+ To install just run:
12
+
13
+ ```
14
+ gem install rsync-deploy
15
+ ```
16
+
17
+
18
+ ## Commands
19
+
20
+ #### deploy install
21
+
22
+ Will create an template `deploy.yml` file in the current directory.
23
+
24
+ #### deploy [env...]
25
+
26
+ Will deploy to the environment(s) listed in the command. This can be used to deploy to a single server, like this:
27
+
28
+ ```
29
+ deploy production
30
+ ```
31
+
32
+ Or to multiple servers, like this:
33
+
34
+ ```
35
+ deploy dev staging production
36
+ ```
37
+
38
+ All environments called (eg. **dev**, **staging**, and **production**) are expected to be listed in your `deploy.yml` file.
39
+
40
+ # Basic example
41
+
42
+ Set up your server in the `deploy.yml` file
43
+
44
+ ```
45
+ production:
46
+ host: "server.com"
47
+ user: "username"
48
+ path:
49
+ local: "deploy/"
50
+ remote: "public_html/"
51
+ ```
52
+
53
+ And then use the following command to deploy:
54
+
55
+ ```
56
+ deploy production
57
+ ```
58
+
59
+ # Mentions
60
+
61
+ Deploy is almost identical to [DPLOY](https://github.com/LeanMeanFightingMachine/dploy), which was in turn inspired by [dandelion](https://github.com/scttnlsn/dandelion). However, Deploy separates version control from deployment, which helps avoid messy version control history with commits like _bug fix_, _typo_, and so on.
62
+
63
+
64
+ ## Uninstall
65
+
66
+ To uninstall Deploy, download the [project files](https://github.com/rosszurowski/deploy/archive/master.zip), navigate to the unzipped directory, and run:
67
+
68
+ ```
69
+ gem uninstall rsync-deploy
70
+ ```
data/Rakefile ADDED
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
data/bin/deploy ADDED
@@ -0,0 +1,88 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'deploy'
4
+ require 'fileutils'
5
+
6
+ def help
7
+ %Q(
8
+ Usage: deploy [COMMAND] [ENVIRONMENTS] [OPTIONS]
9
+
10
+ Commands:
11
+ install Configure directory for deployment
12
+ help Prints this help document
13
+ version Prints the siteleaf gem version
14
+
15
+ Environments:
16
+ <env> Deploys listed environments
17
+
18
+ If no commands, environments, or options are given, the first environment in the config file will be deployed.
19
+
20
+ Options:
21
+ -h, --help Prints this help document
22
+ -v, --version Prints the deploy gem version
23
+
24
+ See https://github.com/rosszurowski/deploy for additional documentation.
25
+ )
26
+ end
27
+
28
+ # TODO: Allow creation of environments from install command, for example
29
+ # `deploy install live dev` would create a file with live and dev
30
+ # configurations to be filled in
31
+ def install
32
+
33
+ if File.exist?(Deploy::CONFIG_PATH)
34
+
35
+ puts "Deployment configuration file `#{Deploy::CONFIG_PATH}` already exists."
36
+
37
+ # Use a Y/n prompt to see if things should be overwritten
38
+ prompt = "Would you like to overwrite it?"
39
+ answer = ''
40
+ default = 'y'
41
+ until %w[y n].include? answer
42
+ print prompt + ' [Y/n]:'
43
+ answer = STDIN.gets.chomp.downcase
44
+ answer = default if answer.length == 0
45
+ end
46
+
47
+ if(answer == 'y')
48
+ File.open(Deploy::CONFIG_PATH, 'w+') do |file|
49
+ file.puts 'server_name:',' host: ""',' user: ""',' pass: ""',' path:',' local: "/"',' remote: "/public_html/"'
50
+ end
51
+ puts "Configuration file created. Fill in `#{Deploy::CONFIG_PATH}` with server details before deploying."
52
+ else
53
+ puts "No congifuration file has been installed."
54
+ end
55
+
56
+ else
57
+
58
+ File.open(Deploy::CONFIG_PATH, 'w+') do |file|
59
+ file.puts 'server_name:',' host: ""',' user: ""',' pass: ""',' path:',' local: "/"',' remote: "/public_html/"'
60
+ end
61
+ puts "Deployment configuration file created. Fill in `#{Deploy::CONFIG_PATH}` with server details before deploying."
62
+
63
+ end
64
+
65
+ end
66
+
67
+ # See if they're running a command
68
+ if ARGV.size > 0
69
+ case ARGV[0]
70
+ when '-v', '--version', 'version'
71
+ puts "Deploy v" + Deploy::VERSION
72
+ exit
73
+ when '-h', '--help', 'help'
74
+ puts help
75
+ exit
76
+ when 'install', 'setup'
77
+ install
78
+ exit
79
+ end
80
+ end
81
+
82
+ if File.exist?(Deploy::CONFIG_PATH)
83
+ deploy = Deploy::Deployment.new
84
+ deploy.go ARGV
85
+ else
86
+ puts "No config file found, run `deploy install` to create one"
87
+ exit
88
+ end
@@ -0,0 +1,96 @@
1
+ # Parses and provides an easy interface for working with
2
+ # deployment environment variables.
3
+
4
+ require 'tempfile'
5
+
6
+ module Deploy
7
+ class Environment
8
+
9
+ attr_reader :name
10
+ attr_accessor :config, :options
11
+
12
+ def initialize(name, hash)
13
+
14
+ @name = name
15
+ @config = { :host => '', :user => '', :pass => '', :local => '', :remote => '' }
16
+ @options = { :verbose => false, :sync => true }
17
+
18
+ @config[:host] = hash['host']
19
+ @config[:user] = hash['user']
20
+ @config[:pass] = hash['pass'] unless hash['pass'].nil?
21
+
22
+ @config[:local] = hash['path']['local'].gsub(/\s+/, "")
23
+ @config[:remote] = hash['path']['remote'].gsub(/\s+/, "")
24
+
25
+ # Set to project and server root if local/remote are empty
26
+ @config[:local] = '/' if @config[:local].empty?
27
+ @config[:local].insert(0,'/') unless @config[:local].start_with?('/')
28
+ @config[:remote] = '/' if @config[:remote].empty?
29
+ @config[:remote].insert(0,'/') unless @config[:remote].start_with?('/')
30
+
31
+
32
+ @config[:excludes] = hash['exclude'] if hash['exclude']
33
+
34
+ @options[:verbose] = hash['verbose'] unless hash['verbose'].nil?
35
+ @options[:sync] = hash['sync'] unless hash['sync'].nil?
36
+
37
+ validate
38
+
39
+ # TODO: Find a way to do a setter for @config[:excludes] instead of
40
+ # freezing the hash
41
+ @config[:excludes].freeze
42
+
43
+ end
44
+
45
+ # Runs the deploy based upon the current @config and @options settings
46
+ # Creates rsync command and creates exclude file then cleans up
47
+ def deploy
48
+
49
+ # Create excludes file if needed
50
+ if(@config[:excludes])
51
+ tmp_exclude = Tempfile.new(['excludes','.txt'])
52
+ @config[:excludes].each do |ex|
53
+ tmp_exclude.puts ex
54
+ end
55
+ tmp_exclude.close
56
+ end
57
+
58
+ rsync_cmd = 'rsync -a' # Always keep permissions
59
+ rsync_cmd += 'v' if @options[:verbose] # Verbose if requested
60
+ rsync_cmd += 'z' # Always zip files
61
+
62
+ rsync_cmd += ' --progress' # Always show progress
63
+ rsync_cmd += ' --force --delete' unless !@options[:sync] # Sync unless explicitly requested
64
+ rsync_cmd += " --exclude-from=#{tmp_exclude.path}" if @config[:excludes] # Include exclude file if it exists
65
+ rsync_cmd += " -e \"ssh -p22\""
66
+
67
+ rsync_cmd += " " + `pwd`.gsub(/\s+/, "") + "#{@config[:local]}" # The local path from the current directory
68
+ rsync_cmd += " #{@config[:user]}@#{@config[:host]}:"
69
+ rsync_cmd += "~#{@config[:remote]}"
70
+
71
+ # Run the command
72
+ # puts rsync_cmd
73
+ system(rsync_cmd)
74
+
75
+ # Remove excludes file if needed
76
+ tmp_exclude.unlink if @config[:excludes]
77
+
78
+ end
79
+
80
+ private
81
+
82
+ def validate
83
+
84
+ # Fail without hostname/username (password is optional)
85
+ raise "Error: no hostname set for #{@name}" if @config[:host].empty?
86
+ raise "Error: no user set for #{@name}" if @config[:user].empty?
87
+
88
+ # Fail if local/remote paths not set (because they should be in initialize
89
+ # even if they're not set in the yml config file.
90
+ raise "Error: no local path set for #{@name}" if @config[:local].empty?
91
+ raise "Error: no remote path set for #{@name}" if @config[:remote].empty?
92
+
93
+ end
94
+
95
+ end
96
+ end
@@ -0,0 +1,5 @@
1
+ module Deploy
2
+
3
+ VERSION = "0.0.9"
4
+
5
+ end
data/lib/deploy.rb ADDED
@@ -0,0 +1,58 @@
1
+ libdir = File.dirname(__FILE__)
2
+ $LOAD_PATH.unshift(libdir) unless $LOAD_PATH.include?(libdir)
3
+
4
+ require 'yaml'
5
+ require 'deploy/version'
6
+ require 'deploy/environment'
7
+
8
+ module Deploy
9
+
10
+ # TODO: Make this adjustable from the command line
11
+ CONFIG_PATH = "deploy.yml"
12
+
13
+ class Deployment
14
+
15
+ attr_reader :environments
16
+
17
+ def initialize()
18
+
19
+ @config = YAML::load(File.open(CONFIG_PATH))
20
+ @environments = Array.new
21
+
22
+ @config.each do |env|
23
+ @environments.push Environment.new(env[0], env[1])
24
+ end
25
+
26
+ end
27
+
28
+ def go(args)
29
+
30
+ # If there are no arguments, deploy using the first environment in
31
+ # the configuration file, otherwise loop through and deploy each one
32
+ if args.size == 0
33
+
34
+ @environments.first.deploy
35
+
36
+ else
37
+
38
+ # Loop through the arguments and deploy any given ones that are also
39
+ # present in the config file.
40
+ args.each do |arg_env|
41
+
42
+ curr_env = @environments.find { |e| e.name == arg_env }
43
+
44
+ if curr_env.nil?
45
+ puts "No environment found for #{arg_env}, add it to `#{Deploy::CONFIG_PATH}`"
46
+ else
47
+ curr_env.deploy
48
+ end
49
+
50
+ end
51
+
52
+ end
53
+
54
+ end
55
+
56
+ end
57
+
58
+ end
@@ -0,0 +1,31 @@
1
+ lib = File.expand_path('../lib', __FILE__)
2
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
3
+
4
+ require 'deploy/version'
5
+
6
+ Gem::Specification.new do |s|
7
+
8
+ s.name = 'rsync-deploy'
9
+ s.version = Deploy::VERSION
10
+ s.date = '2013-12-23'
11
+
12
+ s.summary = "Deployments based on rsync"
13
+ s.description = "A simple rsync based deployment gem"
14
+
15
+ s.authors = ["Ross Zurowski"]
16
+ s.email = 'ross@rosszurowski.com'
17
+ s.homepage = 'http://rubygems.org/gems/rsync-deploy'
18
+ s.license = 'WTFPL'
19
+
20
+ s.require_paths = ["lib"]
21
+
22
+ s.add_development_dependency "bundler", "~> 1.3"
23
+ s.add_development_dependency "rake"
24
+
25
+ s.files = `git ls-files`.split($/)
26
+ s.files += Dir.glob("lib/**/*.rb")
27
+ s.executables = ["deploy"]
28
+ s.test_files = s.files.grep(%r{^(test|spec|features)/})
29
+ s.require_paths = ["lib"]
30
+
31
+ end
metadata ADDED
@@ -0,0 +1,88 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: rsync-deploy
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.9
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Ross Zurowski
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2013-12-23 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: bundler
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ~>
20
+ - !ruby/object:Gem::Version
21
+ version: '1.3'
22
+ type: :development
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ~>
28
+ - !ruby/object:Gem::Version
29
+ version: '1.3'
30
+ - !ruby/object:Gem::Dependency
31
+ name: rake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :development
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ description: A simple rsync based deployment gem
47
+ email: ross@rosszurowski.com
48
+ executables:
49
+ - deploy
50
+ extensions: []
51
+ extra_rdoc_files: []
52
+ files:
53
+ - .gitignore
54
+ - Gemfile
55
+ - LICENSE.txt
56
+ - README.md
57
+ - Rakefile
58
+ - bin/deploy
59
+ - lib/deploy.rb
60
+ - lib/deploy/environment.rb
61
+ - lib/deploy/version.rb
62
+ - rsync-deploy.gemspec
63
+ homepage: http://rubygems.org/gems/rsync-deploy
64
+ licenses:
65
+ - WTFPL
66
+ post_install_message:
67
+ rdoc_options: []
68
+ require_paths:
69
+ - lib
70
+ required_ruby_version: !ruby/object:Gem::Requirement
71
+ none: false
72
+ requirements:
73
+ - - ! '>='
74
+ - !ruby/object:Gem::Version
75
+ version: '0'
76
+ required_rubygems_version: !ruby/object:Gem::Requirement
77
+ none: false
78
+ requirements:
79
+ - - ! '>='
80
+ - !ruby/object:Gem::Version
81
+ version: '0'
82
+ requirements: []
83
+ rubyforge_project:
84
+ rubygems_version: 1.8.23
85
+ signing_key:
86
+ specification_version: 3
87
+ summary: Deployments based on rsync
88
+ test_files: []