bard 0.47.0 → 0.48.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
2
  SHA256:
3
- metadata.gz: 30db9f340faac772ea3260d4684fbe069eff20c418f81940070d087c22537881
4
- data.tar.gz: 37a0849b559a8f53080fdff3dded230053d004440eb6b74276745b5578ddb3ba
3
+ metadata.gz: 7bb22c1837b63f605c0417e3ce283546623b2a8dfd1b8728f95bda0466f65fa0
4
+ data.tar.gz: fb674ce15fdf02f6113caa5d553bae0633b5b9873b7fb39a0378716b17a34bb5
5
5
  SHA512:
6
- metadata.gz: c6b419ea8c5cf37c5a51c3f89abec27c7505a9a973ce05bcffaddb2a5f43d4307d640a280b74b418e2cc9119b84669d9b1cf358b786006f82ad06e5f282a6136
7
- data.tar.gz: 483be73924429a4e788efcc833ccd9aba2229bb7be2cd9e46d9b5147be366dee6b6d137b7753fc8c6c90f25644596064a7fd6e8d6e94d37ecc1f11947ee9d6cd
6
+ metadata.gz: 877e9bf78d365846fb83dcd5d77b14a2b1bec637a29f95c55b4dd6c121cbb8bdb2e1656907afef3ef798599c8c03e4b68003092a9893c6cda9a0a24aa322734b
7
+ data.tar.gz: 97a5adca93a34605c47c61d18c9f283e058c9f3342f38df2b59f288d734d7b03e69909f64f1058f0034dea265facc05f21afcc6328e00acc2fde0e99095f24aa
data/.gitignore CHANGED
@@ -8,6 +8,7 @@ tmp
8
8
  .bundle
9
9
  .rvmrc
10
10
  .ruby-version
11
+ .byebug_history
11
12
  Gemfile.lock
