stash_notifier 1.1.0 → 2.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG.md +9 -0
- data/Guardfile +6 -0
- data/README.md +1 -0
- data/bin/notify +25 -18
- data/lib/stash_notifier.rb +20 -87
- data/lib/stash_notifier/build_result.rb +53 -0
- data/lib/stash_notifier/exceptions.rb +20 -0
- data/lib/stash_notifier/http_client.rb +97 -0
- data/lib/stash_notifier/version.rb +2 -2
- data/spec/.rspec +2 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_204_when_passed_valid_parameters.yml +46 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_passed_an_invalid_git_commit.yml +49 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_key_is_missing_or_invalid.yml +50 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_state_is_missing_or_invalid.yml +50 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_url_is_missing_or_invalid.yml +49 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_pwd.yml +44 -0
- data/spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_user.yml +44 -0
- data/spec/spec_helper.rb +26 -1
- data/spec/stash_notifier/build_result_spec.rb +79 -0
- data/spec/stash_notifier_spec.rb +102 -2
- data/stash_notifier.gemspec +13 -10
- metadata +91 -7
- checksums.yaml +0 -15
data/CHANGELOG.md
CHANGED
@@ -1,3 +1,12 @@
|
|
1
|
+
## version 2.0.0
|
2
|
+
Add stash_pwd option to notify
|
3
|
+
Add VCR support for offline testing
|
4
|
+
Refactor StashNotifier into Module
|
5
|
+
Create StashNotifier::BuildResult class
|
6
|
+
Create StashNotifier::HTTPClient class
|
7
|
+
|
8
|
+
Fixes #8: Add to_s method to StashNotifier class
|
9
|
+
|
1
10
|
## version 1.1.0
|
2
11
|
Fixes #4: Rename "job\_" parameters to "build\_" and add `build_name` param
|
3
12
|
|
data/Guardfile
ADDED
data/README.md
CHANGED
data/bin/notify
CHANGED
@@ -16,31 +16,38 @@
|
|
16
16
|
# limitations under the License.
|
17
17
|
|
18
18
|
require 'slop'
|
19
|
-
|
20
19
|
require 'stash_notifier'
|
20
|
+
require 'chef-vault'
|
21
21
|
|
22
22
|
# EXAMPLE:
|
23
|
-
# notify -s https://git.mycompany.com -u
|
23
|
+
# notify -s https://git.mycompany.com -u my_stash_user -g e2b8a34c60eeec41d3e9d83f60d3b288e909c1eb -r failed -k REPO-MASTER -n REPO-MASTER-12 -l http://jenkins.my_company.com/jenkins/view/FOO/job/Deploy/17/console -d 'Jenkins deploy job'
|
24
24
|
|
25
|
-
opts = Slop.parse(
|
25
|
+
opts = Slop.parse(help: true, strict: true, arguments: true) do
|
26
26
|
banner 'Usage: notify [options]'
|
27
|
-
on :s,
|
28
|
-
on :u,
|
29
|
-
on :
|
30
|
-
on :
|
31
|
-
|
32
|
-
on :
|
33
|
-
on :
|
34
|
-
|
35
|
-
on :
|
36
|
-
on :
|
27
|
+
on :s, :stash_url=, 'Atlassian Stash server base URL, e.g. https://git.mycompany.com'
|
28
|
+
on :u, :stash_user=, 'Stash API user'
|
29
|
+
on :p, :stash_pwd=, "Stash API user's password"
|
30
|
+
on :g, :git_commit=, 'Git commit sha'
|
31
|
+
|
32
|
+
on :d, :data_bag=, 'Name of Chef passwords data bag'
|
33
|
+
on :c, :config=, 'Chef config file'
|
34
|
+
|
35
|
+
on :r, :build_status=, 'CI server job status, e.g. INPROGRESS, SUCCESSFUL, FAILED'
|
36
|
+
on :k, :build_key=, 'CI server job name'
|
37
|
+
on :n, :build_name=, 'CI server build name'
|
38
|
+
on :l, :build_url=, 'URL to CI server job results'
|
39
|
+
on :d, :build_description=, 'CI server job description'
|
37
40
|
end
|
38
41
|
|
39
|
-
args = opts.to_hash
|
42
|
+
@args = opts.to_hash
|
43
|
+
|
44
|
+
def get_stash_pwd
|
45
|
+
ChefVault.load_config(@args[:config])
|
46
|
+
user = ChefVault::Item.load(@args[:data_bag], @args[:stash_user])
|
47
|
+
user['password']
|
48
|
+
end
|
40
49
|
|
41
|
-
|
42
|
-
args[:data_bag] ||= 'passwords'
|
50
|
+
@args[:stash_pwd] ||= get_stash_pwd
|
43
51
|
|
44
|
-
notify = StashNotifier.new(args)
|
45
|
-
notify.pwd_vault = ChefVault.new(args[:data_bag], args[:config])
|
52
|
+
notify = StashNotifier.new(@args)
|
46
53
|
notify.post_to_stash
|
data/lib/stash_notifier.rb
CHANGED
@@ -13,93 +13,26 @@
|
|
13
13
|
# See the License for the specific language governing permissions and
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
|
-
require '
|
17
|
-
require '
|
18
|
-
require '
|
19
|
-
|
20
|
-
|
21
|
-
class
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
args = DEFAULTS.merge(args) {|key, arg, default| arg.nil? ? default : arg}
|
37
|
-
|
38
|
-
@stash_url = args[:stash_url]
|
39
|
-
@stash_user = args[:stash_user]
|
40
|
-
@git_commit = args[:git_commit]
|
41
|
-
self.build_status = args[:build_status]
|
42
|
-
@build_key = args[:build_key]
|
43
|
-
@build_name = args[:build_name]
|
44
|
-
@build_url = args[:build_url]
|
45
|
-
@build_description = args[:build_description]
|
46
|
-
@http_client = args[:http_client]
|
47
|
-
@pwd_vault = args[:pwd_vault]
|
48
|
-
end
|
49
|
-
|
50
|
-
def build_status=(new_build_status)
|
51
|
-
new_build_status = new_build_status.strip.upcase
|
52
|
-
|
53
|
-
if VALID_BUILD_STATUSES.include?(new_build_status)
|
54
|
-
@build_status = new_build_status
|
55
|
-
else
|
56
|
-
raise ArgumentError, "'#{new_build_status}' is not a valid Stash Build Status! Valid job statuses are #{VALID_BUILD_STATUSES}."
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
def post_to_stash
|
61
|
-
setup_http_client
|
62
|
-
response = post_results
|
63
|
-
check_errors(response)
|
64
|
-
end
|
65
|
-
|
66
|
-
private
|
67
|
-
|
68
|
-
def setup_http_client
|
69
|
-
http_client.url_prefix = stash_url
|
70
|
-
http_client.path_prefix = STASH_BUILD_STATUS_PATH
|
71
|
-
http_client.basic_auth(stash_user, get_pwd)
|
72
|
-
http_client.ssl[:verify] = false
|
73
|
-
end
|
74
|
-
|
75
|
-
def post_results
|
76
|
-
http_client.post do |req|
|
77
|
-
req.url git_commit
|
78
|
-
req.headers['Content-Type'] = 'application/json'
|
79
|
-
req.body = format_build_result
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
def check_errors(response, success_codes=[204])
|
84
|
-
unless success_codes.include?(response.status)
|
85
|
-
# raise an error here please
|
86
|
-
puts "FAILED: #{response.to_s}"
|
16
|
+
require 'stash_notifier/build_result'
|
17
|
+
require 'stash_notifier/http_client'
|
18
|
+
require 'stash_notifier/version'
|
19
|
+
|
20
|
+
module StashNotifier
|
21
|
+
class << self
|
22
|
+
def new(args)
|
23
|
+
# TODO: Refactor this into private method
|
24
|
+
build_args = {}
|
25
|
+
build_args[:state] = args[:build_status]
|
26
|
+
build_args[:key] = args[:build_key]
|
27
|
+
build_args[:name] = args[:build_name]
|
28
|
+
build_args[:url] = args[:build_url]
|
29
|
+
build_args[:description] = args[:build_description]
|
30
|
+
|
31
|
+
build_result = StashNotifier::BuildResult.new(build_args)
|
32
|
+
|
33
|
+
args[:build_result] = build_result.to_json
|
34
|
+
|
35
|
+
StashNotifier::HTTPClient.new(args)
|
87
36
|
end
|
88
37
|
end
|
89
|
-
|
90
|
-
def format_build_result
|
91
|
-
build_result = {
|
92
|
-
state: build_status,
|
93
|
-
key: build_key,
|
94
|
-
name: build_name,
|
95
|
-
url: build_url,
|
96
|
-
description: build_description
|
97
|
-
}
|
98
|
-
build_result.to_json
|
99
|
-
end
|
100
|
-
|
101
|
-
def get_pwd
|
102
|
-
user = pwd_vault.user(stash_user)
|
103
|
-
user.decrypt_password
|
104
|
-
end
|
105
38
|
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
# build_result.rb
|
2
|
+
# Copyright 2013 Doug Ireton
|
3
|
+
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
module StashNotifier
|
17
|
+
class BuildResult
|
18
|
+
|
19
|
+
attr_accessor :key, :name, :url, :description
|
20
|
+
attr_reader :state
|
21
|
+
|
22
|
+
VALID_BUILD_STATES = %w{ INPROGRESS SUCCESSFUL FAILED }
|
23
|
+
|
24
|
+
def initialize(args)
|
25
|
+
self.state = args[:state]
|
26
|
+
@key = args[:key]
|
27
|
+
@name = args[:name]
|
28
|
+
@url = args[:url]
|
29
|
+
@description = args[:description]
|
30
|
+
end
|
31
|
+
|
32
|
+
def state=(new_state)
|
33
|
+
new_state = new_state.upcase
|
34
|
+
if VALID_BUILD_STATES.include?(new_state)
|
35
|
+
@state = new_state
|
36
|
+
else
|
37
|
+
raise ArgumentError, "'#{new_state}' is not a valid Stash Build state! Valid states are #{VALID_BUILD_STATES}."
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
def to_json
|
42
|
+
result = {
|
43
|
+
state: state,
|
44
|
+
key: key,
|
45
|
+
name: name,
|
46
|
+
url: url,
|
47
|
+
description: description
|
48
|
+
}
|
49
|
+
result.to_json
|
50
|
+
end
|
51
|
+
|
52
|
+
end
|
53
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# exceptions.rb
|
2
|
+
# Copyright 2013 Doug Ireton
|
3
|
+
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
module StashNotifier
|
17
|
+
class Error < StandardError; end
|
18
|
+
class BadRequest < StandardError; end
|
19
|
+
class Unauthorized < StandardError; end
|
20
|
+
end
|
@@ -0,0 +1,97 @@
|
|
1
|
+
# stash_nofier.rb
|
2
|
+
# Copyright 2013 Doug Ireton
|
3
|
+
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require 'faraday'
|
17
|
+
require 'json'
|
18
|
+
require 'stash_notifier/exceptions'
|
19
|
+
|
20
|
+
module StashNotifier
|
21
|
+
|
22
|
+
class HTTPClient
|
23
|
+
STASH_BUILD_STATUS_PATH = 'rest/build-status/1.0/commits'
|
24
|
+
DEFAULTS = {
|
25
|
+
http_client: Faraday.new
|
26
|
+
}.freeze
|
27
|
+
|
28
|
+
attr_accessor :stash_url, :stash_user, :stash_pwd, :git_commit,
|
29
|
+
:build_result, :http_client
|
30
|
+
|
31
|
+
def initialize(args)
|
32
|
+
args = DEFAULTS.merge(args)
|
33
|
+
|
34
|
+
@stash_url = args[:stash_url]
|
35
|
+
@stash_user = args[:stash_user]
|
36
|
+
@stash_pwd = args[:stash_pwd]
|
37
|
+
@git_commit = args[:git_commit]
|
38
|
+
@build_result = args[:build_result]
|
39
|
+
@http_client = args[:http_client]
|
40
|
+
end
|
41
|
+
|
42
|
+
def to_s
|
43
|
+
"StashNotifier connection:
|
44
|
+
url: #{stash_url},
|
45
|
+
git_commit: #{git_commit},
|
46
|
+
user: #{stash_user},
|
47
|
+
pwd: ***********,
|
48
|
+
build_result: #{build_result}"
|
49
|
+
end
|
50
|
+
|
51
|
+
def post_to_stash
|
52
|
+
setup_http_client
|
53
|
+
response = post_results
|
54
|
+
check_errors(response)
|
55
|
+
response
|
56
|
+
end
|
57
|
+
|
58
|
+
private
|
59
|
+
|
60
|
+
def setup_http_client
|
61
|
+
http_client.url_prefix = stash_url
|
62
|
+
http_client.path_prefix = STASH_BUILD_STATUS_PATH
|
63
|
+
http_client.basic_auth(stash_user, stash_pwd)
|
64
|
+
http_client.ssl[:verify] = false
|
65
|
+
end
|
66
|
+
|
67
|
+
def post_results
|
68
|
+
http_client.post do |req|
|
69
|
+
req.url git_commit
|
70
|
+
req.headers['Content-Type'] = 'application/json'
|
71
|
+
req.body = build_result
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
def check_errors(response)
|
76
|
+
unless response.success?
|
77
|
+
|
78
|
+
err_msg = get_stash_err(response)
|
79
|
+
|
80
|
+
case response.status
|
81
|
+
when 400
|
82
|
+
raise StashNotifier::BadRequest, err_msg
|
83
|
+
when 401
|
84
|
+
raise StashNotifier::Unauthorized, err_msg
|
85
|
+
else
|
86
|
+
raise StashNotifier::Error, err_msg
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
|
91
|
+
def get_stash_err(response)
|
92
|
+
response_body = JSON.parse(response.body)
|
93
|
+
response_body['errors'].first['message']
|
94
|
+
end
|
95
|
+
|
96
|
+
end
|
97
|
+
end
|
data/spec/.rspec
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"SUCCESSFUL","key":"repo-master","name":"repo-master-42","url":"https://jenkins.example.com/view/All/job/myproject/57/console","description":null}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.8
|
12
|
+
Authorization:
|
13
|
+
- Basic <Base-64 encoded password>
|
14
|
+
Content-Type:
|
15
|
+
- application/json
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 204
|
19
|
+
message:
|
20
|
+
headers:
|
21
|
+
server:
|
22
|
+
- Apache-Coyote/1.1
|
23
|
+
x-arequestid:
|
24
|
+
- 1018x2286998x1
|
25
|
+
set-cookie:
|
26
|
+
- JSESSIONID=78EC7ADF309F13A72875495FA5DE378D; Path=/; Secure; HttpOnly
|
27
|
+
x-ausername:
|
28
|
+
- MY_STASH_USER
|
29
|
+
x-asessionid:
|
30
|
+
- p4ihzt
|
31
|
+
cache-control:
|
32
|
+
- no-cache, no-transform
|
33
|
+
vary:
|
34
|
+
- X-AUSERNAME, Cookie
|
35
|
+
content-type:
|
36
|
+
- application/json
|
37
|
+
date:
|
38
|
+
- Tue, 17 Sep 2013 23:58:14 GMT
|
39
|
+
connection:
|
40
|
+
- close
|
41
|
+
body:
|
42
|
+
encoding: US-ASCII
|
43
|
+
string: ''
|
44
|
+
http_version:
|
45
|
+
recorded_at: Tue, 17 Sep 2013 23:58:13 GMT
|
46
|
+
recorded_with: VCR 2.5.0
|
data/spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_passed_an_invalid_git_commit.yml
ADDED
@@ -0,0 +1,49 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/bogus
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"SUCCESSFUL","key":"repo-master","name":"repo-master-42","url":"https://jenkins.example.com/view/All/job/myproject/57/console","description":null}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.8
|
12
|
+
Authorization:
|
13
|
+
- Basic <Base-64 encoded password>
|
14
|
+
Content-Type:
|
15
|
+
- application/json
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 400
|
19
|
+
message:
|
20
|
+
headers:
|
21
|
+
server:
|
22
|
+
- Apache-Coyote/1.1
|
23
|
+
x-arequestid:
|
24
|
+
- 1018x2287000x1
|
25
|
+
set-cookie:
|
26
|
+
- JSESSIONID=902D30453B14A38C1D8978CAFB949FDE; Path=/; Secure; HttpOnly
|
27
|
+
x-ausername:
|
28
|
+
- MY_STASH_USER
|
29
|
+
x-asessionid:
|
30
|
+
- 12cpxek
|
31
|
+
cache-control:
|
32
|
+
- no-cache, no-transform
|
33
|
+
vary:
|
34
|
+
- X-AUSERNAME, Cookie
|
35
|
+
content-type:
|
36
|
+
- application/json;charset=UTF-8
|
37
|
+
transfer-encoding:
|
38
|
+
- chunked
|
39
|
+
date:
|
40
|
+
- Tue, 17 Sep 2013 23:58:14 GMT
|
41
|
+
connection:
|
42
|
+
- close
|
43
|
+
body:
|
44
|
+
encoding: US-ASCII
|
45
|
+
string: ! '{"errors":[{"context":null,"message":"Please specify the changeset
|
46
|
+
id as a 40-character hash","exceptionName":null}]}'
|
47
|
+
http_version:
|
48
|
+
recorded_at: Tue, 17 Sep 2013 23:58:13 GMT
|
49
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"successful","key":null,"name":"repo-master-42","url":"https://gittst.example.com","description":"This
|
9
|
+
is the description"}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.8.8
|
13
|
+
Authorization:
|
14
|
+
- Basic <Base-64 encoded password>
|
15
|
+
Content-Type:
|
16
|
+
- application/json
|
17
|
+
response:
|
18
|
+
status:
|
19
|
+
code: 400
|
20
|
+
message:
|
21
|
+
headers:
|
22
|
+
server:
|
23
|
+
- Apache-Coyote/1.1
|
24
|
+
x-arequestid:
|
25
|
+
- 1018x2286996x1
|
26
|
+
set-cookie:
|
27
|
+
- JSESSIONID=A67AE640B7FA3BC552DE426A490B7FCB; Path=/; Secure; HttpOnly
|
28
|
+
x-ausername:
|
29
|
+
- MY_STASH_USER
|
30
|
+
x-asessionid:
|
31
|
+
- 1l5rkd0
|
32
|
+
cache-control:
|
33
|
+
- no-cache, no-transform
|
34
|
+
vary:
|
35
|
+
- X-AUSERNAME, Cookie
|
36
|
+
content-type:
|
37
|
+
- application/json;charset=UTF-8
|
38
|
+
transfer-encoding:
|
39
|
+
- chunked
|
40
|
+
date:
|
41
|
+
- Tue, 17 Sep 2013 23:58:13 GMT
|
42
|
+
connection:
|
43
|
+
- close
|
44
|
+
body:
|
45
|
+
encoding: US-ASCII
|
46
|
+
string: ! '{"errors":[{"context":null,"message":"Please specify a non-blank
|
47
|
+
key","exceptionName":null}]}'
|
48
|
+
http_version:
|
49
|
+
recorded_at: Tue, 17 Sep 2013 23:58:12 GMT
|
50
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,50 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"bogus","key":"repo-master","name":"repo-master-42","url":"https://gittst.example.com","description":"This
|
9
|
+
is the description"}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.8.8
|
13
|
+
Authorization:
|
14
|
+
- Basic <Base-64 encoded password>
|
15
|
+
Content-Type:
|
16
|
+
- application/json
|
17
|
+
response:
|
18
|
+
status:
|
19
|
+
code: 400
|
20
|
+
message:
|
21
|
+
headers:
|
22
|
+
server:
|
23
|
+
- Apache-Coyote/1.1
|
24
|
+
x-arequestid:
|
25
|
+
- 1018x2286997x1
|
26
|
+
set-cookie:
|
27
|
+
- JSESSIONID=EF4D56A1F42560CBBD897C99B903E0C0; Path=/; Secure; HttpOnly
|
28
|
+
x-ausername:
|
29
|
+
- MY_STASH_USER
|
30
|
+
x-asessionid:
|
31
|
+
- 879ej3
|
32
|
+
cache-control:
|
33
|
+
- no-cache, no-transform
|
34
|
+
vary:
|
35
|
+
- X-AUSERNAME, Cookie
|
36
|
+
content-type:
|
37
|
+
- application/json;charset=UTF-8
|
38
|
+
transfer-encoding:
|
39
|
+
- chunked
|
40
|
+
date:
|
41
|
+
- Tue, 17 Sep 2013 23:58:13 GMT
|
42
|
+
connection:
|
43
|
+
- close
|
44
|
+
body:
|
45
|
+
encoding: US-ASCII
|
46
|
+
string: ! '{"errors":[{"context":null,"message":"Please specify a valid state
|
47
|
+
(valid states: {SUCCESSFUL,FAILED,INPROGRESS})","exceptionName":null}]}'
|
48
|
+
http_version:
|
49
|
+
recorded_at: Tue, 17 Sep 2013 23:58:13 GMT
|
50
|
+
recorded_with: VCR 2.5.0
|
@@ -0,0 +1,49 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"successful","key":"repo-master","name":"repo-master-42","url":"bogus","description":"This
|
9
|
+
is the description"}'
|
10
|
+
headers:
|
11
|
+
User-Agent:
|
12
|
+
- Faraday v0.8.8
|
13
|
+
Authorization:
|
14
|
+
- Basic <Base-64 encoded password>
|
15
|
+
Content-Type:
|
16
|
+
- application/json
|
17
|
+
response:
|
18
|
+
status:
|
19
|
+
code: 400
|
20
|
+
message:
|
21
|
+
headers:
|
22
|
+
server:
|
23
|
+
- Apache-Coyote/1.1
|
24
|
+
x-arequestid:
|
25
|
+
- 1018x2286994x1
|
26
|
+
set-cookie:
|
27
|
+
- JSESSIONID=9FC5CD033AAEE6B9019416F415E4D03F; Path=/; Secure; HttpOnly
|
28
|
+
x-ausername:
|
29
|
+
- MY_STASH_USER
|
30
|
+
x-asessionid:
|
31
|
+
- 16txqub
|
32
|
+
cache-control:
|
33
|
+
- no-cache, no-transform
|
34
|
+
vary:
|
35
|
+
- X-AUSERNAME, Cookie
|
36
|
+
content-type:
|
37
|
+
- application/json;charset=UTF-8
|
38
|
+
transfer-encoding:
|
39
|
+
- chunked
|
40
|
+
date:
|
41
|
+
- Tue, 17 Sep 2013 23:58:13 GMT
|
42
|
+
connection:
|
43
|
+
- close
|
44
|
+
body:
|
45
|
+
encoding: US-ASCII
|
46
|
+
string: ! '{"errors":[{"context":null,"message":"Please specify a valid url","exceptionName":null}]}'
|
47
|
+
http_version:
|
48
|
+
recorded_at: Tue, 17 Sep 2013 23:58:12 GMT
|
49
|
+
recorded_with: VCR 2.5.0
|
data/spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_pwd.yml
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"SUCCESSFUL","key":"repo-master","name":"repo-master-42","url":"https://jenkins.example.com/view/All/job/myproject/57/console","description":null}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.8
|
12
|
+
Authorization:
|
13
|
+
- Basic <Base-64 encoded password>
|
14
|
+
Content-Type:
|
15
|
+
- application/json
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 401
|
19
|
+
message:
|
20
|
+
headers:
|
21
|
+
server:
|
22
|
+
- Apache-Coyote/1.1
|
23
|
+
x-arequestid:
|
24
|
+
- 1018x2286999x1
|
25
|
+
set-cookie:
|
26
|
+
- JSESSIONID=6B3D48F2656588A1AF9F323BDA04FFA7; Path=/; Secure; HttpOnly, _atl_stash_remember_me="";
|
27
|
+
Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
|
28
|
+
www-authenticate:
|
29
|
+
- Basic realm="Atlassian Stash"
|
30
|
+
content-type:
|
31
|
+
- application/json;charset=UTF-8
|
32
|
+
content-length:
|
33
|
+
- '130'
|
34
|
+
date:
|
35
|
+
- Tue, 17 Sep 2013 23:58:14 GMT
|
36
|
+
connection:
|
37
|
+
- close
|
38
|
+
body:
|
39
|
+
encoding: US-ASCII
|
40
|
+
string: ! '{"errors":[{"context":null,"message":"Authentication failed. Please
|
41
|
+
check your credentials and try again.","exceptionName":null}]}'
|
42
|
+
http_version:
|
43
|
+
recorded_at: Tue, 17 Sep 2013 23:58:13 GMT
|
44
|
+
recorded_with: VCR 2.5.0
|
data/spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_user.yml
ADDED
@@ -0,0 +1,44 @@
|
|
1
|
+
---
|
2
|
+
http_interactions:
|
3
|
+
- request:
|
4
|
+
method: post
|
5
|
+
uri: https://stash.example.com/rest/build-status/1.0/commits/68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb
|
6
|
+
body:
|
7
|
+
encoding: UTF-8
|
8
|
+
string: ! '{"state":"SUCCESSFUL","key":"repo-master","name":"repo-master-42","url":"https://jenkins.example.com/view/All/job/myproject/57/console","description":null}'
|
9
|
+
headers:
|
10
|
+
User-Agent:
|
11
|
+
- Faraday v0.8.8
|
12
|
+
Authorization:
|
13
|
+
- Basic Ym9ndXM6TTBiaWxlLXNoZWxs
|
14
|
+
Content-Type:
|
15
|
+
- application/json
|
16
|
+
response:
|
17
|
+
status:
|
18
|
+
code: 401
|
19
|
+
message:
|
20
|
+
headers:
|
21
|
+
server:
|
22
|
+
- Apache-Coyote/1.1
|
23
|
+
x-arequestid:
|
24
|
+
- 1018x2286995x1
|
25
|
+
set-cookie:
|
26
|
+
- JSESSIONID=F0BB7905B2B5E65755F44E61DCDF9215; Path=/; Secure; HttpOnly, _atl_stash_remember_me="";
|
27
|
+
Expires=Thu, 01-Jan-1970 00:00:10 GMT; Path=/
|
28
|
+
www-authenticate:
|
29
|
+
- Basic realm="Atlassian Stash"
|
30
|
+
content-type:
|
31
|
+
- application/json;charset=UTF-8
|
32
|
+
content-length:
|
33
|
+
- '130'
|
34
|
+
date:
|
35
|
+
- Tue, 17 Sep 2013 23:58:13 GMT
|
36
|
+
connection:
|
37
|
+
- close
|
38
|
+
body:
|
39
|
+
encoding: US-ASCII
|
40
|
+
string: ! '{"errors":[{"context":null,"message":"Authentication failed. Please
|
41
|
+
check your credentials and try again.","exceptionName":null}]}'
|
42
|
+
http_version:
|
43
|
+
recorded_at: Tue, 17 Sep 2013 23:58:12 GMT
|
44
|
+
recorded_with: VCR 2.5.0
|
data/spec/spec_helper.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
#
|
1
|
+
# spec_helper.rb
|
2
2
|
# Copyright 2013 Doug Ireton
|
3
3
|
|
4
4
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
@@ -15,3 +15,28 @@
|
|
15
15
|
|
16
16
|
$LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
|
17
17
|
require 'stash_notifier'
|
18
|
+
require 'vcr'
|
19
|
+
|
20
|
+
VCR.configure do |c|
|
21
|
+
c.cassette_library_dir = 'spec/cassettes'
|
22
|
+
c.hook_into :faraday
|
23
|
+
c.configure_rspec_metadata!
|
24
|
+
end
|
25
|
+
|
26
|
+
# See http://rubydoc.info/gems/rspec-core/RSpec/Core/Configuration
|
27
|
+
RSpec.configure do |config|
|
28
|
+
config.treat_symbols_as_metadata_keys_with_true_values = true
|
29
|
+
config.run_all_when_everything_filtered = true
|
30
|
+
config.filter_run :focus
|
31
|
+
|
32
|
+
# disable should syntax
|
33
|
+
config.expect_with :rspec do |c|
|
34
|
+
c.syntax = :expect
|
35
|
+
end
|
36
|
+
|
37
|
+
# Run specs in random order to surface order dependencies. If you find an
|
38
|
+
# order dependency and want to debug it, you can fix the order by providing
|
39
|
+
# the seed, which is printed after each run.
|
40
|
+
# --seed 1234
|
41
|
+
config.order = 'random'
|
42
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
# build_result_spec.rb
|
2
|
+
# Copyright 2013 Doug Ireton
|
3
|
+
|
4
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
5
|
+
# you may not use this file except in compliance with the License.
|
6
|
+
# You may obtain a copy of the License at
|
7
|
+
|
8
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
9
|
+
|
10
|
+
# Unless required by applicable law or agreed to in writing, software
|
11
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
12
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
13
|
+
# See the License for the specific language governing permissions and
|
14
|
+
# limitations under the License.
|
15
|
+
|
16
|
+
require 'json'
|
17
|
+
require 'spec_helper'
|
18
|
+
|
19
|
+
describe StashNotifier::BuildResult do
|
20
|
+
|
21
|
+
let(:args) {
|
22
|
+
{
|
23
|
+
state: 'successful',
|
24
|
+
key: 'repo-master',
|
25
|
+
name: 'repo-master-42',
|
26
|
+
url: 'https://gittst.example.com',
|
27
|
+
description: 'This is the description'
|
28
|
+
}
|
29
|
+
}
|
30
|
+
|
31
|
+
let(:build_result) { StashNotifier::BuildResult.new(args) }
|
32
|
+
|
33
|
+
describe '#state' do
|
34
|
+
it "returns UPPERCASE state" do
|
35
|
+
expect(build_result.state).to eq('SUCCESSFUL')
|
36
|
+
end
|
37
|
+
|
38
|
+
it 'accepts a different state' do
|
39
|
+
build_result.state = 'failed'
|
40
|
+
expect(build_result.state).to eq('FAILED')
|
41
|
+
end
|
42
|
+
|
43
|
+
it 'raises an ArgumentError when state is not valid' do
|
44
|
+
expect { build_result.state = 'foo' }.to raise_error(ArgumentError)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe '#key' do
|
49
|
+
it 'returns the build key' do
|
50
|
+
expect(build_result.key).to eq 'repo-master'
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#name' do
|
55
|
+
it 'returns the name' do
|
56
|
+
expect(build_result.name).to eq 'repo-master-42'
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe '#url' do
|
61
|
+
it 'returns the url' do
|
62
|
+
expect(build_result.url).to eq 'https://gittst.example.com'
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
describe '#description' do
|
67
|
+
it 'returns the description' do
|
68
|
+
expect(build_result.description).to eq 'This is the description'
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
describe '#to_json' do
|
73
|
+
it 'returns a JSON string suitable for sending to the Stash Build Result API endpoint' do
|
74
|
+
args[:state] = 'SUCCESSFUL'
|
75
|
+
expect(build_result.to_json).to eq(args.to_json)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
end
|
data/spec/stash_notifier_spec.rb
CHANGED
@@ -14,10 +14,110 @@
|
|
14
14
|
# limitations under the License.
|
15
15
|
|
16
16
|
require 'spec_helper'
|
17
|
+
require 'json'
|
17
18
|
|
18
19
|
describe StashNotifier do
|
19
|
-
|
20
|
-
|
20
|
+
|
21
|
+
let(:build_result) do
|
22
|
+
{
|
23
|
+
state: 'successful',
|
24
|
+
key: 'repo-master',
|
25
|
+
name: 'repo-master-42',
|
26
|
+
url: 'https://jenkins.example.com/view/All/job/myproject/57/console',
|
27
|
+
description: 'This is the description'
|
28
|
+
}
|
29
|
+
end
|
30
|
+
|
31
|
+
let(:args) do
|
32
|
+
{
|
33
|
+
stash_url: 'https://stash.example.com',
|
34
|
+
stash_user: 'my_stash_user',
|
35
|
+
stash_pwd: 'P@ssword',
|
36
|
+
git_commit: '68ccfc66971c2e1e2ca57e17707dbebb6c6b4ebb',
|
37
|
+
build_status: build_result[:state],
|
38
|
+
build_key: build_result[:key],
|
39
|
+
build_name: build_result[:name],
|
40
|
+
build_url: build_result[:url],
|
41
|
+
description: build_result[:description],
|
42
|
+
# you must supply http_client so that VCR can override it
|
43
|
+
http_client: Faraday.new
|
44
|
+
}
|
45
|
+
end
|
46
|
+
|
47
|
+
let!(:stash_notifier) { StashNotifier.new(args) }
|
48
|
+
|
49
|
+
it 'should have a SimVer compatible version number' do
|
50
|
+
SIMVER_REGEXP = /^\d{1}\.\d{1,2}\.\d{1,2}\.*\w*$/
|
51
|
+
expect(StashNotifier::VERSION).to match SIMVER_REGEXP
|
52
|
+
end
|
53
|
+
|
54
|
+
describe '#post_to_stash', :vcr do
|
55
|
+
it 'returns 204 when passed valid parameters' do
|
56
|
+
|
57
|
+
response = stash_notifier.post_to_stash
|
58
|
+
expect(response.status).to eq 204
|
59
|
+
end
|
60
|
+
|
61
|
+
it 'returns 401 when passed an invalid stash_user' do
|
62
|
+
stash_notifier.stash_user = 'bogus'
|
63
|
+
|
64
|
+
expect { stash_notifier.post_to_stash }.to \
|
65
|
+
raise_error(StashNotifier::Unauthorized,
|
66
|
+
'Authentication failed. Please check your credentials and try again.')
|
67
|
+
end
|
68
|
+
|
69
|
+
it 'returns 401 when passed an invalid stash_pwd' do
|
70
|
+
stash_notifier.stash_pwd = 'bogus'
|
71
|
+
|
72
|
+
expect { stash_notifier.post_to_stash }.to \
|
73
|
+
raise_error(StashNotifier::Unauthorized,
|
74
|
+
'Authentication failed. Please check your credentials and try again.')
|
75
|
+
end
|
76
|
+
|
77
|
+
it 'returns 400 when passed an invalid git_commit' do
|
78
|
+
stash_notifier.git_commit = 'bogus'
|
79
|
+
|
80
|
+
expect { stash_notifier.post_to_stash }.to \
|
81
|
+
raise_error(StashNotifier::BadRequest)
|
82
|
+
end
|
83
|
+
|
84
|
+
it 'returns 400 when the build state is missing or invalid' do
|
85
|
+
build_result[:state] = 'bogus'
|
86
|
+
stash_notifier.build_result = build_result.to_json
|
87
|
+
|
88
|
+
expect { stash_notifier.post_to_stash }.to \
|
89
|
+
raise_error(StashNotifier::BadRequest)
|
90
|
+
end
|
91
|
+
|
92
|
+
it 'returns 400 when the build key is missing or invalid' do
|
93
|
+
build_result[:key] = nil
|
94
|
+
stash_notifier.build_result = build_result.to_json
|
95
|
+
|
96
|
+
expect { stash_notifier.post_to_stash }.to \
|
97
|
+
raise_error(StashNotifier::BadRequest)
|
98
|
+
end
|
99
|
+
|
100
|
+
it 'returns 400 when the build url is missing or invalid' do
|
101
|
+
build_result[:url] = 'bogus'
|
102
|
+
stash_notifier.build_result = build_result.to_json
|
103
|
+
|
104
|
+
expect { stash_notifier.post_to_stash }.to \
|
105
|
+
raise_error(StashNotifier::BadRequest)
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
describe '#to_s' do
|
110
|
+
it 'returns a nice, descriptive string' do
|
111
|
+
stash_notifier = StashNotifier.new(args)
|
112
|
+
expect(stash_notifier.to_s).to start_with('StashNotifier connection')
|
113
|
+
end
|
114
|
+
|
115
|
+
end
|
116
|
+
|
117
|
+
describe '#http_client' do
|
118
|
+
it 'returns the http_client' do
|
119
|
+
expect(stash_notifier.http_client).to be_an_instance_of(Faraday::Connection)
|
120
|
+
end
|
21
121
|
end
|
22
122
|
|
23
123
|
end
|
data/stash_notifier.gemspec
CHANGED
@@ -19,25 +19,28 @@ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
|
19
19
|
require 'stash_notifier/version'
|
20
20
|
|
21
21
|
Gem::Specification.new do |spec|
|
22
|
-
spec.name =
|
22
|
+
spec.name = 'stash_notifier'
|
23
23
|
spec.version = StashNotifier::VERSION
|
24
|
-
spec.authors = [
|
25
|
-
spec.email = [
|
24
|
+
spec.authors = ['Doug Ireton']
|
25
|
+
spec.email = ['doug.ireton@nordstrom.com']
|
26
26
|
spec.description = %q{Send per-commit CI server build results to Atlassian Stash}
|
27
27
|
spec.summary = %q{Send per-commit CI server build results to Atlassian Stash}
|
28
|
-
spec.homepage =
|
29
|
-
spec.license =
|
28
|
+
spec.homepage = 'https://github.com/dougireton/stash_notifier'
|
29
|
+
spec.license = 'Apache License, Version 2.0'
|
30
30
|
|
31
31
|
spec.files = `git ls-files`.split($/)
|
32
32
|
spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
|
33
33
|
spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
|
34
|
-
spec.require_paths = [
|
34
|
+
spec.require_paths = ['lib']
|
35
35
|
|
36
36
|
spec.add_dependency 'faraday', '~> 0.8'
|
37
|
-
spec.add_dependency 'chef-vault', '~>
|
37
|
+
spec.add_dependency 'chef-vault', '~> 2.0'
|
38
38
|
spec.add_dependency 'slop'
|
39
39
|
|
40
|
-
spec.add_development_dependency
|
41
|
-
spec.add_development_dependency
|
42
|
-
spec.add_development_dependency
|
40
|
+
spec.add_development_dependency 'bundler', '~> 1.3'
|
41
|
+
spec.add_development_dependency 'rake'
|
42
|
+
spec.add_development_dependency 'rspec', '~> 2.14'
|
43
|
+
spec.add_development_dependency 'vcr', '~> 2.5'
|
44
|
+
spec.add_development_dependency 'guard'
|
45
|
+
spec.add_development_dependency 'guard-rspec'
|
43
46
|
end
|
metadata
CHANGED
@@ -1,18 +1,20 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: stash_notifier
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
|
+
prerelease:
|
5
6
|
platform: ruby
|
6
7
|
authors:
|
7
8
|
- Doug Ireton
|
8
9
|
autorequire:
|
9
10
|
bindir: bin
|
10
11
|
cert_chain: []
|
11
|
-
date: 2013-
|
12
|
+
date: 2013-09-23 00:00:00.000000000 Z
|
12
13
|
dependencies:
|
13
14
|
- !ruby/object:Gem::Dependency
|
14
15
|
name: faraday
|
15
16
|
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
16
18
|
requirements:
|
17
19
|
- - ~>
|
18
20
|
- !ruby/object:Gem::Version
|
@@ -20,6 +22,7 @@ dependencies:
|
|
20
22
|
type: :runtime
|
21
23
|
prerelease: false
|
22
24
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
23
26
|
requirements:
|
24
27
|
- - ~>
|
25
28
|
- !ruby/object:Gem::Version
|
@@ -27,20 +30,23 @@ dependencies:
|
|
27
30
|
- !ruby/object:Gem::Dependency
|
28
31
|
name: chef-vault
|
29
32
|
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
30
34
|
requirements:
|
31
35
|
- - ~>
|
32
36
|
- !ruby/object:Gem::Version
|
33
|
-
version: '
|
37
|
+
version: '2.0'
|
34
38
|
type: :runtime
|
35
39
|
prerelease: false
|
36
40
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
37
42
|
requirements:
|
38
43
|
- - ~>
|
39
44
|
- !ruby/object:Gem::Version
|
40
|
-
version: '
|
45
|
+
version: '2.0'
|
41
46
|
- !ruby/object:Gem::Dependency
|
42
47
|
name: slop
|
43
48
|
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
44
50
|
requirements:
|
45
51
|
- - ! '>='
|
46
52
|
- !ruby/object:Gem::Version
|
@@ -48,6 +54,7 @@ dependencies:
|
|
48
54
|
type: :runtime
|
49
55
|
prerelease: false
|
50
56
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
51
58
|
requirements:
|
52
59
|
- - ! '>='
|
53
60
|
- !ruby/object:Gem::Version
|
@@ -55,6 +62,7 @@ dependencies:
|
|
55
62
|
- !ruby/object:Gem::Dependency
|
56
63
|
name: bundler
|
57
64
|
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
58
66
|
requirements:
|
59
67
|
- - ~>
|
60
68
|
- !ruby/object:Gem::Version
|
@@ -62,6 +70,7 @@ dependencies:
|
|
62
70
|
type: :development
|
63
71
|
prerelease: false
|
64
72
|
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
65
74
|
requirements:
|
66
75
|
- - ~>
|
67
76
|
- !ruby/object:Gem::Version
|
@@ -69,6 +78,7 @@ dependencies:
|
|
69
78
|
- !ruby/object:Gem::Dependency
|
70
79
|
name: rake
|
71
80
|
requirement: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
72
82
|
requirements:
|
73
83
|
- - ! '>='
|
74
84
|
- !ruby/object:Gem::Version
|
@@ -76,6 +86,7 @@ dependencies:
|
|
76
86
|
type: :development
|
77
87
|
prerelease: false
|
78
88
|
version_requirements: !ruby/object:Gem::Requirement
|
89
|
+
none: false
|
79
90
|
requirements:
|
80
91
|
- - ! '>='
|
81
92
|
- !ruby/object:Gem::Version
|
@@ -83,6 +94,55 @@ dependencies:
|
|
83
94
|
- !ruby/object:Gem::Dependency
|
84
95
|
name: rspec
|
85
96
|
requirement: !ruby/object:Gem::Requirement
|
97
|
+
none: false
|
98
|
+
requirements:
|
99
|
+
- - ~>
|
100
|
+
- !ruby/object:Gem::Version
|
101
|
+
version: '2.14'
|
102
|
+
type: :development
|
103
|
+
prerelease: false
|
104
|
+
version_requirements: !ruby/object:Gem::Requirement
|
105
|
+
none: false
|
106
|
+
requirements:
|
107
|
+
- - ~>
|
108
|
+
- !ruby/object:Gem::Version
|
109
|
+
version: '2.14'
|
110
|
+
- !ruby/object:Gem::Dependency
|
111
|
+
name: vcr
|
112
|
+
requirement: !ruby/object:Gem::Requirement
|
113
|
+
none: false
|
114
|
+
requirements:
|
115
|
+
- - ~>
|
116
|
+
- !ruby/object:Gem::Version
|
117
|
+
version: '2.5'
|
118
|
+
type: :development
|
119
|
+
prerelease: false
|
120
|
+
version_requirements: !ruby/object:Gem::Requirement
|
121
|
+
none: false
|
122
|
+
requirements:
|
123
|
+
- - ~>
|
124
|
+
- !ruby/object:Gem::Version
|
125
|
+
version: '2.5'
|
126
|
+
- !ruby/object:Gem::Dependency
|
127
|
+
name: guard
|
128
|
+
requirement: !ruby/object:Gem::Requirement
|
129
|
+
none: false
|
130
|
+
requirements:
|
131
|
+
- - ! '>='
|
132
|
+
- !ruby/object:Gem::Version
|
133
|
+
version: '0'
|
134
|
+
type: :development
|
135
|
+
prerelease: false
|
136
|
+
version_requirements: !ruby/object:Gem::Requirement
|
137
|
+
none: false
|
138
|
+
requirements:
|
139
|
+
- - ! '>='
|
140
|
+
- !ruby/object:Gem::Version
|
141
|
+
version: '0'
|
142
|
+
- !ruby/object:Gem::Dependency
|
143
|
+
name: guard-rspec
|
144
|
+
requirement: !ruby/object:Gem::Requirement
|
145
|
+
none: false
|
86
146
|
requirements:
|
87
147
|
- - ! '>='
|
88
148
|
- !ruby/object:Gem::Version
|
@@ -90,6 +150,7 @@ dependencies:
|
|
90
150
|
type: :development
|
91
151
|
prerelease: false
|
92
152
|
version_requirements: !ruby/object:Gem::Requirement
|
153
|
+
none: false
|
93
154
|
requirements:
|
94
155
|
- - ! '>='
|
95
156
|
- !ruby/object:Gem::Version
|
@@ -107,39 +168,62 @@ files:
|
|
107
168
|
- .travis.yml
|
108
169
|
- CHANGELOG.md
|
109
170
|
- Gemfile
|
171
|
+
- Guardfile
|
110
172
|
- LICENSE
|
111
173
|
- README.md
|
112
174
|
- Rakefile
|
113
175
|
- bin/notify
|
114
176
|
- lib/stash_notifier.rb
|
177
|
+
- lib/stash_notifier/build_result.rb
|
178
|
+
- lib/stash_notifier/exceptions.rb
|
179
|
+
- lib/stash_notifier/http_client.rb
|
115
180
|
- lib/stash_notifier/version.rb
|
181
|
+
- spec/.rspec
|
182
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_204_when_passed_valid_parameters.yml
|
183
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_passed_an_invalid_git_commit.yml
|
184
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_key_is_missing_or_invalid.yml
|
185
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_state_is_missing_or_invalid.yml
|
186
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_url_is_missing_or_invalid.yml
|
187
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_pwd.yml
|
188
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_user.yml
|
116
189
|
- spec/spec_helper.rb
|
190
|
+
- spec/stash_notifier/build_result_spec.rb
|
117
191
|
- spec/stash_notifier_spec.rb
|
118
192
|
- stash_notifier.gemspec
|
119
193
|
homepage: https://github.com/dougireton/stash_notifier
|
120
194
|
licenses:
|
121
195
|
- Apache License, Version 2.0
|
122
|
-
metadata: {}
|
123
196
|
post_install_message:
|
124
197
|
rdoc_options: []
|
125
198
|
require_paths:
|
126
199
|
- lib
|
127
200
|
required_ruby_version: !ruby/object:Gem::Requirement
|
201
|
+
none: false
|
128
202
|
requirements:
|
129
203
|
- - ! '>='
|
130
204
|
- !ruby/object:Gem::Version
|
131
205
|
version: '0'
|
132
206
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
207
|
+
none: false
|
133
208
|
requirements:
|
134
209
|
- - ! '>='
|
135
210
|
- !ruby/object:Gem::Version
|
136
211
|
version: '0'
|
137
212
|
requirements: []
|
138
213
|
rubyforge_project:
|
139
|
-
rubygems_version:
|
214
|
+
rubygems_version: 1.8.23
|
140
215
|
signing_key:
|
141
|
-
specification_version:
|
216
|
+
specification_version: 3
|
142
217
|
summary: Send per-commit CI server build results to Atlassian Stash
|
143
218
|
test_files:
|
219
|
+
- spec/.rspec
|
220
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_204_when_passed_valid_parameters.yml
|
221
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_passed_an_invalid_git_commit.yml
|
222
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_key_is_missing_or_invalid.yml
|
223
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_state_is_missing_or_invalid.yml
|
224
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_400_when_the_build_url_is_missing_or_invalid.yml
|
225
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_pwd.yml
|
226
|
+
- spec/cassettes/StashNotifier/_post_to_stash/returns_401_when_passed_an_invalid_stash_user.yml
|
144
227
|
- spec/spec_helper.rb
|
228
|
+
- spec/stash_notifier/build_result_spec.rb
|
145
229
|
- spec/stash_notifier_spec.rb
|
checksums.yaml
DELETED
@@ -1,15 +0,0 @@
|
|
1
|
-
---
|
2
|
-
!binary "U0hBMQ==":
|
3
|
-
metadata.gz: !binary |-
|
4
|
-
ZDQ5MWE1ZGYxMTgwNjVkZDUzYTFmYzkzZTZmMWIzMWY3ZTc0MDcwYQ==
|
5
|
-
data.tar.gz: !binary |-
|
6
|
-
OTlhZTZjYTYxYzZiNGE1ZTc5MjkwNjcyMTQwODdmM2UzOTg1MGJlMg==
|
7
|
-
!binary "U0hBNTEy":
|
8
|
-
metadata.gz: !binary |-
|
9
|
-
NTgxOGE5NGQxYjcxODQwNzFjOTUxZWYzYmQxZjVhNjMwNDZiYWE1NTIxYjhh
|
10
|
-
MGZhMDVlOWVhM2JlNDdjZmVhZGYyYzFiYzg4MGQzMmUyZjQ4ZDU0N2UwMGY4
|
11
|
-
ZDhhMjI0NjEyNzZmNmQwM2VmNWVhOGRmZDVmOWNkZmU1NzdkMTA=
|
12
|
-
data.tar.gz: !binary |-
|
13
|
-
MmMwZDlmNGM3MjI2ZjZmMmM4ZDBlZDViNjkyMTUyOGRlYTdhZTM3Y2JkYTQ4
|
14
|
-
NGIxMDkwMjI0ZDkzZTJhM2FkNmJkMWY2YjMzYTQwNDUxM2FiODA0ZTg2ZjBh
|
15
|
-
OWU1ZjczZTc1MDc2NzcyZTNkZjBkOThlOGFjNTc1YWI4N2I3NmY=
|