devops_assist 0.1.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 +7 -0
- data/.rspec +3 -0
- data/Gemfile +16 -0
- data/Gemfile.lock +69 -0
- data/README.md +35 -0
- data/Rakefile +10 -0
- data/bin/console +15 -0
- data/bin/setup +8 -0
- data/devops_assist.gemspec +46 -0
- data/lib/Rakefile +9 -0
- data/lib/devops_assist/gem/gem.rb +151 -0
- data/lib/devops_assist/gem/gemspec.rb +28 -0
- data/lib/devops_assist/release_log/release_log.rb +164 -0
- data/lib/devops_assist/vcs/git/cli_prompt.rb +14 -0
- data/lib/devops_assist/vcs/vcs.rb +0 -0
- data/lib/devops_assist/version.rb +5 -0
- data/lib/devops_assist/version_manager.rb +47 -0
- data/lib/devops_assist.rb +23 -0
- data/tasks/devops_assist.rake +68 -0
- data/tasks/gem.rake +81 -0
- data/tasks/vcs.rake +64 -0
- metadata +146 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 9341a00d87166f5a645d2d24b70554c4570a902f0349791c18ac17888ec935c6
|
4
|
+
data.tar.gz: d82621277b2d51615f4aa9f5dfb1e7e1bfcdc4951735fa87344b327e90f76a15
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 3c370df28626241e94c31b66aff7b36bca11ba78ccc78d5af9f62f4a8b3144ecaccbae6fb3993114d68c599d855944e458c0e82c6b376b462de7051305bc2f16
|
7
|
+
data.tar.gz: c59c1009ab2dae931096a9d6632aa14b0b0729cafdfa740a9c0469dbf3e8a5b7b95a6c9d31030329d7b7d522ee5beb4d73246351bb0d2844acb755fa6793cfb5
|
data/.rspec
ADDED
data/Gemfile
ADDED
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
source "https://rubygems.org"
|
4
|
+
|
5
|
+
# Specify your gem's dependencies in devops_assist.gemspec
|
6
|
+
gemspec
|
7
|
+
|
8
|
+
gem "rake", "~> 13.0"
|
9
|
+
|
10
|
+
gem "rspec", "~> 3.0"
|
11
|
+
|
12
|
+
#gem "git_cli", path: '../../git/git_cli'
|
13
|
+
#gem "git_cli_prompt", path: '../../git/git_cli_prompt'
|
14
|
+
#
|
15
|
+
#gem 'toolrack', path: '../../WIP/toolrack'
|
16
|
+
|
data/Gemfile.lock
ADDED
@@ -0,0 +1,69 @@
|
|
1
|
+
PATH
|
2
|
+
remote: .
|
3
|
+
specs:
|
4
|
+
devops_assist (0.1.0)
|
5
|
+
git_cli
|
6
|
+
git_cli_prompt
|
7
|
+
gvcs
|
8
|
+
tlogger
|
9
|
+
toolrack
|
10
|
+
tty-prompt
|
11
|
+
|
12
|
+
GEM
|
13
|
+
remote: https://rubygems.org/
|
14
|
+
specs:
|
15
|
+
base58 (0.2.3)
|
16
|
+
diff-lcs (1.4.4)
|
17
|
+
git_cli (0.9.0)
|
18
|
+
gvcs
|
19
|
+
ptools (~> 1.4.0)
|
20
|
+
tlogger
|
21
|
+
toolrack
|
22
|
+
git_cli_prompt (0.2.0)
|
23
|
+
tlogger
|
24
|
+
toolrack
|
25
|
+
tty-prompt
|
26
|
+
gvcs (0.1.0)
|
27
|
+
pastel (0.8.0)
|
28
|
+
tty-color (~> 0.5)
|
29
|
+
ptools (1.4.2)
|
30
|
+
rake (13.0.6)
|
31
|
+
rspec (3.10.0)
|
32
|
+
rspec-core (~> 3.10.0)
|
33
|
+
rspec-expectations (~> 3.10.0)
|
34
|
+
rspec-mocks (~> 3.10.0)
|
35
|
+
rspec-core (3.10.1)
|
36
|
+
rspec-support (~> 3.10.0)
|
37
|
+
rspec-expectations (3.10.1)
|
38
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
39
|
+
rspec-support (~> 3.10.0)
|
40
|
+
rspec-mocks (3.10.2)
|
41
|
+
diff-lcs (>= 1.2.0, < 2.0)
|
42
|
+
rspec-support (~> 3.10.0)
|
43
|
+
rspec-support (3.10.2)
|
44
|
+
tlogger (0.26.1)
|
45
|
+
toolrack (0.16.0)
|
46
|
+
base58
|
47
|
+
tlogger
|
48
|
+
tty-color (0.6.0)
|
49
|
+
tty-cursor (0.7.1)
|
50
|
+
tty-prompt (0.23.1)
|
51
|
+
pastel (~> 0.8)
|
52
|
+
tty-reader (~> 0.8)
|
53
|
+
tty-reader (0.9.0)
|
54
|
+
tty-cursor (~> 0.7)
|
55
|
+
tty-screen (~> 0.8)
|
56
|
+
wisper (~> 2.0)
|
57
|
+
tty-screen (0.8.1)
|
58
|
+
wisper (2.0.1)
|
59
|
+
|
60
|
+
PLATFORMS
|
61
|
+
x86_64-linux
|
62
|
+
|
63
|
+
DEPENDENCIES
|
64
|
+
devops_assist!
|
65
|
+
rake (~> 13.0)
|
66
|
+
rspec (~> 3.0)
|
67
|
+
|
68
|
+
BUNDLED WITH
|
69
|
+
2.2.28
|
data/README.md
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
# DevopsAssist
|
2
|
+
|
3
|
+
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/devops_assist`. To experiment with that code, run `bin/console` for an interactive prompt.
|
4
|
+
|
5
|
+
TODO: Delete this and the text above, and describe your gem
|
6
|
+
|
7
|
+
## Installation
|
8
|
+
|
9
|
+
Add this line to your application's Gemfile:
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
gem 'devops_assist'
|
13
|
+
```
|
14
|
+
|
15
|
+
And then execute:
|
16
|
+
|
17
|
+
$ bundle install
|
18
|
+
|
19
|
+
Or install it yourself as:
|
20
|
+
|
21
|
+
$ gem install devops_assist
|
22
|
+
|
23
|
+
## Usage
|
24
|
+
|
25
|
+
TODO: Write usage instructions here
|
26
|
+
|
27
|
+
## Development
|
28
|
+
|
29
|
+
After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
|
30
|
+
|
31
|
+
To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
|
32
|
+
|
33
|
+
## Contributing
|
34
|
+
|
35
|
+
Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/devops_assist.
|
data/Rakefile
ADDED
data/bin/console
ADDED
@@ -0,0 +1,15 @@
|
|
1
|
+
#!/usr/bin/env ruby
|
2
|
+
# frozen_string_literal: true
|
3
|
+
|
4
|
+
require "bundler/setup"
|
5
|
+
require "devops_assist"
|
6
|
+
|
7
|
+
# You can add fixtures and/or initialization code here to make experimenting
|
8
|
+
# with your gem easier. You can also use a different console, if you like.
|
9
|
+
|
10
|
+
# (If you use this, don't forget to add pry to your Gemfile!)
|
11
|
+
# require "pry"
|
12
|
+
# Pry.start
|
13
|
+
|
14
|
+
require "irb"
|
15
|
+
IRB.start(__FILE__)
|
data/bin/setup
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "lib/devops_assist/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |spec|
|
6
|
+
spec.name = "devops_assist"
|
7
|
+
spec.version = DevopsAssist::VERSION
|
8
|
+
spec.authors = ["Chris Liaw"]
|
9
|
+
spec.email = ["chrisliaw@antrapol.com"]
|
10
|
+
|
11
|
+
spec.summary = ""
|
12
|
+
spec.description = ""
|
13
|
+
spec.homepage = ""
|
14
|
+
spec.required_ruby_version = ">= 2.4.0"
|
15
|
+
|
16
|
+
#spec.metadata["allowed_push_host"] = "TODO: Set to your gem server 'https://example.com'"
|
17
|
+
|
18
|
+
#spec.metadata["homepage_uri"] = spec.homepage
|
19
|
+
#spec.metadata["source_code_uri"] = "TODO: Put your gem's public repo URL here."
|
20
|
+
#spec.metadata["changelog_uri"] = "TODO: Put your gem's CHANGELOG.md URL here."
|
21
|
+
|
22
|
+
# Specify which files should be added to the gem when it is released.
|
23
|
+
# The `git ls-files -z` loads the files in the RubyGem that have been added into git.
|
24
|
+
spec.files = Dir.chdir(File.expand_path(__dir__)) do
|
25
|
+
`git ls-files -z`.split("\x0").reject do |f|
|
26
|
+
(f == __FILE__) || f.match(%r{\A(?:(?:test|spec|features)/|\.(?:git|travis|circleci)|appveyor)})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
spec.bindir = "exe"
|
30
|
+
spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
|
31
|
+
spec.require_paths = ["lib"]
|
32
|
+
|
33
|
+
spec.add_dependency 'toolrack'
|
34
|
+
spec.add_dependency 'tlogger'
|
35
|
+
spec.add_dependency 'tty-prompt'
|
36
|
+
|
37
|
+
spec.add_dependency 'gvcs'
|
38
|
+
spec.add_dependency 'git_cli'
|
39
|
+
spec.add_dependency 'git_cli_prompt'
|
40
|
+
|
41
|
+
# Uncomment to register a new dependency of your gem
|
42
|
+
# spec.add_dependency "example-gem", "~> 1.0"
|
43
|
+
|
44
|
+
# For more information and examples about making a new gem, checkout our
|
45
|
+
# guide at: https://bundler.io/guides/creating_gem.html
|
46
|
+
end
|
data/lib/Rakefile
ADDED
@@ -0,0 +1,151 @@
|
|
1
|
+
|
2
|
+
require 'yaml'
|
3
|
+
|
4
|
+
require_relative 'gemspec'
|
5
|
+
|
6
|
+
module DevopsAssist
|
7
|
+
module Gem
|
8
|
+
include TR::CondUtils
|
9
|
+
include Gemspec
|
10
|
+
|
11
|
+
class GemError < StandardError; end
|
12
|
+
|
13
|
+
def update_gem_version(root, newVersion, &block)
|
14
|
+
|
15
|
+
version_file = find_gem_version_file(root)
|
16
|
+
|
17
|
+
if version_file.length > 1
|
18
|
+
if block
|
19
|
+
selVerFile = block.call(:select_version_file, version_file)
|
20
|
+
raise GemError, "Multiple version files found and user not selected any"
|
21
|
+
else
|
22
|
+
raise GemError, "Multiple version files found. Please provide a block to select version file or make sure there is no other file named version.rb"
|
23
|
+
end
|
24
|
+
else
|
25
|
+
selVerFile = version_file.first
|
26
|
+
end
|
27
|
+
|
28
|
+
tmpFile = File.join(File.dirname(selVerFile),"version.rb.tmp")
|
29
|
+
FileUtils.mv(selVerFile,tmpFile)
|
30
|
+
|
31
|
+
File.open(selVerFile,"w") do |f|
|
32
|
+
File.open(tmpFile,"r").each_line do |l|
|
33
|
+
if l =~ /VERSION/
|
34
|
+
indx = (l =~ /=/)
|
35
|
+
ll = "#{l[0..indx]} \"#{newVersion}\""
|
36
|
+
f.puts ll
|
37
|
+
else
|
38
|
+
f.write l
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
FileUtils.rm tmpFile
|
44
|
+
|
45
|
+
selVerFile
|
46
|
+
|
47
|
+
end
|
48
|
+
|
49
|
+
def find_gem_version_file(root)
|
50
|
+
if is_empty?(root)
|
51
|
+
raise GemError, "Root path '#{root}' to find_gem_version_file is empty"
|
52
|
+
else
|
53
|
+
Dir.glob(File.join(root,"**/version.rb"))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
def publish_gem(version, opts = { }, &block)
|
59
|
+
|
60
|
+
cred = find_rubygems_api_key
|
61
|
+
|
62
|
+
selAcct = cred.keys.first
|
63
|
+
if cred.keys.length > 1
|
64
|
+
logger.tdebug :pubgem, "Multiple rubygems account detected."
|
65
|
+
# multiple account configured...
|
66
|
+
selAcct = block.call(:multiple_rubygems_account, cred)
|
67
|
+
return :skipped if selAcct == :skip
|
68
|
+
raise GemError, "No rubygems account is selected." if is_empty?(selAcct)
|
69
|
+
end
|
70
|
+
|
71
|
+
# find the package
|
72
|
+
root = opts[:root] || Dir.getwd
|
73
|
+
foundGem = Dir.glob("**/*-#{version}.gem")
|
74
|
+
if foundGem.length == 0
|
75
|
+
raise GemError, "No built gem found."
|
76
|
+
elsif foundGem.length > 1
|
77
|
+
if block
|
78
|
+
targetGem = block.call(:multiple_built_gems, foundGem)
|
79
|
+
else
|
80
|
+
raise GemError, "Multiple versions of gem found : #{foundGem}. Please provide a block for selection"
|
81
|
+
end
|
82
|
+
else
|
83
|
+
targetGem = foundGem.first
|
84
|
+
end
|
85
|
+
|
86
|
+
cmd = "cd #{root} && gem push #{targetGem} -k #{selAcct}"
|
87
|
+
logger.tdebug :pubgem, "Command to publish gem : #{cmd}"
|
88
|
+
res = `#{cmd}`
|
89
|
+
[$?, targetGem, res]
|
90
|
+
|
91
|
+
end
|
92
|
+
|
93
|
+
def publish_gem_file(gemfile, opts = { }, &block)
|
94
|
+
|
95
|
+
cred = find_rubygems_api_key
|
96
|
+
|
97
|
+
selAcct = cred.keys.first
|
98
|
+
if cred.keys.length > 1
|
99
|
+
logger.tdebug :pubgemfile, "Multiple rubygems account detected."
|
100
|
+
# multiple account configured...
|
101
|
+
selAcct = block.call(:multiple_rubygems_account, cred)
|
102
|
+
raise GemError, "No rubygems account is selected." if is_empty?(selAcct)
|
103
|
+
end
|
104
|
+
|
105
|
+
if File.exist?(gemfile)
|
106
|
+
root = File.dirname(gemfile)
|
107
|
+
targetGem = File.basename(gemfile)
|
108
|
+
|
109
|
+
cmd = "cd #{root} && gem push #{targetGem} -k #{selAcct}"
|
110
|
+
logger.tdebug :pubgemfile, "Command to publish gem : #{cmd}"
|
111
|
+
res = `#{cmd}`
|
112
|
+
[$?, res, targetGem]
|
113
|
+
else
|
114
|
+
raise GemError, "Given Gemfile '#{gemfile}' not found"
|
115
|
+
end
|
116
|
+
|
117
|
+
end
|
118
|
+
|
119
|
+
|
120
|
+
private
|
121
|
+
def logger
|
122
|
+
if @logger.nil?
|
123
|
+
@logger = Tlogger.new
|
124
|
+
end
|
125
|
+
@logger
|
126
|
+
end
|
127
|
+
|
128
|
+
def find_rubygems_api_key
|
129
|
+
if TR::RTUtils.on_windows?
|
130
|
+
credFile = File.join(ENV['USERPROFILE'],".gem","credentials")
|
131
|
+
else
|
132
|
+
credFile = File.join(Dir.home,".local","share","gem","credentials")
|
133
|
+
end
|
134
|
+
|
135
|
+
raise GemError, "Credential file not found at '#{credFile}'" if not File.exist?(credFile)
|
136
|
+
|
137
|
+
cred = nil
|
138
|
+
File.open(credFile,"r") do |f|
|
139
|
+
cred = YAML.load(f.read)
|
140
|
+
end
|
141
|
+
|
142
|
+
raise GemError, "Credential file is empty" if is_empty?(cred)
|
143
|
+
raise GemError, "No credential created yet for rubygems." if is_empty?(cred.keys)
|
144
|
+
|
145
|
+
cred
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
|
150
|
+
end
|
151
|
+
end
|
@@ -0,0 +1,28 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
module DevopsAssist
|
4
|
+
module Gem
|
5
|
+
module Gemspec
|
6
|
+
include TR::CondUtils
|
7
|
+
|
8
|
+
class GemspecError < StandardError; end
|
9
|
+
|
10
|
+
def find_gem_name(root)
|
11
|
+
spec = find_gemspec(root)
|
12
|
+
s = ::Gem::Specification.load(spec)
|
13
|
+
s.name
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
def find_gemspec(root)
|
18
|
+
if is_empty?(root)
|
19
|
+
raise GemspecError, "Root path '#{root}' to find_gemspec is empty"
|
20
|
+
else
|
21
|
+
Dir.glob(File.join(root,"*.gemspec")).first
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
@@ -0,0 +1,164 @@
|
|
1
|
+
|
2
|
+
require 'toolrack'
|
3
|
+
require 'yaml'
|
4
|
+
|
5
|
+
module DevopsAssist
|
6
|
+
|
7
|
+
class ReleaseLogError < StandardError; end
|
8
|
+
|
9
|
+
class ReleaseLogger
|
10
|
+
include TR::CondUtils
|
11
|
+
|
12
|
+
LOG_NAME = ".release_history.yml"
|
13
|
+
|
14
|
+
attr_accessor :relRec
|
15
|
+
def initialize(rec = nil)
|
16
|
+
if not_empty?(rec)
|
17
|
+
@relRec = YAML.load(rec)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def log_release(relName, version, &block)
|
22
|
+
|
23
|
+
raise ReleaseLogError, "Release name cannot be empty" if is_empty?(relName)
|
24
|
+
raise ReleaseLogError, "Version cannot be empty" if is_empty?(version)
|
25
|
+
|
26
|
+
raise ReleaseLogError, "Version '#{version}' already in the log file for release '#{relName}'" if is_version_exist?(version, relName)
|
27
|
+
|
28
|
+
rec = { version: version, timestamp: Time.now.to_f }
|
29
|
+
if block
|
30
|
+
relBy = block.call(:released_by)
|
31
|
+
rec[:released_by] = relBy if not_empty?(relBy)
|
32
|
+
|
33
|
+
relFrom = block.call(:released_location)
|
34
|
+
rec[:released_location] = relFrom if not_empty?(relFrom)
|
35
|
+
end
|
36
|
+
|
37
|
+
relRec[relName] = [] if is_empty?(relRec[relName])
|
38
|
+
relRec[relName] << rec
|
39
|
+
|
40
|
+
save
|
41
|
+
|
42
|
+
relRec
|
43
|
+
end
|
44
|
+
|
45
|
+
def last_version_number(relName = nil)
|
46
|
+
if is_empty?(relName)
|
47
|
+
list = relRec[relRec.keys.first]
|
48
|
+
else
|
49
|
+
list = relRec[relName]
|
50
|
+
end
|
51
|
+
|
52
|
+
list.last[:version] if not_empty?(list)
|
53
|
+
end
|
54
|
+
|
55
|
+
def is_version_exist?(ver, relName = nil)
|
56
|
+
if is_empty?(relName)
|
57
|
+
list = relRec[relRec.keys.first]
|
58
|
+
else
|
59
|
+
list = relRec[relName]
|
60
|
+
end
|
61
|
+
res = false
|
62
|
+
if not_empty?(list)
|
63
|
+
ref = ::Gem::Version.new(ver)
|
64
|
+
list.each do |l|
|
65
|
+
subj = ::Gem::Version.new(l[:version])
|
66
|
+
res = (subj == ref)
|
67
|
+
break if res
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
res
|
72
|
+
end
|
73
|
+
|
74
|
+
def releases(&block)
|
75
|
+
ret = Marshal.load(Marshal.dump(relRec))
|
76
|
+
ret.values.each do |v|
|
77
|
+
#ret.map { |k,v|
|
78
|
+
v.map { |r|
|
79
|
+
|
80
|
+
t = r[:timestamp]
|
81
|
+
tt = Time.at(t)
|
82
|
+
|
83
|
+
res = nil
|
84
|
+
|
85
|
+
if block
|
86
|
+
res = block.call(:convert_timestamp, tt)
|
87
|
+
end
|
88
|
+
|
89
|
+
if is_empty?(res)
|
90
|
+
res = tt.strftime("%a, %d %b %Y, %H:%M:%S")
|
91
|
+
end
|
92
|
+
|
93
|
+
r[:timestamp] = res
|
94
|
+
|
95
|
+
relBy = r[:released_by]
|
96
|
+
if not_empty?(relBy)
|
97
|
+
|
98
|
+
if block
|
99
|
+
res = block.call(:convert_released_by, relBy)
|
100
|
+
r[:released_by] = res if not_empty?(res)
|
101
|
+
end
|
102
|
+
|
103
|
+
end
|
104
|
+
|
105
|
+
relFrom = r[:released_location]
|
106
|
+
if not_empty?(relFrom)
|
107
|
+
|
108
|
+
if block
|
109
|
+
res = block.call(:convert_released_location, relFrom)
|
110
|
+
r[:released_location] = res if not_empty?(res)
|
111
|
+
end
|
112
|
+
|
113
|
+
end
|
114
|
+
|
115
|
+
r
|
116
|
+
|
117
|
+
}
|
118
|
+
|
119
|
+
v
|
120
|
+
|
121
|
+
end
|
122
|
+
|
123
|
+
ret
|
124
|
+
end
|
125
|
+
|
126
|
+
def self.load(root = Dir.getwd)
|
127
|
+
f = File.join(root, LOG_NAME)
|
128
|
+
if not File.exist?(f)
|
129
|
+
ReleaseLogger.new
|
130
|
+
else
|
131
|
+
relLog = nil
|
132
|
+
File.open(f,"r") do |ff|
|
133
|
+
relLog = ReleaseLogger.new(ff.read)
|
134
|
+
end
|
135
|
+
relLog
|
136
|
+
end
|
137
|
+
end
|
138
|
+
|
139
|
+
def save(root = Dir.getwd)
|
140
|
+
f = File.join(root, LOG_NAME)
|
141
|
+
File.open(f,"w") do |ff|
|
142
|
+
ff.write YAML.dump(relRec)
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
146
|
+
def reset_log(root = Dir.getwd)
|
147
|
+
log = File.join(root, LOG_NAME)
|
148
|
+
FileUtils.rm(log) if File.exist?(log)
|
149
|
+
end
|
150
|
+
|
151
|
+
private
|
152
|
+
def relRec
|
153
|
+
if @relRec.nil?
|
154
|
+
@relRec = { }
|
155
|
+
end
|
156
|
+
@relRec
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
|
File without changes
|
@@ -0,0 +1,47 @@
|
|
1
|
+
|
2
|
+
require 'tty/prompt'
|
3
|
+
|
4
|
+
module DevopsAssist
|
5
|
+
module VersionManager
|
6
|
+
extend DevopsAssist::Gem
|
7
|
+
extend TR::VUtils
|
8
|
+
|
9
|
+
def self.prompt_version(gemName, last_version = "0.0.0")
|
10
|
+
|
11
|
+
begin
|
12
|
+
|
13
|
+
last_version = "0.0.0" if is_empty?(last_version)
|
14
|
+
|
15
|
+
pmt = TTY::Prompt.new
|
16
|
+
vers = possible_versions(last_version)
|
17
|
+
|
18
|
+
vers << "Custom"
|
19
|
+
vers << "Quit"
|
20
|
+
#vers << [ \
|
21
|
+
# "Maybe not now..." \
|
22
|
+
# ,"Nah, forget it..." \
|
23
|
+
#].sample
|
24
|
+
|
25
|
+
vsel = pmt.select(" Please select one of the versions below:") do |menu|
|
26
|
+
vers.each do |v|
|
27
|
+
menu.choice v
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
case vsel
|
32
|
+
when "Custom"
|
33
|
+
vsel = pmt.ask(" Please provide custom version no:", required: true)
|
34
|
+
when vers[-1]
|
35
|
+
raise DevopsAssist::Error, " Aborted. Have a nice day! "
|
36
|
+
end
|
37
|
+
|
38
|
+
vsel
|
39
|
+
|
40
|
+
rescue TTY::Reader::InputInterrupt
|
41
|
+
raise DevopsAssist::Error
|
42
|
+
end
|
43
|
+
|
44
|
+
end
|
45
|
+
|
46
|
+
end
|
47
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative "devops_assist/version"
|
4
|
+
require_relative 'devops_assist/release_log/release_log'
|
5
|
+
|
6
|
+
require_relative 'devops_assist/vcs/git/cli_prompt'
|
7
|
+
|
8
|
+
require_relative 'devops_assist/gem/gem'
|
9
|
+
|
10
|
+
require_relative 'devops_assist/version_manager'
|
11
|
+
|
12
|
+
require 'toolrack'
|
13
|
+
require 'tlogger'
|
14
|
+
|
15
|
+
module DevopsAssist
|
16
|
+
class Error < StandardError; end
|
17
|
+
# Your code goes here...
|
18
|
+
end
|
19
|
+
|
20
|
+
# load the rake tasks
|
21
|
+
rf = File.join(File.dirname(__FILE__),"Rakefile")
|
22
|
+
load rf
|
23
|
+
|
@@ -0,0 +1,68 @@
|
|
1
|
+
|
2
|
+
|
3
|
+
require_relative '../lib/devops_assist'
|
4
|
+
require 'tty/prompt'
|
5
|
+
|
6
|
+
namespace :devops do
|
7
|
+
|
8
|
+
desc "Release gem file project"
|
9
|
+
task :release do
|
10
|
+
|
11
|
+
begin
|
12
|
+
|
13
|
+
pmt = TTY::Prompt.new
|
14
|
+
|
15
|
+
root = Dir.getwd
|
16
|
+
|
17
|
+
gemName = find_gem_name(root)
|
18
|
+
|
19
|
+
pmt.say " Starting gem release for gem #{gemName}", color: :yellow
|
20
|
+
|
21
|
+
# check in source code
|
22
|
+
res = Rake::Task["devops:vcs:checkin_changes"].execute
|
23
|
+
pmt.say " Workspace check in done\n", color: :yellow
|
24
|
+
|
25
|
+
rl = DevopsAssist::ReleaseLogger.load
|
26
|
+
|
27
|
+
# select version
|
28
|
+
ver = DevopsAssist::VersionManager.prompt_version(gemName, rl.last_version_number(gemName))
|
29
|
+
pmt.say " Version no. '#{ver}' chosen", color: :yellow
|
30
|
+
|
31
|
+
selVerFile = update_gem_version(root, ver) do |*args|
|
32
|
+
ops = args.first
|
33
|
+
case ops
|
34
|
+
when :select_version_file
|
35
|
+
files = args[1]
|
36
|
+
vfile = pmt.select("Please select one of the gem version file to update the version number:", files)
|
37
|
+
vfile
|
38
|
+
end
|
39
|
+
end
|
40
|
+
pmt.say " Version file updated", color: :yellow
|
41
|
+
|
42
|
+
# build the gem
|
43
|
+
Rake::Task["build"].execute
|
44
|
+
|
45
|
+
rl.log_release(gemName, ver)
|
46
|
+
pmt.say " Release version number is logged", color: :yellow
|
47
|
+
|
48
|
+
# publish gem
|
49
|
+
Rake::Task["devops:gem:publish_gem"].execute({ version: ver, pmt: pmt })
|
50
|
+
|
51
|
+
Rake::Task["devops:vcs:checkin_misc_files"].execute({ root: root, files: [selVerFile, DevopsAssist::ReleaseLogger::LOG_NAME], version: ver })
|
52
|
+
pmt.say " Updated files during release prep have committed into version control", color: :yellow
|
53
|
+
|
54
|
+
Rake::Task["devops:vcs:tag_source_code"].execute({ root: root, version: ver })
|
55
|
+
pmt.say " Source code is tagged as version #{ver}", color: :yellow
|
56
|
+
|
57
|
+
Rake::Task["devops:vcs:push_source_code"].execute({ root: root, pmt: pmt })
|
58
|
+
|
59
|
+
rescue GitCliPrompt::UserAborted, GitCliPrompt::UserChangedMind
|
60
|
+
rescue Exception => ex
|
61
|
+
STDERR.puts ex.message
|
62
|
+
#STDERR.puts ex.backtrace.join('\n')
|
63
|
+
end
|
64
|
+
|
65
|
+
end
|
66
|
+
|
67
|
+
end
|
68
|
+
|
data/tasks/gem.rake
ADDED
@@ -0,0 +1,81 @@
|
|
1
|
+
|
2
|
+
require_relative '../lib/devops_assist'
|
3
|
+
|
4
|
+
require 'tty/prompt'
|
5
|
+
|
6
|
+
include DevopsAssist::Gem
|
7
|
+
include TR::VUtils
|
8
|
+
|
9
|
+
namespace :devops do
|
10
|
+
namespace :gem do
|
11
|
+
|
12
|
+
desc "Build the gem"
|
13
|
+
task :build_gem, :version do |t, args|
|
14
|
+
|
15
|
+
root = Dir.getwd
|
16
|
+
|
17
|
+
selVerFile = update_gem_version(root, args) do |*args|
|
18
|
+
ops = args.first
|
19
|
+
case ops
|
20
|
+
when :select_version_file
|
21
|
+
files = args[1]
|
22
|
+
vfile = pmt.select(" Please select one of the gem version file to update the version number:", files)
|
23
|
+
vfile
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
Rake::Task["build"].execute
|
28
|
+
|
29
|
+
end
|
30
|
+
|
31
|
+
desc "Publish specific gem version to Rubygems"
|
32
|
+
task :publish_gem, :version do |t, args|
|
33
|
+
|
34
|
+
pmt = args[:pmt]
|
35
|
+
version = args[:version]
|
36
|
+
|
37
|
+
ans = pmt.yes?(" Proceed to publish the gem to Rubygems?")
|
38
|
+
if ans
|
39
|
+
res, tg, out = publish_gem(version) do |*args|
|
40
|
+
ops = args.first
|
41
|
+
case ops
|
42
|
+
when :multiple_rubygems_account
|
43
|
+
acct = args[1]
|
44
|
+
selAct = pmt.select(" Please select one of the Rubygems credential to release:") do |menu|
|
45
|
+
|
46
|
+
acct.each do |k,v|
|
47
|
+
menu.choice k, k
|
48
|
+
end
|
49
|
+
|
50
|
+
menu.choice "Skip", :skip
|
51
|
+
menu.choice "Quit", :quit
|
52
|
+
|
53
|
+
end
|
54
|
+
|
55
|
+
raise DevopsAssist::Error, " Aborted. Have a nice day " if selAct == :quit
|
56
|
+
|
57
|
+
selAct
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
pmt.say(" Gem publishing is skipped", color: :yellow) if res == :skipped
|
62
|
+
|
63
|
+
if res.respond_to?(:success?)
|
64
|
+
if res.success?
|
65
|
+
pmt.say " Gem published!\n", color: :yellow
|
66
|
+
else
|
67
|
+
pmt.say " Gem publishing failed. Return message :\n#{out}", color: :red
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
end
|
72
|
+
|
73
|
+
end
|
74
|
+
|
75
|
+
desc "Publish specific gem file to Rubygems"
|
76
|
+
task :publish_gem_file, :file do |t, args|
|
77
|
+
|
78
|
+
end
|
79
|
+
|
80
|
+
end
|
81
|
+
end
|
data/tasks/vcs.rake
ADDED
@@ -0,0 +1,64 @@
|
|
1
|
+
|
2
|
+
require_relative '../lib/devops_assist'
|
3
|
+
|
4
|
+
namespace :devops do
|
5
|
+
namespace :vcs do
|
6
|
+
|
7
|
+
desc "Checking in changes of source code"
|
8
|
+
task :checkin_changes do
|
9
|
+
cli = DevopsAssist::Vcs::Git::CliPrompt.new
|
10
|
+
cli.commit(Dir.getwd)
|
11
|
+
end
|
12
|
+
|
13
|
+
desc "Checking in files generated by devops assist"
|
14
|
+
task :checkin_misc_files do |t, args|
|
15
|
+
|
16
|
+
root = args[:root]
|
17
|
+
files = args[:files]
|
18
|
+
ver = args[:version]
|
19
|
+
|
20
|
+
ws = Gvcs::Workspace.new(root)
|
21
|
+
if ws.is_workspace?
|
22
|
+
ws.add_to_staging(files)
|
23
|
+
ws.commit(" Committing file changed during release version '#{ver}'")
|
24
|
+
else
|
25
|
+
raise DevopsAssist::Error, " Given path '#{root}' is not a repository"
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
|
30
|
+
desc "Tag source code"
|
31
|
+
task :tag_source_code do |t, args|
|
32
|
+
|
33
|
+
root = args[:root]
|
34
|
+
ver = args[:version]
|
35
|
+
|
36
|
+
pmt = TTY::Prompt.new
|
37
|
+
msg = pmt.ask(" Tagging message : ", default: "Automated tagging of source code release version #{ver} by DevOps Assist")
|
38
|
+
ws = Gvcs::Workspace.new(root)
|
39
|
+
if ws.is_workspace?
|
40
|
+
ws.create_tag(ver, msg)
|
41
|
+
else
|
42
|
+
raise DevopsAssist::Error, "Given path '#{root}' is not a repository"
|
43
|
+
end
|
44
|
+
|
45
|
+
end
|
46
|
+
|
47
|
+
desc "Push source code to repository"
|
48
|
+
task :push_source_code do |t, args|
|
49
|
+
|
50
|
+
root = args[:root]
|
51
|
+
pmt = args[:pmt]
|
52
|
+
|
53
|
+
cli = DevopsAssist::Vcs::Git::CliPrompt.new
|
54
|
+
cli.push(root) do |ops, val|
|
55
|
+
case ops
|
56
|
+
when :push_info
|
57
|
+
pmt.say " Source code push to remote repository '#{val[:name]}'", color: :yellow
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
end
|
62
|
+
|
63
|
+
end
|
64
|
+
end
|
metadata
ADDED
@@ -0,0 +1,146 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: devops_assist
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Chris Liaw
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2021-10-22 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: toolrack
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - ">="
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - ">="
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: tlogger
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: tty-prompt
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - ">="
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '0'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - ">="
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: gvcs
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: git_cli
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ">="
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ">="
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '0'
|
83
|
+
- !ruby/object:Gem::Dependency
|
84
|
+
name: git_cli_prompt
|
85
|
+
requirement: !ruby/object:Gem::Requirement
|
86
|
+
requirements:
|
87
|
+
- - ">="
|
88
|
+
- !ruby/object:Gem::Version
|
89
|
+
version: '0'
|
90
|
+
type: :runtime
|
91
|
+
prerelease: false
|
92
|
+
version_requirements: !ruby/object:Gem::Requirement
|
93
|
+
requirements:
|
94
|
+
- - ">="
|
95
|
+
- !ruby/object:Gem::Version
|
96
|
+
version: '0'
|
97
|
+
description: ''
|
98
|
+
email:
|
99
|
+
- chrisliaw@antrapol.com
|
100
|
+
executables: []
|
101
|
+
extensions: []
|
102
|
+
extra_rdoc_files: []
|
103
|
+
files:
|
104
|
+
- ".rspec"
|
105
|
+
- Gemfile
|
106
|
+
- Gemfile.lock
|
107
|
+
- README.md
|
108
|
+
- Rakefile
|
109
|
+
- bin/console
|
110
|
+
- bin/setup
|
111
|
+
- devops_assist.gemspec
|
112
|
+
- lib/Rakefile
|
113
|
+
- lib/devops_assist.rb
|
114
|
+
- lib/devops_assist/gem/gem.rb
|
115
|
+
- lib/devops_assist/gem/gemspec.rb
|
116
|
+
- lib/devops_assist/release_log/release_log.rb
|
117
|
+
- lib/devops_assist/vcs/git/cli_prompt.rb
|
118
|
+
- lib/devops_assist/vcs/vcs.rb
|
119
|
+
- lib/devops_assist/version.rb
|
120
|
+
- lib/devops_assist/version_manager.rb
|
121
|
+
- tasks/devops_assist.rake
|
122
|
+
- tasks/gem.rake
|
123
|
+
- tasks/vcs.rake
|
124
|
+
homepage: ''
|
125
|
+
licenses: []
|
126
|
+
metadata: {}
|
127
|
+
post_install_message:
|
128
|
+
rdoc_options: []
|
129
|
+
require_paths:
|
130
|
+
- lib
|
131
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: 2.4.0
|
136
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
137
|
+
requirements:
|
138
|
+
- - ">="
|
139
|
+
- !ruby/object:Gem::Version
|
140
|
+
version: '0'
|
141
|
+
requirements: []
|
142
|
+
rubygems_version: 3.2.22
|
143
|
+
signing_key:
|
144
|
+
specification_version: 4
|
145
|
+
summary: ''
|
146
|
+
test_files: []
|