fastlane-plugin-jira_issues_release_notes 0.3.0 → 1.0.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/README.md +267 -31
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_comment_action.rb +200 -0
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/{branch_jira_issues_release_notes_action.rb → jira_feature_validation_action.rb} +31 -47
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_issues_keys_from_commits_action.rb +134 -0
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_release_changelog_action.rb +182 -0
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_release_validation_action.rb +173 -0
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_versions_action.rb +162 -0
- data/lib/fastlane/plugin/jira_issues_release_notes/helper/jira_issues_release_notes_helper.rb +212 -17
- data/lib/fastlane/plugin/jira_issues_release_notes/version.rb +1 -1
- metadata +11 -7
- data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_issues_release_notes_action.rb +0 -284
@@ -3,15 +3,18 @@ require_relative '../helper/jira_issues_release_notes_helper'
|
|
3
3
|
|
4
4
|
module Fastlane
|
5
5
|
module Actions
|
6
|
-
class
|
6
|
+
class JiraFeatureValidationAction < Action
|
7
7
|
def self.run(params)
|
8
8
|
branch = other_action.git_branch
|
9
|
-
|
9
|
+
ticket_key = Helper::JiraIssuesReleaseNotesHelper.extract_key_from_branch(
|
10
|
+
branch: branch,
|
11
|
+
ticket_prefix: params[:ticket_prefix]
|
12
|
+
)
|
10
13
|
|
11
14
|
@format = params[:format]
|
12
15
|
@extra_fields = params[:extra_fields]
|
16
|
+
@format_line_break = @format === 'html' ? '<br />' : "\n"
|
13
17
|
|
14
|
-
ticket_code = regex.match branch
|
15
18
|
|
16
19
|
return ticket_not_found unless ticket_code
|
17
20
|
|
@@ -20,6 +23,7 @@ module Fastlane
|
|
20
23
|
|
21
24
|
@jira_helper = Helper::JiraIssuesReleaseNotesHelper.jira_helper(
|
22
25
|
host: params[:host],
|
26
|
+
api_version: params[:api_version],
|
23
27
|
username: params[:username],
|
24
28
|
password: params[:password],
|
25
29
|
context_path: params[:context_path],
|
@@ -42,48 +46,12 @@ module Fastlane
|
|
42
46
|
header_text = ticket_code ? "😅 Jira issue with key '#{ticket_code}' could not be found" : "😅 Jira issue could not be detected"
|
43
47
|
|
44
48
|
return [
|
45
|
-
style_text(text: header_text, style: 'heading'),
|
46
|
-
style_text(text: "► Latest Commit:", style: 'bold'),
|
49
|
+
Helper::JiraIssuesReleaseNotesHelper.style_text(text: header_text, style: 'heading'),
|
50
|
+
Helper::JiraIssuesReleaseNotesHelper.style_text(text: "► Latest Commit:", style: 'bold'),
|
47
51
|
last_commit[:message]
|
48
52
|
].join("\n")
|
49
53
|
end
|
50
|
-
|
51
|
-
def self.style_text(text:, style:)
|
52
|
-
# formats the text according to the style we're looking to use
|
53
|
-
|
54
|
-
# Skips all styling
|
55
|
-
case style
|
56
|
-
when "title"
|
57
|
-
case @format
|
58
|
-
when "markdown"
|
59
|
-
"# #{text}"
|
60
|
-
when "slack"
|
61
|
-
"*#{text}*"
|
62
|
-
else
|
63
|
-
text
|
64
|
-
end
|
65
|
-
when "heading"
|
66
|
-
case format
|
67
|
-
when "markdown"
|
68
|
-
"### #{text}"
|
69
|
-
when "slack"
|
70
|
-
"*#{text}*"
|
71
|
-
else
|
72
|
-
"#{text}:"
|
73
|
-
end
|
74
|
-
when "bold"
|
75
|
-
case format
|
76
|
-
when "markdown"
|
77
|
-
"**#{text}**"
|
78
|
-
when "slack"
|
79
|
-
"*#{text}*"
|
80
|
-
else
|
81
|
-
text
|
82
|
-
end
|
83
|
-
else
|
84
|
-
text # catchall, shouldn't be needed
|
85
|
-
end
|
86
|
-
end
|
54
|
+
|
87
55
|
|
88
56
|
def self.generate_message_with(issue:)
|
89
57
|
link = @jira_helper.url(issue: issue)
|
@@ -99,7 +67,7 @@ module Fastlane
|
|
99
67
|
extra.flatten!
|
100
68
|
]
|
101
69
|
.flatten!
|
102
|
-
.join(
|
70
|
+
.join(@format_line_break)
|
103
71
|
when "markdown"
|
104
72
|
extra = @extra_fields.map { |key, value| ["", "**► #{key.to_s}**", issue.attrs["fields"][value.to_s]] }
|
105
73
|
[
|
@@ -108,7 +76,16 @@ module Fastlane
|
|
108
76
|
extra.flatten!
|
109
77
|
]
|
110
78
|
.flatten!
|
111
|
-
.join(
|
79
|
+
.join(@format_line_break)
|
80
|
+
when "html"
|
81
|
+
extra = @extra_fields.map { |key, value| ["", "<strong>► #{key.to_s}</strong>", issue.attrs["fields"][value.to_s]] }
|
82
|
+
[
|
83
|
+
"<strong>► #{issue_type}: <a href=\"#{link}\" target=\"_blank\">#{issue.summary}</a></strong> (#{status})",
|
84
|
+
issue.description,
|
85
|
+
extra.flatten!
|
86
|
+
]
|
87
|
+
.flatten!
|
88
|
+
.join(@format_line_break)
|
112
89
|
else
|
113
90
|
extra = @extra_fields.map { |key, value| ["", "► #{key.to_s}", issue.attrs["fields"][value.to_s]] }
|
114
91
|
[
|
@@ -117,7 +94,7 @@ module Fastlane
|
|
117
94
|
extra.flatten!
|
118
95
|
]
|
119
96
|
.flatten!
|
120
|
-
.join(
|
97
|
+
.join(@format_line_break)
|
121
98
|
end
|
122
99
|
end
|
123
100
|
|
@@ -149,11 +126,11 @@ module Fastlane
|
|
149
126
|
),
|
150
127
|
FastlaneCore::ConfigItem.new(
|
151
128
|
key: :format,
|
152
|
-
description: "You can use either markdown, slack or plain",
|
129
|
+
description: "You can use either markdown, slack, html or plain",
|
153
130
|
default_value: "markdown",
|
154
131
|
optional: true,
|
155
132
|
verify_block: proc do |value|
|
156
|
-
UI.user_error!("Invalid format! You can use either markdown, slack or plain") unless ['markdown', 'slack', 'plain'].include?(value)
|
133
|
+
UI.user_error!("Invalid format! You can use either markdown, slack, html or plain") unless ['markdown', 'html', 'slack', 'plain'].include?(value)
|
157
134
|
end
|
158
135
|
),
|
159
136
|
FastlaneCore::ConfigItem.new(
|
@@ -183,6 +160,13 @@ module Fastlane
|
|
183
160
|
description: 'Jira location',
|
184
161
|
optional: false
|
185
162
|
),
|
163
|
+
FastlaneCore::ConfigItem.new(
|
164
|
+
key: :api_version,
|
165
|
+
env_name: 'FL_JIRA_API_VERSION',
|
166
|
+
description: 'Jira api version',
|
167
|
+
default_value: '2',
|
168
|
+
optional: true,
|
169
|
+
),
|
186
170
|
FastlaneCore::ConfigItem.new(
|
187
171
|
key: :context_path,
|
188
172
|
env_name: 'FL_JIRA_CONTEXT_PATH',
|
data/lib/fastlane/plugin/jira_issues_release_notes/actions/jira_issues_keys_from_commits_action.rb
ADDED
@@ -0,0 +1,134 @@
|
|
1
|
+
require 'fastlane/action'
|
2
|
+
require_relative '../helper/jira_issues_release_notes_helper'
|
3
|
+
|
4
|
+
module Fastlane
|
5
|
+
module Actions
|
6
|
+
module SharedValues
|
7
|
+
FL_JIRA_LAST_TAG ||= :S3_APK_OUTPUT_PATH
|
8
|
+
FL_JIRA_LAST_TAG_HASH ||= :FL_JIRA_LAST_TAG_HASH
|
9
|
+
FL_JIRA_COMMITS_FROM_HASH ||= :FL_JIRA_COMMITS_FROM_HASH
|
10
|
+
FL_JIRA_LAST_KEYS_FROM_COMMITS ||= :FL_JIRA_LAST_KEYS_FROM_COMMITS
|
11
|
+
FL_JIRA_LAST_ISSUES_FROM_COMMITS ||= :FL_JIRA_LAST_ISSUES_FROM_COMMITS
|
12
|
+
end
|
13
|
+
|
14
|
+
class JiraIssuesKeysFromCommitsAction < Action
|
15
|
+
def self.run(params)
|
16
|
+
Helper::JiraIssuesReleaseNotesHelper.initialize_jira(
|
17
|
+
host: params[:host],
|
18
|
+
api_version: params[:api_version],
|
19
|
+
username: params[:username],
|
20
|
+
password: params[:password],
|
21
|
+
context_path: params[:context_path],
|
22
|
+
disable_ssl_verification: params[:disable_ssl_verification]
|
23
|
+
)
|
24
|
+
|
25
|
+
issue_key_regex = Regexp.new("(#{params[:ticket_prefix]}-\\d+)")
|
26
|
+
|
27
|
+
Helper::JiraIssuesReleaseNotesHelper.get_keys_from_commit_after_latest_tag(
|
28
|
+
tag_regex: params[:tag_prefix],
|
29
|
+
tag_version_match: params[:tag_version_match],
|
30
|
+
issue_key_regex: issue_key_regex,
|
31
|
+
debug: params[:debug]
|
32
|
+
)
|
33
|
+
end
|
34
|
+
|
35
|
+
def self.description
|
36
|
+
"It generates a release note based on the issues keys found in branch name and descriptions found in the commits"
|
37
|
+
end
|
38
|
+
|
39
|
+
def self.authors
|
40
|
+
["Erick Martins"]
|
41
|
+
end
|
42
|
+
|
43
|
+
def self.return_value
|
44
|
+
["ABC-123", "ABC-321"]
|
45
|
+
end
|
46
|
+
|
47
|
+
def self.details
|
48
|
+
# Optional:
|
49
|
+
"It generates a release note based on the issues keys found in branch name and descriptions found in the commits"
|
50
|
+
end
|
51
|
+
|
52
|
+
def self.available_options
|
53
|
+
[
|
54
|
+
FastlaneCore::ConfigItem.new(
|
55
|
+
key: :tag_prefix,
|
56
|
+
description: "Match parameter of git describe. See man page of git describe for more info",
|
57
|
+
verify_block: proc do |value|
|
58
|
+
UI.user_error!("No match for analyze_commits action given, pass using `match: 'expr'`") unless value && !value.empty?
|
59
|
+
end
|
60
|
+
),
|
61
|
+
FastlaneCore::ConfigItem.new(
|
62
|
+
key: :ticket_prefix,
|
63
|
+
env_name: 'FL_FIND_TICKETS_MATCHING',
|
64
|
+
description: 'regex to extract ticket numbers',
|
65
|
+
default_value: '[A-Z]+',
|
66
|
+
optional: true
|
67
|
+
),
|
68
|
+
FastlaneCore::ConfigItem.new(
|
69
|
+
key: :tag_version_match,
|
70
|
+
description: "To parse version number from tag name",
|
71
|
+
default_value: '\d+\.\d+\.\d+'
|
72
|
+
),
|
73
|
+
|
74
|
+
# Jira Client options
|
75
|
+
FastlaneCore::ConfigItem.new(
|
76
|
+
key: :username,
|
77
|
+
env_name: 'FL_JIRA_USERNAME',
|
78
|
+
description: 'Jira user',
|
79
|
+
optional: false
|
80
|
+
),
|
81
|
+
FastlaneCore::ConfigItem.new(
|
82
|
+
key: :password,
|
83
|
+
env_name: 'FL_JIRA_PASSWORD',
|
84
|
+
description: 'Jira user',
|
85
|
+
optional: false
|
86
|
+
),
|
87
|
+
FastlaneCore::ConfigItem.new(
|
88
|
+
key: :host,
|
89
|
+
env_name: 'FL_JIRA_HOST',
|
90
|
+
description: 'Jira location',
|
91
|
+
optional: false
|
92
|
+
),
|
93
|
+
FastlaneCore::ConfigItem.new(
|
94
|
+
key: :api_version,
|
95
|
+
env_name: 'FL_JIRA_API_VERSION',
|
96
|
+
description: 'Jira api version',
|
97
|
+
default_value: '2',
|
98
|
+
optional: true,
|
99
|
+
),
|
100
|
+
FastlaneCore::ConfigItem.new(
|
101
|
+
key: :context_path,
|
102
|
+
env_name: 'FL_JIRA_CONTEXT_PATH',
|
103
|
+
description: 'Jira context path',
|
104
|
+
optional: true,
|
105
|
+
default_value: ''
|
106
|
+
),
|
107
|
+
FastlaneCore::ConfigItem.new(
|
108
|
+
key: :disable_ssl_verification,
|
109
|
+
env_name: 'FL_JIRA_DISABLE_SSL_VERIFICATION',
|
110
|
+
description: 'Jira SSL Verification mode',
|
111
|
+
optional: true,
|
112
|
+
default_value: false,
|
113
|
+
type: Boolean
|
114
|
+
),
|
115
|
+
FastlaneCore::ConfigItem.new(
|
116
|
+
key: :debug,
|
117
|
+
description: "True if you want to log out a debug info",
|
118
|
+
default_value: false,
|
119
|
+
type: Boolean,
|
120
|
+
optional: true
|
121
|
+
)
|
122
|
+
]
|
123
|
+
end
|
124
|
+
|
125
|
+
def self.is_supported?(platform)
|
126
|
+
# Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
|
127
|
+
# See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
|
128
|
+
#
|
129
|
+
# [:ios, :mac, :android].include?(platform)
|
130
|
+
true
|
131
|
+
end
|
132
|
+
end
|
133
|
+
end
|
134
|
+
end
|
@@ -0,0 +1,182 @@
|
|
1
|
+
require 'fastlane/action'
|
2
|
+
require_relative '../helper/jira_issues_release_notes_helper'
|
3
|
+
|
4
|
+
module Fastlane
|
5
|
+
module Actions
|
6
|
+
|
7
|
+
module SharedValues
|
8
|
+
FL_JIRA_LAST_TAG ||= :S3_APK_OUTPUT_PATH
|
9
|
+
FL_JIRA_LAST_TAG_HASH ||= :FL_JIRA_LAST_TAG_HASH
|
10
|
+
FL_JIRA_COMMITS_FROM_HASH ||= :FL_JIRA_COMMITS_FROM_HASH
|
11
|
+
FL_JIRA_LAST_KEYS_FROM_COMMITS ||= :FL_JIRA_LAST_KEYS_FROM_COMMITS
|
12
|
+
FL_JIRA_LAST_ISSUES_FROM_COMMITS ||= :FL_JIRA_LAST_ISSUES_FROM_COMMITS
|
13
|
+
end
|
14
|
+
|
15
|
+
class JiraReleaseChangelogAction < Action
|
16
|
+
def self.run(params)
|
17
|
+
Helper::JiraIssuesReleaseNotesHelper.initialize_jira(
|
18
|
+
host: params[:host],
|
19
|
+
api_version: params[:api_version],
|
20
|
+
username: params[:username],
|
21
|
+
password: params[:password],
|
22
|
+
context_path: params[:context_path],
|
23
|
+
disable_ssl_verification: params[:disable_ssl_verification]
|
24
|
+
)
|
25
|
+
|
26
|
+
issue_key_regex = Regexp.new("(#{params[:ticket_prefix]}-\\d+)")
|
27
|
+
|
28
|
+
issues = Helper::JiraIssuesReleaseNotesHelper.get_issues_from_commit_after_latest_tag(
|
29
|
+
tag_regex: params[:tag_prefix],
|
30
|
+
tag_version_match: params[:tag_version_match],
|
31
|
+
issue_key_regex: issue_key_regex,
|
32
|
+
debug: params[:debug]
|
33
|
+
)
|
34
|
+
|
35
|
+
return '' unless issues
|
36
|
+
|
37
|
+
@format = params[:format]
|
38
|
+
@format_line_break = @format === 'html' ? '<br />' : "\n"
|
39
|
+
|
40
|
+
grouped_by_types = params[:grouped_by_types]
|
41
|
+
|
42
|
+
grouped_issues = {}
|
43
|
+
|
44
|
+
group_key_for_any = nil
|
45
|
+
|
46
|
+
grouped_by_types.each do |key, value|
|
47
|
+
matched_issues = issues.select {|issue| value.include?(issue.issuetype.name) }
|
48
|
+
not_matched_issues = issues.select {|issue| !value.include?(issue.issuetype.name) }
|
49
|
+
|
50
|
+
grouped_issues[key] = matched_issues
|
51
|
+
|
52
|
+
issues = not_matched_issues
|
53
|
+
|
54
|
+
group_key_for_any = key if value.include? "ANY_TYPE"
|
55
|
+
end
|
56
|
+
|
57
|
+
if group_key_for_any and issues then
|
58
|
+
grouped_issues[group_key_for_any].concat issues
|
59
|
+
end
|
60
|
+
|
61
|
+
Helper::JiraIssuesReleaseNotesHelper.generate_changelog(
|
62
|
+
groups: grouped_issues,
|
63
|
+
line_break_format: @format_line_break
|
64
|
+
)
|
65
|
+
end
|
66
|
+
|
67
|
+
def self.description
|
68
|
+
"It generates a release note based on the issues keys and descriptions found in the commits"
|
69
|
+
end
|
70
|
+
|
71
|
+
def self.authors
|
72
|
+
["Erick Martins"]
|
73
|
+
end
|
74
|
+
|
75
|
+
def self.return_value
|
76
|
+
# If your method provides a return value, you can describe here what it does
|
77
|
+
end
|
78
|
+
|
79
|
+
def self.details
|
80
|
+
# Optional:
|
81
|
+
"It generates a release note based on the issues keys and descriptions found in the commits"
|
82
|
+
end
|
83
|
+
|
84
|
+
def self.available_options
|
85
|
+
[
|
86
|
+
FastlaneCore::ConfigItem.new(
|
87
|
+
key: :tag_prefix,
|
88
|
+
description: "Match parameter of git describe. See man page of git describe for more info",
|
89
|
+
verify_block: proc do |value|
|
90
|
+
UI.user_error!("No match for analyze_commits action given, pass using `match: 'expr'`") unless value && !value.empty?
|
91
|
+
end
|
92
|
+
),
|
93
|
+
FastlaneCore::ConfigItem.new(
|
94
|
+
key: :ticket_prefix,
|
95
|
+
env_name: 'FL_FIND_TICKETS_MATCHING',
|
96
|
+
description: 'regex to extract ticket numbers',
|
97
|
+
default_value: '[A-Z]+',
|
98
|
+
optional: true
|
99
|
+
),
|
100
|
+
FastlaneCore::ConfigItem.new(
|
101
|
+
key: :tag_version_match,
|
102
|
+
description: "To parse version number from tag name",
|
103
|
+
default_value: '\d+\.\d+\.\d+'
|
104
|
+
),
|
105
|
+
FastlaneCore::ConfigItem.new(
|
106
|
+
key: :grouped_by_types,
|
107
|
+
env_name: 'FL_JIRA_RELESE_GROUPED_TYPES',
|
108
|
+
description: 'Hash with grouped types with names by issue type. Use de key work "ANY_TYPE" as fallback. Example: { "Fixed" => ["Bug"], "Added/Changed" => ["Story", "Task"], "Others" => ["ANY_TYPE"] } ',
|
109
|
+
optional: false,
|
110
|
+
type: Hash
|
111
|
+
),
|
112
|
+
FastlaneCore::ConfigItem.new(
|
113
|
+
key: :format,
|
114
|
+
description: "You can use either markdown, slack, html or plain",
|
115
|
+
default_value: "markdown",
|
116
|
+
optional: true,
|
117
|
+
verify_block: proc do |value|
|
118
|
+
UI.user_error!("Invalid format! You can use either markdown, slack, html or plain") unless ['markdown', 'html', 'slack', 'plain'].include?(value)
|
119
|
+
end
|
120
|
+
),
|
121
|
+
|
122
|
+
# Jira Client options
|
123
|
+
FastlaneCore::ConfigItem.new(
|
124
|
+
key: :username,
|
125
|
+
env_name: 'FL_JIRA_USERNAME',
|
126
|
+
description: 'Jira user',
|
127
|
+
optional: false
|
128
|
+
),
|
129
|
+
FastlaneCore::ConfigItem.new(
|
130
|
+
key: :password,
|
131
|
+
env_name: 'FL_JIRA_PASSWORD',
|
132
|
+
description: 'Jira user password',
|
133
|
+
optional: false
|
134
|
+
),
|
135
|
+
FastlaneCore::ConfigItem.new(
|
136
|
+
key: :host,
|
137
|
+
env_name: 'FL_JIRA_HOST',
|
138
|
+
description: 'Jira location',
|
139
|
+
optional: false
|
140
|
+
),
|
141
|
+
FastlaneCore::ConfigItem.new(
|
142
|
+
key: :api_version,
|
143
|
+
env_name: 'FL_JIRA_API_VERSION',
|
144
|
+
description: 'Jira api version',
|
145
|
+
default_value: '2',
|
146
|
+
optional: true,
|
147
|
+
),
|
148
|
+
FastlaneCore::ConfigItem.new(
|
149
|
+
key: :context_path,
|
150
|
+
env_name: 'FL_JIRA_CONTEXT_PATH',
|
151
|
+
description: 'Jira context path',
|
152
|
+
optional: true,
|
153
|
+
default_value: ''
|
154
|
+
),
|
155
|
+
FastlaneCore::ConfigItem.new(
|
156
|
+
key: :disable_ssl_verification,
|
157
|
+
env_name: 'FL_JIRA_DISABLE_SSL_VERIFICATION',
|
158
|
+
description: 'Jira SSL Verification mode',
|
159
|
+
optional: true,
|
160
|
+
default_value: false,
|
161
|
+
type: Boolean
|
162
|
+
),
|
163
|
+
FastlaneCore::ConfigItem.new(
|
164
|
+
key: :debug,
|
165
|
+
description: "True if you want to log out a debug info",
|
166
|
+
default_value: false,
|
167
|
+
type: Boolean,
|
168
|
+
optional: true
|
169
|
+
)
|
170
|
+
]
|
171
|
+
end
|
172
|
+
|
173
|
+
def self.is_supported?(platform)
|
174
|
+
# Adjust this if your plugin only works for a particular platform (iOS vs. Android, for example)
|
175
|
+
# See: https://docs.fastlane.tools/advanced/#control-configuration-by-lane-and-by-platform
|
176
|
+
#
|
177
|
+
# [:ios, :mac, :android].include?(platform)
|
178
|
+
true
|
179
|
+
end
|
180
|
+
end
|
181
|
+
end
|
182
|
+
end
|