heploy 0.0.1 → 0.0.2

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/README.md CHANGED
@@ -20,19 +20,33 @@ Or install it yourself as:
20
20
 
21
21
  $ gem install heploy
22
22
 
23
+ Then run the installer:
24
+
25
+ $ rails g heploy:install
26
+
27
+ You'll have to fill out the configuration file with some application details and your Heroku information.
28
+
29
+ Bonus! Add an alias:
30
+
31
+ alias deploy='bundle exec heploy'
32
+
33
+ Enjoy typing `$ deploy staging` instead of `$ bundle exec heploy staging` all the time.
34
+
23
35
  ## Usage
24
36
 
37
+ I'm trying to keep this is simple as possible.
38
+
25
39
  ### Basic usage
26
40
 
27
- Heploy defaults to you using a "dev", "staging" and "production" branch. We'll go over how to change the default later. But for now, here we go.
41
+ Heploy defaults to you using a "dev", "staging" and "production" branch. You can change the defaults in the configuration file. But for now, here we go.
28
42
 
29
43
  Deploying to staging:
30
44
 
31
- $ heploy staging
45
+ $ bundle exec heploy staging
32
46
 
33
47
  Deploying to production:
34
48
 
35
- $ heploy production
49
+ $ bundle exec heploy production
36
50
 
37
51
  Simple.
38
52
 
@@ -51,10 +65,6 @@ Let's start with `$ heploy staging`. When you run it, you:
51
65
 
52
66
  As you might have guessed, `$ heploy production` does pretty much the same thing, except merges the "staging" branch into "production".
53
67
 
54
- ### Changing the defaults
55
-
56
- I'm looking into the best way to do this now.
57
-
58
68
  ### Other things
59
69
 
60
70
  Heploy can also help set up your staging and production environments.
data/bin/heploy CHANGED
@@ -1,2 +1,12 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # resolve bin path, ignoring symlinks
4
+ require "pathname"
5
+ bin_file = Pathname.new(__FILE__).realpath
6
+
7
+ # add self to libpath
8
+ $LOAD_PATH.unshift File.expand_path("../../lib", bin_file)
9
+
10
+ require 'heploy/cli'
11
+ Heploy::CLI.start
12
+
data/heploy.gemspec CHANGED
@@ -14,6 +14,9 @@ Gem::Specification.new do |gem|
14
14
 
15
15
  gem.add_dependency "thor"
16
16
  gem.add_dependency "git"
17
+ gem.add_dependency "heroku"
18
+ gem.add_dependency "rake"
19
+ gem.add_development_dependency "minitest"
17
20
 
18
21
  gem.files = `git ls-files`.split($/)
19
22
  gem.executables = gem.files.grep(%r{^bin/}).map{ |f| File.basename(f) }
data/lib/heploy.rb CHANGED
@@ -1,5 +1,19 @@
1
- require "heploy/version"
1
+ require 'git'
2
+ require 'heroku'
3
+
4
+ require 'heploy/version'
5
+ require 'heploy/configuration'
6
+ require 'heploy/command'
7
+ require 'heploy/command/deploy'
2
8
 
3
9
  module Heploy
4
- # Your code goes here...
10
+ class << self
11
+ attr_accessor :configuration
12
+
13
+ def configure
14
+ self.configuration ||= Configuration.new
15
+ yield(configuration) if block_given?
16
+ configuration
17
+ end
18
+ end
5
19
  end
data/lib/heploy/cli.rb CHANGED
@@ -1,3 +1,22 @@
1
- class Heploy::CLI < Thor
1
+ require 'thor'
2
+ require 'heploy'
2
3
 
4
+ module Heploy
5
+ class CLI < Thor
6
+
7
+ method_option :verbose, type: :boolean, aliases: "-v", default: false
8
+
9
+ desc 'staging', 'Deploys your application to your staging server.'
10
+ def staging
11
+ config = Heploy::Configuration.find
12
+ Heploy::Command::Deploy.staging config, options['verbose']
13
+ end
14
+
15
+ desc 'production', 'Deploys your application to your production server.'
16
+ def production
17
+ config = Heploy::Configuration.find
18
+ Heploy::Command::Deploy.production config, options['verbose']
19
+ end
20
+
21
+ end
3
22
  end
