CiHelper 1.0.6 → 1.1
Sign up to get free protection for your applications and to get access to all the features.
- 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
|