capistrano-ci 0.0.1

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.
Files changed (31) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +17 -0
  3. data/.travis.yml +14 -0
  4. data/Gemfile +4 -0
  5. data/LICENSE.txt +22 -0
  6. data/README.md +76 -0
  7. data/Rakefile +11 -0
  8. data/capistrano-ci.gemspec +31 -0
  9. data/lib/capistrano/ci/client.rb +37 -0
  10. data/lib/capistrano/ci/clients/base.rb +34 -0
  11. data/lib/capistrano/ci/clients/travis.rb +36 -0
  12. data/lib/capistrano/ci/clients/travis_pro.rb +15 -0
  13. data/lib/capistrano/ci/recipes.rb +19 -0
  14. data/lib/capistrano/ci/version.rb +5 -0
  15. data/lib/capistrano/ci.rb +5 -0
  16. data/spec/capistrano/ci/client_spec.rb +81 -0
  17. data/spec/capistrano/ci/clients/base_spec.rb +15 -0
  18. data/spec/capistrano/ci/clients/travis_pro_spec.rb +46 -0
  19. data/spec/capistrano/ci/clients/travis_spec.rb +43 -0
  20. data/spec/spec_helper.rb +25 -0
  21. data/spec/vcr/Capistrano_CI_Clients_Travis/_passed_/when_failed/.yml +122 -0
  22. data/spec/vcr/Capistrano_CI_Clients_Travis/_passed_/when_passed/.yml +126 -0
  23. data/spec/vcr/Capistrano_CI_Clients_Travis/_state/when_failed/.yml +122 -0
  24. data/spec/vcr/Capistrano_CI_Clients_Travis/_state/when_passed/.yml +126 -0
  25. data/spec/vcr/Capistrano_CI_Clients_Travis/_state/when_repository_was_not_found/.yml +50 -0
  26. data/spec/vcr/Capistrano_CI_Clients_TravisPro/_passed_/when_not_passed/.yml +114 -0
  27. data/spec/vcr/Capistrano_CI_Clients_TravisPro/_passed_/when_passed/.yml +115 -0
  28. data/spec/vcr/Capistrano_CI_Clients_TravisPro/_state/when_not_passed/.yml +114 -0
  29. data/spec/vcr/Capistrano_CI_Clients_TravisPro/_state/when_passed/.yml +115 -0
  30. data/spec/vcr/Capistrano_CI_Clients_TravisPro/_state/when_repository_was_not_found/.yml +42 -0
  31. metadata +200 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: a4bb2f3e598f26beed767fa2053561d13f87924f
