instapusher 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.md CHANGED
@@ -4,79 +4,82 @@ Makes it easy to push to heroku.
4
4
 
5
5
  ## Installation
6
6
 
7
- gem install instapusher
7
+ Add this to Gemfile:
8
8
 
9
- ## Setting up account
10
-
11
- * Login at instapusher.com .
12
- * Execute `instapusher --api-key` on local machine .
9
+ gem 'instapusher'
13
10
 
14
11
  ## Usage
15
12
 
16
- In order to deploy your code first make sure that you are in the branch that you want to deploy.
17
- Then execute this command.
18
-
19
- ```
20
- instapusher
21
- ```
22
-
23
- It detects project name and a branch from the git repo and starts deploying your project.
24
-
25
- ### Running background jobs and other rake tasks
26
-
27
- Instapusher does not create workers on heroku for your project.
28
- Background jobs or rake tasks should be run manually from the console.
29
-
30
- ``` sh
31
- heroku run rake <TASK_NAME> --app <APP_NAME_GIVEN_BY_INSTAPUSHER>
32
- ```
13
+ rake instapusher
33
14
 
34
- For eg. to run delayed job workers
15
+ After installing the gem copy [this file](https://raw.github.com/gist/3098161/578dad8cd3933834712a8afdf33520221dbdb986/instapusher.yml) to `config/instapusher.yml` .
35
16
 
36
- ``` sh
37
- heroku run rake jobs:work --app my-awesome-app-42-add-devise-authentication-ip
38
- ```
17
+ Change the contents of `config/instapusher.yml` as per your needs after
18
+ reading rest of README.
39
19
 
40
- ## Setup Instapusher server
20
+ ## What problem it solves
41
21
 
42
- You can provide the env variable `LOCAL` like:
22
+ Here at BigBinary we create a separate branch for each feature we work
23
+ on. Let's say that I am working on `authentication with facebook`.
24
+ When I am done with the feature then I send pull request to my team
25
+ members to review. However in order to review the work all the team
26
+ members need to pull down the branch and fire up `rails server` and then
27
+ review.
43
28
 
44
- instapusher --local
29
+ We like to see things working. So we developed `push2heroku` to push a
30
+ feature branch to heroku instantly with one command. Executing
31
+ `push2heroku` prints a url and we put that url in the pull request so
32
+ that team members can actually test the feature.
45
33
 
46
- To enable debug messages do
34
+ ## Here is how it works
47
35
 
48
- instapusher --debug
36
+ `push2heroku` reads the `push2heroku.yml` and executes those commands.
37
+ It's that simple.
49
38
 
50
- Pass host info like this
39
+ Lets say that I am working in a branch called
40
+ `76-facebook-authentication`. When I execute `push2heroku` then the
41
+ application name under which it will be deployed to heroku will be
42
+ `nimbleshop-76-facebook-neeraj`.
51
43
 
52
- INSTAPUSHER_HOST=instapusher.com instapusher
44
+ `nimbleshop` is the name of the project.
45
+ `76-facebook` is the first 10 letters of the branch name.
46
+ `neeraj` is the first 5 letters of my github user name.
53
47
 
54
- Also there are other env variables like `INSTAPUSHER_PROJECT` and `INSTAPUSHER_BRANCH`.
48
+ So in this case the url of the application will be
49
+ `http://nimbleshop-76-facebook-neeraj.herokuapp.com` .
55
50
 
56
- INSTAPUSHER_HOST=instapusher.com INSTAPUSHER_PROJECT=rails INSTAPUSHER_BRANCH=master instapusher
51
+ In the `push2heroku.yml` file the keys `production` and `staging`
52
+ are branch names. And these branches are special branches. For these
53
+ branches the url generated will be just the application name and the
54
+ branch name. For example if I execute `rake push2heroku` from `staging`
55
+ branch then the heroku url will be
56
+ `http://nimbleshop-staging.herokuapp.com`.
57
57
 
58
- ALSO you can pass your `api_key`
58
+ However if I delete `staging` key from `push2heroku.yml` then `staging`
59
+ is no longer a special branch and the heroku url would be
60
+ `http://nimbleshop-staging-neeraj.herokuapp.com` .
59
61
 
60
- API_KEY=xxxx instapusher
62
+ ## Callbacks
61
63
 
62
- ## What problem it solves
64
+ The new design of `push2heroku` is very flexible. Let's say that Artem
65
+ wants to test something then he can add to `push2heroku.yml` something
66
+ like this
63
67
 
64
- Here at BigBinary we create a separate branch for each feature we work
65
- on. Let's say that I am working on `authentication with facebook`.
66
- When I am done with the feature then I send pull request to my team
67
- members to review. However in order to review the work all the team
68
- members need to pull down the branch and fire up `rails server` and then
69
- review.
68
+ ```
69
+ regenerate_images:
70
+ - bundle exec heroku run rake db:regenerate_images --app <%=ENV['HEROKU_APP_NAME']%> --trace
71
+ - bundle exec heroku run rake db:post_image_cleanup --app <%=ENV['HEROKU_APP_NAME']%> --trace
72
+ ```
70
73
 
71
- We like to see things working. So we developed `instapusher` to push a
72
- feature branch to heroku instantly with one command. Executing
73
- `instapusher` prints a url and we put that url in the pull request so
74
- that team members can actually test the feature.
74
+ Now to execute all the commands under key `regenrate_images` all he has to do is
75
75
 
76
- ## Here is how it works
76
+ ```
77
+ rake push2heroku CALLBACKS=reset_db_using_fixtures,regenerate_images
78
+ ```
77
79
 
78
- A video is coming up.
80
+ Just comma separate all the tasks. It's that simple. Now `push2heroku` gives all the control to the developer.
79
81
 
80
82
  ## License
81
83
 
82
84
  `instapusher` is released under MIT License.
85
+
data/bin/instapusher ADDED
@@ -0,0 +1,5 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'instapusher/commands'
4
+
5
+ Instapusher::Commands.deploy
data/instapusher.gemspec CHANGED
@@ -1,5 +1,5 @@
1
1
  # -*- encoding: utf-8 -*-
2
- require File.expand_path('../lib/instapusher2/version', __FILE__)
2
+ require File.expand_path('../lib/instapusher/version', __FILE__)
3
3
 
4
4
  Gem::Specification.new do |gem|
5
5
  gem.authors = ["Neeraj Singh"]
@@ -13,9 +13,9 @@ Gem::Specification.new do |gem|
13
13
  gem.test_files = gem.files.grep(%r{^(test|spec|features)/})
14
14
  gem.name = "instapusher"
15
15
  gem.require_paths = ["lib"]
16
- gem.version = Instapusher2::VERSION
16
+ gem.version = Instapusher::VERSION
17
17
 
18
- gem.add_dependency("hashr", ">= 0.0.19")
19
- gem.add_dependency("json")
20
- gem.add_dependency("activesupport")
18
+ gem.add_dependency("hashr", "~> 0.0.19")
19
+ gem.add_dependency("heroku", "~> 2.25.0")
20
+ gem.add_dependency("railties", ">= 3.1.0")
21
21
  end
@@ -0,0 +1,8 @@
1
+ require "active_support"
2
+
3
+ module Instapusher
4
+ extend ActiveSupport::Autoload
5
+ autoload :Git
6
+ end
7
+
8
+ require 'instapusher/railtie'
@@ -0,0 +1,72 @@
1
+ require "open3"
2
+
3
+ module Instapusher
4
+ class Base
5
+
6
+ attr_accessor :branch_name, :commands, :current_user, :settings, :named_branches, :job
7
+ attr_reader :callbacks, :project_name, :heroku_app_name, :git, :config, :config_file
8
+
9
+ def initialize(job_id, config_path, callbacks)
10
+ @job = ::Job.find_by_id! job_id
11
+ @callbacks = callbacks
12
+
13
+ @git = Git.new
14
+ @commands = []
15
+ @config_file = File.join(config_path, 'instapusher.yml')
16
+ @config = ConfigLoader.new(@config_file)
17
+ @project_name = @job.project_name
18
+ @branch_name = @job.branch_name
19
+ after_initialize
20
+ end
21
+
22
+ def push
23
+ CommandBuilder.new(self).build.each_with_index do |cmd, index|
24
+ Executor.new(self).execute(cmd, index)
25
+ end
26
+ end
27
+
28
+ private
29
+
30
+ def after_initialize
31
+ set_current_user_name
32
+ set_named_branches
33
+ set_settings
34
+ set_heroku_app_name
35
+ set_env
36
+ reload_config
37
+ end
38
+
39
+ def set_env
40
+ ENV['BRANCH_NAME'] = branch_name
41
+ ENV['HEROKU_APP_NAME'] = heroku_app_name
42
+ ENV['HEROKU_APP_URL'] = "http://#{heroku_app_name}.herokuapp.com"
43
+ ENV['APP_URL'] = @settings.app_url ? @settings.app_url : ENV['HEROKU_APP_URL']
44
+ end
45
+
46
+ def set_current_user_name
47
+ @current_user = git.current_user
48
+ end
49
+
50
+ def set_named_branches
51
+ @named_branches = config.named_branches
52
+ end
53
+
54
+ def set_settings
55
+ @settings = config.settings(branch_name)
56
+ end
57
+
58
+ def set_heroku_app_name
59
+ @heroku_app_name = HerokuAppNameGenerator.new( project_name, branch_name).name
60
+ end
61
+
62
+ def reload_config
63
+ @config = ConfigLoader.new(config_file)
64
+ set_settings
65
+ end
66
+
67
+ def sanitized_user_name
68
+ current_user || 'ip'
69
+ end
70
+
71
+ end
72
+ end
@@ -0,0 +1,62 @@
1
+ module Instapusher
2
+ class CommandBuilder
3
+
4
+ attr_reader :base
5
+
6
+ delegate :setttings, to: :base
7
+ delegate :heroku_app_name, to: :base
8
+ delegate :callbacks, to: :base
9
+ delegate :job, to: :base
10
+
11
+ def initialize base
12
+ @base = base
13
+ @commands = []
14
+ end
15
+
16
+ def build
17
+ add_pre_config_commands
18
+ add_config_environment_commands
19
+ add_before_every_install_commands
20
+ add_callback_commands
21
+ add_after_every_install
22
+
23
+ commands.flatten!.compact!
24
+ feedback_to_user
25
+ commands
26
+ end
27
+
28
+ private
29
+
30
+ def feedback_to_user
31
+ job.add_log 'Following commands will be executed:'
32
+ commands.each do |cmd|
33
+ job.add_log(' '*4 + cmd)
34
+ end
35
+ end
36
+
37
+ def add_after_every_install
38
+ commands << settings.post_config_commands.after_every_install
39
+ end
40
+
41
+ def add_callback_commands
42
+ callbacks.each do |callback|
43
+ commands << settings.post_config_commands[callback]
44
+ end
45
+ end
46
+
47
+ def add_before_every_install_commands
48
+ commands << settings.post_config_commands.before_every_install
49
+ end
50
+
51
+ def add_pre_config_commands
52
+ commands << settings.pre_config_commands
53
+ end
54
+
55
+ def add_config_environment_commands
56
+ return unless settings.config
57
+ config_cmd = settings.config.map { |key, value| "#{key.upcase}=#{value}" }
58
+ commands << "bundle exec heroku config:add #{config_cmd.join(' ')} --app #{heroku_app_name}"
59
+ end
60
+
61
+ end
62
+ end
@@ -0,0 +1,45 @@
1
+ require 'net/http'
2
+ require 'uri'
3
+ require 'multi_json'
4
+ require 'instapusher'
5
+
6
+ module Instapusher
7
+ class Commands
8
+ DEFAULT_HOSTNAME = 'instapusher.com'
9
+
10
+ def self.deploy
11
+
12
+ hostname = ENV['INSTAPUSHER_HOST'] || DEFAULT_HOSTNAME
13
+
14
+ #TODO: Remove this env and use host instead of duplication
15
+ if ENV['LOCAL']
16
+ hostname = "localhost:3000"
17
+ end
18
+ url = "http://#{hostname}/heroku"
19
+
20
+
21
+ git = Git.new
22
+ branch_name = git.current_branch
23
+ project_name = git.project_name
24
+
25
+ response = Net::HTTP.post_form(URI.parse(url),
26
+ { project: project_name,
27
+ branch: branch_name,
28
+ local: ENV['LOCAL'],
29
+ 'options[callbacks]' => ENV['CALLBACKS'] })
30
+
31
+ if response.code == '200'
32
+ response_body = MultiJson.load(response.body)
33
+ status_url = response_body['status']
34
+
35
+ status_url = status_url.gsub(DEFAULT_HOSTNAME, hostname) if ENV['LOCAL']
36
+ puts 'The appliction will be deployed to: ' + response_body['heroku_url']
37
+ puts 'Monitor the job status at: ' + status_url
38
+ cmd = "open #{status_url}"
39
+ `#{cmd}`
40
+ else
41
+ puts 'Something has gone wrong'
42
+ end
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,57 @@
1
+ module Instapusher
2
+ class Executor
3
+
4
+ attr_accessor :base
5
+
6
+ delegate :job, to: :base
7
+
8
+ def initialize base
9
+ @base = base
10
+ end
11
+
12
+ def execute cmd, index
13
+ job.add_log("executing: #{cmd}")
14
+ handle_error unless execute_using_popen3
15
+ end
16
+
17
+ private
18
+
19
+ def handle_failure
20
+ job.update_attributes(ended_at: Time.now, status: :failed)
21
+ msg = "#{cmd} FAILED"
22
+ job.add_log(msg)
23
+ raise msg
24
+ end
25
+
26
+ # returns false if command fails
27
+ def execute_using_popen3
28
+ Open3.popen3(cmd) do |stdin, stdout, stderr, wait_thr|
29
+ while line = stdout.gets
30
+ job.add_log(line)
31
+ end
32
+ while line = stderr.gets
33
+ job.add_log(line)
34
+ end
35
+
36
+ exit_status = wait_thr.value
37
+
38
+ job.add_log("exist_status.success? is: #{exit_status.success?}")
39
+ job.add_log("index is: #{index}")
40
+
41
+ success = exit_status.success?
42
+ failure = !success
43
+
44
+ if failure && index == 1
45
+ cmd = "git remote add h#{branch_name} git@heroku.com:#{heroku_app_name}.git"
46
+ job.add_log(cmd)
47
+ return false unless system(cmd)
48
+ elsif failure && index != 1
49
+ return false
50
+ end
51
+
52
+ true
53
+ end
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,20 @@
1
+ module Instapusher
2
+ class Git
3
+ def current_branch
4
+ result = %x{git branch}.split("\n")
5
+ if result.empty?
6
+ raise "It seems your app is not a git repo"
7
+ else
8
+ result.select { |b| b =~ /^\*/ }.first.split(" ").last.strip
9
+ end
10
+ end
11
+
12
+ def current_user
13
+ `git config user.name`.chop!
14
+ end
15
+
16
+ def project_name
17
+ `git config remote.origin.url`.chop!.scan(/\/([^\/]+).git$/).flatten.first
18
+ end
19
+ end
20
+ end
@@ -1,13 +1,13 @@
1
1
  require 'rails/engine'
2
2
 
3
- module Instapusher2
3
+ module Instapusher
4
4
  class Engine < Rails::Engine
5
5
 
6
6
  rake_tasks do
7
- require 'instapusher2/commands'
7
+ require 'instapusher/commands'
8
8
 
9
9
  desc "pushes to heroku"
10
- task :instapusher2 do
10
+ task :instapusher do
11
11
  Instapusher::Commands.deploy
12
12
  end
13
13
  end
@@ -0,0 +1,3 @@
1
+ module Instapusher
2
+ VERSION = "0.0.2"
3
+ end
metadata CHANGED
@@ -1,62 +1,69 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: instapusher
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
+ prerelease:
5
6
  platform: ruby
6
7
  authors:
7
8
  - Neeraj Singh
8
9
  autorequire:
9
10
  bindir: bin
10
11
  cert_chain: []
11
- date: 2014-04-28 00:00:00.000000000 Z
12
+ date: 2013-03-01 00:00:00.000000000 Z
12
13
  dependencies:
13
14
  - !ruby/object:Gem::Dependency
14
15
  name: hashr
15
16
  requirement: !ruby/object:Gem::Requirement
17
+ none: false
16
18
  requirements:
17
- - - '>='
19
+ - - ~>
18
20
  - !ruby/object:Gem::Version
19
21
  version: 0.0.19
20
22
  type: :runtime
21
23
  prerelease: false
22
24
  version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
23
26
  requirements:
24
- - - '>='
27
+ - - ~>
25
28
  - !ruby/object:Gem::Version
26
29
  version: 0.0.19
27
30
  - !ruby/object:Gem::Dependency
28
- name: json
31
+ name: heroku
29
32
  requirement: !ruby/object:Gem::Requirement
33
+ none: false
30
34
  requirements:
31
- - - '>='
35
+ - - ~>
32
36
  - !ruby/object:Gem::Version
33
- version: '0'
37
+ version: 2.25.0
34
38
  type: :runtime
35
39
  prerelease: false
36
40
  version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
37
42
  requirements:
38
- - - '>='
43
+ - - ~>
39
44
  - !ruby/object:Gem::Version
40
- version: '0'
45
+ version: 2.25.0
41
46
  - !ruby/object:Gem::Dependency
42
- name: activesupport
47
+ name: railties
43
48
  requirement: !ruby/object:Gem::Requirement
49
+ none: false
44
50
  requirements:
45
- - - '>='
51
+ - - ! '>='
46
52
  - !ruby/object:Gem::Version
47
- version: '0'
53
+ version: 3.1.0
48
54
  type: :runtime
49
55
  prerelease: false
50
56
  version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
51
58
  requirements:
52
- - - '>='
59
+ - - ! '>='
53
60
  - !ruby/object:Gem::Version
54
- version: '0'
61
+ version: 3.1.0
55
62
  description: instapusher makes it easy to push code to heroku
56
63
  email:
57
64
  - neeraj@bigbinary.com
58
65
  executables:
59
- - instapusher2
66
+ - instapusher
60
67
  extensions: []
61
68
  extra_rdoc_files: []
62
69
  files:
@@ -65,38 +72,44 @@ files:
65
72
  - LICENSE
66
73
  - README.md
67
74
  - Rakefile
68
- - bin/instapusher2
75
+ - bin/instapusher
69
76
  - instapusher.gemspec
70
- - lib/instapusher2.rb
71
- - lib/instapusher2/commands.rb
72
- - lib/instapusher2/configuration.rb
73
- - lib/instapusher2/git.rb
74
- - lib/instapusher2/job_submission.rb
75
- - lib/instapusher2/railtie.rb
76
- - lib/instapusher2/special_instruction_for_production.rb
77
- - lib/instapusher2/tag_the_release.rb
78
- - lib/instapusher2/version.rb
77
+ - lib/instapusher.rb
78
+ - lib/instapusher/base.rb
79
+ - lib/instapusher/command_builder.rb
80
+ - lib/instapusher/commands.rb
81
+ - lib/instapusher/executor.rb
82
+ - lib/instapusher/git.rb
83
+ - lib/instapusher/railtie.rb
84
+ - lib/instapusher/version.rb
79
85
  homepage: http://bigbinary.com
80
86
  licenses: []
81
- metadata: {}
82
87
  post_install_message:
83
88
  rdoc_options: []
84
89
  require_paths:
85
90
  - lib
86
91
  required_ruby_version: !ruby/object:Gem::Requirement
92
+ none: false
87
93
  requirements:
88
- - - '>='
94
+ - - ! '>='
89
95
  - !ruby/object:Gem::Version
90
96
  version: '0'
97
+ segments:
98
+ - 0
99
+ hash: -2089320010673045013
91
100
  required_rubygems_version: !ruby/object:Gem::Requirement
101
+ none: false
92
102
  requirements:
93
- - - '>='
103
+ - - ! '>='
94
104
  - !ruby/object:Gem::Version
95
105
  version: '0'
106
+ segments:
107
+ - 0
108
+ hash: -2089320010673045013
96
109
  requirements: []
97
110
  rubyforge_project:
98
- rubygems_version: 2.0.3
111
+ rubygems_version: 1.8.23
99
112
  signing_key:
100
- specification_version: 4
113
+ specification_version: 3
101
114
  summary: instapusher gem makes it easy to push code to heroku
102
115
  test_files: []
checksums.yaml DELETED
@@ -1,7 +0,0 @@
1
- ---
2
- SHA1:
3
- metadata.gz: 7433c60ac1e70c23b055cb650bf71ba093cf9abf
4
- data.tar.gz: 8d61b93297079ef691340adc607f213e52588657
5
- SHA512:
6
- metadata.gz: 01fd1afab40795944461e7453f05cdcdf508f5f607507ca6baaf81cc48c69d45683b6f4a4b026cb9d0f359921f325d69678fed3ab2e6a29869bd7579fbd10ea7
7
- data.tar.gz: 7ef193a70158e245c84a13da8c87e4a6db15c5aeb7a8af6985358cd1594a7baba9f1b65e24a3d397966ca8553ad32e468f2f495995af3839d44d0e5fe4e69da8
data/bin/instapusher2 DELETED
@@ -1,40 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require_relative '../lib/instapusher2'
4
-
5
- require 'optparse'
6
-
7
- options = {}
8
- OptionParser.new do |opts|
9
-
10
- opts.on("-v", "--version", "show version") do |v|
11
- options[:version] = v
12
- end
13
-
14
- opts.on("--quick", "Run quickly") do |v|
15
- options[:quick] = v
16
- end
17
-
18
- opts.on("--local", "Run locally") do |v|
19
- options[:local] = v
20
- end
21
-
22
- opts.on("--debug", "Show debug messages") do |v|
23
- options[:debug] = v
24
- end
25
-
26
- opts.on("--api-key", "Setup Instapusher api key") do |v|
27
- options[:api_key] = v
28
- end
29
-
30
- end.parse!
31
-
32
- if options[:version]
33
- puts Instapusher2::VERSION
34
-
35
- elsif options[:api_key]
36
- Instapusher2::Configuration.ask_for_and_write_api_key
37
-
38
- else
39
- Instapusher2::Commands.new(options).deploy
40
- end
data/lib/instapusher2.rb DELETED
@@ -1,12 +0,0 @@
1
- require_relative './instapusher2/git'
2
- require_relative './instapusher2/commands'
3
- require_relative './instapusher2/version'
4
- require_relative './instapusher2/configuration'
5
- require_relative './instapusher2/job_submission'
6
- require_relative './instapusher2/special_instruction_for_production'
7
- require_relative './instapusher2/tag_the_release'
8
- require 'active_support/all'
9
- require 'json'
10
-
11
- module Instapusher2
12
- end
@@ -1,65 +0,0 @@
1
- require_relative "../instapusher2"
2
- require 'net/http'
3
- require 'uri'
4
-
5
- module Instapusher2
6
- class Commands
7
-
8
- attr_reader :debug, :api_key, :branch_name, :project_name
9
-
10
- def initialize init_options = {}
11
- @debug = init_options[:debug]
12
- @quick = init_options[:quick]
13
- @local = init_options[:local]
14
-
15
- git = Git.new
16
- @branch_name = init_options[:project_name] || ENV['INSTAPUSHER_BRANCH'] || git.current_branch
17
- @project_name = init_options[:branch_name] || ENV['INSTAPUSHER_PROJECT'] || git.project_name
18
- end
19
-
20
- def deploy
21
- verify_api_key
22
- #SpecialInstructionForProduction.new.run if production?
23
-
24
- job_submission = JobSubmission.new(debug, options)
25
- job_submission.submit_the_job
26
-
27
- if job_submission.success?
28
- job_submission.feedback_to_user
29
- TagTheRelease.new(branch_name, debug).tagit if production?
30
- else
31
- puts job_submission.error_message
32
- end
33
- end
34
-
35
- private
36
-
37
- def options
38
- @options ||= begin
39
- { project: project_name,
40
- branch: branch_name,
41
- owner: Git.new.repo_owner,
42
- quick: @quick,
43
- local: @local,
44
- api_key: api_key }
45
- end
46
- end
47
-
48
- def verify_api_key
49
- @api_key = ENV['API_KEY'] || Instapusher::Configuration.api_key(debug) || ""
50
-
51
- if @api_key.to_s.length == 0
52
- puts ''
53
- abort "No instapusher API key was found. Please execute instapusher --api-key to setup instapusher API key."
54
-
55
- elsif debug
56
- puts "api_key is #{@api_key}"
57
- end
58
- end
59
-
60
- def production?
61
- branch_name.intern == :production
62
- end
63
-
64
- end
65
- end
@@ -1,53 +0,0 @@
1
- require 'yaml'
2
-
3
- # used to read api_key
4
- module Instapusher2
5
- module Configuration
6
- extend self
7
- @_settings = {}
8
- attr_reader :_settings
9
-
10
- def load(debug = false, filename=nil)
11
- filename ||= File.join(ENV['HOME'], '.instapusher')
12
-
13
- unless File.exist? filename
14
- File.new(filename, File::CREAT|File::TRUNC|File::RDWR, 0644).close
15
- end
16
-
17
- @_settings = YAML::load_file(filename) || {}
18
-
19
- if debug
20
- puts @_settings.inspect
21
- end
22
- end
23
-
24
- def ask_for_api_key
25
- puts ""
26
- puts "Note: Your instapusher API key is available at http://www.instapusher.com/my/api_key"
27
- puts ""
28
- puts "Enter your Instapusher API key:"
29
- api_key = ask
30
- api_key
31
- end
32
-
33
- def ask_for_and_write_api_key
34
- api_key = ask_for_api_key
35
- instapusher_config = {"api_key" => api_key}
36
- File.open(File.join(Dir.home, ".instapusher2"), "w") do |file|
37
- file.write instapusher_config.to_yaml
38
- end
39
-
40
- puts ""
41
- puts "You are all set. Start using instapusher2."
42
- end
43
-
44
- def ask
45
- $stdin.gets.to_s.strip
46
- end
47
-
48
- def method_missing(name, *args, &block)
49
- self.load
50
- @_settings[name.to_s]
51
- end
52
- end
53
- end
@@ -1,31 +0,0 @@
1
- module Instapusher2
2
- class Git
3
- def current_branch
4
- result = %x{git branch}.split("\n")
5
- if result.empty?
6
- raise "It seems your app is not a git repo"
7
- else
8
- result.select { |b| b =~ /^\*/ }.first.split(" ").last.strip
9
- end
10
- end
11
-
12
- def current_user
13
- `git config user.name`.chop!
14
- end
15
-
16
- def project_name
17
- result = `git config remote.origin.url`.chop!.scan(/\/([^\/]+)?$/).flatten.first
18
- result.sub!(/\.git$/, '') if result
19
- result ||= File.basename(Dir.getwd)
20
- result
21
- end
22
-
23
- def repo_owner
24
- string = `git remote -v | grep fetch | grep origin`
25
- regex = /.*:(.*)\/.*/
26
- match_data = string.match(regex)
27
- match_data.to_a.last
28
- end
29
-
30
- end
31
- end
@@ -1,54 +0,0 @@
1
- module Instapusher2
2
- class JobSubmission
3
-
4
- attr_reader :options, :debug, :job_status_url, :response_body
5
-
6
- DEFAULT_HOSTNAME = 'instapusher.com'
7
-
8
- def initialize debug, options
9
- @debug = debug
10
- @options = options
11
- end
12
-
13
- def success?
14
- job_status_url && job_status_url != ""
15
- end
16
-
17
- def pre_submission_feedback_to_user
18
- puts "url to hit: #{url_to_submit_job.inspect}"
19
- puts "options being passed to the url: #{options.inspect}"
20
- puts "connecting to #{url_to_submit_job} to send data"
21
- end
22
-
23
- def feedback_to_user
24
- puts 'The application will be deployed to: ' + response_body['heroku_url']
25
- puts 'Monitor the job status at: ' + job_status_url
26
- cmd = "open #{job_status_url}"
27
- `#{cmd}`
28
- end
29
-
30
- def error_message
31
- response_body['error']
32
- end
33
-
34
- def submit_the_job
35
- pre_submission_feedback_to_user if debug
36
-
37
- response = Net::HTTP.post_form URI.parse(url_to_submit_job), options
38
- @response_body = ::JSON.parse(response.body)
39
- puts "response_body: #{response_body.inspect}" if debug
40
- @job_status_url = response_body['status'] || response_body['job_status_url']
41
- end
42
-
43
- def url_to_submit_job
44
- @url ||= begin
45
- hostname = if options[:local]
46
- "localhost:3000"
47
- else
48
- ENV['INSTAPUSHER_HOST'] || DEFAULT_HOSTNAME
49
- end
50
- "http://#{hostname}/heroku.json"
51
- end
52
- end
53
- end
54
- end
@@ -1,21 +0,0 @@
1
- module Instapusher2
2
- class SpecialInstructionForProduction
3
-
4
- def run
5
- question = "You are deploying to production. Did you take backup? If not then execute rake handy:heroku:backup_production and then come back. "
6
- STDOUT.puts question
7
- STDOUT.puts "Answer 'yes' or 'no' "
8
-
9
- input = STDIN.gets.chomp.downcase
10
-
11
- if %w(yes y).include?(input)
12
- #do nothing
13
- elsif %w(no n).include?(input)
14
- abort "Please try again when you have taken the backup"
15
- else
16
- abort "Please answer yes or no"
17
- end
18
- end
19
-
20
- end
21
- end
@@ -1,25 +0,0 @@
1
- module Instapusher2
2
- class TagTheRelease
3
-
4
- attr_reader :branch_name, :debug
5
-
6
- def initialize branch_name, debug
7
- @branch_name = branch_name
8
- @debug = debug
9
- end
10
-
11
- def tagit
12
- version_number = Time.current.to_s.parameterize
13
- tag_name = "#{branch_name}-#{version_number}"
14
-
15
- cmd = "git tag -a -m \"Version #{tag_name}\" #{tag_name}"
16
- puts cmd if debug
17
- system cmd
18
-
19
- cmd = "git push --tags"
20
- puts cmd if debug
21
- system cmd
22
- end
23
-
24
- end
25
- end
@@ -1,3 +0,0 @@
1
- module Instapusher2
2
- VERSION = "0.0.1"
3
- end