circle-cli 0.1.1 → 0.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 2c7b71e8a9731de1a586b5547cf637195ff8053c
4
- data.tar.gz: eab8f75eaa33e854fd61523348626a095b54c60b
3
+ metadata.gz: 6a8e9e402d8f93f06dc69380fbc21bcd66f46e7d
4
+ data.tar.gz: e9bab525b120127053b0c89a10799b79b96466bd
5
5
  SHA512:
6
- metadata.gz: 18aab504787d372931578fa9664cdcd73ee61b67755b50cd3402edc577d19b4b27341c19d6366233efe19b3bbec72c5a083cb3a00a05e46beaf16c5aef8eee4d
7
- data.tar.gz: 007039abd28f5f96339e6735deb99ae29c5560fac3e5be39d4d2165df8ecc6742a380b462c2cf2a2ea33434e5ed033062e141a608c2becd961c92248e88d8c88
6
+ metadata.gz: f2046a64dd9d596cc7276f1c74bd2a8d2e0da36b29f4375778c261260def341d45b8998daed5dc7a823aba947011c4307737be16ab0fa22e98eb19533f235c92
7
+ data.tar.gz: e09a6cfa6436cb27d43b2d879246497f903fecd0c0f6e180912c15d011b3ad22c38ab7fc47a874e681fe8088239916dbc5bd8230ea587385b940f26fb9f299c4
data/README.md CHANGED
@@ -44,7 +44,7 @@ Command line tools for Circle CI
44
44
  - Watch the most recent CI build for your current branch
45
45
 
46
46
  ```
47
- $ circle watch
47
+ $ circle --watch
48
48
  ```
49
49
 
50
50
  - Cancel the most recent CI build for your current branch
@@ -10,7 +10,7 @@ Gem::Specification.new do |spec|
10
10
  spec.email = ['derek@codeurge.com', 'jean.boussier@gmail.com']
11
11
  spec.summary = %q{Command line tools for Circle CI}
12
12
  spec.description = %q{A bunch of commands useful to deal with Circle CI without leaving your terminal.}
13
- spec.homepage = ''
13
+ spec.homepage = 'https://github.com/circle-cli/circle-cli'
14
14
  spec.license = 'MIT'
15
15
 
16
16
  spec.files = `git ls-files`.split
@@ -18,16 +18,16 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ['lib']
20
20
 
21
- spec.add_dependency 'circleci'
22
- spec.add_dependency 'rugged', '>= 0.23'
23
- spec.add_dependency 'gitable'
24
- spec.add_dependency 'launchy'
25
- spec.add_dependency 'thor'
21
+ spec.add_dependency 'circleci', '~> 1.0.3', '>= 1.0.3'
22
+ spec.add_dependency 'git', '~> 1.3.0', '>= 1.3.0'
23
+ spec.add_dependency 'gitable', '~> 0.3.1', '>=0.3.1'
24
+ spec.add_dependency 'launchy', '~> 2.4.3', '>= 2.4.3'
25
+ spec.add_dependency 'thor', '~> 0.19.1', '>= 0.19.1'
26
26
 
27
- spec.add_development_dependency 'bundler', '~> 1.5'
28
- spec.add_development_dependency 'rake'
29
- spec.add_development_dependency 'rspec'
30
- spec.add_development_dependency 'vcr'
31
- spec.add_development_dependency 'webmock'
32
- spec.add_development_dependency 'simplecov'
27
+ spec.add_development_dependency 'bundler', '~> 1.5', '>= 1.5'
28
+ spec.add_development_dependency 'rake', '~> 11.2.2', '>= 11.2.2'
29
+ spec.add_development_dependency 'rspec', '~> 3.5.0', '>= 3.5.0'
30
+ spec.add_development_dependency 'vcr', '~> 3.0.3', '>= 3.0.3'
31
+ spec.add_development_dependency 'webmock', '~> 2.1.0', '>= 2.1.0'
32
+ spec.add_development_dependency 'simplecov', '~> 0.12.0', '>= 0.12.0'
33
33
  end