4
+ data.tar.gz: 51f561d4c7e7353439e07062cdeb1038fd4d3911
5
+ SHA512:
6
+ metadata.gz: 35753365238dae3e5dc0764da0b78798d85ee9ad52ffdbd86f7751e74128904417ee18c14c5b4f8058251ee3fbe429da5d2604a7dde35aab6f40e8ba9c7dde5a
7
+ data.tar.gz: 287ea3753b4b0560dbe4256669d6c62799bc4d27fa4b2bc2cd08baaf2e431776fa280a0952202b8c958403ea9c6822402c1c220845b730233f87d6446fd0d652
data/.gitignore ADDED
@@ -0,0 +1,17 @@
1
+ *.gem
2
+ *.rbc
3
+ .bundle
4
+ .config
5
+ .yardoc
6
+ Gemfile.lock
7
+ InstalledFiles
8
+ _yardoc
9
+ coverage
10
+ doc/
11
+ lib/bundler/man
12
+ pkg
13
+ rdoc
14
+ spec/reports
15
+ test/tmp
16
+ test/version_tmp
17
+ tmp
data/.travis.yml ADDED
@@ -0,0 +1,14 @@
1
+ language: ruby
2
+ rvm:
3
+ - 1.9.3
4
+ - 2.0.0
5
+ - ruby-head
6
+ notifications:
7
+ email: false
8
+ branches:
9
+ only:
10
+ - master
11
+ - development
12
+ matrix:
13
+ allow_failures:
14
+ - rvm: ruby-head
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in capistrano-ci.gemspec
4
+ gemspec
data/LICENSE.txt ADDED
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2013 Railsware LLC
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
data/README.md ADDED
@@ -0,0 +1,76 @@
1
+ # Capistrano::Ci
2
+ [![Build Status](https://travis-ci.org/railsware/capistrano-ci.png)](https://travis-ci.org/railsware/capistrano-ci)
3
+
4
+
5
+ ## Introduction
6
+
7
+ capistrano-ci is extension for capistrano that allows you to check status of your repository before deployment. Currently it supports:
8
+
9
+ * travis-ci: Open Source and Pro versions ([https://travis-ci.org](https://travis-ci.org) or [https://travis-ci.com](https://travis-ci.com))
10
+
11
+ ## Installation
12
+
13
+ Add this line to your application's Gemfile:
14
+
15
+ gem 'capistrano-ci'
16
+
17
+ And then execute:
18
+
19
+ $ bundle
20
+
21
+ Or install it yourself as:
22
+
23
+ $ gem install capistrano-ci
24
+
25
+ Add to your Capfile:
26
+
27
+ require 'capistrano/ci/recipies'
28
+
29
+ ## Configuration
30
+
31
+ Variables list:
32
+
33
+ * :ci_client (required) - supports 'travis' or 'travis_pro';
34
+ * :ci_repository (required) - organization or user name and repository name on github;
35
+ * :ci_access_token(required only for 'travis_pro' ci client) - access token for Pro account on Travis-CI.
36
+
37
+ ### Open Source Projects
38
+
39
+ Setup ci_client and ci_repository variables in your deployment script:
40
+
41
+ set(:ci_client){ "travis" }
42
+ set(:ci_repository){ "organisation-or-user/repository-name" }
43
+
44
+ ### Pro Account of Travis-CI:
45
+
46
+ Additional to ci_client and ci_repository setup ci_access_token:
47
+
48
+ set(:ci_client){ "travis_pro" }
49
+ set(:ci_repository){ "organisation-or-user/repository-name" }
50
+ set(:ci_access_token){ "your-pro-access-token" }
51
+
52
+ Read explaination [how to obtain Travis-CI access token](http://railsware.com/blog/2013/09/10/capistrano-recipe-for-checking-travis-ci-build-status/). To have more information about Travis-CI access token follow [this blog post](http://about.travis-ci.org/blog/2013-01-28-token-token-token).
53
+
54
+ ### Enable ci:verify task:
55
+
56
+ before 'deploy' do
57
+ ci.verify
58
+ end
59
+
60
+ # or in case of using capistrano-patch:
61
+ before 'patch:create' do
62
+ ci.verify
63
+ end
64
+
65
+ ## Contributing
66
+
67
+ 1. Fork it
68
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
69
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
70
+ 4. Push to the branch (`git push origin my-new-feature`)
71
+ 5. Create new Pull Request
72
+
73
+ ## Copyright
74
+
75
+ Copyright (c) 2013 Railsware LLC. See LICENSE.txt for
76
+ further details.
data/Rakefile ADDED
@@ -0,0 +1,11 @@
1
+ require 'rubygems'
2
+ require 'bundler'
3
+
4
+ Bundler.require
5
+
6
+ require 'rspec/core/rake_task'
7
+ require "bundler/gem_tasks"
8
+
9
+ RSpec::Core::RakeTask.new(:spec)
10
+
11
+ task :default => :spec
@@ -0,0 +1,31 @@
1
+ # coding: utf-8
2
+ lib = File.expand_path('../lib', __FILE__)
3
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
+ require 'capistrano/ci/version'
5
+
6
+ Gem::Specification.new do |spec|
7
+ spec.name = "capistrano-ci"
8
+ spec.version = Capistrano::Ci::VERSION
9
+ spec.authors = ["paladiy"]
10
+ spec.email = ["olexanderpaladiy@gmail.com"]
11
+ spec.description = %q{Capistrano recipe for checking CI build status}
12
+ spec.summary = %q{Capistrano recipe for checking CI build status of your repo}
13
+ spec.homepage = "https://github.com/railsware/capistrano-ci"
14
+ spec.license = "MIT"
15
+
16
+ spec.files = `git ls-files`.split($/)
17
+ spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
18
+ spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
+ spec.require_paths = ["lib"]
20
+
21
+ spec.add_development_dependency "bundler", "~> 1.3"
22
+ spec.add_development_dependency "rake"
23
+ spec.add_development_dependency "rspec", "2.14.1"
24
+ spec.add_development_dependency "simplecov", "~> 0.7.1"
25
+ spec.add_development_dependency "vcr", "~> 2.6.0"
26
+ spec.add_development_dependency "webmock", "~> 1.14.0"
27
+
28
+ spec.add_runtime_dependency "capistrano", ">=2.5.5"
29
+ spec.add_runtime_dependency "httparty"
30
+
31
+ end
@@ -0,0 +1,37 @@
1
+ module Capistrano
2
+ module CI
3
+ class Client
4
+ SETTINGS = [:ci_client, :ci_repository, :ci_access_token]
5
+
6
+ class NotFound < StandardError; end
7
+
8
+ def initialize(config)
9
+ @config = SETTINGS.inject({}) do |result, key|
10
+ result[key] = config[key] if config.exists?(key)
11
+ result
12
+ end
13
+ end
14
+
15
+ def state(branch)
16
+ client.state(branch)
17
+ end
18
+
19
+ def passed?(branch)
20
+ client.passed?(branch)
21
+ end
22
+
23
+ private
24
+
25
+ def client
26
+ @client ||= case @config[:ci_client]
27
+ when "travis"
28
+ Capistrano::CI::Clients::Travis.new @config[:ci_repository]
29
+ when "travis_pro"
30
+ Capistrano::CI::Clients::TravisPro.new @config[:ci_repository], @config[:ci_access_token]
31
+ else
32
+ raise NotFound, "can't find CI client with name '#{@config[:ci_client]}'"
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end
@@ -0,0 +1,34 @@
1
+ require "httparty"
2
+
3
+ module Capistrano
4
+ module CI
5
+ module Clients
6
+ class ResponseError < StandardError; end
7
+
8
+ class Base
9
+ include HTTParty
10
+
11
+ def passed?(branch)
12
+ raise NotImplementedError
13
+ end
14
+
15
+ def state(branch)
16
+ raise NotImplementedError
17
+ end
18
+
19
+ private
20
+
21
+ def get(url)
22
+ response = self.class.get(url)
23
+
24
+ if response.response.code == "200"
25
+ response.parsed_response
26
+ else
27
+ raise Capistrano::CI::Clients::ResponseError
28
+ end
29
+ end
30
+
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,36 @@
1
+ module Capistrano
2
+ module CI
3
+ module Clients
4
+ class Travis < Base
5
+ base_uri 'https://api.travis-ci.org'
6
+
7
+ attr_reader :repository_name
8
+
9
+ def initialize(repository_name)
10
+ self.class.headers 'Accept' => 'application/json; version=2'
11
+
12
+ @repository_name = repository_name
13
+ end
14
+
15
+ def passed?(branch)
16
+ state(branch) == "passed"
17
+ end
18
+
19
+ def state(branch)
20
+ branch(branch)["state"]
21
+ end
22
+
23
+ private
24
+
25
+ def repository
26
+ @repository ||= get("/repos/#{@repository_name}")["repo"]
27
+ end
28
+
29
+ def branch(branch_name)
30
+ @branches ||= {}
31
+ @branches[branch_name] ||= get("/repos/#{repository["id"]}/branches/#{branch_name}")["branch"]
32
+ end
33
+ end
34
+ end
35
+ end
36
+ end
@@ -0,0 +1,15 @@
1
+ module Capistrano
2
+ module CI
3
+ module Clients
4
+ class TravisPro < Travis
5
+ base_uri 'https://api.travis-ci.com'
6
+
7
+ def initialize(repository_name, api_token)
8
+ @repository_name = repository_name
9
+
10
+ self.class.headers 'Accept' => 'application/json; version=2', "Authorization" => "token #{api_token}"
11
+ end
12
+ end
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,19 @@
1
+ require 'capistrano/ci'
2
+
3
+ Capistrano::Configuration.instance(true).load do
4
+ namespace :ci do
5
+ desc "verification of branch build status on CI"
6
+ task :verify do
7
+ begin
8
+ client = Capistrano::CI::Client.new self
9
+
10
+ unless client.passed?(branch)
11
+ Capistrano::CLI.ui.say "Your '#{branch}' branch has '#{client.state(branch)}' state on CI."
12
+ Capistrano::CLI.ui.ask("Continue anyway? (y/N)") == 'y' or abort
13
+ end
14
+ rescue => e
15
+ Capistrano::CLI.ui.say "#{e.class.name}: #{e.message}"
16
+ end
17
+ end
18
+ end
19
+ end
@@ -0,0 +1,5 @@
1
+ module Capistrano
2
+ module Ci
3
+ VERSION = "0.0.1"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ require "capistrano/ci/version"
2
+ require "capistrano/ci/clients/base"
3
+ require "capistrano/ci/clients/travis"
4
+ require "capistrano/ci/clients/travis_pro"
5
+ require "capistrano/ci/client"
@@ -0,0 +1,81 @@
1
+ require 'spec_helper'
2
+
3
+ class CIConfig < Hash
4
+ alias_method :exists?, :key?
5
+ end
6
+
7
+ describe Capistrano::CI::Client do
8
+ let(:config) do
9
+ config = CIConfig.new
10
+ config[:ci_client] = ci_client
11
+ config[:ci_repository] = "rails/rails"
12
+ config[:ci_access_token] = "token"
13
+ config
14
+ end
15
+
16
+ let(:client){ described_class.new(config) }
17
+
18
+ describe "#state" do
19
+
20
+ subject{ client.state("master") }
21
+
22
+ context "when travis" do
23
+ let(:ci_client){ "travis" }
24
+ let(:travis_client){ double(state: "passed") }
25
+
26
+ before do
27
+ Capistrano::CI::Clients::Travis.should_receive(:new).with("rails/rails").and_return(travis_client)
28
+ end
29
+
30
+ it{ should == "passed" }
31
+ end
32
+
33
+ context "when travis pro" do
34
+ let(:ci_client){ "travis_pro" }
35
+ let(:travis_client){ double(state: "passed") }
36
+
37
+ before do
38
+ Capistrano::CI::Clients::TravisPro.should_receive(:new).with("rails/rails","token").and_return(travis_client)
39
+ end
40
+
41
+ it{ should == "passed" }
42
+ end
43
+
44
+ context "when unsupported" do
45
+ let(:ci_client){ "unsupported" }
46
+
47
+ it{ expect{ subject }.to raise_error(Capistrano::CI::Client::NotFound) }
48
+ end
49
+ end
50
+
51
+ describe "#passed?" do
52
+ subject{ client.passed?("master") }
53
+
54
+ context "when travis" do
55
+ let(:ci_client){ "travis" }
56
+ let(:travis_client){ double(passed?: true) }
57
+
58
+ before do
59
+ Capistrano::CI::Clients::Travis.should_receive(:new).with("rails/rails").and_return(travis_client)
60
+ end
61
+
62
+ it{ should == true }
63
+ end
64
+
65
+ context "when travis pro" do
66
+ let(:ci_client){ "travis_pro" }
67
+ let(:travis_client){ double(passed?: true) }
68
+
69
+ before do
70
+ Capistrano::CI::Clients::Travis.should_receive(:new).with("rails/rails","token").and_return(travis_client)
71
+ end
72
+
73
+ it{ should == true }
74
+ end
75
+ context "when unsupported" do
76
+ let(:ci_client){ "unsupported" }
77
+
78
+ it{ expect{ subject }.to raise_error(Capistrano::CI::Client::NotFound) }
79
+ end
80
+ end
81
+ end
@@ -0,0 +1,15 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capistrano::CI::Clients::Base do
4
+ describe "#passed?" do
5
+ subject{ described_class.new.passed?("master") }
6
+
7
+ it{ ->{ subject }.should raise_error(NotImplementedError) }
8
+ end
9
+
10
+ describe "#state" do
11
+ subject{ described_class.new.state("master") }
12
+
13
+ it{ ->{ subject }.should raise_error(NotImplementedError) }
14
+ end
15
+ end
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capistrano::CI::Clients::TravisPro, :vcr do
4
+ let(:client){ described_class.new("rails/rails-private", "secret_token") }
5
+
6
+ describe "#passed?" do
7
+ subject{ client.passed?(branch_name) }
8
+
9
+ context "when passed" do
10
+ let(:branch_name){ "master" }
11
+
12
+ it{ should == true }
13
+ end
14
+
15
+ context "when not passed" do
16
+ let(:branch_name){ "events-framework" }
17
+
18
+ it{ should == false }
19
+ end
20
+ end
21
+
22
+ describe "#state" do
23
+
24
+ subject{ client.state(branch_name) }
25
+
26
+ context "when passed" do
27
+ let(:branch_name){ "master" }
28
+
29
+ it{ should == "passed" }
30
+ end
31
+
32
+ context "when not passed" do
33
+ let(:branch_name){ "events-framework" }
34
+
35
+ it{ should == "started" }
36
+ end
37
+
38
+ context "when repository was not found" do
39
+ let(:client){ described_class.new("rails/some_strange_repo", "secret_token") }
40
+
41
+ let(:branch_name){ "master" }
42
+
43
+ it{ expect{ subject }.to raise_error(Capistrano::CI::Clients::ResponseError) }
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,43 @@
1
+ require 'spec_helper'
2
+
3
+ describe Capistrano::CI::Clients::Travis, :vcr do
4
+ describe "#passed?" do
5
+ subject{ client.passed?("master") }
6
+
7
+ context "when passed" do
8
+ let(:client){ described_class.new("rails/rails") }
9
+
10
+ it{ should == true }
11
+ end
12
+
13
+ context "when failed" do
14
+ let(:client){ described_class.new("railsware/zero_deploy") }
15
+
16
+ it{ should == false }
17
+ end
18
+ end
19
+
20
+ describe "#state" do
21
+
22
+ subject{ client.state("master") }
23
+
24
+
25
+ context "when passed" do
26
+ let(:client){ described_class.new("rails/rails") }
27
+
28
+ it{ should == "passed" }
29
+ end
30
+
31
+ context "when failed" do
32
+ let(:client){ described_class.new("railsware/zero_deploy") }
33
+
34
+ it{ should == "failed" }
35
+ end
36
+
37
+ context "when repository was not found" do
38
+ let(:client){ described_class.new("rails/some_strange_repo") }
39
+
40
+ it{ expect{ subject }.to raise_error(Capistrano::CI::Clients::ResponseError) }
41
+ end
42
+ end
43
+ end
@@ -0,0 +1,25 @@
1
+ require 'simplecov'
2
+ require 'vcr'
3
+
4
+ SimpleCov.start do
5
+ add_filter '/spec/'
6
+
7
+ add_group 'Libraries', '/lib/'
8
+ end
9
+
10
+ VCR.configure do |c|
11
+ c.cassette_library_dir = "spec/vcr"
12
+ c.hook_into :webmock
13
+ c.configure_rspec_metadata!
14
+ c.ignore_localhost = true
15
+ end
16
+
17
+ RSpec.configure do |config|
18
+ require "capistrano/ci"
19
+
20
+ config.treat_symbols_as_metadata_keys_with_true_values = true
21
+ config.run_all_when_everything_filtered = true
22
+ config.filter_run :focus
23
+
24
+ config.order = 'random'
25
+ end
@@ -0,0 +1,122 @@
1
+ ---
2
+ http_interactions:
3
+ - request:
4
+ method: get
5
+ uri: https://api.travis-ci.org/repos/railsware/zero_deploy
6
+ body:
7
+ encoding: US-ASCII
8
+ string: ''
9
+ headers:
10
+ Accept:
11
+ - application/json; version=2
12
+ response:
13
+ status:
14
+ code: 200
15
+ message: OK
16
+ headers:
17
+ Access-Control-Allow-Credentials:
18
+ - 'true'
19
+ Access-Control-Allow-Origin:
20
+ - ! '*'
21
+ Access-Control-Expose-Headers:
22
+ - Content-Type, Cache-Control, Expires, Etag, Last-Modified
23
+ Age:
24
+ - '0'
25
+ Cache-Control:
26
+ - no-cache
27
+ Content-Type:
28
+ - application/json;charset=utf-8
29
+ Date:
30
+ - Sat, 19 Oct 2013 08:57:28 GMT
31
+ Etag:
32
+ - ! '"239eb3427e8c413b25e58cba9ffe5b3d"'
33
+ Server:
34
+ - nginx/1.5.2
35
+ Status:
36
+ - 200 OK
37
+ Strict-Transport-Security:
38
+ - max-age=31536000
39
+ Vary:
40
+ - Accept,Accept-Encoding
41
+ X-Accepted-Oauth-Scopes:
42
+ - public
43
+ X-Content-Digest:
44
+ - 1683464301ae074e6fed5351396dda29178dc27f
45
+ X-Endpoint:
46
+ - Travis::Api::App::Endpoint::Repos
47
+ X-Oauth-Scopes:
48
+ - public
49
+ X-Pattern:
50
+ - /:owner_name/:name
51
+ X-Rack-Cache:
52
+ - miss, store
53
+ Content-Length:
54
+ - '318'
55
+ Connection:
56
+ - keep-alive
57
+ body:
58
+ encoding: US-ASCII
59
+ string: ! '{"repo":{"id":544757,"slug":"railsware/zero_deploy","description":"","last_build_id":5983202,"last_build_number":"2","last_build_state":"failed","last_build_duration":31,"last_build_language":null,"last_build_started_at":"2013-04-02T11:13:13Z","last_build_finished_at":"2013-04-02T11:13:30Z","github_language":"Ruby"}}'
60
+ http_version:
61
+ recorded_at: Sat, 19 Oct 2013 08:57:33 GMT
62
+ - request:
63
+ method: get
64
+ uri: https://api.travis-ci.org/repos/544757/branches/master
65
+ body:
66
+ encoding: US-ASCII
67
+ string: ''
68
+ headers:
69
+ Accept:
70
+ - application/json; version=2
71
+ response:
72
+ status:
73
+ code: 200
74
+ message: OK
75
+ headers:
76
+ Access-Control-Allow-Credentials:
77
+ - 'true'
78
+ Access-Control-Allow-Origin:
79
+ - ! '*'
80
+ Access-Control-Expose-Headers:
81
+ - Content-Type, Cache-Control, Expires, Etag, Last-Modified
82
+ Age:
83
+ - '0'
84
+ Cache-Control:
85
+ - no-cache
86
+ Content-Type:
87
+ - application/json;charset=utf-8
88
+ Date:
89
+ - Sat, 19 Oct 2013 08:57:29 GMT
90
+ Etag:
91
+ - ! '"8112a97fe15ce9bfbe1191c9368b5ae1"'
92
+ Server:
93
+ - nginx/1.5.2
94
+ Status:
95
+ - 200 OK
96
+ Strict-Transport-Security:
97
+ - max-age=31536000
98
+ Vary:
99
+ - Accept,Accept-Encoding
100
+ X-Accepted-Oauth-Scopes:
101
+ - public
102
+ X-Content-Digest:
103
+ - 9899e89a9ea15351cbc404d88f816de9910373b0
104
+ X-Endpoint:
105
+ - Travis::Api::App::Endpoint::Repos
106
+ X-Oauth-Scopes:
107
+ - public
108
+ X-Pattern:
109
+ - /:repository_id/branches/:branch
110
+ X-Rack-Cache:
111
+ - miss, store
112
+ Content-Length:
113
+ - '700'
114
+ Connection:
115
+ - keep-alive
116
+ body:
117
+ encoding: US-ASCII
118
+ string: ! '{"branch":{"id":5983202,"repository_id":544757,"commit_id":1766529,"number":"2","config":{"language":"ruby","rvm":["1.9.3","2.0.0"],".result":"configured"},"state":"failed","started_at":"2013-04-02T11:13:13Z","finished_at":"2013-04-02T11:13:30Z","duration":31,"job_ids":[5983203,5983204],"pull_request":false},"commit":{"id":1766529,"sha":"ef87117a529b2e20a34d9ddbdee82c6baf906abd","branch":"master","message":"CI
119
+ status added","committed_at":"2013-04-02T11:10:49Z","author_name":"gregolsen","author_email":"anotheroneman@yahoo.com","committer_name":"gregolsen","committer_email":"anotheroneman@yahoo.com","compare_url":"https://github.com/railsware/zero_deploy/compare/0a2aaa3d7050...ef87117a529b"}}'
120
+ http_version:
121
+ recorded_at: Sat, 19 Oct 2013 08:57:33 GMT
122
+ recorded_with: VCR 2.6.0