github_heroku_deployer 0.0.4 → 0.0.5

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -40,12 +40,13 @@ Set defaults in an initializer, defaults are shown:
40
40
 
41
41
  ```ruby
42
42
  GithubHerokuDeployer.configure do |config|
43
- config.ssh = false
44
43
  config.github_repo = ENV["GITHUB_REPO"]
45
44
  config.heroku_api_key = ENV["HEROKU_API_KEY"]
46
45
  config.heroku_app_name = ENV["HEROKU_APP_NAME"]
47
46
  config.heroku_repo = ENV["HEROKU_REPO"]
48
47
  config.heroku_username = ENV["HEROKU_USERNAME"]
48
+ config.id_rsa = ENV["ID_RSA"]
49
+ config.logger = Logger.new(STDOUT)
49
50
  end
50
51
  ```
51
52
 
@@ -57,6 +58,7 @@ export HEROKU_API_KEY=heroku_api_key
57
58
  export HEROKU_APP_NAME=heroku_app_name
58
59
  export HEROKU_REPO=git@heroku.com:repo.git
59
60
  export HEROKU_USERNAME=heroku_username
61
+ export ID_RSA=id_rsa
60
62
  ```
61
63
 
62
64
  Deploy:
@@ -1,13 +1,14 @@
1
1
  module GithubHerokuDeployer
2
2
  class Configuration
3
3
  OPTIONS = {
4
- github_private_key: ENV["GITHUB_PRIVATE_KEY"],
5
4
  github_repo: ENV["GITHUB_REPO"],
6
5
  heroku_api_key: ENV["HEROKU_API_KEY"],
7
6
  heroku_app_name: ENV["HEROKU_APP_NAME"],
8
7
  heroku_repo: ENV["HEROKU_REPO"],
9
8
  heroku_username: ENV["HEROKU_USERNAME"],
10
- ssh_enabled: false,
9
+ id_rsa: ENV["ID_RSA"],
10
+ logger: ::Logger.new(STDOUT),
11
+ repo_dir: ENV["REPO_DIR"]
11
12
  }
12
13
 
13
14
  # Defines accessors for all OPTIONS
@@ -1,3 +1,4 @@
1
1
  module GithubHerokuDeployer
2
2
  class ConfigurationException < StandardError; end
3
+ class CommandException < StandardError; end
3
4
  end
@@ -5,16 +5,19 @@ module GithubHerokuDeployer
5
5
  class Git
6
6
 
7
7
  def initialize(options)
8
- @ssh_enabled = options[:ssh_enabled]
9
8
  @heroku_repo = options[:heroku_repo]
10
9
  @github_repo = options[:github_repo]
11
- @private_key = options[:github_private_key]
10
+ @id_rsa = options[:id_rsa]
11
+ @logger = options[:logger]
12
+ @repo_dir = options[:repo_dir]
12
13
  end
13
14
 
14
15
  def push_app_to_heroku(remote="heroku", branch="master")
15
16
  wrapper = ssh_wrapper
16
- repo.add_remote("heroku", @heroku_repo) unless repo.remote("heroku").url
17
- `cd #{repo.dir}; env #{wrapper.git_ssh} git push -f #{remote} #{branch}`
17
+ run "cd #{repo.dir}; git remote rm #{remote}" if repo.remote(remote).url
18
+ repo.add_remote(remote, @heroku_repo)
19
+ @logger.info "deploying #{repo.dir} to #{repo.remote(remote).url} from branch #{branch}"
20
+ run "cd #{repo.dir}; env #{wrapper.git_ssh} git push -f #{remote} #{branch}"
18
21
  ensure
19
22
  wrapper.unlink
20
23
  end
@@ -24,17 +27,18 @@ module GithubHerokuDeployer
24
27
  end
25
28
 
26
29
  def setup_repo
27
- # remove_folder
28
30
  clone_or_pull
29
31
  open
30
32
  end
31
33
 
32
- # def remove_folder
33
- # `rm -r #{folder}`
34
- # end
35
-
36
34
  def folder
37
- @folder ||= "repos/#{Zlib.crc32(@github_repo)}"
35
+ @folder ||= setup_folder
36
+ end
37
+
38
+ def setup_folder
39
+ folder = File.join(@repo_dir, Zlib.crc32(@github_repo).to_s)
40
+ FileUtils.mkdir_p(folder)
41
+ folder
38
42
  end
39
43
 
