qb 0.1.56 → 0.1.57
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/lib/qb/version.rb +1 -1
- data/plugins/filter_plugins/version.py +5 -2
- data/roles/nrser.rb/library/set_fact_with_ruby.rb +94 -0
- data/roles/qb.bump/.qb-options.yml +5 -0
- data/roles/qb.bump/README.md +13 -0
- data/roles/qb.bump/defaults/main.yml +7 -0
- data/roles/qb.bump/library/bump +272 -0
- data/roles/qb.bump/meta/main.yml +9 -0
- data/roles/qb.bump/meta/qb.yml +74 -0
- data/roles/qb.bump/tasks/frontend/level/dev.yml +80 -0
- data/roles/qb.bump/tasks/frontend/level/rc.yml +120 -0
- data/roles/qb.bump/tasks/frontend/level/release.yml +112 -0
- data/roles/qb.bump/tasks/frontend/main.yml +22 -0
- data/roles/qb.bump/tasks/main.yml +82 -0
- metadata +14 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4995bf75df88c4e41eb0d9faf8d87df23a46715b
|
4
|
+
data.tar.gz: 5840addfe4c798eac0cc9cfef8686448e6eefb15
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f62010e8cbb650069092df7095b78f733fe5f71a6a462f6bbbbcebe5e36791c69167423d8e6fd4ac8cb0c003090b68bb988d63499dbbe5ab8b2606076845bf57
|
7
|
+
data.tar.gz: de0962656f44993001f4f6393aa7eefc5fb1356a97942ed128bc9fb6377342929f9f7509621834e9b2132398b41da34229946a261a510e833c29dc21fad46809
|
data/lib/qb/version.rb
CHANGED
@@ -81,9 +81,12 @@ def semver_parse(version):
|
|
81
81
|
)
|
82
82
|
|
83
83
|
if version['is_release']:
|
84
|
-
version['
|
84
|
+
version['level'] = 'release'
|
85
85
|
else:
|
86
|
-
version['
|
86
|
+
version['level'] = version['prerelease'][0]
|
87
|
+
|
88
|
+
# depreciated name for level
|
89
|
+
version['type'] = version['level']
|
87
90
|
|
88
91
|
version['release'] = "%(major)s.%(minor)s.%(patch)s" % version
|
89
92
|
|
@@ -0,0 +1,94 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# WANT_JSON
|
3
|
+
# ^ i think this is something telling ansible to provide JSON args?
|
4
|
+
|
5
|
+
# stdlib
|
6
|
+
require 'json'
|
7
|
+
require 'shellwords'
|
8
|
+
require 'pp'
|
9
|
+
|
10
|
+
# deps
|
11
|
+
require 'nrser'
|
12
|
+
|
13
|
+
$warnings = []
|
14
|
+
|
15
|
+
def namespace prefix, hash
|
16
|
+
Hash[
|
17
|
+
hash.map {|key, value|
|
18
|
+
["#{ prefix }_#{ key }", value]
|
19
|
+
}
|
20
|
+
]
|
21
|
+
end
|
22
|
+
|
23
|
+
def warn msg, **details
|
24
|
+
unless details.empty?
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
$warnings << msg
|
29
|
+
end
|
30
|
+
|
31
|
+
def main
|
32
|
+
input = nil
|
33
|
+
args = nil
|
34
|
+
|
35
|
+
begin
|
36
|
+
input = File.read ARGV[0]
|
37
|
+
args = JSON.load input
|
38
|
+
|
39
|
+
var_name = args.fetch 'var_name'
|
40
|
+
|
41
|
+
b = binding
|
42
|
+
|
43
|
+
['bind', 'vars'].each do |key|
|
44
|
+
if args.key? key
|
45
|
+
args[key].each {|k, v|
|
46
|
+
b.local_variable_set k, v
|
47
|
+
}
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
result = b.eval args.fetch('src')
|
52
|
+
|
53
|
+
print JSON.dump({
|
54
|
+
'changed' => false,
|
55
|
+
'ansible_facts' => {
|
56
|
+
var_name => result,
|
57
|
+
},
|
58
|
+
'warnings' => $warnings,
|
59
|
+
})
|
60
|
+
|
61
|
+
rescue Exception => e
|
62
|
+
path = File.join Dir.pwd, "ansible-error.log"
|
63
|
+
msg = NRSER.squish <<-END
|
64
|
+
set_fact_with_ruby failed: #{ e.message } (#{ e.class.name }).
|
65
|
+
See #{ path } for details.
|
66
|
+
END
|
67
|
+
|
68
|
+
formatted = NRSER.format_exception(e)
|
69
|
+
|
70
|
+
File.open(path, 'w') {|f|
|
71
|
+
f.puts "ERROR:\n\n"
|
72
|
+
f.puts NRSER.indent(formatted)
|
73
|
+
|
74
|
+
f.puts "\nINPUT:\n\n"
|
75
|
+
f.puts NRSER.indent(input) if defined? input
|
76
|
+
|
77
|
+
f.puts "\nARGS:\n\n"
|
78
|
+
f.puts NRSER.indent(args.pretty_inspect) if defined? args
|
79
|
+
|
80
|
+
f.puts "\nRUBY:\n"
|
81
|
+
f.puts NRSER.indent("VERSION: #{ RUBY_VERSION }")
|
82
|
+
f.puts NRSER.indent("PATH: #{ RbConfig.ruby }")
|
83
|
+
}
|
84
|
+
|
85
|
+
print JSON.dump({
|
86
|
+
'failed' => true,
|
87
|
+
'msg' => msg,
|
88
|
+
'warnings' => $warnings,
|
89
|
+
'exception' => formatted,
|
90
|
+
})
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
main if __FILE__ == $0
|
@@ -0,0 +1,13 @@
|
|
1
|
+
bump role
|
2
|
+
==============================================================================
|
3
|
+
|
4
|
+
bump a service to the next version, committing the change and tagging the
|
5
|
+
commit.
|
6
|
+
|
7
|
+
------------------------------------------------------------------------------
|
8
|
+
usage
|
9
|
+
------------------------------------------------------------------------------
|
10
|
+
|
11
|
+
CLI help:
|
12
|
+
|
13
|
+
qb bump --help
|
@@ -0,0 +1,272 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# WANT_JSON
|
3
|
+
|
4
|
+
# init bundler in dev env
|
5
|
+
if ENV['QB_DEV_ENV']
|
6
|
+
ENV.each {|k, v|
|
7
|
+
if k.start_with? 'QB_DEV_ENV_'
|
8
|
+
ENV[k.sub('QB_DEV_ENV_', '')] = v
|
9
|
+
end
|
10
|
+
}
|
11
|
+
require 'bundler/setup'
|
12
|
+
end
|
13
|
+
|
14
|
+
require 'json'
|
15
|
+
require 'pathname'
|
16
|
+
|
17
|
+
require 'qb'
|
18
|
+
require 'cmds'
|
19
|
+
require 'nrser'
|
20
|
+
require 'nrser/refinements'
|
21
|
+
|
22
|
+
using NRSER
|
23
|
+
|
24
|
+
class Version
|
25
|
+
# raw version string if available (version was read from file or whatever),
|
26
|
+
# defaults to `nil`.
|
27
|
+
#
|
28
|
+
# @return [nil | String]
|
29
|
+
attr_reader :raw
|
30
|
+
|
31
|
+
# major (first element) of version (the `1` in `1.2.3-rc.4`).
|
32
|
+
#
|
33
|
+
# @return [Fixnum]
|
34
|
+
attr_reader :major
|
35
|
+
|
36
|
+
# minor (second element) of version (the `2` in `1.2.3-rc.4`).
|
37
|
+
#
|
38
|
+
# @return [Fixnum]
|
39
|
+
attr_reader :minor
|
40
|
+
|
41
|
+
# patch (third element) of version (the `3` in `1.2.3-rc.4`).
|
42
|
+
#
|
43
|
+
# @return [Fixnum]
|
44
|
+
attr_reader :patch
|
45
|
+
|
46
|
+
# array of everything after the patch element.
|
47
|
+
#
|
48
|
+
# (`['rc', 4]` in `1.2.3-rc.4` or `1.2.3.rc.4`).
|
49
|
+
#
|
50
|
+
# @return [Array<String | Fixnum>]
|
51
|
+
attr_reader :prerelease
|
52
|
+
|
53
|
+
|
54
|
+
def initialize raw: nil, major:, minor:, patch:, prerelease:
|
55
|
+
@raw = raw
|
56
|
+
@major = major
|
57
|
+
@minor = minor
|
58
|
+
@patch = patch
|
59
|
+
@prerelease = prerelease
|
60
|
+
end # #initialize
|
61
|
+
|
62
|
+
|
63
|
+
# version without prerelease
|
64
|
+
def release
|
65
|
+
[@major, @minor, @patch].join '.'
|
66
|
+
end # #release
|
67
|
+
|
68
|
+
|
69
|
+
def to_hash
|
70
|
+
{
|
71
|
+
raw: @raw,
|
72
|
+
major: @major,
|
73
|
+
minor: @minor,
|
74
|
+
patch: @patch,
|
75
|
+
prerelease: @prerelease,
|
76
|
+
release: release,
|
77
|
+
}
|
78
|
+
end # #to_hash
|
79
|
+
|
80
|
+
|
81
|
+
def merge **changes
|
82
|
+
self.class.new **to_hash.omit(:raw, :release).merge(**changes)
|
83
|
+
end # #merge
|
84
|
+
|
85
|
+
# ruby inter-op
|
86
|
+
# ------------------------------------------------------------------------
|
87
|
+
|
88
|
+
def to_json options
|
89
|
+
QB::AnsibleModule.stringify_keys(to_hash).to_json options
|
90
|
+
end # #to_json
|
91
|
+
end # Version
|
92
|
+
|
93
|
+
|
94
|
+
# abstract base class for bumpers - classes that implement reading and
|
95
|
+
# writing Version objects to a package directory.
|
96
|
+
class Bumper
|
97
|
+
# absolute path to the root directory of the package.
|
98
|
+
#
|
99
|
+
# @return [String]
|
100
|
+
attr_reader :package_dir
|
101
|
+
|
102
|
+
# absolute file paths that are relevant to a version bump.
|
103
|
+
# used when doing a `git add` to commit changes to the version.
|
104
|
+
#
|
105
|
+
# @return [Array<String>]
|
106
|
+
attr_reader :files
|
107
|
+
|
108
|
+
# current Version the package is at (before bump).
|
109
|
+
#
|
110
|
+
# **DOES NOT** get updated when {#bump} is called.
|
111
|
+
#
|
112
|
+
# @return [Version]
|
113
|
+
attr_reader :current
|
114
|
+
|
115
|
+
|
116
|
+
def initialize package_dir:, files:
|
117
|
+
@package_dir = package_dir
|
118
|
+
@files = files
|
119
|
+
end # #initialize
|
120
|
+
end # Bumper
|
121
|
+
|
122
|
+
|
123
|
+
class NodeBumper < Bumper
|
124
|
+
|
125
|
+
def self.parse version_string
|
126
|
+
js = <<-END
|
127
|
+
var semver = require('semver');
|
128
|
+
var parsed = semver(#{ JSON.dump version_string});
|
129
|
+
var json = JSON.stringify(parsed, null, 2);
|
130
|
+
|
131
|
+
console.log(json);
|
132
|
+
END
|
133
|
+
|
134
|
+
obj = JSON.load(
|
135
|
+
Cmds.new("node --eval %s", chdir: QB::ROOT.to_s).chomp!(js)
|
136
|
+
)
|
137
|
+
|
138
|
+
Version.new raw: obj['raw'],
|
139
|
+
major: obj['major'],
|
140
|
+
minor: obj['minor'],
|
141
|
+
patch: obj['patch'],
|
142
|
+
prerelease: obj['prerelease']
|
143
|
+
end # .parse
|
144
|
+
|
145
|
+
|
146
|
+
def self.format version
|
147
|
+
"#{ version.release }-#{ version.prerelease.join '.' }"
|
148
|
+
end
|
149
|
+
|
150
|
+
|
151
|
+
def initialize package_dir:
|
152
|
+
@package_json_path = File.join(package_dir, 'package.json')
|
153
|
+
|
154
|
+
super package_dir: package_dir, files: [@package_json_path]
|
155
|
+
|
156
|
+
@package_json = JSON.load File.read(@package_json_path)
|
157
|
+
@current = self.class.parse @package_json.fetch('version')
|
158
|
+
end # #initialize
|
159
|
+
|
160
|
+
|
161
|
+
def bump! **merge
|
162
|
+
next_version = @current.merge **merge
|
163
|
+
|
164
|
+
# bump the version in package.json using yarn
|
165
|
+
Cmds.new(
|
166
|
+
"yarn version <%= opts %>",
|
167
|
+
chdir: @package_dir,
|
168
|
+
kwds: {
|
169
|
+
opts: {
|
170
|
+
'new-version': self.class.format(next_version),
|
171
|
+
'no-git-tag-version': true,
|
172
|
+
}
|
173
|
+
}
|
174
|
+
).stream!
|
175
|
+
|
176
|
+
next_version
|
177
|
+
end # #bump!
|
178
|
+
|
179
|
+
end # NodeBumper
|
180
|
+
|
181
|
+
|
182
|
+
class Bump < QB::AnsibleModule
|
183
|
+
|
184
|
+
def check_repo_clean!
|
185
|
+
unless Cmds.chomp!('git status --porcelain 2>/dev/null') == ''
|
186
|
+
raise "can not bump a dirty repo"
|
187
|
+
end
|
188
|
+
end # #check_repo_clean!
|
189
|
+
|
190
|
+
|
191
|
+
def next_rc
|
192
|
+
re = /^#{ Regexp.escape(@tag_prefix + @bumper.current.release) }-rc\.(\d+)$/
|
193
|
+
|
194
|
+
result = 0
|
195
|
+
|
196
|
+
Cmds.new("git tag", chdir: @repo_root).chomp!.lines.each {|tag|
|
197
|
+
if m = re.match(tag.chomp)
|
198
|
+
succ = m[1].to_i.succ
|
199
|
+
|
200
|
+
result = succ if succ > result
|
201
|
+
end
|
202
|
+
}
|
203
|
+
|
204
|
+
result
|
205
|
+
end # #next_rc
|
206
|
+
|
207
|
+
|
208
|
+
def bump_rc
|
209
|
+
@next_version = @bumper.bump! prerelease: ['rc', next_rc]
|
210
|
+
@next_version_formatted = @bumper.class.format @next_version
|
211
|
+
|
212
|
+
# add the files
|
213
|
+
Cmds.new(
|
214
|
+
"git add <%= *args %>", chdir: @repo_root
|
215
|
+
).stream! *@bumper.files
|
216
|
+
|
217
|
+
# commit the changes
|
218
|
+
Cmds.new(
|
219
|
+
"git commit %{opts}",
|
220
|
+
chdir: @repo_root,
|
221
|
+
).stream! opts: {
|
222
|
+
m: "bump #{ @rel_path.to_s } to #{ @next_version_formatted }"
|
223
|
+
}
|
224
|
+
|
225
|
+
# create tag
|
226
|
+
@tag = @tag_prefix + @next_version_formatted
|
227
|
+
Cmds.new("git tag %s", chdir: @repo_root).stream! @tag
|
228
|
+
|
229
|
+
# push tag
|
230
|
+
Cmds.new("git push origin %s", chdir: @repo_root).stream! @tag
|
231
|
+
end # #bump_rc
|
232
|
+
|
233
|
+
|
234
|
+
def main
|
235
|
+
# check_repo_clean!
|
236
|
+
|
237
|
+
@package_dir = File.realpath @args.fetch('package_dir')
|
238
|
+
@level = @args.fetch 'level'
|
239
|
+
|
240
|
+
@repo_root = Cmds.new(
|
241
|
+
"git rev-parse --show-toplevel", chdir: @package_dir
|
242
|
+
).chomp!
|
243
|
+
|
244
|
+
@rel_path = Pathname.new(@package_dir).realpath.relative_path_from(
|
245
|
+
Pathname.new(@repo_root).realpath
|
246
|
+
).to_s
|
247
|
+
|
248
|
+
@tag_prefix = if @rel_path == '.'
|
249
|
+
'v'
|
250
|
+
else
|
251
|
+
"#{ @rel_path }/v"
|
252
|
+
end
|
253
|
+
|
254
|
+
@bumper = NodeBumper.new package_dir: @package_dir
|
255
|
+
|
256
|
+
case @level
|
257
|
+
when 'rc'
|
258
|
+
bump_rc
|
259
|
+
else
|
260
|
+
raise "bad level: #{ @level.inspect }"
|
261
|
+
end
|
262
|
+
|
263
|
+
{
|
264
|
+
current: @bumper.current,
|
265
|
+
next_version: @next_version,
|
266
|
+
tag: @tag,
|
267
|
+
}
|
268
|
+
end
|
269
|
+
|
270
|
+
end # Bump
|
271
|
+
|
272
|
+
Bump.new.run
|
@@ -0,0 +1,74 @@
|
|
1
|
+
---
|
2
|
+
# meta/qb.yml file for bump
|
3
|
+
#
|
4
|
+
# qb settings for this role. see README.md for more info.
|
5
|
+
#
|
6
|
+
|
7
|
+
# description of the role to show in it's help output.
|
8
|
+
description: >-
|
9
|
+
bump a service to the next version, committing the change and tagging the
|
10
|
+
commit.
|
11
|
+
|
12
|
+
# prefix for role variables
|
13
|
+
var_prefix: null
|
14
|
+
|
15
|
+
# how to get a default for `dir` if it's not provided as the only
|
16
|
+
# positional argument. if a positional argument is provided it will
|
17
|
+
# override the method defined here.
|
18
|
+
#
|
19
|
+
# options:
|
20
|
+
#
|
21
|
+
# - null
|
22
|
+
# - require the value on the command line.
|
23
|
+
# - false
|
24
|
+
# - don't provide qb_dir (means doesn't load or save options either).
|
25
|
+
# - git_root
|
26
|
+
# - use the git root fof the directory that the `qb` command is invoked
|
27
|
+
# from. useful for 'project-centric' commands so they can be invoked
|
28
|
+
# from anywhere in the repo.
|
29
|
+
# - cwd
|
30
|
+
# - use the directory the `qb` command is invoked form.
|
31
|
+
# - {exe: PATH}
|
32
|
+
# - invoke an execuable, passing a JSON serialization of the options
|
33
|
+
# mapping their CLI names to values. path can be relative to role
|
34
|
+
# directory.
|
35
|
+
# - {find_up: FILENAME}
|
36
|
+
# - starting at the current direcotry and climbing up to parent
|
37
|
+
# directories, use the first one that contains FILENAME. error
|
38
|
+
# if none is found.
|
39
|
+
default_dir: null
|
40
|
+
|
41
|
+
# default user to become for play
|
42
|
+
default_user: null
|
43
|
+
|
44
|
+
# set to false to not save options in .qb-options.yml files
|
45
|
+
save_options: false
|
46
|
+
|
47
|
+
# options to pass to ansible-playbook
|
48
|
+
ansible_options: {}
|
49
|
+
|
50
|
+
# examples:
|
51
|
+
# - |
|
52
|
+
# here here
|
53
|
+
#
|
54
|
+
# there there
|
55
|
+
|
56
|
+
options: # []
|
57
|
+
# - name: example
|
58
|
+
# description: an example of a variable.
|
59
|
+
# required: false
|
60
|
+
# type: boolean # boolean (default) | string
|
61
|
+
# short: e
|
62
|
+
|
63
|
+
- name: level
|
64
|
+
description: the version level to bump.
|
65
|
+
required: true
|
66
|
+
type:
|
67
|
+
one_of:
|
68
|
+
- major
|
69
|
+
- minor
|
70
|
+
- patch
|
71
|
+
- release
|
72
|
+
- rc
|
73
|
+
- dev
|
74
|
+
short: t
|
@@ -0,0 +1,80 @@
|
|
1
|
+
---
|
2
|
+
- debug:
|
3
|
+
msg: bumping to the next development (dev) version...
|
4
|
+
|
5
|
+
- when: bump_current_version.level not in ['rc', 'release']
|
6
|
+
fail:
|
7
|
+
msg: >-
|
8
|
+
the frontend service version must have level 'rc' (form `M.m.p-rc.R`) or
|
9
|
+
'release' (form `M.m.p`), found {{ bump_current_version.raw }}
|
10
|
+
|
11
|
+
- block: # the next version and commit message depend on the level of the
|
12
|
+
# current version
|
13
|
+
|
14
|
+
- when: bump_current_version.level == 'rc'
|
15
|
+
name: >-
|
16
|
+
the next_version is the current release with a 'dev' prerelease
|
17
|
+
set_fact:
|
18
|
+
bump_next_version: "{{ bump_current_version.release }}-dev"
|
19
|
+
bump_commit_message: drop version level back down to dev
|
20
|
+
|
21
|
+
- when: bump_current_version.level == 'release'
|
22
|
+
name: >-
|
23
|
+
the next version is the current release with the patch incremented and
|
24
|
+
a 'dev' prerelease. example: 0.1.2 => 0.1.3-dev
|
25
|
+
set_fact:
|
26
|
+
bump_next_version: >-
|
27
|
+
{{
|
28
|
+
[
|
29
|
+
bump_current_version.major,
|
30
|
+
bump_current_version.minor,
|
31
|
+
bump_current_version.patch + 1
|
32
|
+
] | join('.') + '-dev'
|
33
|
+
}}
|
34
|
+
bump_commit_message: >-
|
35
|
+
start development on version {{
|
36
|
+
[
|
37
|
+
bump_current_version.major,
|
38
|
+
bump_current_version.minor,
|
39
|
+
bump_current_version.patch + 1
|
40
|
+
] | join('.')
|
41
|
+
}}
|
42
|
+
|
43
|
+
# /block
|
44
|
+
|
45
|
+
- name: >-
|
46
|
+
use yarn to set version in frontend/package.json
|
47
|
+
to {{ bump_next_version }}
|
48
|
+
shell: |-
|
49
|
+
yarn version \
|
50
|
+
--no-git-tag-version \
|
51
|
+
--new-version {{ bump_next_version | quote }}
|
52
|
+
args:
|
53
|
+
chdir: "{{ bump_frontend_dir }}"
|
54
|
+
|
55
|
+
- name: >-
|
56
|
+
add frontend/package.json changes in git
|
57
|
+
shell: >-
|
58
|
+
git add frontend/package.json
|
59
|
+
args:
|
60
|
+
chdir: "{{ bump_repo_root }}"
|
61
|
+
|
62
|
+
- name: >-
|
63
|
+
commit frontend/package.json changes in git
|
64
|
+
shell: >-
|
65
|
+
git commit -m {{ bump_commit_message | quote }}
|
66
|
+
args:
|
67
|
+
chdir: "{{ bump_repo_root }}"
|
68
|
+
|
69
|
+
- name: >-
|
70
|
+
push changes in git
|
71
|
+
shell: >-
|
72
|
+
git push
|
73
|
+
args:
|
74
|
+
chdir: "{{ bump_repo_root }}"
|
75
|
+
|
76
|
+
# done!
|
77
|
+
|
78
|
+
- debug:
|
79
|
+
msg: >-
|
80
|
+
bumped version to dev.
|
@@ -0,0 +1,120 @@
|
|
1
|
+
---
|
2
|
+
- debug:
|
3
|
+
msg: bumping to the next release candidate (rc) version...
|
4
|
+
|
5
|
+
- name: >-
|
6
|
+
set rc_tag_prefix to 'frontend/v'
|
7
|
+
set_fact:
|
8
|
+
bump_rc_tag_prefix: frontend/v
|
9
|
+
|
10
|
+
- name: >-
|
11
|
+
fail if unless the frontend service version level is 'dev' or 'rc'
|
12
|
+
fail:
|
13
|
+
msg: >
|
14
|
+
the frontend version must be 'dev' (form `M.m.p-dev`) or 'rc'
|
15
|
+
(form `M.m.p-rc.R`), found {{ bump_current_version.raw }}
|
16
|
+
when: bump_current_version.level not in ['dev', 'rc']
|
17
|
+
|
18
|
+
- name: >-
|
19
|
+
check that the repo is clean of any untracked or changed files
|
20
|
+
include_role:
|
21
|
+
name: qb.git_check_clean
|
22
|
+
vars:
|
23
|
+
git_check_clean_dir: "{{ bump_repo_root }}"
|
24
|
+
|
25
|
+
- name: >-
|
26
|
+
get the git tags
|
27
|
+
shell: git tag
|
28
|
+
args:
|
29
|
+
chdir: "{{ bump_repo_root }}"
|
30
|
+
register: bump_git_tags
|
31
|
+
changed_when: false
|
32
|
+
|
33
|
+
- name: >-
|
34
|
+
find the next rc number, which is the lowest integer R such that
|
35
|
+
'{{ bump_rc_tag_prefix }}{{ bump_current_version.release }}-rc.R'
|
36
|
+
is a tag, or 0 if there are no such tags.
|
37
|
+
vars.rb:
|
38
|
+
namespace: bump
|
39
|
+
bind:
|
40
|
+
tags: "{{ bump_git_tags.stdout_lines }}"
|
41
|
+
current_release: "{{ bump_current_version.release }}"
|
42
|
+
tag_prefix: "{{ bump_rc_tag_prefix }}"
|
43
|
+
src: |
|
44
|
+
re = /^#{ Regexp.escape(tag_prefix + current_release) }-rc\.(\d+)$/
|
45
|
+
|
46
|
+
rc_number = 0
|
47
|
+
|
48
|
+
tags.each {|tag|
|
49
|
+
if m = re.match(tag)
|
50
|
+
succ = m[1].to_i.succ
|
51
|
+
|
52
|
+
rc_number = succ if succ > rc_number
|
53
|
+
end
|
54
|
+
}
|
55
|
+
|
56
|
+
{'rc_number' => rc_number}
|
57
|
+
|
58
|
+
- name: >-
|
59
|
+
set rc_version to the current release with '-rc.<rc_number>' appended
|
60
|
+
set_fact:
|
61
|
+
bump_rc_version: "{{ bump_current_version.release }}-rc.{{ bump_rc_number }}"
|
62
|
+
|
63
|
+
- name: >-
|
64
|
+
set rc_tag to rc_tag_prefix contactinated with the rc_version
|
65
|
+
set_fact:
|
66
|
+
bump_rc_tag: "{{ bump_rc_tag_prefix }}{{ bump_rc_version }}"
|
67
|
+
|
68
|
+
- name: >-
|
69
|
+
use yarn to bump the version in frontend/package.json
|
70
|
+
to {{ bump_rc_version }}
|
71
|
+
shell: |-
|
72
|
+
yarn version \
|
73
|
+
--no-git-tag-version \
|
74
|
+
--new-version {{ bump_rc_version }}
|
75
|
+
args:
|
76
|
+
chdir: "{{ bump_frontend_dir }}"
|
77
|
+
|
78
|
+
- name: >-
|
79
|
+
add frontend/package.json changes in git
|
80
|
+
shell: |-
|
81
|
+
git add frontend/package.json
|
82
|
+
args:
|
83
|
+
chdir: "{{ bump_repo_root }}"
|
84
|
+
|
85
|
+
- name: >-
|
86
|
+
commit frontend/package.json changes in git
|
87
|
+
shell: |-
|
88
|
+
git commit -m "bump frontend to {{ bump_rc_version }}"
|
89
|
+
args:
|
90
|
+
chdir: "{{ bump_repo_root }}"
|
91
|
+
|
92
|
+
- name: >-
|
93
|
+
tag commit as {{ bump_rc_tag }}
|
94
|
+
shell: |-
|
95
|
+
git tag {{ bump_rc_tag }}
|
96
|
+
args:
|
97
|
+
chdir: "{{ bump_repo_root }}"
|
98
|
+
|
99
|
+
- name: >-
|
100
|
+
push tag to origin
|
101
|
+
shell: |-
|
102
|
+
git push origin {{ bump_rc_tag }}
|
103
|
+
args:
|
104
|
+
chdir: "{{ bump_repo_root }}"
|
105
|
+
|
106
|
+
- debug:
|
107
|
+
msg: "DONE: bumped frontend to {{ bump_rc_version }}"
|
108
|
+
|
109
|
+
# TODO doesn't work... get's the path wrong as
|
110
|
+
#
|
111
|
+
# /Users/nrser/dev/gh/beiarea/www/frontend/main.yml
|
112
|
+
#
|
113
|
+
# shitty ansible.
|
114
|
+
#
|
115
|
+
# - name: kickoff frontend build...
|
116
|
+
# when: "{{ bump_build }}"
|
117
|
+
# include_role:
|
118
|
+
# name: build
|
119
|
+
# vars:
|
120
|
+
# build_service: "{{ bump_service }}"
|
@@ -0,0 +1,112 @@
|
|
1
|
+
---
|
2
|
+
- debug:
|
3
|
+
msg: bumping to release version...
|
4
|
+
|
5
|
+
# setup some variables...
|
6
|
+
|
7
|
+
- name: >-
|
8
|
+
bump_rc_tag is the git tag for the current rc version that we're making
|
9
|
+
the release off. it's format is 'frontend/v<bump_current_release>'
|
10
|
+
set_fact:
|
11
|
+
bump_rc_tag: "frontend/v{{ bump_current_version.raw }}"
|
12
|
+
|
13
|
+
- name: >-
|
14
|
+
bump_next_version is the version we're going to bump to, which is
|
15
|
+
just the release part of the current one (`M.m.p-rc.R` => `M.m.p`)
|
16
|
+
set_fact:
|
17
|
+
bump_next_version: "{{ bump_current_version.release }}"
|
18
|
+
|
19
|
+
- name: >-
|
20
|
+
bump_tag is the tag that will be used for the commit with the release
|
21
|
+
version in frontend/package.json. it's format is
|
22
|
+
'frontend/v<bump_next_version>'
|
23
|
+
set_fact:
|
24
|
+
bump_tag: "frontend/v{{ bump_next_version }}"
|
25
|
+
|
26
|
+
- name: >-
|
27
|
+
bump_commit_message is the message that will be used for the commit that
|
28
|
+
changes the version in frontend/package.json
|
29
|
+
set_fact:
|
30
|
+
bump_commit_message: >-
|
31
|
+
bump frontend to release version {{ bump_next_version }}
|
32
|
+
|
33
|
+
# check some prerequisities...
|
34
|
+
|
35
|
+
- when: bump_current_version.level not in ['rc']
|
36
|
+
fail:
|
37
|
+
msg: >-
|
38
|
+
the frontend service version must have level 'rc' (form `M.m.p-rc.R`),
|
39
|
+
found {{ bump_current_version.raw }}
|
40
|
+
|
41
|
+
- name: >-
|
42
|
+
check that the repo is clean of any untracked or changed files
|
43
|
+
include_role:
|
44
|
+
name: qb.git_check_clean
|
45
|
+
vars:
|
46
|
+
git_check_clean_dir: "{{ bump_repo_root }}"
|
47
|
+
|
48
|
+
- name: >-
|
49
|
+
get the tags for HEAD
|
50
|
+
shell: |-
|
51
|
+
git describe --exact-match --tags HEAD
|
52
|
+
args:
|
53
|
+
chdir: "{{ bump_repo_root }}"
|
54
|
+
register: bump_git_tags_at_head
|
55
|
+
changed_when: false
|
56
|
+
|
57
|
+
- when: bump_rc_tag not in bump_git_tags_at_head.stdout_lines
|
58
|
+
fail: >-
|
59
|
+
repo HEAD needs to be at {{ bump_rc_tag }} tag.
|
60
|
+
|
61
|
+
# do the work...
|
62
|
+
|
63
|
+
- name: >-
|
64
|
+
use yarn to bump the version in //frontend/package.json
|
65
|
+
to bump_next_version
|
66
|
+
shell: |-
|
67
|
+
yarn version \
|
68
|
+
--no-git-tag-version \
|
69
|
+
--new-version {{ bump_next_version | quote }}
|
70
|
+
args:
|
71
|
+
chdir: "{{ bump_frontend_dir }}"
|
72
|
+
|
73
|
+
- name: >-
|
74
|
+
add //frontend/package.json changes in git
|
75
|
+
shell: |-
|
76
|
+
git add frontend/package.json
|
77
|
+
args:
|
78
|
+
chdir: "{{ bump_repo_root }}"
|
79
|
+
|
80
|
+
- name: >-
|
81
|
+
commit //frontend/package.json changes in git
|
82
|
+
shell: |-
|
83
|
+
git commit -m {{ bump_commit_message | quote }}
|
84
|
+
args:
|
85
|
+
chdir: "{{ bump_repo_root }}"
|
86
|
+
|
87
|
+
- name: >-
|
88
|
+
tag commit as bump_tag
|
89
|
+
shell: |-
|
90
|
+
git tag {{ bump_tag | quote }}
|
91
|
+
args:
|
92
|
+
chdir: "{{ bump_repo_root }}"
|
93
|
+
|
94
|
+
- name: >-
|
95
|
+
push bump_tag to origin
|
96
|
+
shell: |-
|
97
|
+
git push origin {{ bump_tag }}
|
98
|
+
args:
|
99
|
+
chdir: "{{ bump_repo_root }}"
|
100
|
+
|
101
|
+
- name: >-
|
102
|
+
push repo
|
103
|
+
shell: |-
|
104
|
+
git push
|
105
|
+
args:
|
106
|
+
chdir: "{{ bump_repo_root }}"
|
107
|
+
|
108
|
+
# done!
|
109
|
+
|
110
|
+
- debug:
|
111
|
+
msg: >-
|
112
|
+
sucessfully bumped {{ bump_service }} to {{ bump_next_version }}
|
@@ -0,0 +1,22 @@
|
|
1
|
+
---
|
2
|
+
- debug:
|
3
|
+
msg: bumping frontend version...
|
4
|
+
|
5
|
+
- name:
|
6
|
+
set frontend_dir to {{ bump_repo_root }}/frontend
|
7
|
+
set_fact:
|
8
|
+
bump_frontend_dir: "{{ bump_repo_root }}/frontend"
|
9
|
+
|
10
|
+
- name: get frontend/package.json info
|
11
|
+
include_role:
|
12
|
+
name: qb.package_json_info
|
13
|
+
vars:
|
14
|
+
package_json_info_dir: "{{ bump_frontend_dir }}"
|
15
|
+
package_json_info_var: bump_frontend_package_json
|
16
|
+
|
17
|
+
- name: >
|
18
|
+
set frontend_version to the semver object
|
19
|
+
set_fact:
|
20
|
+
bump_current_version: "{{ bump_frontend_package_json.version }}"
|
21
|
+
|
22
|
+
- include: "level/{{ bump_level }}.yml"
|
@@ -0,0 +1,82 @@
|
|
1
|
+
---
|
2
|
+
# tasks file for bump
|
3
|
+
|
4
|
+
# set up variables...
|
5
|
+
|
6
|
+
- name: >-
|
7
|
+
get the repo root by cd'ing into bump_package_dir and asking git
|
8
|
+
shell: |-
|
9
|
+
git rev-parse --show-toplevel
|
10
|
+
args:
|
11
|
+
chdir: "{{ bump_package_dir }}"
|
12
|
+
register: bump_git_revparse_showtoplevel
|
13
|
+
|
14
|
+
- name: >-
|
15
|
+
bump_repo_root is the stdout line from bump_git_revparse_showtoplevel
|
16
|
+
set_fact:
|
17
|
+
bump_repo_root: "{{ bump_git_revparse_showtoplevel.stdout_lines[0] }}"
|
18
|
+
|
19
|
+
- name: >-
|
20
|
+
bump_tag_prefix is simply 'v' if the the package dir is the repo root,
|
21
|
+
otherwise it's the relative path to the package dir from the repo root
|
22
|
+
with '/v' appended.
|
23
|
+
set_fact_with_ruby:
|
24
|
+
var_name: bump_tag_prefix
|
25
|
+
bind:
|
26
|
+
repo_root: "{{ bump_repo_root }}"
|
27
|
+
package_dir: "{{ bump_package_dir }}"
|
28
|
+
src: |
|
29
|
+
require 'pathname'
|
30
|
+
|
31
|
+
repo_root_pathname = Pathname.new(repo_root).realpath
|
32
|
+
package_dir_pathname = Pathname.new(package_dir).realpath
|
33
|
+
|
34
|
+
if repo_root_pathname == package_dir_pathname
|
35
|
+
'v'
|
36
|
+
else
|
37
|
+
package_dir_pathname.
|
38
|
+
relative_path_from(repo_root_pathname).
|
39
|
+
join('v')
|
40
|
+
.to_s
|
41
|
+
end
|
42
|
+
|
43
|
+
- name: >-
|
44
|
+
bump_package_type is determined by looking at the contents of package_dir
|
45
|
+
for known package files.
|
46
|
+
set_fact_with_ruby:
|
47
|
+
var_name: bump_package_type
|
48
|
+
bind:
|
49
|
+
package_dir: "{{ bump_package_dir }}"
|
50
|
+
src: |
|
51
|
+
require 'pathname'
|
52
|
+
|
53
|
+
dir = Pathname.new package_dir
|
54
|
+
|
55
|
+
found_types = []
|
56
|
+
|
57
|
+
# node packages (npm / yarn)
|
58
|
+
if dir.join('package.json').file?
|
59
|
+
found_types << :node
|
60
|
+
end
|
61
|
+
|
62
|
+
gemspec_pathnames = Pathname.glob(dir + '*.gemspec')
|
63
|
+
unless gemspec_pathnames.empty?
|
64
|
+
if gemspec_pathnames.length > 1
|
65
|
+
warn "multiple gemspecs found, skipping gem type",
|
66
|
+
files: gemspec_pathnames
|
67
|
+
end
|
68
|
+
|
69
|
+
found_types << :gem
|
70
|
+
end
|
71
|
+
|
72
|
+
if dir.join('VERSION').file?
|
73
|
+
found_types << :file
|
74
|
+
end
|
75
|
+
|
76
|
+
case found_types.length
|
77
|
+
|
78
|
+
- debug: var=bump_package_type
|
79
|
+
|
80
|
+
# include a tasks file based on the type of package
|
81
|
+
|
82
|
+
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: qb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.57
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- nrser
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-04-
|
11
|
+
date: 2017-04-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: bundler
|
@@ -276,6 +276,7 @@ files:
|
|
276
276
|
- roles/nrser.blockinfile/tests/test-replace.yml
|
277
277
|
- roles/nrser.blockinfile/tests/test-state.yml
|
278
278
|
- roles/nrser.rb/.gitignore
|
279
|
+
- roles/nrser.rb/library/set_fact_with_ruby.rb
|
279
280
|
- roles/nrser.rb/library/sync.rb.rb
|
280
281
|
- roles/nrser.rb/library/vars.rb.rb
|
281
282
|
- roles/nrser.rb/meta/main.yml
|
@@ -306,6 +307,17 @@ files:
|
|
306
307
|
- roles/qb.build_gem/defaults/main.yml
|
307
308
|
- roles/qb.build_gem/meta/main.yml
|
308
309
|
- roles/qb.build_gem/tasks/main.yml
|
310
|
+
- roles/qb.bump/.qb-options.yml
|
311
|
+
- roles/qb.bump/README.md
|
312
|
+
- roles/qb.bump/defaults/main.yml
|
313
|
+
- roles/qb.bump/library/bump
|
314
|
+
- roles/qb.bump/meta/main.yml
|
315
|
+
- roles/qb.bump/meta/qb.yml
|
316
|
+
- roles/qb.bump/tasks/frontend/level/dev.yml
|
317
|
+
- roles/qb.bump/tasks/frontend/level/rc.yml
|
318
|
+
- roles/qb.bump/tasks/frontend/level/release.yml
|
319
|
+
- roles/qb.bump/tasks/frontend/main.yml
|
320
|
+
- roles/qb.bump/tasks/main.yml
|
309
321
|
- roles/qb.gem/.qb-options.yml
|
310
322
|
- roles/qb.gem/defaults/main.yml
|
311
323
|
- roles/qb.gem/files/.gitkeep
|