The public Travis API
Go to file
Piotr Sarnacki 260c46181d Add hack to allow handling redirect to logs on the client properly.
This hack is temporary and should be removed when we find better
solution.

TL;DR: we can't handle redirects to S3 using CORS, so in case we want to
get logs from S3 without additional requests to API, we need to return
status that will not be automatically redirected (in this case 204 seems
like the best answer).

Longer rationale:

Old logs are hosted on S3 now and in case log is not available in the
database, we would like to redirect to the archived log. Although S3
support CORS, our use case breaks on some browsers:

  * when request is triggered to /jobs/:id/log and log is archived, api
    returns 302 redirect, Location header points to the log on S3
  * browser transparently redirects to given url, but it sets Origin to
    null, for security reasons
  * "Origin: null" is ok, because we allow every origin by setting
    AllowedOrigin to "*"
  * S3 returns "Access-Control-Allow-Origin: null" header, which breaks
    some browsers (I confirmed it for webkit based browsers)

In order to fix this, S3 would need to return * in
Access-Control-Allow-Origin header or we would need to tell the browser
to not follow redirect. Both solutions are not achiveable.

Another option would be to return log information in job payload - we
could send log_url field which should be either log url on amazon or
null, but in such case we would need to query artifacts table in each
job request. This is something that should be avoided as archived logs
are not frequently requested - slowing down every request to get info
for it would be a waste.
2013-01-29 03:51:22 +01:00
config Use unicorn.rb config, sans prefork for now. 2012-12-05 18:19:23 +01:00
docs fix link to travis-web 2012-11-16 17:35:17 +01:00
lib/travis/api Add hack to allow handling redirect to logs on the client properly. 2013-01-29 03:51:22 +01:00
public/images/result moar work on acceptance tests 2012-10-02 19:10:29 +02:00
script Revert "go back to unicorn for now" 2013-01-23 21:05:36 +01:00
spec Add hack to allow handling redirect to logs on the client properly. 2013-01-29 03:51:22 +01:00
.buildpacks Add last-commit-sha-buildpack 2012-11-25 23:48:39 +01:00
.gitignore Ignore log dir 2013-01-19 22:36:58 +01:00
.travis.yml Update .travis.yml 2012-10-11 15:51:47 -07:00
config.ru Revert "go back to unicorn for now" 2013-01-23 21:05:36 +01:00
Gemfile Use travis-core from master 2013-01-27 21:42:00 +01:00
Gemfile.lock Redirect to archive logs 2013-01-28 03:04:36 +01:00
Procfile add console 2012-10-23 00:24:23 +02:00
Rakefile actually use gemspec 2012-08-05 14:42:05 +02:00
README.md update readme 2012-08-15 02:25:30 +02:00
travis-api.gemspec Update newrelic 2013-01-19 18:26:55 +01:00

The public Travis API

This is the app running on https://api.travis-ci.org/

Installation

Setup:

$ bundle install

Run tests:

$ RAILS_ENV=test rake db:create db:schema:load
$ rake spec

Run the server:

$ rake db:create db:schema:load
$ foreman start

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request

API documentation

We use source code comments to add documentation. If the server is running, you can browse an HTML documenation at /docs.

Project architecture

lib
`-- travis
    `-- api
        `-- app
            |-- endpoint    # API endpoints
            |-- extensions  # Sinatra extensions
            |-- helpers     # Sinatra helpers
            `-- middleware  # Rack middleware

Classes inheriting from Endpoint or Middleware, they will automatically be set up properly.

Each endpoint class gets mapped to a prefix, which defaults to the snake-case class name (i.e. Travis::Api::App::Profile will map to /profile). It can be overridden by setting :prefix:

require 'travis/api/app'

class Travis::Api::App
  class MyRouts < Endpoint
    set :prefix, '/awesome'
  end
end