@@ -0,0 +1,3 @@
1
+ class Heploy::Command
2
+
3
+ end
@@ -0,0 +1,140 @@
1
+ require 'git'
2
+ require 'heroku-api'
3
+ require 'rake'
4
+ require 'logger'
5
+
6
+ class Heploy::Command::Deploy
7
+ class << self
8
+
9
+ def staging(config, verbose)
10
+ deploy_to config.staging_app_name,
11
+ config.development_branch,
12
+ config.staging_branch,
13
+ config,
14
+ verbose
15
+ end
16
+
17
+ def production(config, verbose)
18
+ print "Server you're deploying to: "
19
+ input = STDIN.gets.chomp
20
+ if config.production_app_name == input
21
+ deploy_to config.production_app_name,
22
+ config.staging_branch,
23
+ config.production_branch,
24
+ config,
25
+ verbose
26
+ else
27
+ abandon_ship "That is not the correct server."
28
+ end
29
+ end
30
+
31
+ private
32
+
33
+ def deploy_to(app_name, from_branch_name, to_branch_name, config, verbose)
34
+ if verbose
35
+ @repo = Git.open Dir.pwd, :log => Logger.new(STDOUT)
36
+ else
37
+ @repo = Git.open Dir.pwd
38
+ end
39
+ @dev_branch = @repo.branch config.development_branch
40
+ @from_branch_name = from_branch_name
41
+ @to_branch_name = to_branch_name
42
+ @from_branch = @repo.branch @from_branch_name
43
+ @to_branch = @repo.branch @to_branch_name
44
+ @heroku = heroku_client config.heroku_api_key
45
+ @app_name = app_name
46
+
47
+ @repo.checkout @to_branch
48
+ @repo.merge @from_branch
49
+ turn_maintenance_on
50
+ tag_latest_commit
51
+ push_to_heroku
52
+ migrate_database
53
+ restart_application
54
+ turn_maintenance_off
55
+ @repo.checkout @dev_branch
56
+ end
57
+
58
+ def heroku_client(api_key)
59
+ Heroku::API.new api_key: api_key
60
+ rescue
61
+ abandon_ship "Could not set up your Heroku client."
62
+ end
63
+
64
+ def turn_maintenance_on
65
+ @heroku.post_app_maintenance @app_name, '1'
66
+ if @heroku.get_app_maintenance(@app_name).body['maintenance']
67
+ puts "Turned maintenance mode on."
68
+ else
69
+ abandon_ship "Maintenance mode did not turn on."
70
+ end
71
+ end
72
+
73
+ def turn_maintenance_off
74
+ @heroku.post_app_maintenance @app_name, '0'
75
+ if !@heroku.get_app_maintenance(@app_name).body['maintenance']
76
+ puts "Turned maintenance mode off."
77
+ else
78
+ abandon_ship "Maintenance mode did not turn off."
79
+ end
80
+ end
81
+
82
+ def tag_name
83
+ release = @heroku.get_releases(@app_name).body.last["name"].gsub(/[[:alpha:]]/, "").to_i + 1
84
+ "#{@to_branch_name}-#{release}"
85
+ end
86
+
87
+ def tag_latest_commit
88
+ commit = @repo.add_tag(tag_name).inspect
89
+ puts "Tagged commit #{commit[0,7]} as #{tag_name}."
90
+ rescue Git::GitExecuteError => details
91
+ abandon_ship "#{details.message.split(": ").last.capitalize}."
92
+ end
93
+
94
+ def delete_tag
95
+ system "git tag #{tag_name} -d"
96
+ end
97
+
98
+ def push_to_heroku
99
+ puts "Pushing #{@to_branch_name} branch to #{@app_name}."
100
+ @repo.push @to_branch_name, "#{@to_branch_name}:master", true
101
+ confirm_codebase_push
102
+ rescue Git::GitExecuteError => details
103
+ abandon_ship "Could not push to #{@to_branch_name}." do
104
+ delete_tag
105
+ end
106
+ end
107
+
108
+ def confirm_codebase_push
109
+ latest_local_commit = @repo.log.first.inspect[0,7]
110
+ latest_heroku_commit = @heroku.get_releases(@app_name).body.last['commit']
111
+ if latest_local_commit == latest_heroku_commit
112
+ puts "Completed push successfully."
113
+ else
114
+ abandon_ship "Pushing to #{@app_name} wasn't successful.\n------ Latest local commit: #{latest_local_commit}\n------ Latest Heroku commit: #{latest_heroku_commit}" do
115
+ delete_tag
116
+ end
117
+ end
118
+ end
119
+
120
+ def migrate_database
121
+ @heroku.post_ps @app_name, "rake db:migrate"
122
+ rescue
123
+ abandon_ship "Could not migrate your database."
124
+ end
125
+
126
+ def restart_application
127
+ @heroku.post_ps_restart @app_name
128
+ rescue
129
+ abandon_ship "Could not restart #{@app_name}."
130
+ end
131
+
132
+ def abandon_ship(message, &block)
133
+ puts "-- Abandoning ship: #{message}"
134
+ block.call unless block == nil
135
+ @repo.checkout @dev_branch unless @repo == nil
136
+ exit
137
+ end
138
+
139
+ end
140
+ end
@@ -0,0 +1,26 @@
1
+ module Heploy
2
+ class Configuration
3
+
4
+ attr_accessor :development_branch,
5
+ :staging_branch,
6
+ :production_branch,
7
+ :staging_app_name,
8
+ :production_app_name,
9
+ :heroku_api_key
10
+
11
+ def self.find
12
+ load Dir["config/heploy.rb"].first
13
+ Heploy.configuration
14
+ rescue TypeError
15
+ puts "Error: You don't have a configuration file."
16
+ exit
17
+ end
18
+
19
+ def initialize
20
+ @development_branch = "dev"
21
+ @staging_branch = "staging"
22
+ @production_branch = "production"
23
+ end
24
+
25
+ end
26
+ end
@@ -1,3 +1,3 @@
1
1
  module Heploy
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
@@ -0,0 +1,2 @@
1
+ require 'minitest/autorun'
2
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: heploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,11 +9,11 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-09-10 00:00:00.000000000 Z
12
+ date: 2012-09-13 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: thor
16
- requirement: &70123629232420 !ruby/object:Gem::Requirement
16
+ requirement: &70124576997920 !ruby/object:Gem::Requirement
17
17
  none: false
