CiHelper 1.1 → 2.0
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.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
|