release_tagger 0.2.2 → 0.3.0
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 +4 -4
- data/README.markdown +12 -5
- data/VERSION +1 -1
- data/lib/release_tagger/repo.rb +59 -0
- data/lib/release_tagger.rb +41 -41
- data/release_tagger.gemspec +2 -2
- metadata +21 -19
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8447b80dabdc7b29c854be1bd9f7385e19156ca9
|
4
|
+
data.tar.gz: aebae5d62eed1ca7ae8f4cb75f7a39b4c283bb2a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2aff2951cd9e160bb99c81955afc620d8bdde7fc38105b5bc7885d919dee201861e629455dc494146121cc5c5d735f8632a16110a2558417355f619a85da20a
|
7
|
+
data.tar.gz: b301b8d3298a15aa805536d0a7faf8da63beba444ce2f68c2635cbc6351e55c680de783a3e6d7c70e10bb15133fce9513587c0c1dd26b6575ef5545dfb710996
|
data/README.markdown
CHANGED
@@ -4,12 +4,12 @@ A simple command-line tool to manage a git tag-based release workflow.
|
|
4
4
|
It:
|
5
5
|
|
6
6
|
1. Ensures the working directory is clean and up-to-date
|
7
|
-
2.
|
8
|
-
3.
|
9
|
-
4.
|
10
|
-
5. Tags the release commit
|
11
|
-
6. Pushes the whole lot to the origin repo
|
7
|
+
2. Bumps the requested version number (major, minor or patch)
|
8
|
+
3. Creates an annotated tag noting changes since the last release
|
9
|
+
4. Pushes the tag to the origin repo
|
12
10
|
|
11
|
+
The actual version of the software will be retrieved from our package repository in the cloud
|
12
|
+
(packagecloud)
|
13
13
|
That's all. Any other build steps are to be managed manually, or by CI
|
14
14
|
watching for release tags in the origin repo.
|
15
15
|
|
@@ -29,6 +29,13 @@ Or install it yourself as:
|
|
29
29
|
|
30
30
|
$ gem install release_tagger
|
31
31
|
|
32
|
+
## Configuration
|
33
|
+
The only required configuration is the packagecloud API key to retrieve the latest version.
|
34
|
+
You can configure it adding the API key (ask the infra/geoff squad for it) at:
|
35
|
+
- /etc/release_tagger/packagecloud_token
|
36
|
+
- ~/.release_tagger/packagecloud_token
|
37
|
+
- as an environment variable, PACKAGECLOUD_API_TOKEN
|
38
|
+
|
32
39
|
## Usage
|
33
40
|
|
34
41
|
$ do_release (major|minor|patch)
|
data/VERSION
CHANGED
@@ -1 +1 @@
|
|
1
|
-
0.
|
1
|
+
0.3.0
|
@@ -0,0 +1,59 @@
|
|
1
|
+
require 'net/http'
|
2
|
+
require 'json'
|
3
|
+
require 'pathname'
|
4
|
+
|
5
|
+
module ReleaseTagger
|
6
|
+
class Repo
|
7
|
+
PACKAGECLOUD_ACCOUNT = 'lostmyname'
|
8
|
+
REPO = 'qa'
|
9
|
+
ITEMS_PER_PAGE = 1000
|
10
|
+
VERSIONS_URL = "https://packagecloud.io/api/v1/repos/#{PACKAGECLOUD_ACCOUNT}/#{REPO}/package/rpm/el/7/%s/x86_64/versions.json?per_page=#{ITEMS_PER_PAGE}"
|
11
|
+
|
12
|
+
def get_api_token
|
13
|
+
home_config_file = Pathname.new(File.join(File.expand_path('~'), '.release_tagger', 'packagecloud_token'))
|
14
|
+
etc_config_file = Pathname.new(File.join('/etc', 'release_tagger', 'packagecloud_token'))
|
15
|
+
|
16
|
+
if etc_config_file.exist?
|
17
|
+
package_cloud_api_token = etc_config_file.read.strip
|
18
|
+
elsif home_config_file.exist?
|
19
|
+
package_cloud_api_token = home_config_file.read.strip
|
20
|
+
elsif ENV['PACKAGECLOUD_API_TOKEN']
|
21
|
+
package_cloud_api_token = ENV['PACKAGECLOUD_API_TOKEN']
|
22
|
+
else
|
23
|
+
puts %(Config for packagecloud not found!
|
24
|
+
Consider setting your packagecloud api token in any of:
|
25
|
+
- #{home_config_file}
|
26
|
+
- #{etc_config_file}
|
27
|
+
- env var PACKAGECLOUD_API_TOKEN
|
28
|
+
)
|
29
|
+
exit 1
|
30
|
+
end
|
31
|
+
|
32
|
+
package_cloud_api_token
|
33
|
+
end
|
34
|
+
|
35
|
+
def get_max_package_version(package_name)
|
36
|
+
pc_api_token = get_api_token
|
37
|
+
uri = URI.parse(VERSIONS_URL % package_name)
|
38
|
+
req = Net::HTTP::Get.new(uri)
|
39
|
+
req.basic_auth pc_api_token, ''
|
40
|
+
response = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => uri.scheme == 'https') {|http| http.request(req)}
|
41
|
+
|
42
|
+
unless response.is_a?(Net::HTTPOK)
|
43
|
+
puts "Error trying to get latest version of package #{package_name}"
|
44
|
+
puts response.code
|
45
|
+
exit 1
|
46
|
+
end
|
47
|
+
|
48
|
+
res = JSON.parse(response.body)
|
49
|
+
release_version = '1.0.0'
|
50
|
+
unless res == []
|
51
|
+
latest_package = res.select { |package| package['name'] == package_name}.max_by{ |package| package['version']}
|
52
|
+
release_version = latest_package['version']
|
53
|
+
end
|
54
|
+
release_version
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
|
data/lib/release_tagger.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require "release_tagger/version"
|
2
|
+
require_relative "release_tagger/repo"
|
2
3
|
require 'pathname'
|
3
4
|
|
4
5
|
module ReleaseTagger
|
@@ -25,6 +26,9 @@ module ReleaseTagger
|
|
25
26
|
|
26
27
|
class << self
|
27
28
|
|
29
|
+
TAG_PRODUCTION = '-prod'
|
30
|
+
TAG_QA = '-qa'
|
31
|
+
|
28
32
|
def color_terminal?
|
29
33
|
ENV["TERM"] =~ /color/
|
30
34
|
end
|
@@ -73,18 +77,42 @@ module ReleaseTagger
|
|
73
77
|
%x{git status --porcelain 2>/dev/null | egrep "^(M| M)"}.strip != ""
|
74
78
|
end
|
75
79
|
|
80
|
+
def release_tag
|
81
|
+
if on_master_branch?
|
82
|
+
TAG_PRODUCTION
|
83
|
+
else
|
84
|
+
TAG_QA
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
76
88
|
def release_message(version)
|
77
|
-
"Release
|
89
|
+
"Release #{version}#{release_tag}"
|
78
90
|
end
|
79
91
|
|
80
|
-
def changelog
|
81
|
-
commits
|
92
|
+
def changelog
|
93
|
+
# Get commits since latest tag if any (in this branch or from the original branched one)
|
94
|
+
commits = ''
|
95
|
+
previous_tag = %x{git describe --abbrev=0 --tags --match *.*.*}.strip
|
82
96
|
unless $?.success?
|
83
|
-
raise RuntimeError, "Error getting
|
97
|
+
raise RuntimeError, "Error getting previous tag!"
|
98
|
+
end
|
99
|
+
unless previous_tag == ''
|
100
|
+
commits = %x{git log --pretty="format:* %s" #{previous_tag}..HEAD}
|
101
|
+
unless $?.success?
|
102
|
+
raise RuntimeError, "Error getting changelog!"
|
103
|
+
end
|
84
104
|
end
|
85
105
|
commits
|
86
106
|
end
|
87
107
|
|
108
|
+
def get_repo_name
|
109
|
+
repo_name = %x{basename `git rev-parse --show-toplevel`}.strip
|
110
|
+
unless $?.success?
|
111
|
+
raise RuntimeError, "Error getting repo name!"
|
112
|
+
end
|
113
|
+
repo_name
|
114
|
+
end
|
115
|
+
|
88
116
|
def run!
|
89
117
|
if ARGV.length != 1
|
90
118
|
usage
|
@@ -93,16 +121,11 @@ module ReleaseTagger
|
|
93
121
|
|
94
122
|
release_type = ARGV.first
|
95
123
|
|
96
|
-
|
124
|
+
unless valid_release_type?(release_type)
|
97
125
|
usage
|
98
126
|
exit 1
|
99
127
|
end
|
100
128
|
|
101
|
-
if !on_master_branch?
|
102
|
-
err "You must be on the master branch to make a release"
|
103
|
-
exit 1
|
104
|
-
end
|
105
|
-
|
106
129
|
if behind_origin?
|
107
130
|
err "You are behind the origin/master branch - please pull before releasing."
|
108
131
|
exit 1
|
@@ -114,14 +137,8 @@ module ReleaseTagger
|
|
114
137
|
exit 1
|
115
138
|
end
|
116
139
|
|
117
|
-
|
118
|
-
|
119
|
-
if !version_file.exist?
|
120
|
-
err "Could not find VERSION file - this must be present to make a release"
|
121
|
-
exit 1
|
122
|
-
end
|
123
|
-
|
124
|
-
old_version_string = version_file.read.strip
|
140
|
+
package_name = 'lmn-' + get_repo_name
|
141
|
+
old_version_string = Repo.new().get_max_package_version(package_name)
|
125
142
|
old_version_parts = old_version_string.split(".").map(&:to_i)
|
126
143
|
old_version = Version.new(*old_version_parts)
|
127
144
|
new_version = old_version.bump(release_type)
|
@@ -132,42 +149,25 @@ module ReleaseTagger
|
|
132
149
|
exit 1
|
133
150
|
end
|
134
151
|
|
135
|
-
if !version_file.writable?
|
136
|
-
err "Could not write to VERSION file - please check you have write permissions"
|
137
|
-
exit 1
|
138
|
-
end
|
139
|
-
|
140
|
-
log "Updating VERSION file to #{new_version}"
|
141
|
-
version_file.open("w") do |f|
|
142
|
-
f.write(new_version.to_s)
|
143
|
-
end
|
144
|
-
|
145
|
-
log "Creating release commit"
|
146
|
-
commits = changelog(old_version)
|
147
|
-
commit_output = %x{git add -u . && git commit -m "#{release_message(new_version)}\n\n#{commits}" 2>&1}
|
148
|
-
unless $?.success?
|
149
|
-
err "Error committing VERSION update:"
|
150
|
-
err commit_output
|
151
|
-
exit 1
|
152
|
-
end
|
153
|
-
|
154
152
|
log "Adding release tag"
|
155
|
-
|
153
|
+
commits = changelog
|
154
|
+
tag_output = %x{git tag -a #{new_version}#{release_tag} -m "#{release_message(new_version)}\n\n#{commits}" 2>&1}
|
156
155
|
unless $?.success?
|
157
|
-
err "Error adding version tag
|
156
|
+
err "Error adding version tag #{new_version}#{release_tag}:"
|
158
157
|
err tag_output
|
159
158
|
exit 1
|
160
159
|
end
|
161
160
|
|
162
|
-
log "Pushing
|
161
|
+
log "Pushing tags to origin"
|
163
162
|
# Separate `push` and `push --tags` here, because only relatively recent
|
164
163
|
# versions of git push both refs and tags with the single command.
|
165
|
-
push_output = %x{git push
|
164
|
+
push_output = %x{git push --tags 2>&1}
|
166
165
|
unless $?.success?
|
167
166
|
err "Error pushing release tag to origin:"
|
168
167
|
err push_output
|
169
168
|
exit 1
|
170
169
|
end
|
170
|
+
log "Pushed version #{new_version}"
|
171
171
|
end
|
172
172
|
end
|
173
173
|
end
|
data/release_tagger.gemspec
CHANGED
@@ -6,11 +6,11 @@ require 'release_tagger/version'
|
|
6
6
|
Gem::Specification.new do |spec|
|
7
7
|
spec.name = "release_tagger"
|
8
8
|
spec.version = ReleaseTagger::VERSION
|
9
|
-
spec.authors = ["Simon Coffey"]
|
9
|
+
spec.authors = ["Simon Coffey", "Nadir Lloret"]
|
10
10
|
spec.email = ["dev@lostmy.name"]
|
11
11
|
spec.license = "MIT"
|
12
12
|
|
13
|
-
spec.summary = %q{Helpers for managing a
|
13
|
+
spec.summary = %q{Helpers for managing a git tag-based release workflow integrated with packagecloud}
|
14
14
|
spec.description = %q{A set of helpers for tagging releases and logging changes between releases}
|
15
15
|
spec.homepage = "https://github.com/Lostmyname/release_tagger"
|
16
16
|
|
metadata
CHANGED
@@ -1,75 +1,76 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: release_tagger
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.3.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Simon Coffey
|
8
|
+
- Nadir Lloret
|
8
9
|
autorequire:
|
9
10
|
bindir: exe
|
10
11
|
cert_chain: []
|
11
|
-
date: 2015-
|
12
|
+
date: 2015-10-28 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: bundler
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
16
17
|
requirements:
|
17
|
-
- -
|
18
|
+
- - ~>
|
18
19
|
- !ruby/object:Gem::Version
|
19
20
|
version: '1.10'
|
20
21
|
type: :development
|
21
22
|
prerelease: false
|
22
23
|
version_requirements: !ruby/object:Gem::Requirement
|
23
24
|
requirements:
|
24
|
-
- -
|
25
|
+
- - ~>
|
25
26
|
- !ruby/object:Gem::Version
|
26
27
|
version: '1.10'
|
27
28
|
- !ruby/object:Gem::Dependency
|
28
29
|
name: rake
|
29
30
|
requirement: !ruby/object:Gem::Requirement
|
30
31
|
requirements:
|
31
|
-
- -
|
32
|
+
- - ~>
|
32
33
|
- !ruby/object:Gem::Version
|
33
34
|
version: '10.0'
|
34
35
|
type: :development
|
35
36
|
prerelease: false
|
36
37
|
version_requirements: !ruby/object:Gem::Requirement
|
37
38
|
requirements:
|
38
|
-
- -
|
39
|
+
- - ~>
|
39
40
|
- !ruby/object:Gem::Version
|
40
41
|
version: '10.0'
|
41
42
|
- !ruby/object:Gem::Dependency
|
42
43
|
name: rspec
|
43
44
|
requirement: !ruby/object:Gem::Requirement
|
44
45
|
requirements:
|
45
|
-
- -
|
46
|
+
- - ~>
|
46
47
|
- !ruby/object:Gem::Version
|
47
48
|
version: '3.3'
|
48
|
-
- -
|
49
|
+
- - '>='
|
49
50
|
- !ruby/object:Gem::Version
|
50
51
|
version: 3.3.0
|
51
52
|
type: :development
|
52
53
|
prerelease: false
|
53
54
|
version_requirements: !ruby/object:Gem::Requirement
|
54
55
|
requirements:
|
55
|
-
- -
|
56
|
+
- - ~>
|
56
57
|
- !ruby/object:Gem::Version
|
57
58
|
version: '3.3'
|
58
|
-
- -
|
59
|
+
- - '>='
|
59
60
|
- !ruby/object:Gem::Version
|
60
61
|
version: 3.3.0
|
61
62
|
- !ruby/object:Gem::Dependency
|
62
63
|
name: rubocop
|
63
64
|
requirement: !ruby/object:Gem::Requirement
|
64
65
|
requirements:
|
65
|
-
- -
|
66
|
+
- - ~>
|
66
67
|
- !ruby/object:Gem::Version
|
67
68
|
version: 0.32.1
|
68
69
|
type: :development
|
69
70
|
prerelease: false
|
70
71
|
version_requirements: !ruby/object:Gem::Requirement
|
71
72
|
requirements:
|
72
|
-
- -
|
73
|
+
- - ~>
|
73
74
|
- !ruby/object:Gem::Version
|
74
75
|
version: 0.32.1
|
75
76
|
description: A set of helpers for tagging releases and logging changes between releases
|
@@ -80,9 +81,9 @@ executables:
|
|
80
81
|
extensions: []
|
81
82
|
extra_rdoc_files: []
|
82
83
|
files:
|
83
|
-
-
|
84
|
-
-
|
85
|
-
-
|
84
|
+
- .gitignore
|
85
|
+
- .rspec
|
86
|
+
- .travis.yml
|
86
87
|
- CODE_OF_CONDUCT.markdown
|
87
88
|
- Gemfile
|
88
89
|
- MIT-LICENSE
|
@@ -93,6 +94,7 @@ files:
|
|
93
94
|
- bin/setup
|
94
95
|
- exe/do_release
|
95
96
|
- lib/release_tagger.rb
|
97
|
+
- lib/release_tagger/repo.rb
|
96
98
|
- lib/release_tagger/version.rb
|
97
99
|
- release_tagger.gemspec
|
98
100
|
homepage: https://github.com/Lostmyname/release_tagger
|
@@ -105,18 +107,18 @@ require_paths:
|
|
105
107
|
- lib
|
106
108
|
required_ruby_version: !ruby/object:Gem::Requirement
|
107
109
|
requirements:
|
108
|
-
- -
|
110
|
+
- - '>='
|
109
111
|
- !ruby/object:Gem::Version
|
110
112
|
version: '0'
|
111
113
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
112
114
|
requirements:
|
113
|
-
- -
|
115
|
+
- - '>='
|
114
116
|
- !ruby/object:Gem::Version
|
115
117
|
version: '0'
|
116
118
|
requirements: []
|
117
119
|
rubyforge_project:
|
118
|
-
rubygems_version: 2.
|
120
|
+
rubygems_version: 2.0.14
|
119
121
|
signing_key:
|
120
122
|
specification_version: 4
|
121
|
-
summary: Helpers for managing a
|
123
|
+
summary: Helpers for managing a git tag-based release workflow integrated with packagecloud
|
122
124
|
test_files: []
|