40
44
  def clone_or_pull
@@ -47,7 +51,8 @@ module GithubHerokuDeployer
47
51
 
48
52
  def clone
49
53
  wrapper = ssh_wrapper
50
- `env #{wrapper.git_ssh} git clone #{@github_repo} #{folder}`
54
+ @logger.info "cloning #{@github_repo} to #{folder}"
55
+ run "env #{wrapper.git_ssh} git clone #{@github_repo} #{folder}"
51
56
  ensure
52
57
  wrapper.unlink
53
58
  end
@@ -55,7 +60,8 @@ module GithubHerokuDeployer
55
60
  def pull
56
61
  wrapper = ssh_wrapper
57
62
  dir = Dir.pwd # need to cd back to here
58
- `cd #{dir}/#{folder}; env #{wrapper.git_ssh} git pull; cd #{dir}`
63
+ @logger.info "pulling from #{folder}"
64
+ run "cd #{folder}; env #{wrapper.git_ssh} git pull; cd #{dir}"
59
65
  ensure
60
66
  wrapper.unlink
61
67
  end
@@ -65,14 +71,24 @@ module GithubHerokuDeployer
65
71
  end
66
72
 
67
73
  def ssh_wrapper
68
- GitSSHWrapper.new(private_key_path: private_key_path)
74
+ GitSSHWrapper.new(private_key_path: id_rsa_path)
69
75
  end
70
76
 
71
- def private_key_path
77
+ def id_rsa_path
72
78
  file = Tempfile.new("id_rsa")
73
- file.write(@private_key)
79
+ file.write(@id_rsa)
74
80
  file.rewind
75
81
  file.path
76
82
  end
83
+
84
+ def run(command)
85
+ result = `#{command} 2>&1`
86
+ status = $?.exitstatus
87
+ if status == 0
88
+ @logger.info result
89
+ else
90
+ raise GithubHerokuDeployer::CommandException, result
91
+ end
92
+ end
77
93
  end
78
94
  end
@@ -8,6 +8,7 @@ module GithubHerokuDeployer
8
8
  @heroku_app_name = options[:heroku_app_name]
9
9
  end
10
10
 
11
+
11
12
  def heroku
12
13
  @heroku ||= ::Heroku::API.new(api_key: @heroku_api_key)
13
14
  end
@@ -30,9 +31,13 @@ module GithubHerokuDeployer
30
31
  heroku.post_app(name: @heroku_app_name)
31
32
  end
32
33
 
33
- # def delete_app
34
- # heroku.delete_app(@heroku_app_name)
35
- # end
34
+ def run(command)
35
+ heroku.post_ps(@heroku_app_name, command)
36
+ end
37
+
38
+ def delete_app
39
+ heroku.delete_app(@heroku_app_name)
40
+ end
36
41
 
37
42
  # def add_deployhooks_http(url)
38
43
  # add_addon("deployhooks:http", url: url)
@@ -45,9 +50,5 @@ module GithubHerokuDeployer
45
50
  # def delete_addon(addon)
46
51
  # heroku.delete_addon(@heroku_app_name, addon)
47
52
  # end
48
-
49
- # def migrate
50
- # heroku.post_ps(@heroku_app_name, "rake db:migrate")
51
- # end
52
53
  end
53
54
  end
@@ -1,3 +1,3 @@
1
1
  module GithubHerokuDeployer
2
- VERSION = "0.0.4"
2
+ VERSION = "0.0.5"
3
3
  end
@@ -1,3 +1,4 @@
1
+ require "logger"
1
2
  require "github_heroku_deployer/exceptions"
2
3
  require "github_heroku_deployer/configuration"
3
4
  require "github_heroku_deployer/git"
@@ -28,7 +29,8 @@ module GithubHerokuDeployer
28
29
  # config.heroku_app_name = ENV["HEROKU_APP_NAME"]
29
30
  # config.heroku_repo = ENV["HEROKU_REPO"]
30
31
  # config.heroku_username = ENV["HEROKU_USERNAME"]
31
- # config.ssh_enabled = false
32
+ # config.id_rsa = ENV["ID_RSA"]
33
+ # config.logger = Logger.new(STDOUT)
32
34
  # end
33
35
  def configure
34
36
  yield(configuration)
@@ -42,6 +44,12 @@ module GithubHerokuDeployer
42
44
  true
43
45
  end
44
46
 
