github-release-party 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 7c3aeb5150e8e1d0815c605df468dbaa8b5689b7
4
+ data.tar.gz: 2b77512c89c8d240a3936e9b87c36d4f4474e0ea
5
+ SHA512:
6
+ metadata.gz: 91cea9e652666ee62b3cfea2a8f6d90e5350b45e8270a01df68eacc7a53ecbb57fe0fc2bd743051982640b71e04e56583b3fb4abe65e6414fed7c835091ddc0e
7
+ data.tar.gz: caff089ab5e75a73d7a1d508fa0fb71ed34887561256e59b3703589fd9f6591b651d252abd9ac63d55421ef3c9cf0e2852597bf6a1ce7fe681e5ee8a170c49f4
@@ -0,0 +1,88 @@
1
+ require "github-release-party"
2
+
3
+ desc "Deploy new version to Heroku"
4
+ task :deploy do
5
+ return unless GithubReleaseParty.env_ok
6
+ success = system "git push heroku HEAD:master"
7
+ if not success
8
+ abort "Deploy failed."
9
+ end
10
+ Rake.application.invoke_task("deploy:tag")
11
+ end
12
+
13
+ namespace :deploy do
14
+ desc "Forcibly deploy new version to Heroku"
15
+ task :force do
16
+ return unless GithubReleaseParty.env_ok
17
+ success = system "git push heroku HEAD:master --force"
18
+ if not success
19
+ abort "Deploy failed."
20
+ end
21
+ Rake.application.invoke_task("deploy:tag")
22
+ end
23
+
24
+ desc "Tag latest release"
25
+ task :tag do
26
+ return unless GithubReleaseParty.env_ok
27
+
28
+ # get heroku version number
29
+ ver = `heroku releases`.split("\n")[1].split(" ")[0]
30
+ hash = `git rev-parse HEAD`.strip
31
+ tag_name = "heroku/#{ver}"
32
+
33
+ # build tag message
34
+ repo = GithubReleaseParty.repo
35
+ last_tag = `git describe --tags --abbrev=0 --match 'heroku/v*'`.strip
36
+ commits = `git log #{last_tag}..#{hash} --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
37
+ message = "Deploy #{hash[0..6]}\n\nDiff: https://github.com/#{repo}/compare/#{last_tag}...#{tag_name}\n#{commits}"
38
+
39
+ # tag and push new tag
40
+ puts "Tagging #{tag_name}."
41
+ success = system "git tag -a -m \"#{message.gsub('"','\\"')}\" #{tag_name} #{hash}"
42
+ abort if not success
43
+ success = system "git push origin #{tag_name}"
44
+ abort if not success
45
+
46
+ # create GitHub release
47
+ puts
48
+ puts "Waiting 3 seconds to let GitHub process the new tag."
49
+ sleep 3
50
+ GithubReleaseParty.create(tag_name, ver, message)
51
+ end
52
+ end
53
+
54
+ desc "Rebuild all the release tags"
55
+ task :retag do
56
+ github = GithubReleaseParty.new
57
+ repo = GithubReleaseParty.repo
58
+
59
+ tags = `git tag -l heroku/v* --sort=version:refname`.split("\n")
60
+ puts "Found #{tags.count} tags."
61
+ tags.each_with_index do |tag_name, i|
62
+ ver = tag_name[/v(\d+)/]
63
+ last_tag = if i == 0
64
+ `git rev-list --max-parents=0 HEAD`.strip
65
+ else
66
+ tags[i-1]
67
+ end
68
+
69
+ hash = `git rev-list --max-count=1 #{tag_name}`.strip
70
+ date = `git show --pretty="format:%ai" -s --no-color #{tag_name} | tail -1`.strip
71
+ commits = `git log #{last_tag}..#{tag_name} --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
72
+ message = "Deploy #{hash[0..6]}\n\nDiff: https://github.com/#{repo}/compare/#{last_tag}...#{tag_name}\n#{commits}"
73
+
74
+ if i == 0
75
+ message += "\n"+`git show #{last_tag} -s --pretty=format:"- [%s](https://github.com/#{repo}/commit/%H)"`
76
+ end
77
+
78
+ success = system "GIT_COMMITTER_DATE='#{date}' git tag -f -a -m \"#{message.gsub('"','\\"')}\" #{tag_name} #{tag_name}^{}"
79
+ abort if not success
80
+ success = system "git push -f origin #{tag_name}"
81
+ abort if not success
82
+
83
+ # update or create GitHub release
84
+ github.update_or_create(tag_name, ver, message)
85
+ end
86
+
87
+ puts "Done"
88
+ end
@@ -0,0 +1,3 @@
1
+ class GithubReleaseParty
2
+ VERSION = "0.0.1"
3
+ end
@@ -0,0 +1,109 @@
1
+ # This is a GitHub party, and everyone's invited!
2
+
3
+ require "httparty"
4
+
5
+ class GithubReleaseParty
6
+ include HTTParty
7
+ base_uri "https://api.github.com"
8
+
9
+ def initialize
10
+ return unless self.class.env_ok
11
+ @releases = []
12
+ page = 1
13
+ while true
14
+ r = self.class.get "/repos/#{self.class.repo}/releases?page=#{page}", self.class.options
15
+ raise self.class.error(r) if not r.success?
16
+ break if r.parsed_response.count == 0
17
+
18
+ @releases = @releases + r.parsed_response
19
+ page += 1
20
+ end
21
+ end
22
+
23
+ def update_or_create(tag_name, name, message)
24
+ release = @releases.find { |rel| rel["tag_name"] == tag_name }
25
+ if release
26
+ self.class.update(release["id"], name, message)
27
+ else
28
+ self.class.create(tag_name, name, message)
29
+ end
30
+ end
31
+
32
+ def self.update(id, name, message)
33
+ return unless env_ok
34
+
35
+ r = patch "/repos/#{repo}/releases/#{id}", options.merge({
36
+ body: {
37
+ name: name,
38
+ body: message
39
+ }.to_json
40
+ })
41
+ if r.success?
42
+ puts "GitHub release #{name} updated!"
43
+ else
44
+ puts "Failed to update GitHub release #{tag_name}!"
45
+ puts error(r)
46
+ end
47
+ end
48
+
49
+ def self.create(tag_name, name, message)
50
+ return unless env_ok
51
+
52
+ body = {
53
+ tag_name: tag_name,
54
+ name: name,
55
+ body: message
56
+ }
57
+
58
+ r = post "/repos/#{repo}/releases", options.merge({
59
+ body: body.to_json
60
+ })
61
+ if r.success?
62
+ puts "GitHub release #{tag_name} created!"
63
+ else
64
+ puts error(r)
65
+ puts
66
+ puts "Body sent: #{body.to_json}"
67
+ puts
68
+ puts "Failed to create GitHub release!"
69
+ puts "Create it manually here: https://github.com/#{repo}/releases/new"
70
+ puts "Tag version: #{tag_name}"
71
+ puts "Release title: #{tag_name}"
72
+ puts "Message:"
73
+ puts message
74
+ end
75
+ end
76
+
77
+ def self.env_ok
78
+ if not ENV["GITHUB_RELEASE_TOKEN"]
79
+ puts "Configure GITHUB_RELEASE_TOKEN to create GitHub releases. See https://github.com/stefansundin/github-release-party#setup"
80
+ return false
81
+ end
82
+ if not repo
83
+ puts "Can't find the GitHub repo. Please use the remote 'origin'."
84
+ return false
85
+ end
86
+ return true
87
+ end
88
+
89
+ def self.repo
90
+ `git remote -v`.scan(/^origin\t.*github.com[:\/](.+)\.git /).uniq.flatten.first
91
+ end
92
+
93
+ private
94
+
95
+ def self.options
96
+ {
97
+ query: {
98
+ access_token: ENV["GITHUB_RELEASE_TOKEN"]
99
+ },
100
+ headers: {
101
+ "User-Agent" => "github-release-party/#{GithubReleaseParty::VERSION}"
102
+ }
103
+ }
104
+ end
105
+
106
+ def self.error(r)
107
+ "#{r.request.path.to_s}: #{r.code} #{r.message}: #{r.body}. #{r.headers.to_h.to_json}"
108
+ end
109
+ end
metadata ADDED
@@ -0,0 +1,75 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: github-release-party
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ platform: ruby
6
+ authors:
7
+ - Stefan Sundin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2015-04-27 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: httparty
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.13'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.13'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - '='
32
+ - !ruby/object:Gem::Version
33
+ version: 10.4.2
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - '='
39
+ - !ruby/object:Gem::Version
40
+ version: 10.4.2
41
+ description: I use this gem to automatically create GitHub releases when I deploy
42
+ to Heroku. See the GitHub page for usage.
43
+ email:
44
+ - stefan@stefansundin.com
45
+ executables: []
46
+ extensions: []
47
+ extra_rdoc_files: []
48
+ files:
49
+ - lib/github-release-party.rb
50
+ - lib/github-release-party/tasks/heroku.rb
51
+ - lib/github-release-party/version.rb
52
+ homepage: https://github.com/stefansundin/github-release-party
53
+ licenses: []
54
+ metadata: {}
55
+ post_install_message:
56
+ rdoc_options: []
57
+ require_paths:
58
+ - lib
59
+ required_ruby_version: !ruby/object:Gem::Requirement
60
+ requirements:
61
+ - - ">="
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
64
+ required_rubygems_version: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - ">="
67
+ - !ruby/object:Gem::Version
68
+ version: 1.3.6
69
+ requirements: []
70
+ rubyforge_project:
71
+ rubygems_version: 2.2.2
72
+ signing_key:
73
+ specification_version: 4
74
+ summary: Easily create GitHub releases.
75
+ test_files: []