buildkite_watcher 0.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 ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ce94c9f805c452c1c2d347d496c6035f2c46978c4380ece167df5d4fc8e185bf
4
+ data.tar.gz: 37134a0e829761200e9c864416f023325ef3d716cadc929f7c5c1c9817786f8c
5
+ SHA512:
6
+ metadata.gz: 84da1398fdb493ff787030ce14e9499a58dda0b8b5c6c6e55310b76a389204c7345cd02febd7824bab80f730cf46e5bfa2561db94580f58c450353e40f648d55
7
+ data.tar.gz: fe35e7b28d99cf4bb0e44667cf4f35b96381b5aa499dc6aabd8e7c9725ddb8a963f931006c4742f8e30be5e94b2163094c13ec30c138727a2e172ad93cf82d3c
@@ -0,0 +1,16 @@
1
+ name: Ruby
2
+
3
+ on: [push,pull_request]
4
+
5
+ jobs:
6
+ build:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - uses: actions/checkout@v2
10
+ - name: Set up Ruby
11
+ uses: ruby/setup-ruby@v1
12
+ with:
13
+ ruby-version: 3.0
14
+ bundler-cache: true
15
+ - name: Run the default task
16
+ run: bundle exec rake
data/.gitignore ADDED
@@ -0,0 +1,11 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
9
+
10
+ # rspec failure tracking
11
+ .rspec_status
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
data/.rubocop.yml ADDED
@@ -0,0 +1,43 @@
1
+ inherit_from: .rubocop_todo.yml
2
+
3
+ AllCops:
4
+ TargetRubyVersion: 3.0
5
+ NewCops: enable
6
+
7
+ Style/StringLiterals:
8
+ Enabled: true
9
+ EnforcedStyle: double_quotes
10
+
11
+ Style/StringLiteralsInInterpolation:
12
+ Enabled: true
13
+ EnforcedStyle: double_quotes
14
+
15
+ Style/Documentation:
16
+ Enabled: false
17
+
18
+ Style/TrailingCommaInArguments:
19
+ EnforcedStyleForMultiline: comma
20
+
21
+ Style/TrailingCommaInArrayLiteral:
22
+ EnforcedStyleForMultiline: comma
23
+
24
+ Style/TrailingCommaInHashLiteral:
25
+ EnforcedStyleForMultiline: comma
26
+
27
+ Layout/LineLength:
28
+ Max: 120
29
+
30
+ Layout/MultilineMethodCallIndentation:
31
+ EnforcedStyle: indented
32
+
33
+ Metrics/BlockLength:
34
+ Exclude:
35
+ - '**/*_spec.rb'
36
+
37
+ Metrics/ModuleLength:
38
+ Exclude:
39
+ - '**/*_spec.rb'
40
+
41
+ Lint/AmbiguousBlockAssociation:
42
+ Exclude:
43
+ - "**/*_spec.rb"
data/.rubocop_todo.yml ADDED
@@ -0,0 +1,52 @@
1
+ # This configuration was generated by
2
+ # `rubocop --auto-gen-config`
3
+ # on 2021-06-04 19:01:24 UTC using RuboCop version 1.16.0.
4
+ # The point is for the user to remove these configuration records
5
+ # one by one as the offenses are removed from the code base.
6
+ # Note that changes in the inspected code, or installation of new
7
+ # versions of RuboCop, may require this file to be generated again.
8
+
9
+ # Offense count: 1
10
+ # Configuration parameters: Include.
11
+ # Include: **/*.gemspec
12
+ Gemspec/RequiredRubyVersion:
13
+ Exclude:
14
+ - 'buildkite_watcher.gemspec'
15
+
16
+ # Offense count: 1
17
+ # Configuration parameters: CheckForMethodsWithNoSideEffects.
18
+ Lint/Void:
19
+ Exclude:
20
+ - 'lib/buildkite_watcher.rb'
21
+
22
+ # Offense count: 4
23
+ # Configuration parameters: IgnoredMethods, CountRepeatedAttributes.
24
+ Metrics/AbcSize:
25
+ Max: 100
26
+
27
+ # Offense count: 2
28
+ # Configuration parameters: IgnoredMethods.
29
+ Metrics/CyclomaticComplexity:
30
+ Max: 11
31
+
32
+ # Offense count: 3
33
+ # Configuration parameters: CountComments, CountAsOne, ExcludedMethods, IgnoredMethods.
34
+ Metrics/MethodLength:
35
+ Max: 50
36
+
37
+ # Offense count: 1
38
+ # Configuration parameters: CountComments, CountAsOne.
39
+ Metrics/ModuleLength:
40
+ Max: 300
41
+
42
+ # Offense count: 2
43
+ # Configuration parameters: IgnoredMethods.
44
+ Metrics/PerceivedComplexity:
45
+ Max: 13
46
+
47
+ # Offense count: 1
48
+ # Configuration parameters: EnforcedStyleForLeadingUnderscores.
49
+ # SupportedStylesForLeadingUnderscores: disallowed, required, optional
50
+ Naming/MemoizedInstanceVariableName:
51
+ Exclude:
52
+ - 'lib/buildkite_watcher.rb'
data/CHANGELOG.md ADDED
@@ -0,0 +1,5 @@
1
+ ## [Unreleased]
2
+
3
+ ## [0.1.0] - 2021-06-04
4
+
5
+ - Initial release
data/Gemfile ADDED
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ # Specify your gem's dependencies in buildkite_watcher.gemspec
6
+ gemspec
7
+
8
+ gem "rake", "~> 13.0"
9
+
10
+ gem "rspec", "~> 3.0"
11
+
12
+ gem "rubocop", "~> 1.7"
13
+ gem "rubocop-rake", "~> 0.5.1"
14
+ gem "rubocop-rspec", "~> 2.3.0"
15
+
16
+ gem "pry-byebug"
data/Gemfile.lock ADDED
@@ -0,0 +1,92 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ buildkite_watcher (0.1.0)
5
+ rest-client (~> 2.1.0)
6
+
7
+ GEM
8
+ remote: https://rubygems.org/
9
+ specs:
10
+ ast (2.4.2)
11
+ byebug (11.1.3)
12
+ coderay (1.1.3)
13
+ diff-lcs (1.4.4)
14
+ domain_name (0.5.20190701)
15
+ unf (>= 0.0.5, < 1.0.0)
16
+ http-accept (1.7.0)
17
+ http-cookie (1.0.3)
18
+ domain_name (~> 0.5)
19
+ method_source (1.0.0)
20
+ mime-types (3.3.1)
21
+ mime-types-data (~> 3.2015)
22
+ mime-types-data (3.2021.0225)
23
+ netrc (0.11.0)
24
+ parallel (1.20.1)
25
+ parser (3.0.1.1)
26
+ ast (~> 2.4.1)
27
+ pry (0.13.1)
28
+ coderay (~> 1.1)
29
+ method_source (~> 1.0)
30
+ pry-byebug (3.9.0)
31
+ byebug (~> 11.0)
32
+ pry (~> 0.13.0)
33
+ rainbow (3.0.0)
34
+ rake (13.0.3)
35
+ regexp_parser (2.1.1)
36
+ rest-client (2.1.0)
37
+ http-accept (>= 1.7.0, < 2.0)
38
+ http-cookie (>= 1.0.2, < 2.0)
39
+ mime-types (>= 1.16, < 4.0)
40
+ netrc (~> 0.8)
41
+ rexml (3.2.5)
42
+ rspec (3.10.0)
43
+ rspec-core (~> 3.10.0)
44
+ rspec-expectations (~> 3.10.0)
45
+ rspec-mocks (~> 3.10.0)
46
+ rspec-core (3.10.1)
47
+ rspec-support (~> 3.10.0)
48
+ rspec-expectations (3.10.1)
49
+ diff-lcs (>= 1.2.0, < 2.0)
50
+ rspec-support (~> 3.10.0)
51
+ rspec-mocks (3.10.2)
52
+ diff-lcs (>= 1.2.0, < 2.0)
53
+ rspec-support (~> 3.10.0)
54
+ rspec-support (3.10.2)
55
+ rubocop (1.16.0)
56
+ parallel (~> 1.10)
57
+ parser (>= 3.0.0.0)
58
+ rainbow (>= 2.2.2, < 4.0)
59
+ regexp_parser (>= 1.8, < 3.0)
60
+ rexml
61
+ rubocop-ast (>= 1.7.0, < 2.0)
62
+ ruby-progressbar (~> 1.7)
63
+ unicode-display_width (>= 1.4.0, < 3.0)
64
+ rubocop-ast (1.7.0)
65
+ parser (>= 3.0.1.1)
66
+ rubocop-rake (0.5.1)
67
+ rubocop
68
+ rubocop-rspec (2.3.0)
69
+ rubocop (~> 1.0)
70
+ rubocop-ast (>= 1.1.0)
71
+ ruby-progressbar (1.11.0)
72
+ unf (0.1.4)
73
+ unf_ext
74
+ unf_ext (0.0.7.7)
75
+ unicode-display_width (2.0.0)
76
+
77
+ PLATFORMS
78
+ x86_64-darwin-19
79
+ x86_64-darwin-20
80
+ x86_64-linux
81
+
82
+ DEPENDENCIES
83
+ buildkite_watcher!
84
+ pry-byebug
85
+ rake (~> 13.0)
86
+ rspec (~> 3.0)
87
+ rubocop (~> 1.7)
88
+ rubocop-rake (~> 0.5.1)
89
+ rubocop-rspec (~> 2.3.0)
90
+
91
+ BUNDLED WITH
92
+ 2.2.17
data/README.md ADDED
@@ -0,0 +1,25 @@
1
+ # Buildkite Watcher
2
+
3
+ Command line utility that continuously watches for the buildkite job running current git HEAD and notifies on build status changes.
4
+
5
+ ## Installation
6
+
7
+ Run this command:
8
+
9
+ $ gem install buildkite_watcher
10
+
11
+ ## Usage
12
+
13
+ From a directory in your project, run.
14
+
15
+ `$ bw `
16
+
17
+ ## Development
18
+
19
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
20
+
21
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
22
+
23
+ ## Contributing
24
+
25
+ Bug reports and pull requests are welcome on GitHub at https://github.com/nulogy/buildkite_watcher.
data/Rakefile ADDED
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rspec/core/rake_task"
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ require "rubocop/rake_task"
9
+
10
+ RuboCop::RakeTask.new
11
+
12
+ task default: %i[spec rubocop]
data/bin/console ADDED
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "buildkite_watcher"
6
+
7
+ # You can add fixtures and/or initialization code here to make experimenting
8
+ # with your gem easier. You can also use a different console, if you like.
9
+
10
+ # (If you use this, don't forget to add pry to your Gemfile!)
11
+ # require "pry"
12
+ # Pry.start
13
+
14
+ require "irb"
15
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,33 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative "lib/buildkite_watcher/version"
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "buildkite_watcher"
7
+ spec.version = BuildkiteWatcher::VERSION
8
+ spec.authors = ["Arturo Pie"]
9
+ spec.email = ["arturop@nulogy.com"]
10
+
11
+ spec.summary = "CLI utility that watches buildkite and notify on build status changes"
12
+ spec.description = <<~MSG
13
+ Command line utility that continuously watches for the buildkite job running current git HEAD and
14
+ notifies on build status changes.
15
+ MSG
16
+
17
+ spec.required_ruby_version = ">= 2.7", "< 3.1"
18
+
19
+ spec.metadata["source_code_uri"] = "https://github.com/nulogy/buildkite_watcher"
20
+ spec.metadata["changelog_uri"] = "https://github.com/nulogy/buildkite_watcher/blob/main/CHANGELOG.md"
21
+
22
+ # Specify which files should be added to the gem when it is released.
23
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
24
+ spec.files =
25
+ Dir.chdir(File.expand_path(__dir__)) do
26
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{\A(?:test|spec|features)/}) }
27
+ end
28
+ spec.bindir = "exe"
29
+ spec.executables = spec.files.grep(%r{\Aexe/}) { |f| File.basename(f) }
30
+ spec.require_paths = ["lib"]
31
+
32
+ spec.add_dependency "rest-client", "~> 2.1.0"
33
+ end
data/exe/bw ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ $LOAD_PATH.unshift("#{__dir__}/../lib")
5
+
6
+ require "buildkite_watcher"
7
+
8
+ BuildkiteWatcher.result_watch
@@ -0,0 +1,289 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "rainbow"
4
+ require "rest-client"
5
+ require "buildkite_watcher/version"
6
+
7
+ # Command line utility that continuously watches for the buildkite job running current git HEAD and
8
+ # notifies on build status changes.
9
+ module BuildkiteWatcher
10
+ class << self
11
+ GRAPHQL_QUERY = <<~GRAPHQL
12
+ query ($pipelineSlug: ID!, $commitHash: [String!], $branch: [String!]) {
13
+ pipeline(slug: $pipelineSlug) {
14
+ commit_hash_builds: builds(commit: $commitHash, state: [PASSED, RUNNING, FAILED, BLOCKED], first: 1) {
15
+ edges {
16
+ node {
17
+ commit
18
+ message
19
+ state
20
+ jobs(first: 1, step: { key: "aggregate_results" }) {
21
+ edges {
22
+ node {
23
+ ... on JobTypeCommand {
24
+ label
25
+ artifacts {
26
+ edges {
27
+ node {
28
+ downloadURL
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
34
+ }
35
+ }
36
+ }
37
+ }
38
+ }
39
+ branch_builds: builds(branch: $branch, state: [PASSED, RUNNING, FAILED, BLOCKED], first: 2) {
40
+ edges {
41
+ node {
42
+ commit
43
+ message
44
+ state
45
+ jobs(first: 1, step: { key: "aggregate_results" }) {
46
+ edges {
47
+ node {
48
+ ... on JobTypeCommand {
49
+ label
50
+ artifacts {
51
+ edges {
52
+ node {
53
+ downloadURL
54
+ }
55
+ }
56
+ }
57
+ }
58
+ }
59
+ }
60
+ }
61
+ }
62
+ }
63
+ }
64
+ }
65
+ }
66
+ GRAPHQL
67
+ BUILD_PASSED = "PASSED"
68
+ BUILD_BLOCKED = "BLOCKED"
69
+ BUILD_RUNNING = "RUNNING"
70
+ BUILD_FAILED = "FAILED"
71
+ BUILD_UNKNOWN_STATUS = "UNKNOWN"
72
+
73
+ def result_watch
74
+ Signal.trap("SIGINT") do
75
+ puts
76
+ puts Rainbow("Program interrupt received. Exiting.").red
77
+ exit 1
78
+ end
79
+
80
+ previous_result = BUILD_UNKNOWN_STATUS
81
+ loop do
82
+ system("clear")
83
+ new_result = result
84
+
85
+ maybe_notify(previous_result, new_result)
86
+ previous_result = new_result
87
+
88
+ sleep 30
89
+ end
90
+ end
91
+
92
+ # Scenarios:
93
+ # - current commit doesn't have a build, no prior failed build
94
+ # - current commit doesn't have a build, there is a prior failed build
95
+ # - current commit has a build, is running, no prior failed build
96
+ # - current commit has a build, is running, there is a prior failed build
97
+ # - current commit has a build, has passed
98
+ # - current commit has a build, has failed
99
+
100
+ def result
101
+ puts Rainbow("Branch: ").bright + Rainbow(branch_name)
102
+ puts Rainbow("HEAD ➜ ").bright + Rainbow(commit_hash)
103
+ puts
104
+
105
+ buildkite_query = {
106
+ query: GRAPHQL_QUERY,
107
+ variables: {
108
+ pipelineSlug: pipeline_slug,
109
+ commitHash: commit_hash,
110
+ branch: branch_name,
111
+ },
112
+ }
113
+
114
+ builds = fetch_build_data(buildkite_query)
115
+ commit_hash_builds = simplify_builds_response_data(builds.commit_hash_builds)
116
+ branch_builds = simplify_builds_response_data(builds.branch_builds)
117
+
118
+ if commit_hash_builds.any?
119
+ build = commit_hash_builds.first
120
+ print_state(build.state)
121
+ return build.state if build_passed?(build.state) || branch_builds.empty?
122
+
123
+ if build.state == BUILD_RUNNING && prior_build_failed?(branch_builds)
124
+ puts
125
+ puts Rainbow("Prior failure summary:").bright
126
+ print_failures(prior_failed_build(branch_builds))
127
+ elsif build.state == BUILD_FAILED
128
+ print_failures(build)
129
+ end
130
+ else
131
+ print_no_current_build
132
+
133
+ return build.state if branch_builds.empty?
134
+
135
+ puts
136
+ puts Rainbow("Prior finished build summary:").bright
137
+ puts
138
+
139
+ build = branch_builds.first
140
+ print_state(build.state)
141
+ return build.state if build_passed?(build.state)
142
+
143
+ if last_build_failed?(branch_builds)
144
+ puts
145
+ puts Rainbow("Failure summary:").bright
146
+
147
+ build = branch_builds.first
148
+ print_failures(build)
149
+ end
150
+ end
151
+ build.state
152
+ rescue StandardError => e
153
+ puts
154
+ puts Rainbow("ERROR: #{e.message}\n#{e.backtrace}").red
155
+ end
156
+
157
+ private
158
+
159
+ def maybe_notify(previous_result, new_result)
160
+ return if new_result == previous_result || previous_result == BUILD_UNKNOWN_STATUS
161
+
162
+ case new_result
163
+ when build_passed?(new_result)
164
+ system('osascript -e \'display notification "CI PASSED" with title "CI Result Watch" sound name "Glass"\'')
165
+ when BUILD_FAILED
166
+ system('osascript -e \'display notification "CI FAILED" with title "CI Result Watch" sound name "Basso"\'')
167
+ end
168
+ end
169
+
170
+ def build_passed?(state)
171
+ [BUILD_PASSED, BUILD_BLOCKED].include?(state)
172
+ end
173
+
174
+ def fetch_build_data(buildkite_query)
175
+ response =
176
+ JSON.parse(
177
+ RestClient.post(
178
+ "https://graphql.buildkite.com/v1",
179
+ buildkite_query.to_json,
180
+ { Authorization: "Bearer #{buildkite_token}", content_type: :json },
181
+ ),
182
+ object_class: OpenStruct,
183
+ )
184
+
185
+ response.data.pipeline
186
+ end
187
+
188
+ def simplify_builds_response_data(builds)
189
+ simplified_builds = builds.edges.map(&:node)
190
+ simplified_builds.map do |build|
191
+ OpenStruct.new(
192
+ commit: build.commit,
193
+ message: build.message,
194
+ state: build.state,
195
+ aggregate_results_job: simplify_jobs_response_data(build.jobs),
196
+ )
197
+ end
198
+ end
199
+
200
+ def simplify_jobs_response_data(jobs)
201
+ simplified_jobs = jobs.edges.map(&:node)
202
+ simplified_jobs.map do |job|
203
+ OpenStruct.new(label: job.label, artifacts: simplify_artifacts_response_data(job.artifacts))
204
+ end.first
205
+ end
206
+
207
+ def simplify_artifacts_response_data(artifacts)
208
+ artifacts.edges.map(&:node)
209
+ end
210
+
211
+ def print_state(state)
212
+ case state
213
+ when build_passed?(state)
214
+ puts Rainbow("CI Status: ").bright + Rainbow(state).green
215
+ when BUILD_RUNNING
216
+ puts Rainbow("CI Status: ").bright + Rainbow(state).yellow
217
+ when BUILD_FAILED
218
+ puts Rainbow("CI Status: ").bright + Rainbow(state).red
219
+ end
220
+ end
221
+
222
+ def print_no_current_build
223
+ no_builds_for_head_message =
224
+ "Your HEAD pointer is at commit #{commit_hash} but Buildkite has no finished builds for this commit."
225
+ puts Rainbow(no_builds_for_head_message).yellow
226
+ puts Rainbow("Push the current branch to trigger a build.").bright.yellow
227
+ end
228
+
229
+ def last_build_failed?(builds)
230
+ builds.first.state == BUILD_FAILED
231
+ end
232
+
233
+ def prior_build_failed?(builds)
234
+ builds[1].present? && builds[1].state == BUILD_FAILED
235
+ end
236
+
237
+ def prior_failed_build(builds)
238
+ builds[1]
239
+ end
240
+
241
+ def print_failures(build)
242
+ aggregate_result_job = build.aggregate_results_job
243
+
244
+ unless aggregate_result_job&.artifacts&.any?
245
+ puts
246
+ return(
247
+ puts Rainbow("Could not retrieve failures. Please check the Aggregate Results step of the CI pipeline.")
248
+ .yellow
249
+ )
250
+ end
251
+ failures_artifact = aggregate_result_job.artifacts.first
252
+ download_url = failures_artifact.downloadURL
253
+
254
+ failures = fetch_failures(download_url)
255
+
256
+ puts
257
+ puts Rainbow("#{failures.count} failures from these specs:").yellow
258
+ puts
259
+ failures.map(&:name).map { |name| /\[(\w+)\] (.*): .*/.match(name).captures }.group_by(&:first)
260
+ .each do |key, values|
261
+ puts key
262
+ values.map { |e| e[1] }.uniq.each do |failure_file|
263
+ failure_file
264
+ puts Rainbow(failure_file).red
265
+ end
266
+ end
267
+ end
268
+
269
+ def fetch_failures(download_url)
270
+ JSON.parse(RestClient.get(download_url), object_class: OpenStruct)
271
+ end
272
+
273
+ def pipeline_slug
274
+ ENV.fetch("PIPELINE_SLUG")
275
+ end
276
+
277
+ def branch_name
278
+ ENV.fetch("BRANCH_NAME", `git symbolic-ref --short HEAD`.strip)
279
+ end
280
+
281
+ def commit_hash
282
+ ENV.fetch("COMMIT_HASH", `git rev-parse HEAD`.strip)
283
+ end
284
+
285
+ def buildkite_token
286
+ @_buildkite_token ||= `cat ~/.buildkite_token`
287
+ end
288
+ end
289
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module BuildkiteWatcher
4
+ VERSION = "0.1.0"
5
+ end
metadata ADDED
@@ -0,0 +1,80 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: buildkite_watcher
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Arturo Pie
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2021-06-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: 2.1.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: 2.1.0
27
+ description: |
28
+ Command line utility that continuously watches for the buildkite job running current git HEAD and
29
+ notifies on build status changes.
30
+ email:
31
+ - arturop@nulogy.com
32
+ executables:
33
+ - bw
34
+ extensions: []
35
+ extra_rdoc_files: []
36
+ files:
37
+ - ".github/workflows/main.yml"
38
+ - ".gitignore"
39
+ - ".rspec"
40
+ - ".rubocop.yml"
41
+ - ".rubocop_todo.yml"
42
+ - CHANGELOG.md
43
+ - Gemfile
44
+ - Gemfile.lock
45
+ - README.md
46
+ - Rakefile
47
+ - bin/console
48
+ - bin/setup
49
+ - buildkite_watcher.gemspec
50
+ - exe/bw
51
+ - lib/buildkite_watcher.rb
52
+ - lib/buildkite_watcher/version.rb
53
+ homepage:
54
+ licenses: []
55
+ metadata:
56
+ source_code_uri: https://github.com/nulogy/buildkite_watcher
57
+ changelog_uri: https://github.com/nulogy/buildkite_watcher/blob/main/CHANGELOG.md
58
+ post_install_message:
59
+ rdoc_options: []
60
+ require_paths:
61
+ - lib
62
+ required_ruby_version: !ruby/object:Gem::Requirement
63
+ requirements:
64
+ - - ">="
65
+ - !ruby/object:Gem::Version
66
+ version: '2.7'
67
+ - - "<"
68
+ - !ruby/object:Gem::Version
69
+ version: '3.1'
70
+ required_rubygems_version: !ruby/object:Gem::Requirement
71
+ requirements:
72
+ - - ">="
73
+ - !ruby/object:Gem::Version
74
+ version: '0'
75
+ requirements: []
76
+ rubygems_version: 3.2.16
77
+ signing_key:
78
+ specification_version: 4
79
+ summary: CLI utility that watches buildkite and notify on build status changes
80
+ test_files: []