github-release-party 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/lib/github-release-party/tasks/heroku.rb +88 -0
- data/lib/github-release-party/version.rb +3 -0
- data/lib/github-release-party.rb +109 -0
- metadata +75 -0
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,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: []
|