CiHelper 1.0.6 → 1.1
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/ci_helper/bitbucket/pull_request_page.rb +0 -0
- data/lib/ci_helper/bitbucket_procedure.rb +83 -68
- data/lib/ci_helper/ci_procedure.rb +64 -65
- data/lib/ci_helper/cli.rb +6 -2
- data/lib/ci_helper/constants.rb +6 -0
- data/lib/ci_helper/exceptions.rb +2 -0
- data/lib/ci_helper/installer.rb +1 -1
- data/lib/ci_helper/issue_monitor.rb +47 -64
- data/lib/ci_helper/main_process.rb +94 -65
- data/lib/ci_helper/message.rb +0 -1
- data/lib/ci_helper/redmine/issue_updater.rb +24 -0
- data/lib/ci_helper/redmine.rb +14 -0
- data/lib/ci_helper/redmine_procedure.rb +57 -0
- data/lib/ci_helper/rspec_result_parser/parser.rb +45 -0
- data/lib/ci_helper/rspec_result_parser.rb +8 -0
- data/lib/ci_helper/user_command_line_interface.rb +117 -20
- data/lib/ci_helper/version.rb +1 -1
- data/lib/ci_helper.rb +5 -1
- metadata +34 -2
- data/lib/ci_helper/result_parser.rb +0 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 5c4adaaacbe78f767b551940eff716bd30a09497
|
4
|
+
data.tar.gz: fa41339fec784306dfb560c56058bcf1754dc260
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5d7573713bea893d6894c5e145e15e43aad09b900412fcce91e1890e6cfb83b21c4feddbf3faac78096f078fb129f638928013c9b45e6927e5ef4f4d972b3593
|
7
|
+
data.tar.gz: 0516f85d3c6c3f4e0c5ee6a16979d89538aad138bd75df9254e9e577d9ae60c499e3a363277e7cba5aac113d439d5a6581e3b0785c4e7081af54fff9b38a5b58
|
File without changes
|
@@ -1,70 +1,85 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
description.value += "
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
end
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
1
|
+
require 'mechanize'
|
2
|
+
|
3
|
+
module CiHelper
|
4
|
+
class BitBucketProcedure
|
5
|
+
BIT_BUCKET_LOGIN_URL = 'https://bitbucket.org/account/signin/'
|
6
|
+
|
7
|
+
attr_reader :account, :password, :client, :destination, :user_description, :title, :reviewers
|
8
|
+
attr_reader :pull_request_page, :repository_page
|
9
|
+
|
10
|
+
def initialize(account, password)
|
11
|
+
@account = account
|
12
|
+
@password = password
|
13
|
+
@client = Mechanize.new
|
14
|
+
end
|
15
|
+
|
16
|
+
def create_pull_request(result)
|
17
|
+
login
|
18
|
+
go_to_repo_page
|
19
|
+
go_to_pull_request_page
|
20
|
+
|
21
|
+
create_pull_request_page = pull_request_page.link_with(href: '/vansys/vansys/pull-request/new').click
|
22
|
+
redirect_page = create_pull_request_page.form_with(action: '/vansys/vansys/pull-request/new') do |request_form|
|
23
|
+
|
24
|
+
request_form.field_with(name: 'title').value = "##{result.issue_number} - #{title}"
|
25
|
+
request_form.field_with(name: 'dest').options.select { |option| option.text == destination.to_s }.first.select
|
26
|
+
request_form.field_with(name: 'source').options.select { |option| option.text == result.branch_name }.first.select
|
27
|
+
request_form.field_with(name: 'reviewers').value = reviewers
|
28
|
+
description = request_form.field_with(name: 'description')
|
29
|
+
description.value = "1. #{CiHelper::REDMINE_DOMAIN}#{result.issue_number.delete('t')}\n"
|
30
|
+
description.value += "2. #{result.console_link} \n"
|
31
|
+
description.value += "```\n"
|
32
|
+
description.value += "#!ruby \n"
|
33
|
+
|
34
|
+
result.failures.each do |failure|
|
35
|
+
description.value += "#{failure.to_s}\n"
|
36
|
+
end
|
37
|
+
|
38
|
+
description.value += "```\n"
|
39
|
+
|
40
|
+
description.value += user_description
|
41
|
+
end.click_button
|
42
|
+
redirect_page
|
43
|
+
end
|
44
|
+
|
45
|
+
def add_destination(destination)
|
46
|
+
@destination = destination
|
47
|
+
end
|
48
|
+
|
49
|
+
def add_user_description(description)
|
50
|
+
@user_description = description
|
51
|
+
end
|
52
|
+
|
53
|
+
def add_pf_title(title)
|
54
|
+
@title = title
|
55
|
+
end
|
56
|
+
|
57
|
+
def reviewers=(reviewers)
|
58
|
+
@reviewers = reviewers
|
59
|
+
end
|
60
|
+
|
61
|
+
def login
|
62
|
+
login_page = client.get(BIT_BUCKET_LOGIN_URL)
|
63
|
+
|
64
|
+
@response_page = login_page.form_with(action: '/account/signin/') do |f|
|
65
|
+
f.field_with(name: 'username').value = account
|
66
|
+
f.field_with(name: 'password').value = password
|
67
|
+
end.click_button
|
68
|
+
end
|
69
|
+
|
70
|
+
def go_to_repo_page
|
71
|
+
fail Exceptions::SettingError, "Please make sure you enter the correct account and password \n and run ci_helper -i again" if login_failed?
|
72
|
+
@repository_page = @response_page.link_with(href: '/vansys/vansys').click
|
73
|
+
end
|
74
|
+
|
75
|
+
def go_to_pull_request_page
|
76
|
+
@pull_request_page = repository_page.link_with(href: '/vansys/vansys/pull-requests').click
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def login_failed?
|
82
|
+
@response_page.uri.request_uri.match('signin')
|
83
|
+
end
|
68
84
|
end
|
69
85
|
end
|
70
|
-
|
@@ -1,89 +1,88 @@
|
|
1
1
|
require 'mechanize'
|
2
2
|
|
3
|
-
|
3
|
+
module CiHelper
|
4
|
+
class CiProcedure
|
4
5
|
# this class hardcoding the procedure to the result page
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
attr_accessor :result, :issue_page, :console_page, :raam_page
|
9
|
-
attr_reader :account, :password, :mechanize,
|
10
|
-
:raam_page, :main_page,
|
11
|
-
:matching_strategy
|
7
|
+
CI_LOGIN_URL = 'http://ci.raamsys.co.uk/login?from=%2F'
|
8
|
+
CI_DOMAIN = 'http://ci.raamsys.co.uk/'
|
12
9
|
|
10
|
+
attr_accessor :result, :issue_page, :console_page, :matching_strategy, :raam_page
|
11
|
+
attr_reader :account, :password, :mechanize, :main_page
|
13
12
|
|
14
|
-
Result = Struct.new(:status, :failures)
|
15
13
|
|
16
|
-
|
17
|
-
@account = account
|
18
|
-
@password = password
|
19
|
-
@matching_strategy = matching_strategy
|
20
|
-
@mechanize = Mechanize.new
|
21
|
-
end
|
14
|
+
Result = Struct.new(:status, :failures)
|
22
15
|
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
end
|
16
|
+
def initialize(account, password)
|
17
|
+
@account = account
|
18
|
+
@password = password
|
19
|
+
@mechanize = Mechanize.new
|
20
|
+
end
|
29
21
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
22
|
+
def run
|
23
|
+
@main_page = login
|
24
|
+
@raam_page = go_to_pull_request_page
|
25
|
+
@issue_page = go_to_issue
|
26
|
+
@console_page = go_to_console_output
|
27
|
+
end
|
36
28
|
|
37
|
-
|
38
|
-
|
39
|
-
|
29
|
+
def re_get_console_output
|
30
|
+
self.raam_page = go_to_pull_request_page
|
31
|
+
self.issue_page = go_to_issue
|
32
|
+
self.console_page = go_to_console_output
|
33
|
+
get_console_output
|
34
|
+
end
|
40
35
|
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
def get_console_output
|
37
|
+
console_page.search("pre.console-output").text
|
38
|
+
end
|
44
39
|
|
45
|
-
|
46
|
-
|
47
|
-
|
40
|
+
def issue_number
|
41
|
+
branch_name[1..4]
|
42
|
+
end
|
48
43
|
|
49
|
-
|
50
|
-
|
51
|
-
|
44
|
+
def branch_name
|
45
|
+
issue_link.text.split(' ')[1]
|
46
|
+
end
|
52
47
|
|
53
|
-
|
48
|
+
def commit_hash
|
49
|
+
issue_link.text.split(' ')[2]
|
50
|
+
end
|
54
51
|
|
55
|
-
|
56
|
-
login_page = mechanize.get(CI_LOGIN_URL)
|
52
|
+
private
|
57
53
|
|
58
|
-
|
59
|
-
|
60
|
-
form.fields_with(name: 'j_password').first.value = password
|
61
|
-
end.click_button
|
54
|
+
def login
|
55
|
+
login_page = mechanize.get(CI_LOGIN_URL)
|
62
56
|
|
63
|
-
|
64
|
-
|
65
|
-
|
57
|
+
response_page = login_page.form_with(action: 'j_acegi_security_check') do |form|
|
58
|
+
form.fields_with(name: 'j_username').first.value = account
|
59
|
+
form.fields_with(name: 'j_password').first.value = password
|
60
|
+
end.click_button
|
66
61
|
|
67
|
-
|
68
|
-
|
69
|
-
|
62
|
+
puts 'login success'
|
63
|
+
response_page
|
64
|
+
end
|
70
65
|
|
71
|
-
|
72
|
-
|
73
|
-
|
66
|
+
def go_to_pull_request_page
|
67
|
+
main_page.link_with(text: 'Vansys - pull request').click
|
68
|
+
end
|
74
69
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
end
|
70
|
+
def go_to_develop_page
|
71
|
+
main_page.link_with(text: 'Vansys - develop').click
|
72
|
+
end
|
79
73
|
|
80
|
-
|
81
|
-
|
82
|
-
|
74
|
+
def go_to_issue
|
75
|
+
fail CiHelper::Exceptions::IssueNotFound, 'you may be enter wrong ticket number ' unless issue_link
|
76
|
+
issue_link.click
|
77
|
+
end
|
78
|
+
|
79
|
+
def go_to_console_output
|
80
|
+
issue_page ? issue_page.link_with(text: 'Console Output').click : false
|
81
|
+
end
|
83
82
|
|
84
|
-
|
85
|
-
|
86
|
-
|
83
|
+
def issue_link
|
84
|
+
links = raam_page.links
|
85
|
+
links.select { |link| link.text.match(matching_strategy) }.first
|
86
|
+
end
|
87
87
|
end
|
88
88
|
end
|
89
|
-
|
data/lib/ci_helper/cli.rb
CHANGED
@@ -69,10 +69,14 @@ module CiHelper
|
|
69
69
|
bitbucket_account = gets.chop
|
70
70
|
puts 'Please input your bitbucket passwrod'
|
71
71
|
bitbucket_password = gets.chop
|
72
|
-
|
72
|
+
puts 'Please input your redmine a/c'
|
73
|
+
redmine_ac = gets.chop
|
74
|
+
puts 'Please input your remind password'
|
75
|
+
redmine_pass = gets.chop
|
73
76
|
|
74
77
|
{ ci: { account: ci_account, password: ci_password },
|
75
|
-
bitbucket: { account: bitbucket_account, password: bitbucket_password }
|
78
|
+
bitbucket: { account: bitbucket_account, password: bitbucket_password },
|
79
|
+
redmine: { account: redmine_ac, password: redmine_pass}}
|
76
80
|
end
|
77
81
|
end
|
78
82
|
end
|
data/lib/ci_helper/constants.rb
CHANGED
@@ -10,4 +10,10 @@ unfortunately you need to pass the ci and you can get a UT passed >.^ '\n"
|
|
10
10
|
CI_URL = 'http://ci.raamsys.co.uk/job/RAAM/'
|
11
11
|
REDMINE_DOMAIN = 'http://redmine.raamsys.co.uk/issues/'
|
12
12
|
BITBUCKET_DOMAIN = 'https://bitbucket.org'
|
13
|
+
PRIORITY = { '1' => 'immediately',
|
14
|
+
'2' => 'urgent',
|
15
|
+
'3' => 'High',
|
16
|
+
'4' => 'normal',
|
17
|
+
'5' => 'low'}
|
18
|
+
DANGEROUS = 6
|
13
19
|
end
|
data/lib/ci_helper/exceptions.rb
CHANGED
data/lib/ci_helper/installer.rb
CHANGED
@@ -13,7 +13,7 @@ module CiHelper
|
|
13
13
|
ci_config_file = File.join(target, CiHelper::CONFIG_FILE_NAME)
|
14
14
|
|
15
15
|
result = File.open(ci_config_file, 'w') { |f| f.write(user_setting.to_yaml)}
|
16
|
-
puts '
|
16
|
+
puts 'initialize success You can run the monitor now ' if result
|
17
17
|
end
|
18
18
|
end
|
19
19
|
end
|
@@ -1,79 +1,62 @@
|
|
1
|
-
|
1
|
+
module CiHelper
|
2
|
+
class IssueMonitor
|
3
|
+
include CiHelper::RspecResultParser
|
2
4
|
|
3
|
-
|
4
|
-
|
5
|
+
attr_accessor :issue_status
|
6
|
+
attr_reader :ci_procedure
|
5
7
|
|
6
|
-
|
7
|
-
|
8
|
-
|
8
|
+
Result = Struct.new(:status, :failures,
|
9
|
+
:console_link, :issue_number,
|
10
|
+
:branch_name, :commit_hash)
|
9
11
|
|
10
|
-
|
11
|
-
|
12
|
-
end
|
13
|
-
|
14
|
-
def goto_monitor_page
|
15
|
-
begin
|
16
|
-
ci_procedure.run
|
17
|
-
if finish_test?
|
18
|
-
parse_output(ci_procedure.get_console_output)
|
19
|
-
end
|
20
|
-
true
|
21
|
-
rescue CiHelper::Exceptions::IssueNotFound => e
|
22
|
-
puts "#{e.message} #{ci_procedure.matching_strategy}"
|
23
|
-
false
|
12
|
+
def initialize(account, password)
|
13
|
+
@ci_procedure = CiProcedure.new(account, password)
|
24
14
|
end
|
25
|
-
end
|
26
15
|
|
27
|
-
|
28
|
-
|
29
|
-
finish_test? ? status[0].match('success') : false
|
30
|
-
end
|
31
|
-
|
32
|
-
def finish_test?
|
33
|
-
begin
|
34
|
-
output = ci_procedure.re_get_console_output
|
35
|
-
output.empty? ? false : true
|
36
|
-
rescue CiHelper::Exceptions::IssueNotFound => e
|
37
|
-
puts "#{e.message} #{ci_procedure.matching_strategy}"
|
38
|
-
false
|
16
|
+
def matching_strategy=(pattern)
|
17
|
+
ci_procedure.matching_strategy = pattern
|
39
18
|
end
|
40
|
-
end
|
41
|
-
|
42
|
-
def failures_each
|
43
|
-
fail_examples.each { |failed_example| yield(failed_example) }
|
44
|
-
end
|
45
19
|
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
ci_procedure.issue_number,
|
50
|
-
ci_procedure.branch_name,
|
51
|
-
ci_procedure.commit_hash)
|
52
|
-
end
|
20
|
+
def matching_strategy
|
21
|
+
ci_procedure.matching_strategy
|
22
|
+
end
|
53
23
|
|
54
|
-
|
24
|
+
def goto_monitor_page
|
25
|
+
begin
|
26
|
+
ci_procedure.run
|
27
|
+
rescue CiHelper::Exceptions::IssueNotFound => e
|
28
|
+
puts "#{e.message} #{ci_procedure.matching_strategy}"
|
29
|
+
return false
|
30
|
+
end
|
55
31
|
|
56
|
-
|
57
|
-
|
58
|
-
fail_example_start_index = nil
|
59
|
-
fail_example_end_index = nil
|
60
|
-
result_index = false
|
32
|
+
true
|
33
|
+
end
|
61
34
|
|
62
|
-
|
35
|
+
def success?
|
36
|
+
parser.console_output = ci_procedure.get_console_output
|
37
|
+
parser.formalize_output
|
38
|
+
parser.success?
|
39
|
+
end
|
63
40
|
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
elsif console_output[index].match('Finished: ')
|
71
|
-
result_index = index
|
41
|
+
def finish_test?
|
42
|
+
begin
|
43
|
+
ci_procedure.re_get_console_output.empty? ? false : true
|
44
|
+
rescue CiHelper::Exceptions::IssueNotFound => e
|
45
|
+
puts "#{e.message} #{ci_procedure.matching_strategy}"
|
46
|
+
false
|
72
47
|
end
|
73
48
|
end
|
74
49
|
|
75
|
-
|
76
|
-
|
77
|
-
|
50
|
+
def failures_each
|
51
|
+
parser.fail_examples.each { |failed_example| yield(failed_example) }
|
52
|
+
end
|
53
|
+
|
54
|
+
def content
|
55
|
+
Result.new(success?, parser.fail_examples,
|
56
|
+
"#{ci_procedure.console_page.uri.host}/#{ci_procedure.console_page.uri.request_uri}",
|
57
|
+
ci_procedure.issue_number,
|
58
|
+
ci_procedure.branch_name,
|
59
|
+
ci_procedure.commit_hash)
|
60
|
+
end
|
78
61
|
end
|
79
|
-
end
|
62
|
+
end
|
@@ -1,84 +1,113 @@
|
|
1
1
|
require 'yaml'
|
2
2
|
require 'byebug'
|
3
|
-
|
4
|
-
class MainProcess
|
3
|
+
module CiHelper
|
4
|
+
class MainProcess
|
5
|
+
# This class is responsible the all flow of the testing watching testing result -> create pull request
|
5
6
|
|
6
|
-
|
7
|
+
USER_CONFIG = Struct.new(:ci_ac, :ci_pass,
|
8
|
+
:bit_ac, :bit_pass,
|
9
|
+
:redmine_ac, :redmine_pass)
|
7
10
|
|
8
|
-
|
11
|
+
attr_accessor :config, :user_cli
|
12
|
+
attr_reader :issue_monitor, :bit_bucket_client, :redmine_client
|
9
13
|
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
end
|
14
|
+
def initialize(target)
|
15
|
+
@config = YAML.load_file("#{target}/#{CiHelper::CONFIG_FILE_NAME}")
|
16
|
+
@user_cli = UserCommandLineInterface.new
|
17
|
+
fail CiHelper::ConfigError, 'Please install to set your account first ' unless config
|
15
18
|
|
16
|
-
|
17
|
-
puts CiHelper::HELLO_MSG
|
18
|
-
while true
|
19
|
-
@issue_is_queued_in_ci = false
|
20
|
-
puts 'Please Input your next ticked number or commit hash to specifiy the multi test result in the CI'
|
21
|
-
match_strategy = gets.chop
|
22
|
-
issue_monitor = IssueMonitor.new(config.ci_ac, config.ci_pass, match_strategy)
|
23
|
-
|
24
|
-
unless issue_monitor.goto_monitor_page # no issue pull request found
|
25
|
-
# ask user to wait this issue or not
|
26
|
-
puts 'Your issue is queue or enter wrong issue number, do you want to wait the queue?'
|
27
|
-
puts 'y\n'
|
28
|
-
user_input = gets.chop
|
29
|
-
next if user_input == 'n' || user_input == 'N'
|
30
|
-
end
|
19
|
+
structlize_config
|
31
20
|
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
21
|
+
@issue_monitor = IssueMonitor.new(config.ci_ac, config.ci_pass)
|
22
|
+
@bit_bucket_client = BitBucketProcedure.new(config.bit_ac, config.bit_pass)
|
23
|
+
@redmine_client = RedmineProcedure.new(config.redmine_ac, config.redmine_pass)
|
24
|
+
end
|
36
25
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
26
|
+
def run
|
27
|
+
user_cli.wellcome
|
28
|
+
while true
|
29
|
+
issue_monitor.matching_strategy = user_cli.get_user_issue_pattern
|
30
|
+
|
31
|
+
next if issue_monitor.matching_strategy.empty?
|
32
|
+
|
33
|
+
unless issue_monitor.goto_monitor_page
|
34
|
+
next if user_cli.user_want_skip?
|
35
|
+
end
|
43
36
|
|
44
|
-
|
45
|
-
|
46
|
-
puts fail
|
37
|
+
while !issue_monitor.finish_test?
|
38
|
+
user_cli.wait_issue_finish
|
47
39
|
end
|
48
40
|
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
bit_bucket_client.create_pull_request(issue_monitor.content)
|
64
|
-
sleep(0.5)
|
65
|
-
bit_bucket_client.go_to_pull_request_page
|
66
|
-
sleep(0.5)
|
67
|
-
puts "this is your pull request page : #{CiHelper::BITBUCKET_DOMAIN}#{bit_bucket_client.pull_request_page.link_with(class: 'execute').href}"
|
41
|
+
if issue_monitor.success?
|
42
|
+
print_console_link
|
43
|
+
get_redmine_info
|
44
|
+
create_pull_request
|
45
|
+
# TODO: need to implement the updater_issue class, and then try auto update the issue status
|
46
|
+
# update_issue
|
47
|
+
else
|
48
|
+
print_fails
|
49
|
+
print_console_link
|
50
|
+
if user_cli.force_create_pull_request?
|
51
|
+
get_redmine_info
|
52
|
+
create_pull_request
|
53
|
+
# update_issue
|
54
|
+
end
|
68
55
|
end
|
69
56
|
end
|
70
57
|
end
|
71
|
-
end
|
72
58
|
|
73
|
-
|
59
|
+
private
|
74
60
|
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
61
|
+
def structlize_config
|
62
|
+
self.config = USER_CONFIG.new(config[:ci][:account],
|
63
|
+
config[:ci][:password],
|
64
|
+
config[:bitbucket][:account],
|
65
|
+
config[:bitbucket][:password],
|
66
|
+
config[:redmine][:account],
|
67
|
+
config[:redmine][:password])
|
68
|
+
end
|
69
|
+
|
70
|
+
|
71
|
+
def print_fails
|
72
|
+
puts 'issue failed here is failures '
|
73
|
+
issue_monitor.failures_each do |fail|
|
74
|
+
puts fail
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def print_console_link
|
79
|
+
puts "Console link: #{result.console_link}"
|
80
|
+
end
|
82
81
|
|
82
|
+
def create_pull_request
|
83
|
+
bit_bucket_client.add_pf_title(redmine_client.description)
|
84
|
+
bit_bucket_client.add_destination(user_cli.get_destination)
|
85
|
+
bit_bucket_client.add_user_description(user_cli.get_more_info)
|
86
|
+
bit_bucket_client.reviewers = user_cli.get_reviewers
|
87
|
+
user_cli.waiting_for_creation
|
88
|
+
bit_bucket_client.create_pull_request(result)
|
89
|
+
sleep(0.5)
|
90
|
+
bit_bucket_client.go_to_pull_request_page
|
91
|
+
sleep(0.5)
|
92
|
+
puts "this is your pull request page : #{CiHelper::BITBUCKET_DOMAIN}#{bit_bucket_client.pull_request_page.link_with(class: 'execute').href}"
|
93
|
+
end
|
94
|
+
|
95
|
+
def get_redmine_info
|
96
|
+
redmine_client.issue_no = result.issue_number
|
97
|
+
redmine_client.login
|
98
|
+
end
|
83
99
|
|
100
|
+
def update_issue
|
101
|
+
redmie_client.set do |issue|
|
102
|
+
issue.status = 'ut_passed'
|
103
|
+
issue.text_box = result.commit_hash
|
104
|
+
end
|
105
|
+
redmine_client.submit
|
106
|
+
end
|
107
|
+
|
108
|
+
def result
|
109
|
+
@result ||= issue_monitor.content
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
84
113
|
|
data/lib/ci_helper/message.rb
CHANGED
@@ -0,0 +1,24 @@
|
|
1
|
+
module CiHelper
|
2
|
+
module Redmine
|
3
|
+
class IssueUpdater
|
4
|
+
|
5
|
+
attr_accessor :update_page
|
6
|
+
|
7
|
+
def status=(params)
|
8
|
+
end
|
9
|
+
|
10
|
+
def text_box=(text)
|
11
|
+
end
|
12
|
+
|
13
|
+
def submit
|
14
|
+
form.click_button
|
15
|
+
end
|
16
|
+
|
17
|
+
private
|
18
|
+
|
19
|
+
def form
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
|
2
|
+
module CiHelper
|
3
|
+
|
4
|
+
|
5
|
+
class RedmineProcedure
|
6
|
+
# TODO: use this when implement the auto update
|
7
|
+
# include Redmine
|
8
|
+
attr_reader :issue_page, :issue_no, :client, :account, :password
|
9
|
+
|
10
|
+
|
11
|
+
def initialize(account, password)
|
12
|
+
@account = account
|
13
|
+
@password = password
|
14
|
+
@client = Mechanize.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def issue_no=(no)
|
18
|
+
@issue_no = no
|
19
|
+
end
|
20
|
+
|
21
|
+
def description
|
22
|
+
issue_form.field_with(name: 'issue[subject]').value
|
23
|
+
end
|
24
|
+
|
25
|
+
def priority
|
26
|
+
transform_to_word(issue_form.field_with(name: 'issue[prioirty_id]').text.to_i)
|
27
|
+
end
|
28
|
+
|
29
|
+
|
30
|
+
def issue_form
|
31
|
+
issue_page.form_with(action: "/issues/#{issue_no}")
|
32
|
+
end
|
33
|
+
|
34
|
+
def set(&block)
|
35
|
+
block.call(issue)
|
36
|
+
end
|
37
|
+
|
38
|
+
def submit
|
39
|
+
issue.submit
|
40
|
+
end
|
41
|
+
|
42
|
+
def login
|
43
|
+
login_page = client.get("#{CiHelper::REDMINE_DOMAIN}#{issue_no}")
|
44
|
+
|
45
|
+
@issue_page = login_page.form_with(action: '/login') do |f|
|
46
|
+
f.field_with(name: 'username').value = account
|
47
|
+
f.field_with(name: 'password').value = password
|
48
|
+
end.click_button
|
49
|
+
end
|
50
|
+
|
51
|
+
private
|
52
|
+
|
53
|
+
def transform_to_word(id)
|
54
|
+
CiHelper::PRIORITY[id]
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module CiHelper
|
2
|
+
module RspecResultParser
|
3
|
+
class Parser
|
4
|
+
# This class handle the the result page in the to see the result of test and failures
|
5
|
+
|
6
|
+
attr_reader :fail_examples, :result, :status, :console_output
|
7
|
+
|
8
|
+
def console_output=(output_string)
|
9
|
+
@console_output = output_string.split("\n")
|
10
|
+
formalize_output
|
11
|
+
end
|
12
|
+
|
13
|
+
def success?
|
14
|
+
status[0].match('success') ? true : false
|
15
|
+
end
|
16
|
+
|
17
|
+
def formalize_output
|
18
|
+
fail Exceptions::SettingError, 'Please set the console output first ' unless console_output
|
19
|
+
|
20
|
+
start_index = nil
|
21
|
+
fail_example_start_index = nil
|
22
|
+
fail_example_end_index = nil
|
23
|
+
result_index = false
|
24
|
+
|
25
|
+
console_output.each_index do |index|
|
26
|
+
|
27
|
+
if console_output[index].match('Finished in')
|
28
|
+
start_index = index
|
29
|
+
elsif console_output[index].match('Failed examples:')
|
30
|
+
fail_example_start_index = index
|
31
|
+
elsif console_output[index].match('Randomized')
|
32
|
+
fail_example_end_index = index
|
33
|
+
elsif console_output[index].match('Finished: ')
|
34
|
+
result_index = index
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
@status = console_output[start_index, start_index + 1]
|
39
|
+
@fail_examples = console_output[fail_example_start_index..fail_example_end_index] if fail_example_start_index
|
40
|
+
@result = result_index
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
@@ -1,32 +1,129 @@
|
|
1
|
-
|
1
|
+
module CiHelper
|
2
|
+
class UserCommandLineInterface
|
2
3
|
|
3
|
-
class UserCommandLineInterface
|
4
4
|
|
5
|
-
|
5
|
+
# TODO : need to move to bitbucket related setting to let user set
|
6
|
+
REVIEWERS = ['anna_ho_2014', 'cherylyu_jcm',
|
7
|
+
'millieho', 'AlanYu', 'GGD', 'ivan_ho_jcm']
|
6
8
|
|
7
|
-
|
8
|
-
|
9
|
-
|
9
|
+
# this class is responsible for get the user input and print the question message
|
10
|
+
attr_accessor :user_answer, :matching_strategy
|
11
|
+
attr_reader :issue_monitor
|
10
12
|
|
11
|
-
|
13
|
+
def wellcome
|
14
|
+
puts CiHelper::HELLO_MSG
|
15
|
+
end
|
12
16
|
|
13
|
-
|
17
|
+
def get_user_issue_pattern
|
18
|
+
self.matching_strategy = get_user_input do
|
19
|
+
puts matching_strategy_question
|
20
|
+
end
|
14
21
|
|
15
|
-
|
16
|
-
|
17
|
-
result == 'y' || result == 'Y'
|
18
|
-
end
|
22
|
+
matching_strategy
|
23
|
+
end
|
19
24
|
|
20
|
-
def get_ticket_no
|
21
25
|
|
22
|
-
|
26
|
+
def wait_issue_finish
|
27
|
+
puts waitting_reminder
|
28
|
+
sleep(CiHelper::WAITING_TIME)
|
29
|
+
end
|
23
30
|
|
24
|
-
|
25
|
-
|
26
|
-
|
31
|
+
def user_want_skip?
|
32
|
+
self.user_answer = get_user_input do
|
33
|
+
puts issue_not_found_question
|
34
|
+
puts 'y\n'
|
35
|
+
end
|
36
|
+
|
37
|
+
!user_answer?
|
38
|
+
end
|
39
|
+
|
40
|
+
def force_create_pull_request?
|
41
|
+
self.user_answer = get_user_input do
|
42
|
+
puts fail_test_pull_request_question
|
43
|
+
puts 'y\n'
|
44
|
+
end
|
45
|
+
|
46
|
+
user_answer?
|
47
|
+
end
|
48
|
+
|
49
|
+
def user_answer?
|
50
|
+
user_answer == 'y' || user_answer == 'Y'
|
51
|
+
end
|
52
|
+
|
53
|
+
def get_destination
|
54
|
+
get_user_input do
|
55
|
+
puts destination_question
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def get_more_info
|
60
|
+
get_user_input do
|
61
|
+
puts more_info_question
|
62
|
+
end
|
63
|
+
end
|
64
|
+
|
65
|
+
def get_reviewers
|
66
|
+
option = get_user_input do
|
67
|
+
puts reviewer_question
|
68
|
+
end
|
69
|
+
option_to_string(option)
|
70
|
+
end
|
71
|
+
|
72
|
+
def waiting_for_creation
|
73
|
+
puts 'Please move your finger away from the enter, and dont keep pushing the fuckkkkkkking enter, I am creating the pf >.^ '
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def get_user_input(&question_block)
|
79
|
+
fail CiHelper::Exceptions::NoQuestionError, 'Please assign a question to get user bollean answer' unless question_block
|
80
|
+
|
81
|
+
question_block.call
|
82
|
+
|
83
|
+
return gets.chop
|
84
|
+
end
|
85
|
+
|
86
|
+
def option_to_string(option)
|
87
|
+
choosen_key = option.split(' ')
|
88
|
+
reviewer = []
|
89
|
+
choosen_key.each do |value|
|
90
|
+
fail Exceptions::SettingError, 'Please dont choose Ciao Bao its dangerous !!!!!!!' if value.to_i == CiHelper::DANGEROUS
|
91
|
+
reviewer << REVIEWERS[value.to_i]
|
92
|
+
end
|
93
|
+
|
94
|
+
reviewer.join(',')
|
95
|
+
end
|
96
|
+
|
97
|
+
def issue_not_found_question
|
98
|
+
'Your issue is queue or enter wrong issue number, do you want to wait the queue?'
|
99
|
+
end
|
100
|
+
|
101
|
+
def matching_strategy_question
|
102
|
+
'Please Input your next ticket number or commit hash to specify the multi test result in the CI'
|
103
|
+
end
|
104
|
+
|
105
|
+
def queueing_question
|
106
|
+
'Your issue is queue or enter wrong issue number, do you want to wait the queue?'
|
107
|
+
end
|
108
|
+
|
109
|
+
def waitting_reminder
|
110
|
+
'Your Issue is running the test now, I will check for you every 60seconds'
|
111
|
+
end
|
112
|
+
|
113
|
+
def fail_test_pull_request_question
|
114
|
+
"Are You still wanna crete a pull request ? \n Please make sure all the values are all unstable or you will be killed by Gadii >W<"
|
115
|
+
end
|
116
|
+
|
117
|
+
def destination_question
|
118
|
+
'Please Provide the destination'
|
119
|
+
end
|
120
|
+
|
121
|
+
def more_info_question
|
122
|
+
'Please Provide the more description you want add in the text box'
|
123
|
+
end
|
27
124
|
|
28
|
-
|
29
|
-
|
30
|
-
|
125
|
+
def reviewer_question
|
126
|
+
"Please provide the reviewer 0. Anna 1. Cheryl 2. Millie 3.\\\\ Handsome Alan /////4. GGD 5. Ivan 6. CiaoBao order in gender and alphabetically \n EX: 0 1 2 with one space will be Anna, Cherylyu and Millie"
|
127
|
+
end
|
31
128
|
end
|
32
129
|
end
|
data/lib/ci_helper/version.rb
CHANGED
data/lib/ci_helper.rb
CHANGED
@@ -1,8 +1,12 @@
|
|
1
|
+
require 'ci_helper/rspec_result_parser'
|
1
2
|
require 'ci_helper/main_process'
|
2
3
|
require 'ci_helper/ci_procedure'
|
3
4
|
require 'ci_helper/bitbucket_procedure'
|
5
|
+
require 'ci_helper/user_command_line_interface'
|
4
6
|
require 'ci_helper/issue_monitor'
|
5
7
|
require 'ci_helper/utils'
|
6
8
|
require 'ci_helper/installer'
|
7
9
|
require 'ci_helper/constants'
|
8
|
-
require 'ci_helper/exceptions'
|
10
|
+
require 'ci_helper/exceptions'
|
11
|
+
require 'ci_helper/redmine_procedure'
|
12
|
+
require 'ci_helper/redmine/issue_updater'
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: CiHelper
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: '1.1'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Yu
|
@@ -10,6 +10,34 @@ bindir: bin
|
|
10
10
|
cert_chain: []
|
11
11
|
date: 2015-05-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: rspec
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '3.0'
|
20
|
+
type: :development
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '3.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: byebug
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :development
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
13
41
|
- !ruby/object:Gem::Dependency
|
14
42
|
name: mechanize
|
15
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -33,6 +61,7 @@ extra_rdoc_files: []
|
|
33
61
|
files:
|
34
62
|
- bin/ci_helper
|
35
63
|
- lib/ci_helper.rb
|
64
|
+
- lib/ci_helper/bitbucket/pull_request_page.rb
|
36
65
|
- lib/ci_helper/bitbucket_procedure.rb
|
37
66
|
- lib/ci_helper/ci_procedure.rb
|
38
67
|
- lib/ci_helper/cli.rb
|
@@ -42,8 +71,11 @@ files:
|
|
42
71
|
- lib/ci_helper/issue_monitor.rb
|
43
72
|
- lib/ci_helper/main_process.rb
|
44
73
|
- lib/ci_helper/message.rb
|
74
|
+
- lib/ci_helper/redmine.rb
|
75
|
+
- lib/ci_helper/redmine/issue_updater.rb
|
45
76
|
- lib/ci_helper/redmine_procedure.rb
|
46
|
-
- lib/ci_helper/
|
77
|
+
- lib/ci_helper/rspec_result_parser.rb
|
78
|
+
- lib/ci_helper/rspec_result_parser/parser.rb
|
47
79
|
- lib/ci_helper/user_command_line_interface.rb
|
48
80
|
- lib/ci_helper/utils.rb
|
49
81
|
- lib/ci_helper/version.rb
|