fastlane-plugin-slack_bot 0.4.0 → 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/README.md +17 -7
- data/lib/fastlane/plugin/slack_bot/actions/post_to_slack.rb +12 -5
- data/lib/fastlane/plugin/slack_bot/actions/update_slack_message.rb +4 -4
- data/lib/fastlane/plugin/slack_bot/helper/slack_bot_attachments_helper.rb +113 -0
- data/lib/fastlane/plugin/slack_bot/helper/slack_bot_link_formatter_helper.rb +82 -0
- data/lib/fastlane/plugin/slack_bot/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d41be99af2fa9df13b2a8b613f0afc6ca95ec7e78abe90c07231b2564e9d6431
|
4
|
+
data.tar.gz: f5b92143896f6a54b893b06daf6a2e4f6b464fba24473851b98f70c16995a15e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 40e353d5df69d1822acceb88aaced1b4eb79f5c56d615bf36abb82b56c593311e0e50bbe82362a662e63c9c5a343eae50a0a2fe666b3e48e044090da5d557c77
|
7
|
+
data.tar.gz: 34fb53d69b3fa99084615db23e2ab03c862928af864b6c28239004af7b7ab4e747f91c756dabe6e855008ed58706802618a1c8becfbfc2cc26c80f8810524f35
|
data/README.md
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
![![License]](https://img.shields.io/badge/license-MIT-green.svg?style=flat)
|
5
5
|
[![Gem Version](https://badge.fury.io/rb/fastlane-plugin-slack_bot.svg)](https://badge.fury.io/rb/fastlane-plugin-slack_bot)
|
6
6
|
![![RubyGem Download Badge]](https://ruby-gem-downloads-badge.herokuapp.com/fastlane-plugin-slack_bot?type=total)
|
7
|
-
[![Twitter: @manish](https://img.shields.io/badge/contact-@manish-blue.svg?style=flat)](https://twitter.com/
|
7
|
+
[![Twitter: @manish](https://img.shields.io/badge/contact-@manish-blue.svg?style=flat)](https://twitter.com/iammanishrathi)
|
8
8
|
|
9
9
|
A fastlane plugin to customize your automation workflow(s) with a **Slack Bot** 🤖 using the [Slack APIs](https://api.slack.com/)
|
10
10
|
|
@@ -29,9 +29,7 @@ i.e Listing couple of slack **webhook url** limitations:
|
|
29
29
|
## Getting Started
|
30
30
|
|
31
31
|
1. [Generate `Slack token` for `Fastlane` bot](https://slack.com/intl/en-nl/help/articles/115005265703-Create-a-bot-for-your-workspace)
|
32
|
-
-
|
33
|
-
- Open `Bots`
|
34
|
-
- Add Configuration
|
32
|
+
- Add a slack `Bot` user
|
35
33
|
- Choose a name for your bot, e.g. `"fastlane"`
|
36
34
|
- Save `API Token`
|
37
35
|
|
@@ -54,7 +52,8 @@ Using this `slack_bot` plugin, you can:
|
|
54
52
|
- [x] Post a message to a _public_ channel
|
55
53
|
- [x] Post a message to a _private_ channel
|
56
54
|
- [x] Post a message to a _slack user_ (DM)
|
57
|
-
- [x] Post a message inside a _slack thread_ 🧵
|
55
|
+
- [x] Post a message inside a _slack thread_ 🧵
|
56
|
+
- [x] Post a message with _custom Bot username and icon_
|
58
57
|
|
59
58
|
- Update a message using [chat.update](https://api.slack.com/methods/chat.update) Slack API
|
60
59
|
- [x] update a message in a channel
|
@@ -66,8 +65,8 @@ Using this `slack_bot` plugin, you can:
|
|
66
65
|
- [x] Upload a file to a _public_ channel
|
67
66
|
- [x] Upload a file to a _private_ channel
|
68
67
|
- [x] Upload a file to a _slack user_ (DM)
|
69
|
-
- [x] Upload a file inside a _slack thread_ 🧵
|
70
|
-
- [x] Upload a file with
|
68
|
+
- [x] Upload a file inside a _slack thread_ 🧵
|
69
|
+
- [x] Upload a file with _multiple channels/users_
|
71
70
|
|
72
71
|
|
73
72
|
## Examples (Post a message)
|
@@ -168,6 +167,17 @@ lane :release do
|
|
168
167
|
end
|
169
168
|
```
|
170
169
|
|
170
|
+
Let’s post a message with custom slack bot username and icon
|
171
|
+
|
172
|
+
```ruby
|
173
|
+
# share on Slack
|
174
|
+
post_to_slack(
|
175
|
+
message: "App successfully released!",
|
176
|
+
username: "Release Bot", # Overrides the bot's username
|
177
|
+
icon_url: "https://fastlane.tools/assets/img/fastlane_icon.png" # Overrides the bot's icon
|
178
|
+
)
|
179
|
+
```
|
180
|
+
|
171
181
|
## Examples (Upload a file)
|
172
182
|
|
173
183
|
Let’s Upload a file to a slack channel that main branch unit tests has been failed, see scan logs.
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'fastlane/action'
|
2
2
|
require_relative '../helper/slack_bot_helper'
|
3
|
+
require_relative '../helper/slack_bot_attachments_helper'
|
4
|
+
require_relative '../helper/slack_bot_link_formatter_helper'
|
3
5
|
|
4
6
|
module Fastlane
|
5
7
|
module Actions
|
@@ -9,10 +11,8 @@ module Fastlane
|
|
9
11
|
|
10
12
|
class PostToSlackAction < Action
|
11
13
|
def self.run(options)
|
12
|
-
require 'slack-notifier'
|
13
|
-
|
14
14
|
options[:message] = (options[:message].to_s || '').gsub('\n', "\n")
|
15
|
-
options[:message] =
|
15
|
+
options[:message] = Helper::SlackBotLinkFormatterHelper.format(options[:message])
|
16
16
|
options[:pretext] = options[:pretext].gsub('\n', "\n") unless options[:pretext].nil?
|
17
17
|
|
18
18
|
if options[:channel].to_s.length > 0
|
@@ -20,7 +20,7 @@ module Fastlane
|
|
20
20
|
slack_channel = ('#' + options[:channel]) unless ['#', 'C', '@'].include?(slack_channel[0]) # Add prefix(#) by default, if needed
|
21
21
|
end
|
22
22
|
|
23
|
-
slack_attachment =
|
23
|
+
slack_attachment = Helper::SlackBotAttachmentsHelper.generate_slack_attachments(options)
|
24
24
|
bot_username = options[:username]
|
25
25
|
bot_icon_url = options[:icon_url]
|
26
26
|
|
@@ -38,10 +38,11 @@ module Fastlane
|
|
38
38
|
icon_url: bot_icon_url,
|
39
39
|
attachments: [slack_attachment]
|
40
40
|
}
|
41
|
+
payload[:as_user] = options[:as_user] if options[:as_user] # default is false
|
41
42
|
payload[:thread_ts] = options[:thread_ts] unless options[:thread_ts].nil?
|
42
43
|
payload = payload.to_json
|
43
44
|
|
44
|
-
response = Excon.post(api_url, headers: headers, body: payload)
|
45
|
+
response = Excon.post(api_url, headers: headers, body: payload, omit_default_port: true)
|
45
46
|
result = self.formatted_result(response)
|
46
47
|
rescue => exception
|
47
48
|
UI.error("Exception: #{exception}")
|
@@ -104,6 +105,12 @@ module Fastlane
|
|
104
105
|
default_value: "https://fastlane.tools/assets/img/fastlane_icon.png",
|
105
106
|
is_string: true,
|
106
107
|
optional: true),
|
108
|
+
FastlaneCore::ConfigItem.new(key: :as_user,
|
109
|
+
env_name: "FL_POST_TO_SLACK_AS_USER",
|
110
|
+
description: "Pass true to post the message as the authed user. Defaults to false",
|
111
|
+
optional: true,
|
112
|
+
default_value: false,
|
113
|
+
is_string: false),
|
107
114
|
FastlaneCore::ConfigItem.new(key: :pretext,
|
108
115
|
env_name: "FL_POST_TO_SLACK_PRETEXT",
|
109
116
|
description: "This is optional text that appears above the message attachment block. This supports the standard Slack markup language",
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'fastlane/action'
|
2
2
|
require_relative '../helper/slack_bot_helper'
|
3
|
+
require_relative '../helper/slack_bot_attachments_helper'
|
4
|
+
require_relative '../helper/slack_bot_link_formatter_helper'
|
3
5
|
|
4
6
|
module Fastlane
|
5
7
|
module Actions
|
@@ -8,12 +10,10 @@ module Fastlane
|
|
8
10
|
end
|
9
11
|
class UpdateSlackMessageAction < Action
|
10
12
|
def self.run(options)
|
11
|
-
require 'slack-notifier'
|
12
|
-
|
13
13
|
options[:message] = (options[:message].to_s || '').gsub('\n', "\n")
|
14
|
-
options[:message] =
|
14
|
+
options[:message] = Helper::SlackBotLinkFormatterHelper.format(options[:message])
|
15
15
|
options[:pretext] = options[:pretext].gsub('\n', "\n") unless options[:pretext].nil?
|
16
|
-
slack_attachment =
|
16
|
+
slack_attachment = Helper::SlackBotAttachmentsHelper.generate_slack_attachments(options)
|
17
17
|
|
18
18
|
begin
|
19
19
|
require 'excon'
|
@@ -0,0 +1,113 @@
|
|
1
|
+
require 'fastlane_core/ui/ui'
|
2
|
+
require 'fastlane_core/env'
|
3
|
+
require_relative 'slack_bot_link_formatter_helper'
|
4
|
+
|
5
|
+
module Fastlane
|
6
|
+
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
7
|
+
|
8
|
+
module Helper
|
9
|
+
class SlackBotAttachmentsHelper
|
10
|
+
# class methods that you define here become available in your action
|
11
|
+
# as `Helper::SlackBotAttachmentsHelper.your_method`
|
12
|
+
#
|
13
|
+
def self.show_message
|
14
|
+
UI.message("Hello from the slack_bot plugin attachments helper!")
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.generate_slack_attachments(options)
|
18
|
+
color = (options[:success] ? 'good' : 'danger')
|
19
|
+
should_add_payload = ->(payload_name) { options[:default_payloads].map(&:to_sym).include?(payload_name.to_sym) }
|
20
|
+
|
21
|
+
slack_attachment = {
|
22
|
+
fallback: options[:message],
|
23
|
+
text: options[:message],
|
24
|
+
pretext: options[:pretext],
|
25
|
+
color: color,
|
26
|
+
mrkdwn_in: ["pretext", "text", "fields", "message"],
|
27
|
+
fields: []
|
28
|
+
}
|
29
|
+
|
30
|
+
# custom user payloads
|
31
|
+
slack_attachment[:fields] += options[:payload].map do |k, v|
|
32
|
+
{
|
33
|
+
title: k.to_s,
|
34
|
+
value: SlackBotLinkFormatterHelper.format(v.to_s),
|
35
|
+
short: false
|
36
|
+
}
|
37
|
+
end
|
38
|
+
|
39
|
+
# Add the lane to the Slack message
|
40
|
+
# This might be nil, if slack is called as "one-off" action
|
41
|
+
if should_add_payload[:lane] && Actions.lane_context[Actions::SharedValues::LANE_NAME]
|
42
|
+
slack_attachment[:fields] << {
|
43
|
+
title: 'Lane',
|
44
|
+
value: Actions.lane_context[Actions::SharedValues::LANE_NAME],
|
45
|
+
short: true
|
46
|
+
}
|
47
|
+
end
|
48
|
+
|
49
|
+
# test_result
|
50
|
+
if should_add_payload[:test_result]
|
51
|
+
slack_attachment[:fields] << {
|
52
|
+
title: 'Result',
|
53
|
+
value: (options[:success] ? 'Success' : 'Error'),
|
54
|
+
short: true
|
55
|
+
}
|
56
|
+
end
|
57
|
+
|
58
|
+
# git branch
|
59
|
+
if Actions.git_branch && should_add_payload[:git_branch]
|
60
|
+
slack_attachment[:fields] << {
|
61
|
+
title: 'Git Branch',
|
62
|
+
value: Actions.git_branch,
|
63
|
+
short: true
|
64
|
+
}
|
65
|
+
end
|
66
|
+
|
67
|
+
# git_author
|
68
|
+
if Actions.git_author_email && should_add_payload[:git_author]
|
69
|
+
if FastlaneCore::Env.truthy?('FASTLANE_SLACK_HIDE_AUTHOR_ON_SUCCESS') && options[:success]
|
70
|
+
# We only show the git author if the build failed
|
71
|
+
else
|
72
|
+
slack_attachment[:fields] << {
|
73
|
+
title: 'Git Author',
|
74
|
+
value: Actions.git_author_email,
|
75
|
+
short: true
|
76
|
+
}
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
# last_git_commit
|
81
|
+
if Actions.last_git_commit_message && should_add_payload[:last_git_commit]
|
82
|
+
slack_attachment[:fields] << {
|
83
|
+
title: 'Git Commit',
|
84
|
+
value: Actions.last_git_commit_message,
|
85
|
+
short: false
|
86
|
+
}
|
87
|
+
end
|
88
|
+
|
89
|
+
# last_git_commit_hash
|
90
|
+
if Actions.last_git_commit_hash(true) && should_add_payload[:last_git_commit_hash]
|
91
|
+
slack_attachment[:fields] << {
|
92
|
+
title: 'Git Commit Hash',
|
93
|
+
value: Actions.last_git_commit_hash(short: true),
|
94
|
+
short: false
|
95
|
+
}
|
96
|
+
end
|
97
|
+
|
98
|
+
# merge additional properties
|
99
|
+
deep_merge(slack_attachment, options[:attachment_properties])
|
100
|
+
end
|
101
|
+
|
102
|
+
# Adapted from https://stackoverflow.com/a/30225093/158525
|
103
|
+
def self.deep_merge(a, b)
|
104
|
+
merger = proc do |key, v1, v2|
|
105
|
+
Hash === v1 && Hash === v2 ?
|
106
|
+
v1.merge(v2, &merger) : Array === v1 && Array === v2 ?
|
107
|
+
v1 | v2 : [:undefined, nil, :nil].include?(v2) ? v1 : v2
|
108
|
+
end
|
109
|
+
a.merge(b, &merger)
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
@@ -0,0 +1,82 @@
|
|
1
|
+
require 'fastlane_core/ui/ui'
|
2
|
+
|
3
|
+
module Fastlane
|
4
|
+
UI = FastlaneCore::UI unless Fastlane.const_defined?("UI")
|
5
|
+
|
6
|
+
module Helper
|
7
|
+
# Fastlane is moving away 'slack-notifier' gem, https://github.com/fastlane/fastlane/pull/18512
|
8
|
+
# Duplicate of: https://github.com/stevenosloan/slack-notifier/blob/master/lib/slack-notifier/util/link_formatter.rb
|
9
|
+
class SlackBotLinkFormatterHelper
|
10
|
+
# http://rubular.com/r/19cNXW5qbH
|
11
|
+
HTML_PATTERN = %r{
|
12
|
+
<a
|
13
|
+
(?:.*?)
|
14
|
+
href=['"](.+?)['"]
|
15
|
+
(?:.*?)>
|
16
|
+
(.+?)
|
17
|
+
</a>
|
18
|
+
}x
|
19
|
+
|
20
|
+
# the path portion of a url can contain these characters
|
21
|
+
VALID_PATH_CHARS = '\w\-\.\~\/\?\#\='
|
22
|
+
|
23
|
+
# Attempt at only matching pairs of parens per
|
24
|
+
# the markdown spec http://spec.commonmark.org/0.27/#links
|
25
|
+
#
|
26
|
+
# http://rubular.com/r/y107aevxqT
|
27
|
+
MARKDOWN_PATTERN = %r{
|
28
|
+
\[ ([^\[\]]*?) \]
|
29
|
+
\( ((https?://.*?) | (mailto:.*?)) \)
|
30
|
+
(?! [#{VALID_PATH_CHARS}]* \) )
|
31
|
+
}x
|
32
|
+
|
33
|
+
class << self
|
34
|
+
def format string, opts={}
|
35
|
+
SlackBotLinkFormatterHelper.new(string, **opts).formatted
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
attr_reader :formats
|
40
|
+
|
41
|
+
def initialize string, opts = {}
|
42
|
+
@formats = opts[:formats] || %i[html markdown]
|
43
|
+
@orig = string.respond_to?(:scrub) ? string.scrub : string
|
44
|
+
end
|
45
|
+
|
46
|
+
# rubocop:disable Lint/RescueWithoutErrorClass
|
47
|
+
def formatted
|
48
|
+
return @orig unless @orig.respond_to?(:gsub)
|
49
|
+
|
50
|
+
sub_markdown_links(sub_html_links(@orig))
|
51
|
+
rescue => e
|
52
|
+
raise e unless RUBY_VERSION < "2.1" && e.message.include?("invalid byte sequence")
|
53
|
+
raise e, "#{e.message}. Consider including the 'string-scrub' gem to strip invalid characters"
|
54
|
+
end
|
55
|
+
# rubocop:enable Lint/RescueWithoutErrorClass
|
56
|
+
|
57
|
+
private
|
58
|
+
|
59
|
+
def sub_html_links string
|
60
|
+
return string unless formats.include?(:html)
|
61
|
+
|
62
|
+
string.gsub(HTML_PATTERN) do
|
63
|
+
slack_link Regexp.last_match[1], Regexp.last_match[2]
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
def sub_markdown_links string
|
68
|
+
return string unless formats.include?(:markdown)
|
69
|
+
|
70
|
+
string.gsub(MARKDOWN_PATTERN) do
|
71
|
+
slack_link Regexp.last_match[2], Regexp.last_match[1]
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def slack_link link, text=nil
|
76
|
+
"<#{link}" \
|
77
|
+
"#{text && !text.empty? ? "|#{text}" : ''}" \
|
78
|
+
">"
|
79
|
+
end
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fastlane-plugin-slack_bot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.2.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Manish Rathi
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-10-12 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: pry
|
@@ -149,7 +149,9 @@ files:
|
|
149
149
|
- lib/fastlane/plugin/slack_bot/actions/file_upload_to_slack.rb
|
150
150
|
- lib/fastlane/plugin/slack_bot/actions/post_to_slack.rb
|
151
151
|
- lib/fastlane/plugin/slack_bot/actions/update_slack_message.rb
|
152
|
+
- lib/fastlane/plugin/slack_bot/helper/slack_bot_attachments_helper.rb
|
152
153
|
- lib/fastlane/plugin/slack_bot/helper/slack_bot_helper.rb
|
154
|
+
- lib/fastlane/plugin/slack_bot/helper/slack_bot_link_formatter_helper.rb
|
153
155
|
- lib/fastlane/plugin/slack_bot/version.rb
|
154
156
|
homepage: https://github.com/crazymanish/fastlane-plugin-slack_bot
|
155
157
|
licenses:
|