@@ -1,6 +1,7 @@
1
1
  require 'launchy'
2
2
  require 'circle/cli/repo'
3
3
  require 'circle/cli/project'
4
+ require 'circle/cli/watcher'
4
5
 
5
6
  module Circle
6
7
  module CLI
@@ -26,35 +27,53 @@ CircleCI token hasn't been configured. Run the following command to login:
26
27
 
27
28
  desc 'status', 'show CircleCI build result'
28
29
  method_option :branch, desc: 'branch name'
30
+ method_option :watch, desc: 'watch the build', type: :boolean, default: false
31
+ method_option :poll, default: 5, desc: 'polling frequency', type: :numeric
29
32
  def status
30
33
  validate_repo!
31
34
  validate_latest!
32
- display_status
33
- end
34
35
 
35
- desc 'watch', 'watch your build'
36
- method_option :branch, desc: 'branch name'
37
- method_option :poll, default: 5, desc: 'polling frequency', type: :numeric
38
- def watch
39
- validate_repo!
40
- validate_latest!
41
- watching -> { project.latest.preload } do
36
+ watcher = Watcher.new do
42
37
  display_status
43
38
  end
39
+
40
+ watcher.to_preload do
41
+ project.clear_cache!
42
+ project.latest.preload
43
+ end
44
+
45
+ if options[:watch]
46
+ watcher.poll(options[:poll])
47
+ else
48
+ watcher.display
49
+ end
50
+ end
51
+
52
+ desc 'watch', 'an alias for `circle --watch`', hide: true
53
+ def watch
54
+ invoke :status, [], watch: true
44
55
  end
45
56
 
46
57
  desc 'overview', 'list recent builds and their statuses for all branches'
47
- method_option :watch, desc: 'watch the list of builds'
58
+ method_option :watch, desc: 'watch the list of builds', type: :boolean, default: false
48
59
  method_option :poll, default: 5, desc: 'polling frequency', type: :numeric
49
60
  def overview
50
61
  validate_repo!
51
62
  abort! 'No recent builds.' if project.recent_builds.empty?
52
- show_overview = -> { display_builds(project.recent_builds) }
63
+
64
+ watcher = Watcher.new do
65
+ display_builds(project.recent_builds)
66
+ end
67
+
68
+ watcher.to_preload do
69
+ project.clear_cache!
70
+ project.recent_builds
71
+ end
53
72
 
54
73
  if options[:watch]
55
- watching(-> { project.recent_builds }, &show_overview)
74
+ watcher.poll(options[:poll])
56
75
  else
57
- show_overview
76
+ watcher.display
58
77
  end
59
78
  end
60
79
 
@@ -72,7 +91,7 @@ CircleCI token hasn't been configured. Run the following command to login:
72
91
  validate_repo!
73
92
  project.build!
74
93
  say "A build has been triggered.\n\n", :green
75
- invoke :watch
94
+ invoke :status, [], watch: true
76
95
  end
77
96
 
78
97
  desc 'cancel', 'cancel most recent build'
@@ -133,18 +152,6 @@ CircleCI token hasn't been configured. Run the following command to login:
133
152
  abort set_color(message, :red)
134
153
  end
135
154
 
136
- def watching(preloader)
137
- loop do
138
- yield
139
- sleep options[:poll]
140
- project.clear_cache!
141
- preloader.call
142
- system('clear') || system('cls')
143
- end
144
- rescue Interrupt
145
- exit 0
146
- end
147
-
148
155
  def display(description, value, color)
149
156
  status = set_color description.ljust(15), :bold
150
157
  result = set_color value.to_s, color
@@ -1,3 +1,5 @@
1
+ require 'time'
2
+
1
3
  module Circle
2
4
  module CLI
3
5
  class Model
@@ -16,11 +16,11 @@ module Circle
16
16
  end
17
17
 
18
18
  def builds
19
- @builds ||= to_builds(request(CircleCi::Project, :recent_builds_branch, repo.branch_name))
19
+ @builds ||= request_builds(CircleCi::Project, :recent_builds_branch, repo.branch_name)
20
20
  end