47
+ def heroku_run(command, options={})
48
+ options = configuration.merge(options)
49
+ validate_options(options)
50
+ Heroku.new(options).run(command)
51
+ end
52
+
45
53
  def validate_options(options)
46
54
  configuration.validate_presence(options)
47
55
  end
@@ -42,32 +42,59 @@ describe GithubHerokuDeployer do
42
42
  end
43
43
  end
44
44
 
45
+ # TODO: how can I test these better?
45
46
  context "when configured" do
46
47
  before :each do
47
48
  @deployer = mock("github_heroku_deployer")
48
49
  @deployer.stub!(:deploy).and_return(true)
49
50
  end
50
51
 
51
- # TODO: how can I test this better?
52
- it "deploys public repos" do
53
- GithubHerokuDeployer.configure do |config|
54
- config.github_repo = ENV["PUBLIC_GITHUB_REPO"]
52
+ context "when repo does not exist locally" do
53
+ it "deploys public repos" do
54
+ public_repo = ENV["PUBLIC_GITHUB_REPO"]
55
+ public_repo_folder = Zlib.crc32(public_repo).to_s
56
+ repos_dir = GithubHerokuDeployer.configuration[:repo_dir]
57
+ full_path = File.join(repos_dir, public_repo_folder)
58
+ FileUtils.rm_r(full_path) if File.exists?(full_path)
59
+ GithubHerokuDeployer.configure do |config|
60
+ config.github_repo = public_repo
61
+ end
62
+ # GithubHerokuDeployer.deploy.should be true
63
+ @deployer.deploy.should be true
64
+ end
65
+
66
+ it "deploys private repos" do
67
+ private_repo = ENV["PRIVATE_GITHUB_REPO"]
68
+ private_repo_folder = Zlib.crc32(private_repo).to_s
69
+ repos_dir = GithubHerokuDeployer.configuration[:repo_dir]
70
+ full_path = File.join(repos_dir, private_repo_folder)
71
+ FileUtils.rm_r(full_path) if File.exists?(full_path)
72
+ GithubHerokuDeployer.configure do |config|
73
+ config.github_repo = private_repo
74
+ end
75
+ # GithubHerokuDeployer.deploy.should be true
76
+ @deployer.deploy.should be true
55
77
  end
56
- # GithubHerokuDeployer.deploy.should be true
57
- @deployer.deploy.should be true
58
78
  end
59
79
 
60
- # TODO: how can I test this better?
61
- it "deploys private repos" do
62
- GithubHerokuDeployer.configure do |config|
63
- config.ssh_enabled = true
64
- config.github_repo = ENV["PRIVATE_GITHUB_REPO"]
80
+ context "when repo exists locally" do
81
+ it "deploys public repos" do
82
+ GithubHerokuDeployer.configure do |config|
83
+ config.github_repo = ENV["PUBLIC_GITHUB_REPO"]
84
+ end
85
+ # GithubHerokuDeployer.deploy.should be true
86
+ @deployer.deploy.should be true
87
+ end
88
+
89
+ it "deploys private repos" do
90
+ GithubHerokuDeployer.configure do |config|
91
+ config.github_repo = ENV["PRIVATE_GITHUB_REPO"]
92
+ end
93
+ # GithubHerokuDeployer.deploy.should be true
94
+ @deployer.deploy.should be true
65
95
  end
66
- # GithubHerokuDeployer.deploy.should be true
67
- @deployer.deploy.should be true
68
96
  end
69
97
 
70
- # TODO: how can I test this better?
71
98
  it "overrides defaults" do
72
99
  GithubHerokuDeployer.configure do |config|
73
100
  config.github_repo = ""
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: github_heroku_deployer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.4
4
+ version: 0.0.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2012-10-29 00:00:00.000000000 Z
12
+ date: 2012-10-31 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: heroku-api
@@ -160,12 +160,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
160
160
  - - ! '>='
161
161
  - !ruby/object:Gem::Version
162
162
  version: '0'
163
+ segments:
164
+ - 0
165
+ hash: 3203415681699428382
163
166
  required_rubygems_version: !ruby/object:Gem::Requirement
164
167
  none: false
165
168
  requirements:
166
169
  - - ! '>='
167
170
  - !ruby/object:Gem::Version
168
171
  version: '0'
172
+ segments:
173
+ - 0
174
+ hash: 3203415681699428382
169
175
  requirements: []
170
176
  rubyforge_project:
171
177
  rubygems_version: 1.8.24