jenkins-builder 0.1.5 → 0.2.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Gemfile.lock +11 -11
- data/exe/jk +1 -1
- data/jenkins-builder.gemspec +1 -1
- data/lib/jenkins/builder/app.rb +35 -40
- data/lib/jenkins/builder/cli.rb +24 -3
- data/lib/jenkins/builder/config.rb +20 -7
- data/lib/jenkins/builder/secret.rb +2 -1
- data/lib/jenkins/builder/version.rb +1 -1
- metadata +8 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4344c5bd63933b7a95d76310f4aca60aa7f8b8914bb85519f9de589ed60956f4
|
4
|
+
data.tar.gz: 7cd18dd16185f3650d85103f075bd45d43a6db4142232fedb554ecc1b9cf7ed4
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 6efc476422ddc43a5f408f5b12c9cfc67d8a2297a3e62958e4fe540f0204afb6e8186f38cf50fec42cc134dba8a5a55c7f7d37f9fa221086a23265de973c36c1
|
7
|
+
data.tar.gz: b4e38a74ed226ca256849ee306d6c907810cf2089014d24780d4b866ebeb39745d0bf6248a38a361528ee3f6167988b069c217ac7be06ab6f834d2d0a2a018b9
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
jenkins-builder (0.
|
4
|
+
jenkins-builder (0.2.2)
|
5
5
|
jenkins_api_client (~> 1.5.3)
|
6
6
|
pastel (~> 0.7.2)
|
7
7
|
security (~> 0.1.3)
|
@@ -9,7 +9,7 @@ PATH
|
|
9
9
|
tty-spinner (~> 0.8.0)
|
10
10
|
|
11
11
|
GEM
|
12
|
-
remote: https://
|
12
|
+
remote: https://gems.ruby-china.com/
|
13
13
|
specs:
|
14
14
|
byebug (10.0.2)
|
15
15
|
coderay (1.1.2)
|
@@ -22,12 +22,12 @@ GEM
|
|
22
22
|
socksify (>= 1.7.0)
|
23
23
|
terminal-table (>= 1.4.0)
|
24
24
|
thor (>= 0.16.0)
|
25
|
-
json (2.
|
25
|
+
json (2.3.0)
|
26
26
|
method_source (0.9.1)
|
27
|
-
mini_portile2 (2.
|
27
|
+
mini_portile2 (2.4.0)
|
28
28
|
mixlib-shellout (2.4.0)
|
29
|
-
nokogiri (1.
|
30
|
-
mini_portile2 (~> 2.
|
29
|
+
nokogiri (1.10.9)
|
30
|
+
mini_portile2 (~> 2.4.0)
|
31
31
|
pastel (0.7.2)
|
32
32
|
equatable (~> 0.5.0)
|
33
33
|
tty-color (~> 0.4.0)
|
@@ -58,19 +58,19 @@ GEM
|
|
58
58
|
socksify (1.7.1)
|
59
59
|
terminal-table (1.8.0)
|
60
60
|
unicode-display_width (~> 1.1, >= 1.1.1)
|
61
|
-
thor (0.20.
|
61
|
+
thor (0.20.3)
|
62
62
|
tty-color (0.4.3)
|
63
63
|
tty-cursor (0.6.0)
|
64
64
|
tty-spinner (0.8.0)
|
65
65
|
tty-cursor (>= 0.5.0)
|
66
|
-
unicode-display_width (1.
|
67
|
-
yard (0.9.
|
66
|
+
unicode-display_width (1.7.0)
|
67
|
+
yard (0.9.24)
|
68
68
|
|
69
69
|
PLATFORMS
|
70
70
|
ruby
|
71
71
|
|
72
72
|
DEPENDENCIES
|
73
|
-
bundler (~> 1.
|
73
|
+
bundler (~> 2.1.2)
|
74
74
|
jenkins-builder!
|
75
75
|
pry (~> 0.11.3)
|
76
76
|
pry-byebug (~> 3.6.0)
|
@@ -79,4 +79,4 @@ DEPENDENCIES
|
|
79
79
|
rspec (~> 3.0)
|
80
80
|
|
81
81
|
BUNDLED WITH
|
82
|
-
1.
|
82
|
+
2.1.2
|
data/exe/jk
CHANGED
data/jenkins-builder.gemspec
CHANGED
@@ -36,7 +36,7 @@ Gem::Specification.new do |spec|
|
|
36
36
|
spec.add_dependency 'pastel', '~> 0.7.2'
|
37
37
|
spec.add_dependency 'tty-spinner', '~> 0.8.0'
|
38
38
|
|
39
|
-
spec.add_development_dependency "bundler", "~> 1.
|
39
|
+
spec.add_development_dependency "bundler", "~> 2.1.2"
|
40
40
|
spec.add_development_dependency "rake", "~> 10.0"
|
41
41
|
spec.add_development_dependency "rspec", "~> 3.0"
|
42
42
|
spec.add_development_dependency "pry", "~> 0.11.3"
|
data/lib/jenkins/builder/app.rb
CHANGED
@@ -1,50 +1,55 @@
|
|
1
1
|
require 'jenkins/builder/cli'
|
2
2
|
require 'jenkins/builder/config'
|
3
|
-
require 'jenkins/builder/secret'
|
4
3
|
require 'jenkins_api_client'
|
5
4
|
require 'pastel'
|
6
5
|
require 'tty-spinner'
|
7
6
|
require 'time'
|
7
|
+
require 'cgi'
|
8
|
+
|
9
|
+
|
10
|
+
module JenkinsApi
|
11
|
+
module UriHelper
|
12
|
+
# Encode a string for using in the query part of an URL
|
13
|
+
#
|
14
|
+
def form_encode(string)
|
15
|
+
URI.encode_www_form_component string.encode(Encoding::UTF_8)
|
16
|
+
end
|
17
|
+
|
18
|
+
# Encode a string for use in the hiearchical part of an URL
|
19
|
+
#
|
20
|
+
def path_encode(path)
|
21
|
+
CGI.escape(path.encode(Encoding::UTF_8))
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
8
25
|
|
9
26
|
module Jenkins
|
10
27
|
module Builder
|
11
28
|
class App
|
12
29
|
|
13
|
-
attr_accessor :config, :
|
30
|
+
attr_accessor :config, :client, :options
|
14
31
|
|
15
|
-
def initialize(options={})
|
32
|
+
def initialize(service, options={})
|
16
33
|
@options = options
|
17
|
-
@
|
18
|
-
@
|
34
|
+
@service = service
|
35
|
+
@config = Jenkins::Builder::Config.new(@service)
|
19
36
|
|
20
|
-
if @config.url && @config.username && @
|
37
|
+
if @config.url && @config.username && @config.password
|
21
38
|
@client = JenkinsApi::Client.new(server_url: @config.url,
|
22
39
|
username: @config.username,
|
23
|
-
password: @
|
40
|
+
password: @config.password)
|
24
41
|
end
|
25
42
|
end
|
26
43
|
|
27
|
-
def main(args)
|
28
|
-
validate_os!
|
29
|
-
validate_fzf!
|
30
|
-
Jenkins::Builder::CLI.create_alias_commands(@config.aliases || [])
|
31
|
-
Jenkins::Builder::CLI.start(args)
|
32
|
-
rescue => e
|
33
|
-
STDERR.puts(e.message)
|
34
|
-
end
|
35
|
-
|
36
44
|
def setup(options)
|
37
45
|
validate_credentials!(options)
|
38
46
|
|
39
47
|
config.url = options[:url]
|
40
48
|
config.username = options[:username]
|
41
49
|
config.branches = options[:branches]
|
50
|
+
config.password = options[:password]
|
42
51
|
config.save!
|
43
52
|
|
44
|
-
secret.username = options[:username]
|
45
|
-
secret.password = options[:password]
|
46
|
-
secret.save!
|
47
|
-
|
48
53
|
puts 'Credentials setup successfully.'
|
49
54
|
end
|
50
55
|
|
@@ -54,7 +59,7 @@ module Jenkins
|
|
54
59
|
Username: #{@config.username}
|
55
60
|
INFO
|
56
61
|
|
57
|
-
puts "Password: #{@
|
62
|
+
puts "Password: #{@config.password}" if options[:password]
|
58
63
|
end
|
59
64
|
|
60
65
|
def create_alias(name, command)
|
@@ -95,11 +100,11 @@ module Jenkins
|
|
95
100
|
|
96
101
|
def fetch_all_jobs
|
97
102
|
refresh_jobs_cache unless validate_jobs_cache
|
98
|
-
@config['jobs-cache']['jobs']
|
103
|
+
@config['services'][@service]['jobs-cache']['jobs']
|
99
104
|
end
|
100
105
|
|
101
106
|
def refresh_jobs_cache
|
102
|
-
@config['jobs-cache'] = {
|
107
|
+
@config['services'][@service]['jobs-cache'] = {
|
103
108
|
'expire' => (Time.now + 86400*30).strftime('%F %T'),
|
104
109
|
'jobs' => all_jobs
|
105
110
|
}
|
@@ -107,8 +112,8 @@ module Jenkins
|
|
107
112
|
end
|
108
113
|
|
109
114
|
def validate_jobs_cache
|
110
|
-
@config['jobs-cache'] && !@config['jobs-cache'].empty? && \
|
111
|
-
Time.parse(@config['jobs-cache']['expire']) > Time.now
|
115
|
+
@config['services'][@service]['jobs-cache'] && !@config['services'][@service]['jobs-cache'].empty? && \
|
116
|
+
Time.parse(@config['services'][@service]['jobs-cache']['expire']) > Time.now
|
112
117
|
end
|
113
118
|
|
114
119
|
def all_jobs
|
@@ -153,12 +158,12 @@ module Jenkins
|
|
153
158
|
all_console_output = ''
|
154
159
|
|
155
160
|
loop do
|
156
|
-
console_output = @client.job.get_console_output(job_name, build_no,
|
157
|
-
all_console_output
|
158
|
-
print console_output['output']
|
159
|
-
printed_size
|
161
|
+
console_output = @client.job.get_console_output(job_name, build_no, 0, 'text')
|
162
|
+
all_console_output = console_output['output']
|
163
|
+
print console_output['output'][printed_size..-1] unless @options[:silent]
|
164
|
+
printed_size = console_output['output'].size
|
160
165
|
break unless console_output['more']
|
161
|
-
sleep
|
166
|
+
sleep 0.5
|
162
167
|
end
|
163
168
|
if @options[:silent]
|
164
169
|
spinner.stop
|
@@ -192,16 +197,6 @@ module Jenkins
|
|
192
197
|
|
193
198
|
private
|
194
199
|
|
195
|
-
def validate_os!
|
196
|
-
raise 'Darwin is the only supported OS now.' unless `uname`.chomp == 'Darwin'
|
197
|
-
end
|
198
|
-
|
199
|
-
def validate_fzf!
|
200
|
-
`fzf --version`
|
201
|
-
rescue Errno::ENOENT
|
202
|
-
raise 'Required command fzf is not installed.'
|
203
|
-
end
|
204
|
-
|
205
200
|
def validate_credentials!(options)
|
206
201
|
@client = JenkinsApi::Client.new(server_url: options[:url],
|
207
202
|
username: options[:username],
|
data/lib/jenkins/builder/cli.rb
CHANGED
@@ -7,6 +7,12 @@ module Jenkins
|
|
7
7
|
class CLI < ::Thor
|
8
8
|
|
9
9
|
class << self
|
10
|
+
def main(args)
|
11
|
+
validate_fzf!
|
12
|
+
@config = Jenkins::Builder::Config.new
|
13
|
+
create_alias_commands(@config.aliases || [])
|
14
|
+
start(args)
|
15
|
+
end
|
10
16
|
def create_alias_commands(aliases)
|
11
17
|
aliases.each do |name, command|
|
12
18
|
desc "#{name}", "Alias for: `#{command}'"
|
@@ -15,8 +21,17 @@ module Jenkins
|
|
15
21
|
end
|
16
22
|
end
|
17
23
|
end
|
24
|
+
|
25
|
+
def validate_fzf!
|
26
|
+
`fzf --version`
|
27
|
+
rescue Errno::ENOENT
|
28
|
+
raise 'Required command fzf is not installed.'
|
29
|
+
end
|
30
|
+
|
18
31
|
end
|
19
32
|
|
33
|
+
class_option :service, type: :string, aliases: ['-s'], desc: 'Specify service name'
|
34
|
+
|
20
35
|
desc 'setup [-e]', 'Setup URL, username and password, or open config file in an editor when -e specified.'
|
21
36
|
option :edit, type: :boolean, aliases: ['-e'], desc: 'open config file in an editor'
|
22
37
|
def setup
|
@@ -39,8 +54,8 @@ module Jenkins
|
|
39
54
|
Jenkins::Builder::App.new.print_info(options)
|
40
55
|
end
|
41
56
|
|
42
|
-
desc 'build [-
|
43
|
-
option :
|
57
|
+
desc 'build [-q] [-f] <JOB_IDENTIFIERS>', 'Build jobs'
|
58
|
+
option :quiet, type: :boolean, aliases: ['-q'], desc: 'suppress console output.'
|
44
59
|
option :failfast, type: :boolean, aliases: ['-f'], desc: 'stop immediately when building fails.'
|
45
60
|
option :version, type: :boolean, aliases: ['-v'], desc: 'Show version.'
|
46
61
|
def build(*jobs)
|
@@ -48,7 +63,13 @@ module Jenkins
|
|
48
63
|
puts Jenkins::Builder::VERSION
|
49
64
|
exit
|
50
65
|
end
|
51
|
-
|
66
|
+
if options.service.nil?
|
67
|
+
service = fzf(Config.new().services).first
|
68
|
+
exit if service.nil?
|
69
|
+
else
|
70
|
+
service = options.service
|
71
|
+
end
|
72
|
+
app = Jenkins::Builder::App.new(service, options)
|
52
73
|
if jobs.empty?
|
53
74
|
jobs = fzf(app.fetch_all_jobs)
|
54
75
|
exit if jobs.empty?
|
@@ -4,10 +4,11 @@ module Jenkins
|
|
4
4
|
module Builder
|
5
5
|
class Config
|
6
6
|
|
7
|
-
attr_accessor :file, :config
|
7
|
+
attr_accessor :file, :config, :service
|
8
8
|
|
9
|
-
def initialize
|
9
|
+
def initialize(service = nil)
|
10
10
|
|
11
|
+
@service = service
|
11
12
|
@file = File.expand_path('~/.jenkins-builder.yaml')
|
12
13
|
|
13
14
|
if File.exist?(@file)
|
@@ -25,12 +26,24 @@ module Jenkins
|
|
25
26
|
@config[k] = v
|
26
27
|
end
|
27
28
|
|
29
|
+
def services
|
30
|
+
@config['services'].keys
|
31
|
+
end
|
32
|
+
|
28
33
|
def username
|
29
|
-
@config['username']
|
34
|
+
@config['services'][@service]['username']
|
30
35
|
end
|
31
36
|
|
32
37
|
def username=(name)
|
33
|
-
@config['username'] = name
|
38
|
+
@config['services'][@service]['username'] = name
|
39
|
+
end
|
40
|
+
|
41
|
+
def password
|
42
|
+
@config['services'][@service]['password']
|
43
|
+
end
|
44
|
+
|
45
|
+
def password=(passwd)
|
46
|
+
@config['services'][@service]['password'] = passwd
|
34
47
|
end
|
35
48
|
|
36
49
|
def aliases
|
@@ -42,11 +55,11 @@ module Jenkins
|
|
42
55
|
end
|
43
56
|
|
44
57
|
def url
|
45
|
-
@config['url']
|
58
|
+
@config['services'][@service]['url']
|
46
59
|
end
|
47
60
|
|
48
61
|
def url=(url)
|
49
|
-
@config['url'] = url
|
62
|
+
@config['services'][@service]['url'] = url
|
50
63
|
end
|
51
64
|
|
52
65
|
def branches
|
@@ -58,7 +71,7 @@ module Jenkins
|
|
58
71
|
end
|
59
72
|
|
60
73
|
def hooks_of(job)
|
61
|
-
hooks = @config['hooks'] && @config['hooks'][job]
|
74
|
+
hooks = @config['services'][@service]['hooks'] && @config['services'][@service]['hooks'][job]
|
62
75
|
hooks = [hooks] if hooks.is_a?(String)
|
63
76
|
hooks
|
64
77
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: jenkins-builder
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.2.3
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Liu Xiang
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2020-07-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -86,14 +86,14 @@ dependencies:
|
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version:
|
89
|
+
version: 2.1.2
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version:
|
96
|
+
version: 2.1.2
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
98
|
name: rake
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
@@ -196,7 +196,7 @@ licenses:
|
|
196
196
|
- MIT
|
197
197
|
metadata:
|
198
198
|
allowed_push_host: https://rubygems.org
|
199
|
-
post_install_message:
|
199
|
+
post_install_message:
|
200
200
|
rdoc_options: []
|
201
201
|
require_paths:
|
202
202
|
- lib
|
@@ -211,9 +211,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
211
211
|
- !ruby/object:Gem::Version
|
212
212
|
version: '0'
|
213
213
|
requirements: []
|
214
|
-
|
215
|
-
|
216
|
-
signing_key:
|
214
|
+
rubygems_version: 3.1.2
|
215
|
+
signing_key:
|
217
216
|
specification_version: 4
|
218
217
|
summary: Build Jenkins Jobs
|
219
218
|
test_files: []
|