21
21
 
22
22
  def recent_builds
23
- @recent_builds ||= to_builds(request(CircleCi::Project, :recent_builds))
23
+ @recent_builds ||= request_builds(CircleCi::Project, :recent_builds)
24
24
  end
25
25
 
26
26
  def latest
@@ -38,13 +38,7 @@ module Circle
38
38
  if response.success?
39
39
  response.body
40
40
  else
41
- $stderr.puts 'One or more errors occurred:'
42
-
43
- response.errors.each do |error|
44
- $stderr.puts "+ #{error.message}"
45
- end
46
-
47
- exit 1
41
+ abort "The following error occurred: #{response.body['message']}"
48
42
  end
49
43
  end
50
44
 
@@ -56,8 +50,8 @@ module Circle
56
50
  end
57
51
  end
58
52
 
59
- def to_builds(arr)
60
- arr.to_a.map { |build| Build.new(self, build) }
53
+ def request_builds(*args)
54
+ request(*args).to_a.map { |build| Build.new(self, build) }
61
55
  end
62
56
  end
63
57
  end
@@ -1,5 +1,5 @@
1
1
  require 'gitable'
2
- require 'rugged'
2
+ require 'git'
3
3
 
4
4
  module Circle
5
5
  module CLI
@@ -23,30 +23,29 @@ module Circle
23
23
  end
24
24
 
25
25
  def branch_name
