qb 0.1.56 → 0.1.57

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: a3ccd247eed4ac55327f18af1328683369b781c8
4
- data.tar.gz: 036e4e71a58d83a99137b27c61e44a6bbbf99247
3
+ metadata.gz: 4995bf75df88c4e41eb0d9faf8d87df23a46715b
4
+ data.tar.gz: 5840addfe4c798eac0cc9cfef8686448e6eefb15
5
5
  SHA512:
6
- metadata.gz: b9034e575a08fd1fffb4973fcc5f7c4e3a7055927c8bf07be2cf01e828a3d314cee408b283223cf4458e14dc4217f603d7ba37aaccc84f912022b2a1ba28b39e
7
- data.tar.gz: 2593c3192c626701c2017d51c55cdf30df3359c52245acf69a09616f5e47ea635fff64865d14845bd783eade72cff24d1524420c9dc054ddda68747d85e372fc
6
+ metadata.gz: f62010e8cbb650069092df7095b78f733fe5f71a6a462f6bbbbcebe5e36791c69167423d8e6fd4ac8cb0c003090b68bb988d63499dbbe5ab8b2606076845bf57
7
+ data.tar.gz: de0962656f44993001f4f6393aa7eefc5fb1356a97942ed128bc9fb6377342929f9f7509621834e9b2132398b41da34229946a261a510e833c29dc21fad46809
@@ -1,7 +1,7 @@
1
1
  module QB
2
2
  GEM_NAME = 'qb'
3
3
 
4
- VERSION = "0.1.56"
4
+ VERSION = "0.1.57"
5
5
 
6
6
  def self.gemspec
7
7
  Gem.loaded_specs[GEM_NAME]
@@ -81,9 +81,12 @@ def semver_parse(version):
81
81
  )
82
82
 
83
83
  if version['is_release']:
84
- version['type'] = 'release'
84
+ version['level'] = 'release'
85
85
  else:
86
- version['type'] = version['prerelease'][0]
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,5 @@
1
+ ---
2
+ qb.qb_role:
3
+ modules:
4
+ - bump
5
+ readme: true
@@ -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,7 @@
1
+ ---
2
+ # defaults file for bump
3
+
4
+ # get the repo root from qb if it wasn't provided
5
+ bump_repo_root: "{{ qb_git_repo_root }}"
6
+
7
+ bump_package_dir: "{{ qb_dir }}"
@@ -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,9 @@
1
+ ---
2
+ # meta file for bump
3
+
4
+ allow_duplicates: yes
5
+
6
+ dependencies: # []
7
+ # - role: role-name
8
+ - role: nrser.rb
9
+
@@ -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.56
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-12 00:00:00.000000000 Z
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