-
[deployment-test.git] / config / git-deployment.rb
blob58b3d5488f1e1f33c2c23c0abafb2cdf0c160afe
1 Capistrano::Configuration.instance(true).load do |configuration|
2   before "deploy:update_code", "git:calculate_tag"
4   namespace :git do
5     def sh cmd
6       puts cmd; system cmd
8       if $? != 0
9         raise "#{cmd} failed"
10       end
11     end
13     def last_tag_matching(pattern)
14       lastTag = nil
16       matching_tags = `git tag -l '#{pattern}'`
17       matching_tags = matching_tags.split
18       natcmp_src = File.join(File.dirname(__FILE__), '/natcmp.rb')
19       require natcmp_src
20       matching_tags.sort! do |a,b|
21         String.natcmp(b,a,true)
22       end
24       if matching_tags.length > 0
25         last_tag = matching_tags[0]
26       end
27       return last_tag
28     end
30     def last_devqa_tag()
31       return last_tag_matching('devqa-*')
32     end
34     def last_production_tag()
35       return last_tag_matching('production-*')
36     end
38     task :calculate_tag do
39       sh "git fetch"
41       # ignore the tag-based deployment process and a deploy non-master branch
42       if branch != "master" && stage == "devqa"
43         sh 'git push'
44       else
45         method = "tag_#{stage}"
46         send method
48         # push tags and latest code
49         sh 'git push'
50         sh 'git push --tags'
51       end
52     end
54     desc "Mark the current code as a devqa release"
55     task :tag_devqa do
56       # find latest devqa tag for today
57       new_tag_date = Date.today.to_s
58       new_tag_serial = 1
60       last_devqa_tag = last_tag_matching("devqa-#{new_tag_date}.*")
61       if last_devqa_tag
62         # calculate largest serial and increment
63         last_devqa_tag =~ /devqa-[0-9]{4}-[0-9]{2}-[0-9]{2}\.([0-9]*)/
64         new_tag_serial = $1.to_i + 1
65       end
67       new_devqa_tag = "devqa-#{new_tag_date}.#{new_tag_serial}"
68       current_co_sha = `git log --pretty=format:%H HEAD -1`
69       last_devqa_tag_sha = nil
71       if last_devqa_tag
72         last_devqa_tag_sha = `git log --pretty=format:%H #{last_devqa_tag} -1`
73       end
75       if last_devqa_tag_sha == current_co_sha
76         puts "Not re-tagging devqa because the most recent tag (#{last_devqa_tag}) already points to current head"
77         new_devqa_tag = last_devqa_tag
78       else
79         puts "Tagging current branch for deployment to devqa as '#{new_devqa_tag}'"
80         sh "git tag -a -m 'tagging current code for deployment to devqa' #{new_devqa_tag}"
81       end
83       set :branch, new_devqa_tag
84     end
86     desc "Push the passed devqa tag to production. Pass in tag to deploy with '-s tag=devqa-YYYY-MM-DD.X'."
87     task :tag_production do
88       production_tag = configuration[:tag]
89       if !production_tag && production_tag !~ /devqa-.*/
90         puts "devqa tag required; use '-s tag=devqa-YYYY-MM-DD.X'"
91         exit
92       end
94       raise "devqa tag #{production_tag} does not exist." unless last_tag_matching(production_tag)
96       production_tag =~ /devqa-([0-9]{4}-[0-9]{2}-[0-9]{2}\.[0-9]*)/
97       new_production_tag = "production-#{$1}"
98       puts "promoting devqa tag #{production_tag} to production as '#{new_production_tag}'"
99       sh "git tag -a -m 'tagging current code for deployment to production' #{new_production_tag} #{production_tag}"
101       set :branch, new_production_tag
102     end
103   end