26
- options.fetch 'branch' do
27
- repo.head.name.sub(/^refs\/heads\//, '')
28
- end
26
+ options.fetch('branch') { repo.current_branch }
29
27
  end
30
28
 
31
29
  def circle_token
32
- repo.config['circleci.token'] || ENV['CIRCLE_CLI_TOKEN']
30
+ token = repo.config('circleci.token') || ENV['CIRCLE_CLI_TOKEN']
31
+ token if token && !token.empty?
33
32
  end
34
33
 
35
34
  def circle_token=(token)
36
- repo.config['circleci.token'] = token
35
+ repo.config('circleci.token', token)
37
36
  end
38
37
 
39
38
  private
40
39
 
41
40
  def repo
42
- @repo ||= Rugged::Repository.new(options[:repo])
43
- rescue Rugged::RepositoryError
41
+ @repo ||= Git.open(options[:repo])
42
+ rescue ArgumentError
44
43
  full_path = File.expand_path(options[:repo])
45
44
  abort "#{full_path} is not a git repository."
46
45
  end
47
46
 
48
47
  def origin
49
- @origin ||= repo.remotes.find { |r| r.name == 'origin' }
48
+ @origin ||= repo.remote('origin')
50
49
  end
51
50
  end
52
51
  end
@@ -1,5 +1,5 @@
1
1
  module Circle
2
2
  module CLI
3
- VERSION = '0.1.1'
3
+ VERSION = '0.1.2'
4
4
  end
5
5
  end
@@ -0,0 +1,41 @@
1
+ module Circle
2
+ module CLI
3
+ class Watcher
4
+ attr_reader :displayer, :preloader
5
+
6
+ def initialize(&displayer)
7
+ @displayer = displayer
8
+ @preloader = -> {}
9
+ end
10
+
11
+ def to_preload(&preloader)
12
+ @preloader = preloader
13
+ end
14
+
15
+ def preload
16
+ preloader.call
17
+ end
18
+
19
+ def display
20
+ displayer.call
21
+ end
22
+
23
+ def poll(polling_frequency)
24
+ loop do
25
+ display
26
+ sleep polling_frequency
27
+ preload
28
+ clear
29
+ end
30
+ rescue Interrupt
31
+ exit 0
32
+ end
33
+
34
+ private
35
+
36
+ def clear
37
+ system('clear') || system('cls')
38
+ end
39
+ end
40
+ end
41
+ end
@@ -2,70 +2,105 @@
2
2
  http_interactions:
3
3
  - request:
4
4
  method: get
5
- uri: https://circleci.com/api/v1/project/mtchavez/rb-array-sorting/5?circle-token=123
5
+ uri: https://circleci.com/api/v1/project/mtchavez/circleci/140?circle-token=123
6
6
  body:
7
- encoding: US-ASCII
8
- string: ''
7
+ encoding: UTF-8
8
+ string: "{}"
9
9
  headers:
10
- accept:
10
+ Accept:
11
11
  - application/json
12
- accept-encoding:
13
- - gzip, deflate
14
- content-type:
12
+ Content-Type:
15
13
  - application/json
16
- user-agent:
14
+ Accept-Encoding:
15
+ - gzip;q=1.0,deflate;q=0.6,identity;q=0.3
16
+ User-Agent:
17
17
  - Ruby
18
+ Host:
19
+ - circleci.com
18
20
  response:
19
21
  status:
20
22
  code: 200
21
- message: !binary |-
22
- T0s=
23
+ message: OK
23
24
  headers:
24
- !binary "Y29udGVudC1lbmNvZGluZw==":
25
- - !binary |-
26
- Z3ppcA==
27
- !binary "Y29udGVudC10eXBl":
28
- - !binary |-
29
- YXBwbGljYXRpb24vanNvbjsgY2hhcnNldD11dGYtOA==
30
- !binary "ZGF0ZQ==":
31
- - !binary |-
32
- V2VkLCAxNyBBcHIgMjAxMyAwNTowODozNCBHTVQ=
33
- !binary "c2VydmVy":
34
- - !binary |-
35
- bmdpbngvMS4xLjE5
36
- !binary "c2V0LWNvb2tpZQ==":
37
- - !binary |-
38
- cmluZy1zZXNzaW9uPTcwNDY1OWFhLTU1NmQtNDA4NC1iZTJmLWU5NDgyYTk0
39
- MTc5ZDtQYXRoPS87SHR0cE9ubHk7RXhwaXJlcz1XZWQsIDE2IEFwciAyMDE0
40
- IDE0OjQ5OjM1ICswMDAwO01heC1BZ2U9MzE1MzYwMDA7U2VjdXJl
41
- !binary "Y29udGVudC1sZW5ndGg=":
42
- - !binary |-
43
- Nzg3
44
- !binary "Y29ubmVjdGlvbg==":
45
- - !binary |-
46
- a2VlcC1hbGl2ZQ==
25
+ Access-Control-Allow-Origin:
26
+ - "*"
27
+ Content-Type:
28
+ - application/json; charset=utf-8
29
+ Date:
30
+ - Sun, 25 Sep 2016 17:42:16 GMT
31
+ Server:
32
+ - nginx
33
+ Set-Cookie:
34
+ - ab_test_user_seed=0.6341920666598763;Expires=Mon, 25 Sep 2017 17:42:15 +0000;Path=/;Secure
35
+ - ring-session=aI%2BT%2B38FYMY0Zei4y9L9JlOcd0Fo1ymsoyLtmRxlv8V9ppwly3RnNyvA8FfiRjJlhbYzwHEHp36iz21bff%2Fs61%2FHDXi6w1xm9%2FPij4wOSVy9gVYlWKvgRFY8CBdopzqeQgOoLPxJSxSxEE2nhF8ErjAIsrHL5b4gBXoCZ%2Bg%2FC%2Fe4Py9%2FrbXiO28Z7HcO1lTHibvQeTlrvDmdO29pV5r0%2FDgcLAX9iAQfAJoAycT0Zto%3D--kil2VsZOz%2Brz0c4EIM%2FsbYoXgXDiDdLvh9T%2BrxDlgRg%3D;Path=/;HttpOnly;Expires=Mon,
36
+ 25 Sep 2017 00:18:12 +0000;Max-Age=31536000;Secure
37
+ Strict-Transport-Security:
38
+ - max-age=15724800
39
+ X-Circleci-Identity:
40
+ - i-99b8bf8e
41
+ X-Circleci-Request-Id:
42
+ - d014ef61-fc2d-482c-8f68-7ef5621f9c04
43
+ X-Circleci-Scopes:
44
+ - ":none"
45
+ - ":status"
46
+ - ":view-builds"
47
+ X-Frame-Options:
48
+ - DENY
49
+ X-Route:
50
+ - "/"
51
+ - ":build_num"
52
+ - "\\d+"
53
+ Content-Length:
54
+ - '2699'
55
+ Connection:
56
+ - keep-alive
47
57
  body:
48
58
  encoding: ASCII-8BIT
49
- string: !binary |-
50
- H4sIAAAAAAAAAJWUS2/UMBDHv4rlSy/7SPbVNgIEAg4cuAAnHoocZ5KYOnaw
51
- x11C1e/OONlsdysK4rRZz3jmN4+/73hpDeZFULrkmQlaz7i0basQweVGtMAz
52
- /roRt/CLz3jhhJENnbTCkz2e2LKn//QlAjbW5aXAeCVdb7dJcnW52vDTgH+y
53
- OkCnwPPsy7cZ74QTWoPmWXp6D1qh9JAXsYH9Qg5EL8ecCnstCr8gdwpHYF0M
54
- dscP9NKaStXBAaOrbKyUcCUqa0bHQvgmj8mEOTbBBZOjaiFvldaK/FbX23VE
55
- MqhMgMntgRddgJhdOBwuUuZVkq7nyWaeXn5K1tlmmyVXnyn1X7mOGE/YW/Be
56
- 1FO7YrE8S2YcfiqkEsojmA04uoApn+RJ08ijTAk/hyhEj4FCcx+kpERkjFfL
57
- IdhhOWgDQMOxT8pUjpbBBYmEmlfDnEYT9l3Meu5BIaPPFOD+2z0xDsWdt3ud
58
- bFczvm/idlXKeZwfJzcu2n+txL+H4tF2/+iTVhXIXmoYkIzyDUSe4EkJ2R1X
59
- Ph8/x03QtlYm8qGc5PNYTlMJhn584ewN0OQr0PplHS0D/T2hheI7SJoA/2gd
60
- sr3ChvkOpGfkzj68ffXm/dvxtACSZyvcjT/flLtpFnvhjDL1g5XO3iHT1t54
61
- ptUNsD0waYMuzQUymhw4huCReUDa+9qzyjrW2+BY52ykWrAPMHhZFk+fCdY4
62
- qJ5fNIidz5ZLqRx1TKpYzLK00i9pvQNppr948ZV/HMOOEYcBs9CxyeMrf7YU
63
- LxjdCi0YjDlqIJY4TigXjMh9E2GZNbpnKIhfsAr2rCWNEveCx+36bovDS3aQ
64
- Nj04fW6rE6kQXGyFsXms1vMTKZyc3UqfO7hVnl6O+IrB5UZWSSF3u83merMr
65
- 0lJc73bbtNytxHq3Kq+21SbdJXxacBPa4V2LcYKLk5+6VNP0QjH0aNqXpSvm
66
- wjnRzz1NfRzagxgroT0tWRdxbOR8rM6Dwx/lebCd6nBCPMc6G17dPM22TB+E
67
- +XjLfwQIUOYCnxLf/W9rTc/2hQYAAA==
68
- http_version: !binary |-
69
- MS4x
70
- recorded_at: Wed, 17 Apr 2013 05:08:34 GMT
71
- recorded_with: VCR 2.4.0
59
+ string: '{"compare":"https://github.com/mtchavez/circleci/commit/d9a5a207e102","previous_successful_build":{"build_num":139,"status":"success","build_time_millis":83094},"build_parameters":null,"oss":true,"all_commit_details_truncated":false,"committer_date":"2016-07-25T10:03:49-07:00","steps":[{"name":"Starting
60
+ the build","actions":[{"truncated":false,"index":0,"parallel":false,"failed":null,"infrastructure_fail":null,"name":"Starting
61
+ the build","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:04:37.043Z","type":"infrastructure","output_url":"https://circle-production-action-output.s3.amazonaws.com/80e57358127a0e2208646975-mtchavez-circleci-0-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=T0ESh13bwESfRnmKSwk%2BrCnJCKo%3D","start_time":"2016-07-25T17:04:00.267Z","exit_code":null,"canceled":null,"step":0,"run_time_millis":36776,"has_output":true}]},{"name":"Start
62
+ container","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Start
63
+ container","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:05:08.003Z","source":"config","type":"infrastructure","output_url":"https://circle-production-action-output.s3.amazonaws.com/f0e57358127a0e225a646975-mtchavez-circleci-1-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=KAEM3OiRzAIqQlJ9nwgYVtGz02I%3D","start_time":"2016-07-25T17:04:37.077Z","exit_code":0,"canceled":null,"step":1,"run_time_millis":30926,"has_output":true}]},{"name":"Enable
64
+ SSH","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Enable
65
+ SSH","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:05:14.958Z","type":"infrastructure","output_url":"https://circle-production-action-output.s3.amazonaws.com/a1e57358127a0e224c646975-mtchavez-circleci-2-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=S0DpcmS3T2au5S2Pbr%2Fno34aBNg%3D","start_time":"2016-07-25T17:05:08.038Z","exit_code":null,"canceled":null,"step":2,"run_time_millis":6920,"has_output":true}]},{"name":"Restore
66
+ source cache","actions":[{"truncated":false,"index":0,"parallel":false,"failed":null,"infrastructure_fail":null,"name":"Restore
67
+ source cache","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:05:15.214Z","source":"cache","type":"checkout","start_time":"2016-07-25T17:05:14.984Z","exit_code":null,"canceled":null,"step":3,"run_time_millis":230,"has_output":false}]},{"name":"Checkout
68
+ using deploy key: 81:49:b8:ae:b5:94:db:7a:5b:8a:91:c6:2e:df:f8:b6","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Checkout
69
+ using deploy key: 81:49:b8:ae:b5:94:db:7a:5b:8a:91:c6:2e:df:f8:b6","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:05:29.951Z","source":"config","type":"checkout","output_url":"https://circle-production-action-output.s3.amazonaws.com/f1e57358127a0e22bc646975-mtchavez-circleci-4-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=3I7mADPu1KUN5e74FIipeF9w7A8%3D","start_time":"2016-07-25T17:05:15.238Z","exit_code":0,"canceled":null,"step":4,"run_time_millis":14713,"has_output":true}]},{"name":"Configure
70
+ the build","actions":[{"truncated":false,"index":0,"parallel":false,"failed":null,"infrastructure_fail":null,"name":"Configure
71
+ the build","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:05:49.908Z","source":"cache","type":"machine","start_time":"2016-07-25T17:05:29.989Z","exit_code":null,"canceled":null,"step":5,"run_time_millis":19919,"has_output":false}]},{"name":"Exporting
72
+ env vars from project settings","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Exporting
73
+ env vars from project settings","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:05:55.178Z","source":"db","type":"machine","output_url":"https://circle-production-action-output.s3.amazonaws.com/63e57358127a0e22de646975-mtchavez-circleci-6-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=Z0%2BmNtB354qnXXl6VREvNwjSrNg%3D","start_time":"2016-07-25T17:05:49.955Z","exit_code":0,"canceled":null,"step":6,"run_time_millis":5223,"has_output":true}]},{"name":"set
74
+ ruby version to 2.2.3","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"set
75
+ ruby version to 2.2.3","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:06:01.992Z","source":"inference","type":"machine","output_url":"https://circle-production-action-output.s3.amazonaws.com/83e57358127a0e223f646975-mtchavez-circleci-7-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=dYEgYWd9cqqCyokM%2BB6q%2BI%2F8c0w%3D","start_time":"2016-07-25T17:05:55.253Z","exit_code":0,"canceled":null,"step":7,"run_time_millis":6739,"has_output":true}]},{"name":"Restore
76
+ cache","actions":[{"truncated":false,"index":0,"parallel":false,"failed":null,"infrastructure_fail":null,"name":"Restore
77
+ cache","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:06:02.776Z","source":"cache","type":"machine","start_time":"2016-07-25T17:06:02.040Z","exit_code":null,"canceled":null,"step":8,"run_time_millis":736,"has_output":false}]},{"name":"Exporting
78
+ RAILS_ENV, RACK_ENV","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Exporting
79
+ RAILS_ENV, RACK_ENV","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:06:08.526Z","source":"inference","type":"dependencies","output_url":"https://circle-production-action-output.s3.amazonaws.com/44e57358127a0e22af646975-mtchavez-circleci-9-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=PhZZXQTBIdlGz3NEeIC%2BJ9hmR7k%3D","start_time":"2016-07-25T17:06:02.789Z","exit_code":0,"canceled":null,"step":9,"run_time_millis":5737,"has_output":true}]},{"name":"bundle
80
+ install","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"bundle
81
+ install","bash_command":"bundle check --path=vendor/bundle || bundle install
82
+ --path=vendor/bundle --jobs=4 --retry=3 ","status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:06:28.254Z","source":"inference","type":"dependencies","output_url":"https://circle-production-action-output.s3.amazonaws.com/64e57358127a0e2200746975-mtchavez-circleci-10-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=mxpNZAdcPKzKDXvoAdv1UInMD%2BA%3D","start_time":"2016-07-25T17:06:08.573Z","exit_code":0,"canceled":null,"step":10,"run_time_millis":19681,"has_output":true}]},{"name":"Save
83
+ cache","actions":[{"truncated":false,"index":0,"parallel":false,"failed":null,"infrastructure_fail":null,"name":"Save
84
+ cache","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:06:46.323Z","source":"cache","type":"database","output_url":"https://circle-production-action-output.s3.amazonaws.com/d4e57358127a0e2241746975-mtchavez-circleci-11-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=hvlIRlm5RnDxJ2%2BDD4ArtS3P4o0%3D","start_time":"2016-07-25T17:06:28.275Z","exit_code":null,"canceled":null,"step":11,"run_time_millis":18048,"has_output":true}]},{"name":"bundle
85
+ exec rake rubocop && bundle exec rspec -r rspec_junit_formatter --format RspecJunitFormatter
86
+ -o $CIRCLE_TEST_REPORTS/rspec/junit.xml","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"bundle
87
+ exec rake rubocop && bundle exec rspec -r rspec_junit_formatter --format RspecJunitFormatter
88
+ -o $CIRCLE_TEST_REPORTS/rspec/junit.xml","bash_command":"bundle exec rake
89
+ rubocop && bundle exec rspec -r rspec_junit_formatter --format RspecJunitFormatter
90
+ -o $CIRCLE_TEST_REPORTS/rspec/junit.xml","status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:06:53.152Z","source":"db","type":"test","output_url":"https://circle-production-action-output.s3.amazonaws.com/35e57358127a0e2262746975-mtchavez-circleci-12-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=oG79%2Bt2ypqIF6O8y5CiBrh64vkw%3D","start_time":"2016-07-25T17:06:46.358Z","exit_code":0,"canceled":null,"step":12,"run_time_millis":6794,"has_output":true}]},{"name":"Collect
91
+ test metadata","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Collect
92
+ test metadata","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:07:10.747Z","type":"teardown","output_url":"https://circle-production-action-output.s3.amazonaws.com/65e57358127a0e22d2746975-mtchavez-circleci-13-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=ieJbCNCP5hIO4KdNtmdbaji1D%2FQ%3D","start_time":"2016-07-25T17:06:53.187Z","exit_code":null,"canceled":null,"step":13,"run_time_millis":17560,"has_output":true}]},{"name":"Collect
93
+ artifacts","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Collect
94
+ artifacts","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:07:24.883Z","type":"teardown","output_url":"https://circle-production-action-output.s3.amazonaws.com/66e57358127a0e22e3746975-mtchavez-circleci-14-0?AWSAccessKeyId=AKIAIJNI6FA5RIAFFQ7Q&Expires=1632591736&Signature=Wz72mAmFgvQ5rCjkWfHTnPUHaR0%3D","start_time":"2016-07-25T17:07:10.779Z","exit_code":null,"canceled":null,"step":14,"run_time_millis":14104,"has_output":true}]},{"name":"Disable
95
+ SSH","actions":[{"truncated":false,"index":0,"parallel":true,"failed":null,"infrastructure_fail":null,"name":"Disable
96
+ SSH","bash_command":null,"status":"success","timedout":null,"continue":null,"end_time":"2016-07-25T17:07:24.902Z","type":"teardown","start_time":"2016-07-25T17:07:24.898Z","exit_code":null,"canceled":null,"step":17,"run_time_millis":4,"has_output":false}]}],"body":"*
97
+ Fix from plural envvar to envvars for consistency with API endpoint\n* Preserve
98
+ old functionality","usage_queued_at":"2016-07-25T17:03:26.930Z","fail_reason":null,"retry_of":null,"reponame":"circleci","ssh_users":[],"build_url":"https://circleci.com/gh/mtchavez/circleci/140","parallel":1,"failed":null,"branch":"typo","username":"mtchavez","author_date":"2016-07-25T10:03:49-07:00","why":"github","user":{"is_user":true,"login":"mtchavez","avatar_url":"https://avatars.githubusercontent.com/u/44689?v=3","name":"Chavez","vcs_type":"github","id":44689},"vcs_revision":"d9a5a207e10209eecef8ed02289824a8630ed67d","owners":["mtchavez"],"vcs_tag":null,"build_num":140,"infrastructure_fail":false,"committer_email":"matthew@el-chavez.me","has_artifacts":true,"previous":null,"status":"success","committer_name":"Chavez","pull_request_urls":["https://github.com/mtchavez/circleci/pull/71"],"retries":[150,156,149,147,151,155,154,153,148,152,162,157,160,166,164,158,165,169,163,168,159,161,171,175,176,174,170,167,172,173,178,177,183,184,185,186,190,189,194,193,226,225],"subject":"Project#envvar
99
+ method naming fix","vcs_type":"github","timedout":false,"dont_build":null,"lifecycle":"finished","no_dependency_cache":false,"stop_time":"2016-07-25T17:07:31.761Z","ssh_disabled":false,"build_time_millis":223674,"circle_yml":{"string":"machine:\n ruby:\n version:
100
+ 2.2.3\n"},"messages":[],"is_first_green_build":false,"job_name":null,"start_time":"2016-07-25T17:03:48.087Z","canceler":null,"all_commit_details":[{"committer_date":"2016-07-25T10:03:49-07:00","body":"*
101
+ Fix from plural envvar to envvars for consistency with API endpoint\n* Preserve
102
+ old functionality","branch":"typo","author_date":"2016-07-25T10:03:49-07:00","committer_email":"matthew@el-chavez.me","commit":"d9a5a207e10209eecef8ed02289824a8630ed67d","committer_login":"mtchavez","committer_name":"Chavez","subject":"Project#envvar
103
+ method naming fix","commit_url":"https://github.com/mtchavez/circleci/commit/d9a5a207e10209eecef8ed02289824a8630ed67d","author_login":"mtchavez","author_name":"Chavez","author_email":"matthew@el-chavez.me"}],"outcome":"success","vcs_url":"https://github.com/mtchavez/circleci","author_name":"Chavez","node":[{"public_ip_addr":"54.191.221.156","port":64561,"username":"ubuntu","image_id":"s3://lxc-images-us-west-2/circletar-1741-cc586-20160424T232626Z","ssh_enabled":null}],"queued_at":"2016-07-25T17:03:48.067Z","canceled":false,"author_email":"matthew@el-chavez.me"}'
104
+ http_version:
105
+ recorded_at: Sun, 25 Sep 2016 17:42:12 GMT
106
+ recorded_with: VCR 3.0.3