release_tagger 0.2.2 → 0.3.0

Sign up to get free protection for your applications and to get access to all the features.
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: []