CiHelper 1.1 → 2.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 +4 -4
- data/lib/ci_helper.rb +4 -1
- data/lib/ci_helper/bitbucket.rb +22 -0
- data/lib/ci_helper/bitbucket/pull_request_page.rb +69 -0
- data/lib/ci_helper/bitbucket_procedure.rb +42 -21
- data/lib/ci_helper/cli.rb +4 -4
- data/lib/ci_helper/constants.rb +1 -0
- data/lib/ci_helper/functions.rb +4 -0
- data/lib/ci_helper/functions/base.rb +25 -0
- data/lib/ci_helper/functions/jenkin.rb +71 -0
- data/lib/ci_helper/functions/pull_request.rb +37 -0
- data/lib/ci_helper/functions/redmine.rb +33 -0
- data/lib/ci_helper/main_process.rb +18 -69
- data/lib/ci_helper/redmine.rb +13 -3
- data/lib/ci_helper/redmine/issue_updater.rb +68 -3
- data/lib/ci_helper/redmine_procedure.rb +26 -23
- data/lib/ci_helper/user_command_line_interface.rb +68 -1
- data/lib/ci_helper/version.rb +1 -1
- metadata +7 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 962fdd3ea07e2d9a2530b2f40d9f43adadfb34d6
|
4
|
+
data.tar.gz: 626d889374f8ea6da9583dc95c5eab5856da5dc8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5aeebe913fe7012d7c34e10986e9e349d86ce6331f844e0dbec7715fe269758f3976a2bdebf3a7e7c555accf6cbf57bae304bc6a06f688cac47fa10b03eb1a2e
|
7
|
+
data.tar.gz: e9c3edf5026ba8f1e3ef84ba522eb2c5e08fa6b0c1e272984f20b44db41dcf214dbbb0b5feb21e948b2058c2dca5e56d9a81a8f18fb559cf6bc68c4e1f4b9217
|
data/lib/ci_helper.rb
CHANGED
@@ -1,6 +1,8 @@
|
|
1
|
+
require 'ci_helper/redmine'
|
1
2
|
require 'ci_helper/rspec_result_parser'
|
2
3
|
require 'ci_helper/main_process'
|
3
4
|
require 'ci_helper/ci_procedure'
|
5
|
+
require 'ci_helper/bitbucket'
|
4
6
|
require 'ci_helper/bitbucket_procedure'
|
5
7
|
require 'ci_helper/user_command_line_interface'
|
6
8
|
require 'ci_helper/issue_monitor'
|
@@ -9,4 +11,5 @@ require 'ci_helper/installer'
|
|
9
11
|
require 'ci_helper/constants'
|
10
12
|
require 'ci_helper/exceptions'
|
11
13
|
require 'ci_helper/redmine_procedure'
|
12
|
-
require 'ci_helper/
|
14
|
+
require 'ci_helper/functions'
|
15
|
+
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'ci_helper/bitbucket/pull_request_page'
|
2
|
+
|
3
|
+
module CiHelper
|
4
|
+
module Bitbucket
|
5
|
+
|
6
|
+
def form_set(&block)
|
7
|
+
block.call(pull_request_form)
|
8
|
+
end
|
9
|
+
|
10
|
+
def submit
|
11
|
+
pull_request_form.submit
|
12
|
+
end
|
13
|
+
|
14
|
+
def set_form(form)
|
15
|
+
pull_request_form.form = form
|
16
|
+
end
|
17
|
+
|
18
|
+
def pull_request_form
|
19
|
+
@form ||= CiHelper::Bitbucket::PullRequestPage.new
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,69 @@
|
|
1
|
+
require 'ci_helper/version'
|
2
|
+
module CiHelper
|
3
|
+
module Bitbucket
|
4
|
+
|
5
|
+
class PullRequestPage
|
6
|
+
|
7
|
+
# This class is responsible for the update the pull request form in the bitbucket
|
8
|
+
# example :
|
9
|
+
# object.form_set do |config|
|
10
|
+
# config.title = 'your title'
|
11
|
+
# config.destination = 'the branch name you want to merge'
|
12
|
+
# config.reviewer = 'the reviewer you want to add'
|
13
|
+
# config.append_description = 'text '
|
14
|
+
# config.description_syntax('ruby') do |content|
|
15
|
+
# content.value += 'your code'
|
16
|
+
# end
|
17
|
+
# end
|
18
|
+
|
19
|
+
attr_accessor :form, :point_counter
|
20
|
+
|
21
|
+
def initialize
|
22
|
+
@point_counter = 1
|
23
|
+
end
|
24
|
+
|
25
|
+
def title=(text)
|
26
|
+
form.field_with(name: 'title').value = text
|
27
|
+
end
|
28
|
+
|
29
|
+
def destination=(dest)
|
30
|
+
form.field_with(name: 'dest').options.select { |option| option.text == dest.to_s}.first.select
|
31
|
+
end
|
32
|
+
|
33
|
+
def source=(branch_name)
|
34
|
+
form.field_with(name: 'source').options.select { |option| option.text == branch_name}.first.select
|
35
|
+
end
|
36
|
+
|
37
|
+
def reviewers=(reviewers)
|
38
|
+
form.field_with(name: 'reviewers').value = reviewers
|
39
|
+
end
|
40
|
+
|
41
|
+
def description_point=(text)
|
42
|
+
description.value += "#{point_counter}. #{text}\n"
|
43
|
+
self.point_counter += 1
|
44
|
+
end
|
45
|
+
|
46
|
+
def append_description=(append_text)
|
47
|
+
description.value += "\n#{append_text}\n"
|
48
|
+
end
|
49
|
+
|
50
|
+
def description_syntax(language, &failure_block)
|
51
|
+
description.value += "```\n"
|
52
|
+
description.value += "#!#{language} \n"
|
53
|
+
failure_block.call(description) if block_given?
|
54
|
+
description.value += "```\n"
|
55
|
+
end
|
56
|
+
|
57
|
+
def submit
|
58
|
+
description.value += "\n CiHelper Version #{::CiHelper::VERSION}"
|
59
|
+
form.click_button
|
60
|
+
end
|
61
|
+
|
62
|
+
private
|
63
|
+
|
64
|
+
def description
|
65
|
+
form.field_with(name: 'description')
|
66
|
+
end
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
@@ -3,9 +3,10 @@ require 'mechanize'
|
|
3
3
|
module CiHelper
|
4
4
|
class BitBucketProcedure
|
5
5
|
BIT_BUCKET_LOGIN_URL = 'https://bitbucket.org/account/signin/'
|
6
|
+
include CiHelper::Bitbucket
|
6
7
|
|
7
8
|
attr_reader :account, :password, :client, :destination, :user_description, :title, :reviewers
|
8
|
-
attr_reader :pull_request_page, :repository_page
|
9
|
+
attr_reader :pull_request_page, :repository_page, :branch_name, :result
|
9
10
|
|
10
11
|
def initialize(account, password)
|
11
12
|
@account = account
|
@@ -13,33 +14,37 @@ module CiHelper
|
|
13
14
|
@client = Mechanize.new
|
14
15
|
end
|
15
16
|
|
16
|
-
def create_pull_request
|
17
|
+
def create_pull_request
|
17
18
|
login
|
18
19
|
go_to_repo_page
|
19
20
|
go_to_pull_request_page
|
20
21
|
|
21
22
|
create_pull_request_page = pull_request_page.link_with(href: '/vansys/vansys/pull-request/new').click
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
description.value += "#!ruby \n"
|
33
|
-
|
34
|
-
result.failures.each do |failure|
|
35
|
-
description.value += "#{failure.to_s}\n"
|
23
|
+
set_form(create_pull_request_page.form_with(action: '/vansys/vansys/pull-request/new'))
|
24
|
+
|
25
|
+
form_set do |config|
|
26
|
+
config.title = "#{issue_numbers.join(' ')} - #{title}"
|
27
|
+
config.destination = destination.to_s
|
28
|
+
config.source = branch_name
|
29
|
+
config.reviewers = reviewers
|
30
|
+
|
31
|
+
issue_numbers.each do |number|
|
32
|
+
config.description_point = "#{CiHelper::REDMINE_DOMAIN}#{number}"
|
36
33
|
end
|
37
34
|
|
38
|
-
|
35
|
+
if result
|
36
|
+
config.description_syntax('ruby') do |content|
|
37
|
+
result.failures.each do |failure|
|
38
|
+
content.append_description = failure.to_s
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
39
42
|
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
+
|
44
|
+
config.append_description = user_description
|
45
|
+
end
|
46
|
+
|
47
|
+
submit
|
43
48
|
end
|
44
49
|
|
45
50
|
def add_destination(destination)
|
@@ -50,14 +55,30 @@ module CiHelper
|
|
50
55
|
@user_description = description
|
51
56
|
end
|
52
57
|
|
53
|
-
def
|
58
|
+
def pf_title=(title)
|
54
59
|
@title = title
|
55
60
|
end
|
56
61
|
|
62
|
+
def multiple_issues?
|
63
|
+
issue_numbers.size > 1
|
64
|
+
end
|
65
|
+
|
66
|
+
def issue_numbers
|
67
|
+
branch_name.split('_').each { |name| name.delete!('t') }
|
68
|
+
end
|
69
|
+
|
70
|
+
def branch_name=(name)
|
71
|
+
@branch_name = name
|
72
|
+
end
|
73
|
+
|
57
74
|
def reviewers=(reviewers)
|
58
75
|
@reviewers = reviewers
|
59
76
|
end
|
60
77
|
|
78
|
+
def result=(result)
|
79
|
+
@result = result
|
80
|
+
end
|
81
|
+
|
61
82
|
def login
|
62
83
|
login_page = client.get(BIT_BUCKET_LOGIN_URL)
|
63
84
|
|
data/lib/ci_helper/cli.rb
CHANGED
@@ -61,15 +61,15 @@ module CiHelper
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def get_initialize_data
|
64
|
-
puts 'Please input your ci server
|
64
|
+
puts 'Please input your ci server account '
|
65
65
|
ci_account = gets.chop
|
66
66
|
puts 'Please input your ci server password'
|
67
67
|
ci_password = gets.chop
|
68
|
-
puts 'Please input your bitbucket
|
68
|
+
puts 'Please input your bitbucket account'
|
69
69
|
bitbucket_account = gets.chop
|
70
|
-
puts 'Please input your bitbucket
|
70
|
+
puts 'Please input your bitbucket password'
|
71
71
|
bitbucket_password = gets.chop
|
72
|
-
puts 'Please input your redmine
|
72
|
+
puts 'Please input your redmine account'
|
73
73
|
redmine_ac = gets.chop
|
74
74
|
puts 'Please input your remind password'
|
75
75
|
redmine_pass = gets.chop
|
data/lib/ci_helper/constants.rb
CHANGED
@@ -10,6 +10,7 @@ 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
|
+
|
13
14
|
PRIORITY = { '1' => 'immediately',
|
14
15
|
'2' => 'urgent',
|
15
16
|
'3' => 'High',
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module CiHelper
|
2
|
+
module Functions
|
3
|
+
class Base
|
4
|
+
attr_reader :user_cli, :config,
|
5
|
+
:issue_monitor, :bit_bucket_client,
|
6
|
+
:redmine_client
|
7
|
+
|
8
|
+
|
9
|
+
def initialize(config)
|
10
|
+
@user_cli = CiHelper::UserCommandLineInterface.new
|
11
|
+
|
12
|
+
|
13
|
+
|
14
|
+
# @config = YAML.load_file("#{target}/#{CiHelper::CONFIG_FILE_NAME}")
|
15
|
+
@issue_monitor = IssueMonitor.new(config.ci_ac, config.ci_pass)
|
16
|
+
@bit_bucket_client = BitBucketProcedure.new(config.bit_ac, config.bit_pass)
|
17
|
+
@redmine_client = RedmineProcedure.new(config.redmine_ac, config.redmine_pass)
|
18
|
+
end
|
19
|
+
|
20
|
+
def run
|
21
|
+
fail NotImplementedError, 'Please implement your function first'
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,71 @@
|
|
1
|
+
module CiHelper
|
2
|
+
module Functions
|
3
|
+
class Jenkin < Base
|
4
|
+
def run
|
5
|
+
user_cli.wellcome
|
6
|
+
while true
|
7
|
+
issue_monitor.matching_strategy = user_cli.get_user_issue_pattern
|
8
|
+
|
9
|
+
next if issue_monitor.matching_strategy.empty?
|
10
|
+
|
11
|
+
unless issue_monitor.goto_monitor_page
|
12
|
+
next if user_cli.user_want_skip?
|
13
|
+
end
|
14
|
+
|
15
|
+
while !issue_monitor.finish_test?
|
16
|
+
user_cli.wait_issue_finish
|
17
|
+
end
|
18
|
+
|
19
|
+
if issue_monitor.success?
|
20
|
+
print_console_link
|
21
|
+
get_redmine_info
|
22
|
+
ask_user_pull_request_information
|
23
|
+
# TODO: need to implement the updater_issue class, and then try auto update the issue status
|
24
|
+
# update_issue
|
25
|
+
else
|
26
|
+
print_fails
|
27
|
+
print_console_link
|
28
|
+
if user_cli.force_create_pull_request?
|
29
|
+
redmine_client.issue_no = result.issue_number
|
30
|
+
get_redmine_info
|
31
|
+
ask_user_pull_request_information
|
32
|
+
# update_issue
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
private
|
39
|
+
|
40
|
+
def print_fails
|
41
|
+
puts 'issue failed here is failures '
|
42
|
+
issue_monitor.failures_each do |fail|
|
43
|
+
puts fail
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def ask_user_pull_request_information
|
48
|
+
bit_bucket_client.pf_title = redmine_client.issue.description
|
49
|
+
user_cli.print_target(redmine_client.target)
|
50
|
+
bit_bucket_client.add_destination(user_cli.get_destination)
|
51
|
+
bit_bucket_client.add_user_description(user_cli.get_more_info)
|
52
|
+
bit_bucket_client.reviewers = user_cli.get_reviewers
|
53
|
+
bit_bucket_client.result = result
|
54
|
+
user_cli.waiting_for_creation
|
55
|
+
bit_bucket_client.create_pull_request(result)
|
56
|
+
sleep(0.5)
|
57
|
+
bit_bucket_client.go_to_pull_request_page
|
58
|
+
sleep(0.5)
|
59
|
+
puts "this is your pull request page : #{CiHelper::BITBUCKET_DOMAIN}#{bit_bucket_client.pull_request_page.link_with(class: 'execute').href}"
|
60
|
+
end
|
61
|
+
|
62
|
+
def print_console_link
|
63
|
+
puts "Console link: #{result.console_link}"
|
64
|
+
end
|
65
|
+
|
66
|
+
def result
|
67
|
+
@result ||= issue_monitor.content
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module CiHelper
|
2
|
+
module Functions
|
3
|
+
class PullRequest < Base
|
4
|
+
|
5
|
+
def run
|
6
|
+
bit_bucket_client.branch_name = user_cli.get_branch_name
|
7
|
+
|
8
|
+
if bit_bucket_client.multiple_issues?
|
9
|
+
bit_bucket_client.pf_title = user_cli.customize_title
|
10
|
+
else
|
11
|
+
get_redmine_info
|
12
|
+
bit_bucket_client.pf_title = redmine_client.issue.description
|
13
|
+
end
|
14
|
+
|
15
|
+
bit_bucket_client.add_destination(user_cli.get_destination)
|
16
|
+
bit_bucket_client.add_user_description(user_cli.get_more_info)
|
17
|
+
bit_bucket_client.reviewers = user_cli.get_reviewers
|
18
|
+
user_cli.waiting_for_creation
|
19
|
+
|
20
|
+
bit_bucket_client.create_pull_request
|
21
|
+
sleep(0.5)
|
22
|
+
bit_bucket_client.go_to_pull_request_page
|
23
|
+
sleep(0.5)
|
24
|
+
|
25
|
+
puts "this is your pull request page : #{CiHelper::BITBUCKET_DOMAIN}#{bit_bucket_client.pull_request_page.link_with(class: 'execute').href}"
|
26
|
+
end
|
27
|
+
|
28
|
+
private
|
29
|
+
|
30
|
+
def get_redmine_info
|
31
|
+
redmine_client.issue_no = bit_bucket_client.issue_numbers.first
|
32
|
+
redmine_client.login
|
33
|
+
redmine_client.set_issue_form
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module CiHelper
|
2
|
+
module Functions
|
3
|
+
class Redmine < Base
|
4
|
+
def run
|
5
|
+
@issue_numbers = user_cli.get_issue_numbers
|
6
|
+
|
7
|
+
if multiple_issues?
|
8
|
+
# TODO: handle multiple issue situation
|
9
|
+
# This feature need to wait the issue to handle the status which is not exists
|
10
|
+
# automaticly change the status for user
|
11
|
+
#
|
12
|
+
puts 'sorry now we can not handle this situation '
|
13
|
+
else
|
14
|
+
redmine_client.issue_no = @issue_numbers
|
15
|
+
redmine_client.issue_setting do |config|
|
16
|
+
|
17
|
+
redmine_client.issue.print_all_status
|
18
|
+
config.status = user_cli.get_status
|
19
|
+
config.text_box = user_cli.get_more_info
|
20
|
+
end
|
21
|
+
|
22
|
+
redmine_client.issue.submit
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
private
|
27
|
+
|
28
|
+
def multiple_issues?
|
29
|
+
@issue_numbers.split(' ').size > 1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -2,7 +2,9 @@ require 'yaml'
|
|
2
2
|
require 'byebug'
|
3
3
|
module CiHelper
|
4
4
|
class MainProcess
|
5
|
-
|
5
|
+
|
6
|
+
# This class is responsible for asking the function user want to use
|
7
|
+
# TODO: maybe this class in the future we can extract to command line use Thor to implement it
|
6
8
|
|
7
9
|
USER_CONFIG = Struct.new(:ci_ac, :ci_pass,
|
8
10
|
:bit_ac, :bit_pass,
|
@@ -17,47 +19,24 @@ module CiHelper
|
|
17
19
|
fail CiHelper::ConfigError, 'Please install to set your account first ' unless config
|
18
20
|
|
19
21
|
structlize_config
|
20
|
-
|
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
22
|
end
|
25
23
|
|
26
24
|
def run
|
27
|
-
user_cli.wellcome
|
28
25
|
while true
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
while !issue_monitor.finish_test?
|
38
|
-
user_cli.wait_issue_finish
|
39
|
-
end
|
40
|
-
|
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
|
26
|
+
@option = user_cli.get_user_choose
|
27
|
+
|
28
|
+
if ci_monitor?
|
29
|
+
CiHelper::Functions::Jenkin.new(config).run
|
30
|
+
elsif update_issue?
|
31
|
+
CiHelper::Functions::Redmine.new(config).run
|
32
|
+
elsif create_pull_request?
|
33
|
+
CiHelper::Functions::PullRequest.new(config).run
|
47
34
|
else
|
48
|
-
|
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
|
35
|
+
puts 'Please dont act like a monkey'
|
55
36
|
end
|
56
37
|
end
|
57
38
|
end
|
58
39
|
|
59
|
-
private
|
60
|
-
|
61
40
|
def structlize_config
|
62
41
|
self.config = USER_CONFIG.new(config[:ci][:account],
|
63
42
|
config[:ci][:password],
|
@@ -67,46 +46,16 @@ module CiHelper
|
|
67
46
|
config[:redmine][:password])
|
68
47
|
end
|
69
48
|
|
70
|
-
|
71
|
-
|
72
|
-
puts 'issue failed here is failures '
|
73
|
-
issue_monitor.failures_each do |fail|
|
74
|
-
puts fail
|
75
|
-
end
|
49
|
+
def ci_monitor?
|
50
|
+
@option == '1'
|
76
51
|
end
|
77
52
|
|
78
|
-
def
|
79
|
-
|
80
|
-
end
|
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
|
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
|
53
|
+
def update_issue?
|
54
|
+
@option == '3'
|
106
55
|
end
|
107
56
|
|
108
|
-
def
|
109
|
-
@
|
57
|
+
def create_pull_request?
|
58
|
+
@option == '2'
|
110
59
|
end
|
111
60
|
end
|
112
61
|
end
|
data/lib/ci_helper/redmine.rb
CHANGED
@@ -1,14 +1,24 @@
|
|
1
1
|
require 'ci_helper/redmine/issue_updater'
|
2
2
|
|
3
|
+
# when include this module you can set your issue updator and set the update form
|
4
|
+
# object.update_issue_page
|
3
5
|
module CiHelper
|
4
6
|
module Redmine
|
5
7
|
|
6
|
-
def
|
7
|
-
issue
|
8
|
+
def issue_setting(&block)
|
9
|
+
block.call(issue)
|
10
|
+
end
|
11
|
+
|
12
|
+
def issue_form=(form)
|
13
|
+
issue.form = form
|
14
|
+
end
|
15
|
+
|
16
|
+
def submit
|
17
|
+
issue.submit
|
8
18
|
end
|
9
19
|
|
10
20
|
def issue
|
11
|
-
@issue ||= Redmine::
|
21
|
+
@issue ||= CiHelper::Redmine::IssueUpdater.new
|
12
22
|
end
|
13
23
|
end
|
14
24
|
end
|
@@ -1,23 +1,88 @@
|
|
1
1
|
module CiHelper
|
2
2
|
module Redmine
|
3
|
+
|
4
|
+
# when include Redmine and you will have issue instance that you can use
|
5
|
+
# before use it to set your form
|
6
|
+
#
|
7
|
+
# object.issue_setting do |config|
|
8
|
+
# config.status = 'Your status in text or in value'
|
9
|
+
# config.text_box = 'your description in string'
|
10
|
+
# end
|
11
|
+
#
|
12
|
+
# object.issue.submit
|
13
|
+
|
3
14
|
class IssueUpdater
|
4
15
|
|
5
|
-
attr_accessor :update_page
|
16
|
+
attr_accessor :update_page, :form
|
17
|
+
|
18
|
+
STATUS = { 1 => 'New', 2 => 'Progress', 3 => 'Resolved', 5 => 'Closed', 8 => 'UT passed', 10 => 'Reopen' ,12 => 'Information Waiting'}
|
19
|
+
STATUS_WORKING_FLOW = [1,2,3,8]
|
20
|
+
|
21
|
+
def description
|
22
|
+
form.field_with(name: 'issue[subject]').value
|
23
|
+
end
|
24
|
+
|
25
|
+
def priority
|
26
|
+
# TODO: supply an api for user to pasted the priority of this issue
|
27
|
+
fail NotImplementedError, 'not check this method '
|
28
|
+
transform_to_word(issue_form.field_with(name: 'issue[prioirty_id]').text.to_i)
|
29
|
+
end
|
6
30
|
|
7
|
-
def status=(
|
31
|
+
def status=(user_input)
|
32
|
+
# make sure let user select value or text
|
33
|
+
status_select_list.value = status_options.select { |option| option.value == user_input}
|
8
34
|
end
|
9
35
|
|
10
36
|
def text_box=(text)
|
37
|
+
text_field.value = text
|
38
|
+
end
|
39
|
+
|
40
|
+
def print_all_status
|
41
|
+
status_options_in_text.each_index { |index| puts "status: #{status_options_in_text[index]}, value: #{status_options_in_value[index]}"}
|
42
|
+
end
|
43
|
+
|
44
|
+
def status_options_in_value
|
45
|
+
status_select_list.options.map(&:value)
|
46
|
+
end
|
47
|
+
|
48
|
+
def status_options_in_text
|
49
|
+
status_select_list.options.map(&:text)
|
50
|
+
end
|
51
|
+
|
52
|
+
def target_version
|
53
|
+
target_version_select_list.options.select{ |option| option.value == target_version_select_list.value }
|
11
54
|
end
|
12
55
|
|
13
56
|
def submit
|
57
|
+
# need to handle the submit success or not
|
58
|
+
fail Exceptions::SettingError, 'Please set your form before use it' unless form
|
59
|
+
|
14
60
|
form.click_button
|
15
61
|
end
|
16
62
|
|
17
63
|
private
|
18
64
|
|
19
|
-
def
|
65
|
+
def status_options
|
66
|
+
status_select_list.options
|
67
|
+
end
|
68
|
+
|
69
|
+
def status_select_list
|
70
|
+
form.field_with(name: 'issue[status_id]')
|
71
|
+
end
|
72
|
+
|
73
|
+
def text_field
|
74
|
+
form.field_with(name: 'issue[notes]')
|
75
|
+
end
|
76
|
+
|
77
|
+
def target_version_select_list
|
78
|
+
form.field_with(name: 'issue[fixed_version_id]')
|
79
|
+
end
|
80
|
+
|
81
|
+
private
|
20
82
|
|
83
|
+
# TODO: not implement yet
|
84
|
+
def transform_to_word(id)
|
85
|
+
CiHelper::PRIORITY[id]
|
21
86
|
end
|
22
87
|
end
|
23
88
|
end
|
@@ -1,46 +1,41 @@
|
|
1
|
-
|
2
1
|
module CiHelper
|
3
|
-
|
2
|
+
# This class responsible for traversing the page in the redmine
|
3
|
+
# and find the issue form, re-get the page
|
4
4
|
|
5
5
|
class RedmineProcedure
|
6
6
|
# TODO: use this when implement the auto update
|
7
|
-
|
7
|
+
include CiHelper::Redmine
|
8
8
|
attr_reader :issue_page, :issue_no, :client, :account, :password
|
9
9
|
|
10
10
|
|
11
11
|
def initialize(account, password)
|
12
12
|
@account = account
|
13
13
|
@password = password
|
14
|
-
@client
|
14
|
+
@client = Mechanize.new
|
15
15
|
end
|
16
16
|
|
17
17
|
def issue_no=(no)
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
18
|
+
if issue_no
|
19
|
+
@issue_no = no
|
20
|
+
refresh_issue_page
|
21
|
+
set_issue_form
|
22
|
+
else
|
23
|
+
@issue_no = no
|
24
|
+
login
|
25
|
+
set_issue_form
|
26
|
+
end
|
23
27
|
end
|
24
28
|
|
25
|
-
def
|
26
|
-
|
29
|
+
def set_issue_form
|
30
|
+
self.issue_form = form
|
27
31
|
end
|
28
32
|
|
29
|
-
|
30
|
-
def issue_form
|
33
|
+
def form
|
31
34
|
issue_page.form_with(action: "/issues/#{issue_no}")
|
32
35
|
end
|
33
36
|
|
34
|
-
def set(&block)
|
35
|
-
block.call(issue)
|
36
|
-
end
|
37
|
-
|
38
|
-
def submit
|
39
|
-
issue.submit
|
40
|
-
end
|
41
|
-
|
42
37
|
def login
|
43
|
-
login_page =
|
38
|
+
login_page = get_issue_page
|
44
39
|
|
45
40
|
@issue_page = login_page.form_with(action: '/login') do |f|
|
46
41
|
f.field_with(name: 'username').value = account
|
@@ -48,10 +43,18 @@ module CiHelper
|
|
48
43
|
end.click_button
|
49
44
|
end
|
50
45
|
|
46
|
+
def refresh_issue_page
|
47
|
+
@issue_page = get_issue_page
|
48
|
+
end
|
49
|
+
|
50
|
+
def get_issue_page
|
51
|
+
client.get("#{CiHelper::REDMINE_DOMAIN}#{issue_no}")
|
52
|
+
end
|
53
|
+
|
51
54
|
private
|
52
55
|
|
53
56
|
def transform_to_word(id)
|
54
57
|
CiHelper::PRIORITY[id]
|
55
58
|
end
|
56
59
|
end
|
57
|
-
end
|
60
|
+
end
|
@@ -62,17 +62,52 @@ module CiHelper
|
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
65
|
+
def get_branch_name
|
66
|
+
get_user_input do
|
67
|
+
puts branch_name_question
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
def customize_title
|
72
|
+
get_user_input do
|
73
|
+
puts cusotmize_title_question
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def get_user_choose
|
78
|
+
get_user_input do
|
79
|
+
puts options
|
80
|
+
end
|
81
|
+
end
|
82
|
+
|
65
83
|
def get_reviewers
|
66
84
|
option = get_user_input do
|
67
85
|
puts reviewer_question
|
68
86
|
end
|
87
|
+
# FIXME: the responsibility to transfer the option to bitbucket acceptable params should be the bit_bucket_procedure
|
69
88
|
option_to_string(option)
|
70
89
|
end
|
71
90
|
|
91
|
+
def get_issue_numbers
|
92
|
+
get_user_input do
|
93
|
+
puts issue_number_question
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def get_status
|
98
|
+
get_user_input do
|
99
|
+
puts 'please input status in value'
|
100
|
+
end
|
101
|
+
end
|
102
|
+
|
72
103
|
def waiting_for_creation
|
73
104
|
puts 'Please move your finger away from the enter, and dont keep pushing the fuckkkkkkking enter, I am creating the pf >.^ '
|
74
105
|
end
|
75
106
|
|
107
|
+
def print_target(target)
|
108
|
+
puts "This is your target version #{target}\n"
|
109
|
+
end
|
110
|
+
|
76
111
|
private
|
77
112
|
|
78
113
|
def get_user_input(&question_block)
|
@@ -87,13 +122,26 @@ module CiHelper
|
|
87
122
|
choosen_key = option.split(' ')
|
88
123
|
reviewer = []
|
89
124
|
choosen_key.each do |value|
|
90
|
-
|
125
|
+
if value.to_i == CiHelper::DANGEROUS
|
126
|
+
print_ngyan_cat
|
127
|
+
fail Exceptions::SettingError, 'Please dont choose Ciao Bao its dangerous !!!!!!!'
|
128
|
+
end
|
129
|
+
|
91
130
|
reviewer << REVIEWERS[value.to_i]
|
92
131
|
end
|
93
132
|
|
94
133
|
reviewer.join(',')
|
95
134
|
end
|
96
135
|
|
136
|
+
# TODO: extract to a ngyan cat print lib
|
137
|
+
def print_ngyan_cat
|
138
|
+
puts ' O----O,'
|
139
|
+
puts ' : | 38|\/\ ^^^^'
|
140
|
+
puts ' M ~\___(+.+)'
|
141
|
+
puts ' U U'
|
142
|
+
|
143
|
+
end
|
144
|
+
|
97
145
|
def issue_not_found_question
|
98
146
|
'Your issue is queue or enter wrong issue number, do you want to wait the queue?'
|
99
147
|
end
|
@@ -125,5 +173,24 @@ module CiHelper
|
|
125
173
|
def reviewer_question
|
126
174
|
"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
175
|
end
|
176
|
+
|
177
|
+
def branch_name_question
|
178
|
+
'Please Provide branch name you want to merge'
|
179
|
+
end
|
180
|
+
|
181
|
+
def cusotmize_title_question
|
182
|
+
'You branch seems have a lot of issue, please provide your title of pull request'
|
183
|
+
end
|
184
|
+
|
185
|
+
def options
|
186
|
+
" 1. Monitor issue in CI and create pull request \n
|
187
|
+
2. input branch name to create pull request \n
|
188
|
+
3. update issue status \n
|
189
|
+
please input 1, 2 or 3"
|
190
|
+
end
|
191
|
+
|
192
|
+
def issue_number_question
|
193
|
+
'please input your ticket number you want to update'
|
194
|
+
end
|
128
195
|
end
|
129
196
|
end
|
data/lib/ci_helper/version.rb
CHANGED
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: '
|
4
|
+
version: '2.0'
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Alan Yu
|
@@ -61,12 +61,18 @@ extra_rdoc_files: []
|
|
61
61
|
files:
|
62
62
|
- bin/ci_helper
|
63
63
|
- lib/ci_helper.rb
|
64
|
+
- lib/ci_helper/bitbucket.rb
|
64
65
|
- lib/ci_helper/bitbucket/pull_request_page.rb
|
65
66
|
- lib/ci_helper/bitbucket_procedure.rb
|
66
67
|
- lib/ci_helper/ci_procedure.rb
|
67
68
|
- lib/ci_helper/cli.rb
|
68
69
|
- lib/ci_helper/constants.rb
|
69
70
|
- lib/ci_helper/exceptions.rb
|
71
|
+
- lib/ci_helper/functions.rb
|
72
|
+
- lib/ci_helper/functions/base.rb
|
73
|
+
- lib/ci_helper/functions/jenkin.rb
|
74
|
+
- lib/ci_helper/functions/pull_request.rb
|
75
|
+
- lib/ci_helper/functions/redmine.rb
|
70
76
|
- lib/ci_helper/installer.rb
|
71
77
|
- lib/ci_helper/issue_monitor.rb
|
72
78
|
- lib/ci_helper/main_process.rb
|