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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 44be2464464dd89cd2b526d435d79aad769a8994
4
- data.tar.gz: 62e84b205ba5a5c41c965e129211b07ae7faea8f
3
+ metadata.gz: 8447b80dabdc7b29c854be1bd9f7385e19156ca9
4
+ data.tar.gz: aebae5d62eed1ca7ae8f4cb75f7a39b4c283bb2a
5
5
  SHA512:
6
- metadata.gz: 9995162d0fc8a25bb6880c9fd189fdb743a351d2ceffddf91100e2524798ee99f3ad9acceb36b203a637b622c8be75fbb8a7ae165ee753ffeeab3fa36a3dec61
7
- data.tar.gz: 75967c652de24f7b0a1ed16b69e147537c321fedb02cd9a4246390342a81b2e8d40ebf807a8b0d6b4e5c4b84fa551e9f0b4b90ed4d6fcf2eeaaeb9ec1805cd98
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. Ensures a non-master branch is not being released
8
- 3. Bumps the requested version number (major, minor or patch)
9
- 4. Creates a release commit noting changes since the last release
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.2.2
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
+
@@ -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 v#{version}"
89
+ "Release #{version}#{release_tag}"
78
90
  end
79
91
 
80
- def changelog(old_version)
81
- commits = %x{git log --pretty="format:* %s" v#{old_version}..HEAD}
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 changelog!"
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
- if !valid_release_type?(release_type)
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
- version_file = Pathname.getwd.join("VERSION")
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
- tag_output = %x{git tag v#{new_version} 2>&1}
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 v#{new_version}:"
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 release to origin"
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 2>&1 && git push --tags 2>&1}
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
@@ -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 simple git tag-based release workflow}
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.2.2
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-06-25 00:00:00.000000000 Z
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
- - ".gitignore"
84
- - ".rspec"
85
- - ".travis.yml"
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.4.8
120
+ rubygems_version: 2.0.14
119
121
  signing_key:
120
122
  specification_version: 4
121
- summary: Helpers for managing a simple git tag-based release workflow
123
+ summary: Helpers for managing a git tag-based release workflow integrated with packagecloud
122
124
  test_files: []