18
18
  requirements:
19
19
  - - ! '>='
@@ -21,10 +21,10 @@ dependencies:
21
21
  version: '0'
22
22
  type: :runtime
23
23
  prerelease: false
24
- version_requirements: *70123629232420
24
+ version_requirements: *70124576997920
25
25
  - !ruby/object:Gem::Dependency
26
26
  name: git
27
- requirement: &70123629231840 !ruby/object:Gem::Requirement
27
+ requirement: &70124576997460 !ruby/object:Gem::Requirement
28
28
  none: false
29
29
  requirements:
30
30
  - - ! '>='
@@ -32,7 +32,40 @@ dependencies:
32
32
  version: '0'
33
33
  type: :runtime
34
34
  prerelease: false
35
- version_requirements: *70123629231840
35
+ version_requirements: *70124576997460
36
+ - !ruby/object:Gem::Dependency
37
+ name: heroku
38
+ requirement: &70124568621400 !ruby/object:Gem::Requirement
39
+ none: false
40
+ requirements:
41
+ - - ! '>='
42
+ - !ruby/object:Gem::Version
43
+ version: '0'
44
+ type: :runtime
45
+ prerelease: false
46
+ version_requirements: *70124568621400
47
+ - !ruby/object:Gem::Dependency
48
+ name: rake
49
+ requirement: &70124568620580 !ruby/object:Gem::Requirement
50
+ none: false
51
+ requirements:
52
+ - - ! '>='
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ type: :runtime
56
+ prerelease: false
57
+ version_requirements: *70124568620580
58
+ - !ruby/object:Gem::Dependency
59
+ name: minitest
60
+ requirement: &70124568619440 !ruby/object:Gem::Requirement
61
+ none: false
62
+ requirements:
63
+ - - ! '>='
64
+ - !ruby/object:Gem::Version
65
+ version: '0'
66
+ type: :development
67
+ prerelease: false
68
+ version_requirements: *70124568619440
36
69
  description: Heploy deploys your application to Heroku, using a bunch of best practices
37
70
  and other nice things.
38
71
  email:
@@ -52,7 +85,11 @@ files:
52
85
  - heploy.gemspec
53
86
  - lib/heploy.rb
54
87
  - lib/heploy/cli.rb
88
+ - lib/heploy/command.rb
89
+ - lib/heploy/command/deploy.rb
90
+ - lib/heploy/configuration.rb
55
91
  - lib/heploy/version.rb
92
+ - test/configuration_test.rb
56
93
  homepage: ''
57
94
  licenses: []
58
95
  post_install_message:
@@ -77,4 +114,5 @@ rubygems_version: 1.8.10
77
114
  signing_key:
78
115
  specification_version: 3
79
116
  summary: Deploy your application to Heroku, even easier.
80
- test_files: []
117
+ test_files:
118
+ - test/configuration_test.rb