capistrano-deploybot 0.0.1 → 1.1.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
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: e7681a63cd918d0df99e11d05c571104614061fe9bd9a24d77909b0ff8c76891
|
4
|
+
data.tar.gz: 64367a40e53aedbcaf9a51708b2ea52925460e2744a4757608ba5bd3451b9861
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 688b536e9c4b7fa738a8fa35bf8798b2727386138b40ea88f79db9a56d4ea87107779dfcfb529ca7108f62bf9e1a0451f66e64d0d17caa856d33c7606a3cd092
|
7
|
+
data.tar.gz: 9eb32b67d54606a4f5faaf71020f46538ba6d25313a37847eaafac9d797c9b377656faa8a78915deea5433a7501698b18086820d510e548b7cfa037f16279558
|
@@ -1,14 +1,17 @@
|
|
1
|
+
require 'date'
|
2
|
+
require File.expand_path('../lib/capistrano-deploybot/version', __FILE__)
|
3
|
+
|
1
4
|
Gem::Specification.new do |s|
|
2
5
|
s.name = 'capistrano-deploybot'
|
3
|
-
s.version =
|
6
|
+
s.version = CapistranoDeploybot::VERSION
|
4
7
|
s.homepage = 'https://github.com/kbackowski/capistrano-deploybot'
|
5
8
|
s.description = 'Notify slack channel with list of deployed commits'
|
6
|
-
s.date =
|
9
|
+
s.date = Date.today.to_s
|
7
10
|
s.summary = 'Capistrano deploy integration for slack'
|
8
11
|
s.authors = ['Kamil Baćkowski']
|
9
12
|
s.email = 'kbackowski@gmail.com'
|
10
13
|
s.files = `git ls-files`.split($/)
|
11
14
|
s.license = 'MIT'
|
12
15
|
|
13
|
-
s.add_dependency 'capistrano', '
|
16
|
+
s.add_dependency 'capistrano', '~> 3.5'
|
14
17
|
end
|
@@ -7,9 +7,16 @@ module CapistranoDeploybot
|
|
7
7
|
class Capistrano
|
8
8
|
DEFAULT_OPTIONS = {
|
9
9
|
username: :autodeploy,
|
10
|
-
environments:
|
10
|
+
environments: {
|
11
|
+
staging: {
|
12
|
+
slack_webhooks: [],
|
13
|
+
jira_webhooks: []
|
14
|
+
}
|
15
|
+
}
|
11
16
|
}
|
12
17
|
|
18
|
+
JIRA_TICKET_ID_REGEXP = /[A-Z]{2,}-\d+/
|
19
|
+
|
13
20
|
def initialize(env)
|
14
21
|
@env = env
|
15
22
|
@opts = DEFAULT_OPTIONS.merge(fetch(:deploybot, {}))
|
@@ -18,47 +25,95 @@ module CapistranoDeploybot
|
|
18
25
|
def run
|
19
26
|
current_revision = fetch(:current_revision)
|
20
27
|
previous_revision = fetch(:previous_revision)
|
21
|
-
rails_env = fetch(:rails_env)
|
28
|
+
rails_env = fetch(:rails_env).to_sym
|
29
|
+
|
30
|
+
return if !@opts[:environments].keys.include?(rails_env) || current_revision == previous_revision
|
22
31
|
|
23
|
-
|
32
|
+
@opts[:environments].fetch(rails_env).fetch(:slack_webhooks).tap do |slack_webhooks|
|
33
|
+
notify_slack(slack_webhooks, current_revision, previous_revision)
|
34
|
+
end
|
24
35
|
|
36
|
+
@opts[:environments].fetch(rails_env).fetch(:jira_webhooks).tap do |jira_webhooks|
|
37
|
+
notify_jira(jira_webhooks, current_revision, previous_revision)
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
private
|
42
|
+
|
43
|
+
def notify_slack(webhooks, current_revision, previous_revision)
|
44
|
+
application_name = @opts[:application_name]
|
45
|
+
deploy_target = deploy_target(fetch(:rails_env), application_name)
|
46
|
+
|
25
47
|
payload = {
|
26
48
|
username: @opts[:username],
|
27
|
-
text: payload_text(current_revision, previous_revision,
|
49
|
+
text: payload_text(current_revision, previous_revision, deploy_target)
|
28
50
|
}
|
29
51
|
|
30
|
-
|
31
|
-
post_to_webhook(
|
52
|
+
webhooks.each do |webhook|
|
53
|
+
post_to_webhook(webhook, payload)
|
32
54
|
end
|
55
|
+
|
56
|
+
@env.info('[deploybot] Notified Slack webhooks.')
|
33
57
|
end
|
58
|
+
|
59
|
+
def notify_jira(webhooks, current_revision, previous_revision)
|
60
|
+
jira_issues = extract_jira_ids_from_commits(current_revision, previous_revision)
|
61
|
+
return if jira_issues.empty?
|
34
62
|
|
35
|
-
|
63
|
+
release_tag = ENV['CI_COMMIT_TAG']
|
64
|
+
|
65
|
+
payload = {
|
66
|
+
issues: jira_issues,
|
67
|
+
data: { releaseVersion: release_tag }
|
68
|
+
}
|
69
|
+
|
70
|
+
webhooks.each do |webhook|
|
71
|
+
post_to_webhook(webhook, payload)
|
72
|
+
end
|
73
|
+
|
74
|
+
message = "[deploybot] Notified JIRA webhooks with tickets: #{jira_issues.join(', ')}"
|
75
|
+
message << " and release: #{release_tag}" if release_tag
|
76
|
+
|
77
|
+
@env.info(message)
|
78
|
+
end
|
79
|
+
|
80
|
+
def deploy_target(rails_env, application_name)
|
81
|
+
application_name.nil? ? rails_env : "#{application_name} (#{rails_env})"
|
82
|
+
end
|
83
|
+
|
84
|
+
def extract_jira_ids_from_commits(current_revision, previous_revision)
|
85
|
+
commits = `git show --pretty=format:%s -s #{previous_revision}..#{current_revision}`
|
86
|
+
commits.split("\n").map { |s| s.scan(JIRA_TICKET_ID_REGEXP) }.flatten.uniq
|
87
|
+
end
|
36
88
|
|
37
|
-
def payload_text(current_revision, previous_revision,
|
38
|
-
"Deployed to #{
|
89
|
+
def payload_text(current_revision, previous_revision, deploy_target)
|
90
|
+
"Deployed to #{deploy_target}:\n" + `git shortlog #{previous_revision}..#{current_revision}`
|
39
91
|
end
|
40
92
|
|
41
|
-
def post_to_webhook(payload)
|
93
|
+
def post_to_webhook(url, payload)
|
42
94
|
begin
|
43
|
-
response =
|
95
|
+
response = perform_http_request(url, payload)
|
44
96
|
rescue => e
|
45
|
-
|
46
|
-
|
97
|
+
@env.warn("[deploybot] Error sending request to webhook #{url}")
|
98
|
+
@env.warn("[deploybot] Error: #{e.inspect}")
|
47
99
|
end
|
48
100
|
|
49
101
|
if response && response.code !~ /^2/
|
50
|
-
warn("[deploybot]
|
51
|
-
warn("[deploybot] URI: #{response.uri}")
|
52
|
-
warn("[deploybot] Code: #{response.code}")
|
53
|
-
warn("[deploybot] Message: #{response.message}")
|
54
|
-
warn("[deploybot] Body: #{response.body}") if response.message != response.body && response.body !~ /<html/
|
102
|
+
@env.warn("[deploybot] Webhook API Failure!")
|
103
|
+
@env.warn("[deploybot] URI: #{response.uri}")
|
104
|
+
@env.warn("[deploybot] Code: #{response.code}")
|
105
|
+
@env.warn("[deploybot] Message: #{response.message}")
|
106
|
+
@env.warn("[deploybot] Body: #{response.body}") if response.message != response.body && response.body !~ /<html/
|
55
107
|
end
|
56
108
|
end
|
57
109
|
|
58
|
-
def
|
59
|
-
|
60
|
-
|
61
|
-
|
110
|
+
def perform_http_request(url, payload)
|
111
|
+
uri = URI(url)
|
112
|
+
http = Net::HTTP.new(uri.host, uri.port)
|
113
|
+
http.use_ssl = true
|
114
|
+
req = Net::HTTP::Post.new(uri.path, 'Content-Type' => 'application/json')
|
115
|
+
req.body = payload.to_json
|
116
|
+
http.request(req)
|
62
117
|
end
|
63
118
|
end
|
64
119
|
end
|
@@ -2,10 +2,13 @@ namespace :slack do
|
|
2
2
|
namespace :deploy do
|
3
3
|
desc 'Notify about updated deploy'
|
4
4
|
task :updated do
|
5
|
-
|
5
|
+
on roles(:web) do
|
6
|
+
within release_path do
|
7
|
+
CapistranoDeploybot::Capistrano.new(self).run
|
8
|
+
end
|
9
|
+
end
|
6
10
|
end
|
7
11
|
end
|
8
12
|
end
|
9
13
|
|
10
|
-
# before 'deploy', 'slack:deploy:updated'
|
11
14
|
after 'deploy:finishing', 'slack:deploy:updated'
|
metadata
CHANGED
@@ -1,29 +1,29 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: capistrano-deploybot
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 1.1.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kamil Baćkowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: capistrano
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- - "
|
17
|
+
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: 3.5
|
19
|
+
version: '3.5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- - "
|
24
|
+
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: 3.5
|
26
|
+
version: '3.5'
|
27
27
|
description: Notify slack channel with list of deployed commits
|
28
28
|
email: kbackowski@gmail.com
|
29
29
|
executables: []
|
@@ -54,8 +54,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
54
54
|
- !ruby/object:Gem::Version
|
55
55
|
version: '0'
|
56
56
|
requirements: []
|
57
|
-
|
58
|
-
rubygems_version: 2.4.6
|
57
|
+
rubygems_version: 3.1.2
|
59
58
|
signing_key:
|
60
59
|
specification_version: 4
|
61
60
|
summary: Capistrano deploy integration for slack
|