Class: Amitree::HerokuDeployer
- Inherits:
-
Object
- Object
- Amitree::HerokuDeployer
- Defined in:
- lib/amitree/heroku_deployer.rb
Defined Under Namespace
Classes: ReleaseDetails
Instance Attribute Summary collapse
-
#tracker_project ⇒ Object
readonly
Returns the value of attribute tracker_project.
Instance Method Summary collapse
- #compute_release(options = {}) ⇒ Object
- #get_tracker_status(story_id) ⇒ Object
-
#initialize(options = {}) ⇒ HerokuDeployer
constructor
A new instance of HerokuDeployer.
- #stories_worked_on_between(rev1, rev2) ⇒ Object
- #tracker_data(story_id) ⇒ Object
Constructor Details
#initialize(options = {}) ⇒ HerokuDeployer
Returns a new instance of HerokuDeployer.
42 43 44 45 46 47 48 |
# File 'lib/amitree/heroku_deployer.rb', line 42 def initialize(={}) @heroku = [:heroku] || Amitree::HerokuClient.new([:heroku_api_key], [:heroku_staging_app], [:heroku_production_app]) @git = [:git] || Amitree::GitClient.new([:github_repo], [:github_username], [:github_password]) PivotalTracker::Client.token = [:tracker_token] @tracker_project = PivotalTracker::Project.find([:tracker_project_id]) @tracker_cache = {} end |
Instance Attribute Details
#tracker_project ⇒ Object (readonly)
Returns the value of attribute tracker_project.
7 8 9 |
# File 'lib/amitree/heroku_deployer.rb', line 7 def tracker_project @tracker_project end |
Instance Method Details
#compute_release(options = {}) ⇒ Object
50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/amitree/heroku_deployer.rb', line 50 def compute_release(={}) result = ReleaseDetails.new result.production_release = @heroku.last_promoted_production_release result.production_promoted_from_staging = @heroku.promoted_from_staging?(result.production_release) staging_releases = @heroku.staging_releases_since(@heroku.staging_release_version(result.production_release)) prod_commit = @heroku.get_production_commit(result.production_release) puts "Production release is #{prod_commit}" if [:verbose] result.stories = stories_worked_on_between(prod_commit, 'HEAD') all_stories = Hash[result.stories.map{|story| [story.id, story]}] staging_releases.reverse.each do |staging_release| staging_commit = @heroku.get_staging_commit(staging_release) stories = all_stories.values_at(*@git.stories_worked_on_between(prod_commit, staging_commit)).compact story_ids = stories.map(&:id) puts "- Trying staging release v#{staging_release['version']} with commit #{staging_commit}" if [:verbose] puts " - Stories: #{story_ids.inspect}" if [:verbose] unaccepted_story_ids = story_ids.select { |story_id| get_tracker_status(story_id) != 'accepted' } if unaccepted_story_ids.length > 0 stories.each do |story| story.blocked_by = unaccepted_story_ids end puts " - Some stories are not yet accepted: #{unaccepted_story_ids.inspect}" if [:verbose] else story_ids_referenced_later = story_ids & @git.stories_worked_on_between(staging_commit, 'HEAD') if story_ids_referenced_later.length > 0 puts " - Some stories have been worked on in a later commit: #{story_ids_referenced_later}" if [:verbose] else stories.each do |story| story.blocked_by = unaccepted_story_ids end puts " - This release is good to go!" if [:verbose] result.staging_release_to_deploy = staging_release break end end end return result end |
#get_tracker_status(story_id) ⇒ Object
96 97 98 |
# File 'lib/amitree/heroku_deployer.rb', line 96 def get_tracker_status(story_id) tracker_data(story_id).current_state end |
#stories_worked_on_between(rev1, rev2) ⇒ Object
104 105 106 107 108 109 110 |
# File 'lib/amitree/heroku_deployer.rb', line 104 def stories_worked_on_between(rev1, rev2) @git.stories_worked_on_between(rev1, rev2).map do |story_id| if story = tracker_data(story_id) ReleaseDetails::Story.new(story) end end.compact end |
#tracker_data(story_id) ⇒ Object
100 101 102 |
# File 'lib/amitree/heroku_deployer.rb', line 100 def tracker_data(story_id) @tracker_cache[story_id] ||= @tracker_project.stories.find(story_id) end |