12
13
  pkg/*
13
14
 
data/.rspec ADDED
@@ -0,0 +1,3 @@
1
+ --format documentation
2
+ --color
3
+ --require spec_helper
@@ -0,0 +1,191 @@
1
+ require "thor"
2
+ require "time"
3
+ require "json"
4
+ require "net/http"
5
+
6
+ class Bard::CLI < Thor
7
+ class CI
8
+ class GithubActions < Struct.new(:project_name, :branch, :sha)
9
+ def run
10
+ api = API.new(project_name)
11
+ last_time_elapsed = api.last_successful_run.time_elapsed
12
+ @run = api.create_run!(branch)
13
+
14
+ start_time = Time.new.to_i
15
+ while @run.building?
16
+ elapsed_time = Time.new.to_i - start_time
17
+ yield elapsed_time, last_time_elapsed
18
+ sleep(2)
19
+ @run = api.find_run(@run.id)
20
+ end
21
+
22
+ @run.success?
23
+ end
24
+
25
+ def exists?
26
+ true
27
+ end
28
+
29
+ def console
30
+ @run.console
31
+ end
32
+
33
+ def last_response
34
+ end
35
+
36
+ class API < Struct.new(:project_name)
37
+ def last_successful_run
38
+ successful_runs = client.get("runs", status: "success", per_page: 1)
39
+ json = successful_runs["workflow_runs"][0]
40
+ Run.new(self, json)
41
+ end
42
+
43
+ def find_run id
44
+ json = client.get("runs/#{id}")
45
+ Run.new(self, json)
46
+ end
47
+
48
+ def create_run! branch
49
+ start_time = Time.now
50
+ client.post("workflows/ci.yml/dispatches", ref: branch, inputs: { "git-ref": branch })
51
+ sha = `git rev-parse #{branch}`.chomp
52
+
53
+ loop do
54
+ runs = client.get("runs", head_sha: sha, created: ">#{start_time.iso8601}")
55
+ if json = runs["workflow_runs"].first
56
+ return Run.new(self, json)
57
+ end
58
+ sleep 1
59
+ end
60
+ end
61
+
62
+ def find_job_by_run_id run_id
63
+ jobs = client.get("runs/#{run_id}/jobs", filter: "latest", per_page: 1)
64
+ job_json = jobs["jobs"][0]
65
+ Job.new(self, job_json)
66
+ end
67
+
68
+ def download_logs_by_job_id job_id
69
+ client.get("jobs/#{job_id}/logs")
70
+ end
71
+
72
+ private
73
+
74
+ def client
75
+ @client ||= Client.new(project_name)
76
+ end
77
+ end
78
+
79
+ class Run < Struct.new(:api, :json)
80
+ def id
81
+ json["id"]
82
+ end
83
+
84
+ def time_elapsed
85
+ job.time_elapsed
86
+ end
87
+
88
+ def building?
89
+ %w[in_progress queued requested waiting pending]
90
+ .include?(json["status"])
91
+ end
92
+
93
+ def success?
94
+ json["status"] == "success"
95
+ end
96
+
97
+ def job
98
+ @job ||= api.find_job_by_run_id(id)
99
+ end
100
+
101
+ def console
102
+ job.logs
103
+ end
104
+
105
+ # OTHER STATUSES
106
+ # completed
107
+ # action_required
108
+ # cancelled
109
+ # failure
110
+ # neutral
111
+ # skipped
112
+ # stale
113
+ # timed_out
114
+ end
115
+
116
+ class Job < Struct.new(:api, :json)
117
+ def id
118
+ json["id"]
119
+ end
120
+
121
+ def time_elapsed
122
+ Time.parse(json["completed_at"]).to_i -
123
+ Time.parse(json["started_at"]).to_i
124
+ end
125
+
126
+ def logs
127
+ @logs ||= api.download_logs_by_job_id(id)
128
+ end
129
+ end
130
+
131
+ class Client < Struct.new(:project_name)
132
+ def get path, params={}
133
+ request(path) do |uri|
134
+ uri.query = URI.encode_www_form(params)
135
+ Net::HTTP::Get.new(uri)
136
+ end
137
+ end
138
+
139
+ def post path, params={}
140
+ request(path) do |uri|
141
+ Net::HTTP::Post.new(uri).tap do |r|
142
+ r.body = JSON.dump(params)
143
+ end
144
+ end
145
+ end
146
+
147
+ private
148
+
149
+ def github_apikey
150
+ @github_apikey ||= begin
151
+ raw = `git ls-remote -t git@github.com:botandrose/bard`
152
+ raw[/github-apikey\|(.+)$/, 1]
153
+ end
154
+ end
155
+
156
+ def request path, &block
157
+ uri = if path =~ /^http/
158
+ URI(path)
159
+ else
160
+ URI("https://api.github.com/repos/botandrose/#{project_name}/actions/#{path}")
161
+ end
162
+
163
+ response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: true) do |http|
164
+ request = block.call(uri)
165
+ request["Accept"] = "application/vnd.github+json"
166
+ request["Authorization"] = "Token #{github_apikey}"
167
+ request["X-GitHub-Api-Version"] = "2022-11-28"
168
+ http.request(request)
169
+ end
170
+
171
+ case response
172
+ when Net::HTTPRedirection then
173
+ url = response["Location"]
174
+ request(url) do |uri|
175
+ Net::HTTP::Get.new(uri)
176
+ end
177
+ when Net::HTTPSuccess then
178
+ if response["Content-Type"].to_s.include?("/json")
179
+ JSON.load(response.body)
180
+ else
181
+ response.body
182
+ end
183
+ else
184
+ raise response.inspect
185
+ end
186
+ end
187
+ end
188
+ end
189
+ end
190
+ end
191
+
@@ -0,0 +1,85 @@
1
+ require "json"
2
+
3
+ class Bard::CLI < Thor
4
+ class CI
5
+ class Jenkins < Struct.new(:project_name, :branch, :sha)
6
+ def run
7
+ last_time_elapsed = get_last_time_elapsed
8
+ start
9
+ sleep(2) until started?
10
+
11
+ start_time = Time.new.to_i
12
+ while building?
13
+ elapsed_time = Time.new.to_i - start_time
14
+ yield elapsed_time, last_time_elapsed
15
+ sleep(2)
16
+ end
17
+
18
+ success?
19
+ end
20
+
21
+ def exists?
22
+ `curl -s -I #{ci_host}/` =~ /\b200 OK\b/
23
+ end
24
+
25
+ def console
26
+ raw = `curl -s #{ci_host}/lastBuild/console`
27
+ raw[%r{<pre.*?>(.+)</pre>}m, 1]
28
+ end
29
+
30
+ attr_accessor :last_response
31
+
32
+ private
33
+
34
+ def get_last_time_elapsed
35
+ response = `curl -s #{ci_host}/lastStableBuild/api/xml`
36
+ response.match(/<duration>(\d+)<\/duration>/)
37
+ $1 ? $1.to_i / 1000 : nil
38
+ end
39
+
40
+ def auth
41
+ "botandrose:11cc2ba6ef2e43fbfbedc1f466724f6290"
42
+ end
43
+
44
+ def ci_host
45
+ "http://#{auth}@ci.botandrose.com/job/#{project_name}"
46
+ end
47
+
48
+ def start
49
+ command = "curl -s -I -X POST -L '#{ci_host}/buildWithParameters?GIT_REF=#{sha}'"
50
+ output = `#{command}`
51
+ @queueId = output[%r{Location: .+/queue/item/(\d+)/}, 1].to_i
52
+ end
53
+
54
+ def started?
55
+ command = "curl -s -g '#{ci_host}/api/json?depth=1&tree=builds[queueId,number]'"
56
+ output = `#{command}`
57
+ JSON.parse(output)["builds"][0]["queueId"] == @queueId
58
+ end
59
+
60
+ def job_id
61
+ @job_id ||= begin
62
+ output = `curl -s -g '#{ci_host}/api/json?depth=1&tree=builds[queueId,number]'`
63
+ output[/"number":(\d+),"queueId":#{@queueId}\b/, 1].to_i
64
+ end
65
+ end
66
+
67
+ def building?
68
+ self.last_response = `curl -s #{ci_host}/#{job_id}/api/json?tree=building,result`
69
+ if last_response.blank?
70
+ sleep(2) # retry
71
+ self.last_response = `curl -s #{ci_host}/#{job_id}/api/json?tree=building,result`
72
+ if last_response.blank?
73
+ raise "Blank response from CI twice in a row. Aborting!"
74
+ end
75
+ end
76
+ last_response.include? '"building":true'
77
+ end
78
+
79
+ def success?
80
+ last_response.include? '"result":"SUCCESS"'
81
+ end
82
+ end
83
+ end
84
+ end
85
+
@@ -0,0 +1,49 @@
1
+ require "open3"
2
+
3
+ class Bard::CLI < Thor
4
+ class CI
5
+ class Local < Struct.new(:project_name, :branch, :sha)
6
+ def run
7
+ start
8
+
9
+ start_time = Time.new.to_i
10
+ while building?
11
+ elapsed_time = Time.new.to_i - start_time
12
+ yield elapsed_time, nil
13
+ sleep(2)
14
+ end
15
+
16
+ @stdin.close
17
+ @console = @stdout_and_stderr.read
18
+ @stdout_and_stderr.close
19
+
20
+ success?
21
+ end
22
+
23
+ def exists?
24
+ true
25
+ end
26
+
27
+ def console
28
+ @console
29
+ end
30
+
31
+ attr_accessor :last_response
32
+
33
+ private
34
+
35
+ def start
36
+ @stdin, @stdout_and_stderr, @wait_thread = Open3.popen2e("bin/rake ci")
37
+ end
38
+
39
+ def building?
40
+ ![nil, false].include?(@wait_thread.status)
41
+ end
42
+
43
+ def success?
44
+ @wait_thread.value.success?
45
+ end
46
+ end
47
+ end
48
+ end
49
+
data/lib/bard/ci.rb CHANGED
@@ -1,146 +1,49 @@
1
- require "json"
2
1
  require "forwardable"
3
- require "open3"
4
2
 
5
3
  class Bard::CLI < Thor
6
4
  class CI
7
- def initialize project_name, sha, local: false
5
+ def initialize project_name, branch, local: false
8
6
  @project_name = project_name
9
- @sha = sha
7
+ @branch = branch
10
8
  @local = !!local
11
- @runner = @local ? Local.new(project_name, sha) : Remote.new(project_name, sha)
12
9
  end
13
10
 
14
- attr_reader :project_name, :sha, :runner
11
+ attr_reader :project_name, :branch, :runner
15
12
 
16
- def local?
17
- @local
13
+ def sha
14
+ @sha ||= `git rev-parse #{branch}`.chomp
18
15
  end
19
16
 
20
- extend Forwardable
17
+ def runner
18
+ @runner ||= choose_runner_class.new(project_name, branch, sha)
19
+ end
21
20
 
21
+ extend Forwardable
22
22
  delegate [:run, :exists?, :console, :last_response] => :runner
23
23
 
24
- class Remote < Struct.new(:project_name, :sha)
25
- def run
26
- last_time_elapsed = get_last_time_elapsed
27
- start
28
- sleep(2) until started?
29
-
30
- start_time = Time.new.to_i
31
- while building?
32
- elapsed_time = Time.new.to_i - start_time
33
- yield elapsed_time, last_time_elapsed
34
- sleep(2)
35
- end
36
-
37
- success?
38
- end
39
-
40
- def exists?
41
- `curl -s -I #{ci_host}/` =~ /\b200 OK\b/
42
- end
43
-
44
- def console
45
- raw = `curl -s #{ci_host}/lastBuild/console`
46
- raw[%r{<pre.*?>(.+)</pre>}m, 1]
47
- end
48
-
49
- attr_accessor :last_response
50
-
51
- private
52
-
53
- def get_last_time_elapsed
54
- response = `curl -s #{ci_host}/lastStableBuild/api/xml`
55
- response.match(/<duration>(\d+)<\/duration>/)
56
- $1 ? $1.to_i / 1000 : nil
57
- end
58
-
59
- def auth
60
- "botandrose:11cc2ba6ef2e43fbfbedc1f466724f6290"
61
- end
62
-
63
- def ci_host
64
- "http://#{auth}@ci.botandrose.com/job/#{project_name}"
65
- end
66
-
67
- def start
68
- command = "curl -s -I -X POST -L '#{ci_host}/buildWithParameters?GIT_REF=#{sha}'"
69
- output = `#{command}`
70
- @queueId = output[%r{Location: .+/queue/item/(\d+)/}, 1].to_i
71
- end
72
-
73
- def started?
74
- command = "curl -s -g '#{ci_host}/api/json?depth=1&tree=builds[queueId,number]'"
75
- output = `#{command}`
76
- JSON.parse(output)["builds"][0]["queueId"] == @queueId
77
- end
78
-
79
- def job_id
80
- @job_id ||= begin
81
- output = `curl -s -g '#{ci_host}/api/json?depth=1&tree=builds[queueId,number]'`
82
- output[/"number":(\d+),"queueId":#{@queueId}\b/, 1].to_i
83
- end
84
- end
85
-
86
- def building?
87
- self.last_response = `curl -s #{ci_host}/#{job_id}/api/json?tree=building,result`
88
- if last_response.blank?
89
- sleep(2) # retry
90
- self.last_response = `curl -s #{ci_host}/#{job_id}/api/json?tree=building,result`
91
- if last_response.blank?
92
- raise "Blank response from CI twice in a row. Aborting!"
93
- end
24
+ private
25
+
26
+ def choose_runner_class
27
+ if local?
28
+ require_relative "./ci/local"
29
+ Local
30
+ else
31
+ if github_actions?
32
+ require_relative "./ci/github_actions"
33
+ GithubActions
34
+ else
35
+ require_relative "./ci/jenkins"
36
+ Jenkins
94
37
  end
95
- last_response.include? '"building":true'
96
- end
97
-
98
- def success?
99
- last_response.include? '"result":"SUCCESS"'
100
38
  end
101
39
  end
102
40
 
103
- class Local < Struct.new(:project_name, :sha)
104
- def run
105
- start
106
-
107
- start_time = Time.new.to_i
108
- while building?
109
- elapsed_time = Time.new.to_i - start_time
110
- yield elapsed_time, nil
111
- sleep(2)
112
- end
113
-
114
- @stdin.close
115
- @console = @stdout_and_stderr.read
116
- @stdout_and_stderr.close
117
-
118
- success?
119
- end
120
-
121
- def exists?
122
- true
123
- end
124
-
125
- def console
126
- @console
127
- end
128
-
129
- attr_accessor :last_response
130
-
131
- private
132
-
133
- def start
134
- @stdin, @stdout_and_stderr, @wait_thread = Open3.popen2e("bin/rake ci")
135
- end
136
-
137
- def building?
138
- ![nil, false].include?(@wait_thread.status)
139
- end
41
+ def local?
42
+ @local
43
+ end
140
44
 
141
- def success?
142
- @wait_thread.value.success?
143
- end
45
+ def github_actions?
46
+ File.exist?(".github/workflows/ci.yml")
144
47
  end
145
48
  end
146
49
  end
data/lib/bard/version.rb CHANGED
@@ -1,4 +1,4 @@
1
1
  module Bard
2
- VERSION = "0.47.0"
2
+ VERSION = "0.48.0"
3
3
  end
4
4
 
data/lib/bard.rb CHANGED
@@ -87,7 +87,7 @@ class Bard::CLI < Thor
87
87
  method_options %w[verbose -v] => :boolean, %w[local-ci -l] => :boolean
88
88
  desc "ci [BRANCH=HEAD]", "runs ci against BRANCH"
89
89
  def ci branch=Git.current_branch
90
- ci = CI.new(project_name, `git rev-parse #{branch}`.chomp, local: options["local-ci"])
90
+ ci = CI.new(project_name, branch, local: options["local-ci"])
91
91
  if ci.exists?
92
92
  puts "Continuous integration: starting build on #{branch}..."
93
93
 
@@ -0,0 +1,34 @@
1
+ require "bard/ci/github_actions"
2
+
3
+ describe Bard::CLI::CI::GithubActions do
4
+ subject { described_class.new("metrc", "master", "0966308e204b256fdcc11457eb53306d84884c60") }
5
+
6
+ xit "works" do
7
+ subject.run
8
+ end
9
+ end
10
+
11
+ describe Bard::CLI::CI::GithubActions::API do
12
+ subject { described_class.new("metrc") }
13
+
14
+ describe "#last_successful_run" do
15
+ xit "has #time_elapsed" do
16
+ subject.last_successful_run.time_elapsed
17
+ end
18
+
19
+ xit "has #console" do
20
+ subject.last_successful_run.console
21
+ end
22
+ end
23
+
24
+ describe "#create_run!" do
25
+ xit "returns a run" do
26
+ subject.create_run! "master"
27
+ end
28
+ end
29
+ end
30
+
31
+ describe Bard::CLI::CI::GithubActions::Client do
32
+ subject { described_class.new("metrc") }
33
+ end
34
+
data/spec/spec_helper.rb CHANGED
@@ -1,10 +1,8 @@
1
- $LOAD_PATH.unshift(File.dirname(__FILE__))
2
- $LOAD_PATH.unshift(File.join(File.dirname(__FILE__), '..', 'lib'))
3
- require 'rubygems'
4
- require 'bard'
5
- require 'spec'
6
- require 'spec/autorun'
1
+ $LOAD_PATH.unshift File.expand_path('../../lib', __FILE__)
2
+ require "byebug"
7
3
 
8
- Spec::Runner.configure do |config|
9
-
4
+ RSpec.configure do |config|
5
+ config.filter_run focus: true
6
+ config.run_all_when_everything_filtered = true
10
7
  end
8
+
@@ -0,0 +1 @@
1
+ {"id":11609506957,"run_id":4276761325,"workflow_name":"ci","head_branch":"master","run_url":"https://api.github.com/repos/botandrose/metrc/actions/runs/4276761325","run_attempt":1,"node_id":"CR_kwDOJCdDdM8AAAACs_sEjQ","head_sha":"0966308e204b256fdcc11457eb53306d84884c60","url":"https://api.github.com/repos/botandrose/metrc/actions/jobs/11609506957","html_url":"https://github.com/botandrose/metrc/actions/runs/4276761325/jobs/7445090560","status":"completed","conclusion":"success","created_at":"2023-02-26T20:18:24Z","started_at":"2023-02-26T20:18:30Z","completed_at":"2023-02-26T20:21:59Z","name":"test","steps":[{"name":"Set up job","status":"completed","conclusion":"success","number":1,"started_at":"2023-02-26T14:18:30.000-06:00","completed_at":"2023-02-26T14:18:31.000-06:00"},{"name":"Set up MySQL","status":"completed","conclusion":"success","number":2,"started_at":"2023-02-26T14:18:31.000-06:00","completed_at":"2023-02-26T14:18:33.000-06:00"},{"name":"Checkout code","status":"completed","conclusion":"success","number":3,"started_at":"2023-02-26T14:18:33.000-06:00","completed_at":"2023-02-26T14:18:34.000-06:00"},{"name":"Install Ruby and gems","status":"completed","conclusion":"success","number":4,"started_at":"2023-02-26T14:18:34.000-06:00","completed_at":"2023-02-26T14:18:42.000-06:00"},{"name":"Dependencies","status":"completed","conclusion":"success","number":5,"started_at":"2023-02-26T14:18:43.000-06:00","completed_at":"2023-02-26T14:18:54.000-06:00"},{"name":"Setup","status":"completed","conclusion":"success","number":6,"started_at":"2023-02-26T14:18:54.000-06:00","completed_at":"2023-02-26T14:19:06.000-06:00"},{"name":"Run tests","status":"completed","conclusion":"success","number":7,"started_at":"2023-02-26T14:19:06.000-06:00","completed_at":"2023-02-26T14:21:58.000-06:00"},{"name":"Post Checkout code","status":"completed","conclusion":"success","number":14,"started_at":"2023-02-26T14:21:58.000-06:00","completed_at":"2023-02-26T14:21:58.000-06:00"},{"name":"Complete job","status":"completed","conclusion":"success","number":15,"started_at":"2023-02-26T14:21:58.000-06:00","completed_at":"2023-02-26T14:21:58.000-06:00"}],"check_run_url":"https://api.github.com/repos/botandrose/metrc/check-runs/11609506957","labels":["ubuntu-20.04"],"runner_id":2,"runner_name":"GitHub Actions 2","runner_group_id":2,"runner_group_name":"GitHub Actions"}
@@ -0,0 +1,225 @@
1
+ {
2
+ "total_count" : 1,
3
+ "workflow_runs" : [
4
+ {
5
+ "actor" : {
6
+ "avatar_url" : "https://avatars.githubusercontent.com/u/123604709?v=4",
7
+ "events_url" : "https://api.github.com/users/botandrose-machine/events{/privacy}",
8
+ "followers_url" : "https://api.github.com/users/botandrose-machine/followers",
9
+ "following_url" : "https://api.github.com/users/botandrose-machine/following{/other_user}",
10
+ "gists_url" : "https://api.github.com/users/botandrose-machine/gists{/gist_id}",
11
+ "gravatar_id" : "",
12
+ "html_url" : "https://github.com/botandrose-machine",
13
+ "id" : 123604709,
14
+ "login" : "botandrose-machine",
15
+ "node_id" : "U_kgDOB14O5Q",
16
+ "organizations_url" : "https://api.github.com/users/botandrose-machine/orgs",
17
+ "received_events_url" : "https://api.github.com/users/botandrose-machine/received_events",
18
+ "repos_url" : "https://api.github.com/users/botandrose-machine/repos",
19
+ "site_admin" : false,
20
+ "starred_url" : "https://api.github.com/users/botandrose-machine/starred{/owner}{/repo}",
21
+ "subscriptions_url" : "https://api.github.com/users/botandrose-machine/subscriptions",
22
+ "type" : "User",
23
+ "url" : "https://api.github.com/users/botandrose-machine"
24
+ },
25
+ "artifacts_url" : "https://api.github.com/repos/botandrose/metrc/actions/runs/4276716879/artifacts",
26
+ "cancel_url" : "https://api.github.com/repos/botandrose/metrc/actions/runs/4276716879/cancel",
27
+ "check_suite_id" : 11212996078,
28
+ "check_suite_node_id" : "CS_kwDOJCdDdM8AAAACnFi97g",
29
+ "check_suite_url" : "https://api.github.com/repos/botandrose/metrc/check-suites/11212996078",
30
+ "conclusion" : null,
31
+ "created_at" : "2023-02-26T20:07:23Z",
32
+ "display_title" : "ci",
33
+ "event" : "workflow_dispatch",
34
+ "head_branch" : "master",
35
+ "head_commit" : {
36
+ "author" : {
37
+ "email" : "micah@botandrose.com",
38
+ "name" : "Micah Geisel"
39
+ },
40
+ "committer" : {
41
+ "email" : "micah@botandrose.com",
42
+ "name" : "Micah Geisel"
43
+ },
44
+ "id" : "0966308e204b256fdcc11457eb53306d84884c60",
45
+ "message" : "rename action.",
46
+ "timestamp" : "2023-02-25T21:48:15Z",
47
+ "tree_id" : "1bc3e4e847c2e582821b10ad705a6d2595efc5db"
48
+ },
49
+ "head_repository" : {
50
+ "archive_url" : "https://api.github.com/repos/botandrose/metrc/{archive_format}{/ref}",
51
+ "assignees_url" : "https://api.github.com/repos/botandrose/metrc/assignees{/user}",
52
+ "blobs_url" : "https://api.github.com/repos/botandrose/metrc/git/blobs{/sha}",
53
+ "branches_url" : "https://api.github.com/repos/botandrose/metrc/branches{/branch}",
54
+ "collaborators_url" : "https://api.github.com/repos/botandrose/metrc/collaborators{/collaborator}",
55
+ "comments_url" : "https://api.github.com/repos/botandrose/metrc/comments{/number}",
56
+ "commits_url" : "https://api.github.com/repos/botandrose/metrc/commits{/sha}",
57
+ "compare_url" : "https://api.github.com/repos/botandrose/metrc/compare/{base}...{head}",
58
+ "contents_url" : "https://api.github.com/repos/botandrose/metrc/contents/{+path}",
59
+ "contributors_url" : "https://api.github.com/repos/botandrose/metrc/contributors",
60
+ "deployments_url" : "https://api.github.com/repos/botandrose/metrc/deployments",
61
+ "description" : null,
62
+ "downloads_url" : "https://api.github.com/repos/botandrose/metrc/downloads",
63
+ "events_url" : "https://api.github.com/repos/botandrose/metrc/events",
64
+ "fork" : false,
65
+ "forks_url" : "https://api.github.com/repos/botandrose/metrc/forks",
66
+ "full_name" : "botandrose/metrc",
67
+ "git_commits_url" : "https://api.github.com/repos/botandrose/metrc/git/commits{/sha}",
68
+ "git_refs_url" : "https://api.github.com/repos/botandrose/metrc/git/refs{/sha}",
69
+ "git_tags_url" : "https://api.github.com/repos/botandrose/metrc/git/tags{/sha}",
70
+ "hooks_url" : "https://api.github.com/repos/botandrose/metrc/hooks",
71
+ "html_url" : "https://github.com/botandrose/metrc",
72
+ "id" : 606552948,
73
+ "issue_comment_url" : "https://api.github.com/repos/botandrose/metrc/issues/comments{/number}",
74
+ "issue_events_url" : "https://api.github.com/repos/botandrose/metrc/issues/events{/number}",
75
+ "issues_url" : "https://api.github.com/repos/botandrose/metrc/issues{/number}",
76
+ "keys_url" : "https://api.github.com/repos/botandrose/metrc/keys{/key_id}",
77
+ "labels_url" : "https://api.github.com/repos/botandrose/metrc/labels{/name}",
78
+ "languages_url" : "https://api.github.com/repos/botandrose/metrc/languages",
79
+ "merges_url" : "https://api.github.com/repos/botandrose/metrc/merges",
80
+ "milestones_url" : "https://api.github.com/repos/botandrose/metrc/milestones{/number}",
81
+ "name" : "metrc",
82
+ "node_id" : "R_kgDOJCdDdA",
83
+ "notifications_url" : "https://api.github.com/repos/botandrose/metrc/notifications{?since,all,participating}",
84
+ "owner" : {
85
+ "avatar_url" : "https://avatars.githubusercontent.com/u/17391?v=4",
86
+ "events_url" : "https://api.github.com/users/botandrose/events{/privacy}",
87
+ "followers_url" : "https://api.github.com/users/botandrose/followers",
88
+ "following_url" : "https://api.github.com/users/botandrose/following{/other_user}",
89
+ "gists_url" : "https://api.github.com/users/botandrose/gists{/gist_id}",
90
+ "gravatar_id" : "",
91
+ "html_url" : "https://github.com/botandrose",
92
+ "id" : 17391,
93
+ "login" : "botandrose",
94
+ "node_id" : "MDQ6VXNlcjE3Mzkx",
95
+ "organizations_url" : "https://api.github.com/users/botandrose/orgs",
96
+ "received_events_url" : "https://api.github.com/users/botandrose/received_events",
97
+ "repos_url" : "https://api.github.com/users/botandrose/repos",
98
+ "site_admin" : false,
99
+ "starred_url" : "https://api.github.com/users/botandrose/starred{/owner}{/repo}",
100
+ "subscriptions_url" : "https://api.github.com/users/botandrose/subscriptions",
101
+ "type" : "User",
102
+ "url" : "https://api.github.com/users/botandrose"
103
+ },
104
+ "private" : true,
105
+ "pulls_url" : "https://api.github.com/repos/botandrose/metrc/pulls{/number}",
106
+ "releases_url" : "https://api.github.com/repos/botandrose/metrc/releases{/id}",
107
+ "stargazers_url" : "https://api.github.com/repos/botandrose/metrc/stargazers",
108
+ "statuses_url" : "https://api.github.com/repos/botandrose/metrc/statuses/{sha}",
109
+ "subscribers_url" : "https://api.github.com/repos/botandrose/metrc/subscribers",
110
+ "subscription_url" : "https://api.github.com/repos/botandrose/metrc/subscription",
111
+ "tags_url" : "https://api.github.com/repos/botandrose/metrc/tags",
112
+ "teams_url" : "https://api.github.com/repos/botandrose/metrc/teams",
113
+ "trees_url" : "https://api.github.com/repos/botandrose/metrc/git/trees{/sha}",
114
+ "url" : "https://api.github.com/repos/botandrose/metrc"
115
+ },
116
+ "head_sha" : "0966308e204b256fdcc11457eb53306d84884c60",
117
+ "html_url" : "https://github.com/botandrose/metrc/actions/runs/4276716879",
118
+ "id" : 4276716879,
119
+ "jobs_url" : "https://api.github.com/repos/botandrose/metrc/actions/runs/4276716879/jobs",
120
+ "logs_url" : "https://api.github.com/repos/botandrose/metrc/actions/runs/4276716879/logs",
121
+ "name" : "ci",
122
+ "node_id" : "WFR_kwLOJCdDdM7-6YVP",
123
+ "path" : ".github/workflows/ci.yml",
124
+ "previous_attempt_url" : null,
125
+ "pull_requests" : [],
126
+ "referenced_workflows" : [],
127
+ "repository" : {
128
+ "archive_url" : "https://api.github.com/repos/botandrose/metrc/{archive_format}{/ref}",
129
+ "assignees_url" : "https://api.github.com/repos/botandrose/metrc/assignees{/user}",
130
+ "blobs_url" : "https://api.github.com/repos/botandrose/metrc/git/blobs{/sha}",
131
+ "branches_url" : "https://api.github.com/repos/botandrose/metrc/branches{/branch}",
132
+ "collaborators_url" : "https://api.github.com/repos/botandrose/metrc/collaborators{/collaborator}",
133
+ "comments_url" : "https://api.github.com/repos/botandrose/metrc/comments{/number}",
134
+ "commits_url" : "https://api.github.com/repos/botandrose/metrc/commits{/sha}",
135
+ "compare_url" : "https://api.github.com/repos/botandrose/metrc/compare/{base}...{head}",
136
+ "contents_url" : "https://api.github.com/repos/botandrose/metrc/contents/{+path}",
137
+ "contributors_url" : "https://api.github.com/repos/botandrose/metrc/contributors",
138
+ "deployments_url" : "https://api.github.com/repos/botandrose/metrc/deployments",
139
+ "description" : null,
140
+ "downloads_url" : "https://api.github.com/repos/botandrose/metrc/downloads",
141
+ "events_url" : "https://api.github.com/repos/botandrose/metrc/events",
142
+ "fork" : false,
143
+ "forks_url" : "https://api.github.com/repos/botandrose/metrc/forks",
144
+ "full_name" : "botandrose/metrc",
145
+ "git_commits_url" : "https://api.github.com/repos/botandrose/metrc/git/commits{/sha}",
146
+ "git_refs_url" : "https://api.github.com/repos/botandrose/metrc/git/refs{/sha}",
147
+ "git_tags_url" : "https://api.github.com/repos/botandrose/metrc/git/tags{/sha}",
148
+ "hooks_url" : "https://api.github.com/repos/botandrose/metrc/hooks",
149
+ "html_url" : "https://github.com/botandrose/metrc",
150
+ "id" : 606552948,
151
+ "issue_comment_url" : "https://api.github.com/repos/botandrose/metrc/issues/comments{/number}",
152
+ "issue_events_url" : "https://api.github.com/repos/botandrose/metrc/issues/events{/number}",
153
+ "issues_url" : "https://api.github.com/repos/botandrose/metrc/issues{/number}",
154
+ "keys_url" : "https://api.github.com/repos/botandrose/metrc/keys{/key_id}",
155
+ "labels_url" : "https://api.github.com/repos/botandrose/metrc/labels{/name}",
156
+ "languages_url" : "https://api.github.com/repos/botandrose/metrc/languages",
157
+ "merges_url" : "https://api.github.com/repos/botandrose/metrc/merges",
158
+ "milestones_url" : "https://api.github.com/repos/botandrose/metrc/milestones{/number}",
159
+ "name" : "metrc",
160
+ "node_id" : "R_kgDOJCdDdA",
161
+ "notifications_url" : "https://api.github.com/repos/botandrose/metrc/notifications{?since,all,participating}",
162
+ "owner" : {
163
+ "avatar_url" : "https://avatars.githubusercontent.com/u/17391?v=4",
164
+ "events_url" : "https://api.github.com/users/botandrose/events{/privacy}",
165
+ "followers_url" : "https://api.github.com/users/botandrose/followers",
166
+ "following_url" : "https://api.github.com/users/botandrose/following{/other_user}",
167
+ "gists_url" : "https://api.github.com/users/botandrose/gists{/gist_id}",
168
+ "gravatar_id" : "",
169
+ "html_url" : "https://github.com/botandrose",
170
+ "id" : 17391,
171
+ "login" : "botandrose",
172
+ "node_id" : "MDQ6VXNlcjE3Mzkx",
173
+ "organizations_url" : "https://api.github.com/users/botandrose/orgs",
174
+ "received_events_url" : "https://api.github.com/users/botandrose/received_events",
175
+ "repos_url" : "https://api.github.com/users/botandrose/repos",
176
+ "site_admin" : false,
177
+ "starred_url" : "https://api.github.com/users/botandrose/starred{/owner}{/repo}",
178
+ "subscriptions_url" : "https://api.github.com/users/botandrose/subscriptions",
179
+ "type" : "User",
180
+ "url" : "https://api.github.com/users/botandrose"
181
+ },
182
+ "private" : true,
183
+ "pulls_url" : "https://api.github.com/repos/botandrose/metrc/pulls{/number}",
184
+ "releases_url" : "https://api.github.com/repos/botandrose/metrc/releases{/id}",
185
+ "stargazers_url" : "https://api.github.com/repos/botandrose/metrc/stargazers",
186
+ "statuses_url" : "https://api.github.com/repos/botandrose/metrc/statuses/{sha}",
187
+ "subscribers_url" : "https://api.github.com/repos/botandrose/metrc/subscribers",
188
+ "subscription_url" : "https://api.github.com/repos/botandrose/metrc/subscription",
189
+ "tags_url" : "https://api.github.com/repos/botandrose/metrc/tags",
190
+ "teams_url" : "https://api.github.com/repos/botandrose/metrc/teams",
191
+ "trees_url" : "https://api.github.com/repos/botandrose/metrc/git/trees{/sha}",
192
+ "url" : "https://api.github.com/repos/botandrose/metrc"
193
+ },
194
+ "rerun_url" : "https://api.github.com/repos/botandrose/metrc/actions/runs/4276716879/rerun",
195
+ "run_attempt" : 1,
196
+ "run_number" : 11,
197
+ "run_started_at" : "2023-02-26T20:07:23Z",
198
+ "status" : "in_progress",
199
+ "triggering_actor" : {
200
+ "avatar_url" : "https://avatars.githubusercontent.com/u/123604709?v=4",
201
+ "events_url" : "https://api.github.com/users/botandrose-machine/events{/privacy}",
202
+ "followers_url" : "https://api.github.com/users/botandrose-machine/followers",
203
+ "following_url" : "https://api.github.com/users/botandrose-machine/following{/other_user}",
204
+ "gists_url" : "https://api.github.com/users/botandrose-machine/gists{/gist_id}",
205
+ "gravatar_id" : "",
206
+ "html_url" : "https://github.com/botandrose-machine",
207
+ "id" : 123604709,
208
+ "login" : "botandrose-machine",
209
+ "node_id" : "U_kgDOB14O5Q",
210
+ "organizations_url" : "https://api.github.com/users/botandrose-machine/orgs",
211
+ "received_events_url" : "https://api.github.com/users/botandrose-machine/received_events",
212
+ "repos_url" : "https://api.github.com/users/botandrose-machine/repos",
213
+ "site_admin" : false,
214
+ "starred_url" : "https://api.github.com/users/botandrose-machine/starred{/owner}{/repo}",
215
+ "subscriptions_url" : "https://api.github.com/users/botandrose-machine/subscriptions",
216
+ "type" : "User",
217
+ "url" : "https://api.github.com/users/botandrose-machine"
218
+ },
219
+ "updated_at" : "2023-02-26T20:07:31Z",
220
+ "url" : "https://api.github.com/repos/botandrose/metrc/actions/runs/4276716879",
221
+ "workflow_id" : 49490118,
222
+ "workflow_url" : "https://api.github.com/repos/botandrose/metrc/actions/workflows/49490118"
223
+ }
224
+ ]
225
+ }
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: bard
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.47.0
4
+ version: 0.48.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Micah Geisel
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2022-12-06 00:00:00.000000000 Z
11
+ date: 2023-02-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: thor
@@ -118,6 +118,7 @@ extra_rdoc_files: []
118
118
  files:
119
119
  - ".gitignore"
120
120
  - ".gitmodules"
121
+ - ".rspec"
121
122
  - Gemfile
122
123
  - LICENSE
123
124
  - README.rdoc
@@ -147,12 +148,18 @@ files:
147
148
  - lib/bard.rb
148
149
  - lib/bard/base.rb
149
150
  - lib/bard/ci.rb
151
+ - lib/bard/ci/github_actions.rb
152
+ - lib/bard/ci/jenkins.rb
153
+ - lib/bard/ci/local.rb
150
154
  - lib/bard/config.rb
151
155
  - lib/bard/data.rb
152
156
  - lib/bard/git.rb
153
157
  - lib/bard/version.rb
158
+ - spec/bard/ci/github_actions_spec.rb
154
159
  - spec/bard_spec.rb
155
160
  - spec/spec_helper.rb
161
+ - spec/support/fixtures/job.json
162
+ - spec/support/fixtures/response_in_progress.json
156
163
  homepage: http://github.com/botandrose/bard
157
164
  licenses:
158
165
  - MIT
@@ -189,5 +196,8 @@ test_files:
189
196
  - features/support/env.rb
190
197
  - features/support/grit_ext.rb
191
198
  - features/support/io.rb
199
+ - spec/bard/ci/github_actions_spec.rb
192
200
  - spec/bard_spec.rb
193
201
  - spec/spec_helper.rb
202
+ - spec/support/fixtures/job.json
203
+ - spec/support/fixtures/response_in_progress.json