diff --git a/Gemfile.lock b/Gemfile.lock index 2492b04a..cd108449 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -48,7 +48,7 @@ GIT GIT remote: git://github.com/travis-ci/travis-core.git - revision: 9978518236afb520c8fff68bebe7beb62f8ad776 + revision: f1d4c3246ea7a5434076fdc7026aa11a2c90bdac specs: travis-core (0.0.1) actionmailer (~> 3.2.19) @@ -56,6 +56,7 @@ GIT coder (~> 0.4.0) data_migrations (~> 0.0.1) gh + google-api-client (~> 0.9.4) hashr metriks (~> 0.9.7) multi_json @@ -66,7 +67,7 @@ GIT rollout (~> 1.1.0) s3 (~> 0.3) simple_states (~> 1.0.0) - thor (~> 0.14.6) + thor travis-config (~> 0.1.0) virtus (~> 1.0.0) @@ -191,6 +192,24 @@ GEM multi_json (~> 1.0) net-http-persistent (>= 2.7) net-http-pipeline + google-api-client (0.9.4) + addressable (~> 2.3) + googleauth (~> 0.5) + httpclient (~> 2.7) + hurley (~> 0.1) + memoist (~> 0.11) + mime-types (>= 1.6) + representable (~> 2.3.0) + retriable (~> 2.0) + thor (~> 0.19) + googleauth (0.5.1) + faraday (~> 0.9) + jwt (~> 1.4) + logging (~> 2.0) + memoist (~> 0.12) + multi_json (~> 1.11) + os (~> 0.9) + signet (~> 0.7) hashr (0.0.22) hike (1.2.3) hitimes (1.2.3) @@ -198,20 +217,27 @@ GEM multi_json (~> 1.0) multi_xml (>= 0.5.2) httpclient (2.7.1) + hurley (0.2) i18n (0.7.0) ice_nine (0.11.2) jemalloc (1.0.1) journey (1.0.4) json (1.8.3) + jwt (1.5.4) kgio (2.9.2) listen (1.0.3) rb-fsevent (>= 0.9.3) rb-inotify (>= 0.9) rb-kqueue (>= 0.2) + little-plugger (1.1.4) + logging (2.1.0) + little-plugger (~> 1.1) + multi_json (~> 1.10) mail (2.5.4) mime-types (~> 1.16) treetop (~> 1.4.8) memcachier (0.0.2) + memoist (0.14.0) metaclass (0.0.4) method_source (0.8.2) metriks (0.9.9.6) @@ -229,6 +255,7 @@ GEM multipart-post (2.0.0) net-http-persistent (2.9.4) net-http-pipeline (1.0.1) + os (0.9.6) pg (0.18.2) polyglot (0.3.5) proxies (0.2.1) @@ -270,8 +297,11 @@ GEM redis (3.2.2) redis-namespace (1.5.1) redis (~> 3.0, >= 3.0.4) + representable (2.3.0) + uber (~> 0.0.7) rerun (0.8.2) listen (~> 1.0.3) + retriable (2.1.0) rollout (1.1.0) rspec (2.99.0) rspec-core (~> 2.99.0) @@ -292,6 +322,11 @@ GEM json redis (>= 3.0.6) redis-namespace (>= 1.3.1) + signet (0.7.2) + addressable (~> 2.3) + faraday (~> 0.9) + jwt (~> 1.5) + multi_json (~> 1.10) simple_states (1.0.1) activesupport hashr (~> 0.0.10) @@ -320,7 +355,7 @@ GEM rack (~> 1.0) tilt (~> 1.1, != 1.3.0) stackprof (0.2.7) - thor (0.14.6) + thor (0.19.1) thread_safe (0.3.5) tilt (1.4.1) timecop (0.8.0) @@ -333,6 +368,7 @@ GEM polyglot polyglot (>= 0.3.1) tzinfo (0.3.48) + uber (0.0.15) unicorn (4.8.3) kgio (~> 2.6) rack @@ -390,6 +426,3 @@ DEPENDENCIES travis-yaml! unicorn yard-sinatra! - -BUNDLED WITH - 1.12.0.pre.1 diff --git a/README.md b/README.md index 5ed8b817..4388b241 100644 --- a/README.md +++ b/README.md @@ -4,50 +4,68 @@ This is the app running on https://api.travis-ci.org/ ## Requirements +You will need the following packages to get travis-api to work: + 1. PostgreSQL 9.3 or higher -1. Redis -1. RabbitMQ -1. Nginx *NB: If working on Ubuntu please install Nginx manually from source. [This guide](http://www.rackspace.com/knowledge_center/article/ubuntu-and-debian-installing-nginx-from-source) is helpful but make sure you install the [latest stable version](https://www.nginx.com/resources/wiki/start/topics/tutorials/install/#stable), include the user name on your ubuntu machine when compiling (add `--user=[yourusername]` as an option when running `./configure`), and don't follow any subsequent server configuration steps. Travis-api will start and configure its own nginx server when run locally. +2. Bundler +3. Redis Server +4. *Optional:* RabbitMQ Server +5. Nginx - + *If working in Ubuntu please install nginx manually from source: Download and extract latest nginx version, open a terminal in extracted folder and then run the following:* +```sh-session + $ sudo apt-get install libpcre3 libpcre3-dev + $ auto/configure --user=$USER + $ make + $ sudo make install + $ sudo ln -s /usr/local/nginx/sbin/nginx /bin/nginx +``` ## Installation ### Setup - - $ bundle install - +```sh-session +$ bundle install +``` ### Database setup +*You might need to create a role first. For this you should run the following:* +```sh-session +$ sudo -u postgres psql -c "CREATE USER yourusername WITH SUPERUSER PASSWORD 'yourpassword'" +``` + NB detail for how `rake` sets up the database can be found in the `Rakefile`. In the `namespace :db` block you will see the database name is configured using the environment variable RAILS_ENV. If you are using a different configuration you will have to make your own adjustments. - -1. `bundle exec rake db:create` -2. for testing 'RAILS_ENV=test bundle exec rake db:create --trace' -1. Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`): ```sh-session -cd .. -git clone https://github.com/travis-ci/travis-logs.git -cd travis-logs -rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby -psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development -pg_dump -t logs travis_logs_development | psql -U postgres travis_development +$ RAILS_ENV=development bundle exec rake db:create +$ RAILS_ENV=test bundle exec rake db:create +``` +#### Optional +Clone `travis-logs` and copy the `logs` database (assume the PostgreSQL user is `postgres`): +```sh-session +$ cd .. +$ git clone https://github.com/travis-ci/travis-logs.git +$ cd travis-logs +$ rvm jruby do bundle exec rake db:migrate # `travis-logs` requires JRuby +$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_development +$ pg_dump -t logs travis_logs_development | psql -U postgres travis_development + +$ RAILS_ENV=test bundle exec rake db:create +$ pushd ../travis-logs +$ RAILS_ENV=test rvm jruby do bundle exec rake db:migrate +$ psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test +$ pg_dump -t logs travis_logs_test | psql -U postgres travis_test +$ popd ``` -Repeat the database steps for `RAILS_ENV=test`. -```sh-session -RAILS_ENV=test bundle exec rake db:create -pushd ../travis-logs -RAILS_ENV=test rvm jruby do bundle exec rake db:migrate -psql -c "DROP TABLE IF EXISTS logs CASCADE" -U postgres travis_test -pg_dump -t logs travis_logs_test | psql -U postgres travis_test -popd -``` ### Run tests - - $ rake spec - +```sh-session +$ bundle exec rspec +``` ### Run the server - - $ bundle exec script/server +```sh-session +$ bundle exec script/server +``` +If you have problems with Nginx because the websocket is already in use, try restarting your computer. ## Contributing diff --git a/lib/travis/api/v3/models/request.rb b/lib/travis/api/v3/models/request.rb index fd1387a8..1baec65c 100644 --- a/lib/travis/api/v3/models/request.rb +++ b/lib/travis/api/v3/models/request.rb @@ -1,10 +1,20 @@ module Travis::API::V3 class Models::Request < Model + BRANCH_REF = %r{refs/heads/(.*?)$} + belongs_to :commit belongs_to :repository belongs_to :owner, polymorphic: true has_many :builds serialize :config serialize :payload + + def branch_name + ref =~ BRANCH_REF and $1 + end + + def ref + payload['ref'] if payload + end end end diff --git a/lib/travis/api/v3/renderer/request.rb b/lib/travis/api/v3/renderer/request.rb index 356a74fe..112315fc 100644 --- a/lib/travis/api/v3/renderer/request.rb +++ b/lib/travis/api/v3/renderer/request.rb @@ -3,6 +3,6 @@ require 'travis/api/v3/renderer/model_renderer' module Travis::API::V3 class Renderer::Request < Renderer::ModelRenderer representation(:minimal, :id) - representation(:standard, :id, :repository, :commit, :owner, :created_at, :result, :message, :event_type) + representation(:standard, :id, :repository, :branch_name, :commit, :owner, :created_at, :result, :message, :event_type) end end diff --git a/lib/travis/api/v3/services/requests/create.rb b/lib/travis/api/v3/services/requests/create.rb index 1d4d0978..ea3827de 100644 --- a/lib/travis/api/v3/services/requests/create.rb +++ b/lib/travis/api/v3/services/requests/create.rb @@ -1,7 +1,7 @@ module Travis::API::V3 class Services::Requests::Create < Service TIME_FRAME = 1.hour - LIMIT = 10 + LIMIT = 10 private_constant :TIME_FRAME, :LIMIT result_type :request @@ -24,7 +24,7 @@ module Travis::API::V3 def limit(repository) if repository.settings.nil? - LIMIT + Travis.config.requests_create_api_limit || LIMIT else repository.settings["api_builds_rate_limit"] || Travis.config.requests_create_api_limit || LIMIT end diff --git a/spec/v3/services/requests/find_spec.rb b/spec/v3/services/requests/find_spec.rb new file mode 100644 index 00000000..f6a8bd7c --- /dev/null +++ b/spec/v3/services/requests/find_spec.rb @@ -0,0 +1,60 @@ +require 'spec_helper' + +describe Travis::API::V3::Services::Requests::Find do + let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } + let(:request) { repo.requests.first } + + describe "fetching requests on a public repository" do + before { get("/v3/repo/#{repo.id}/requests") } + example { expect(last_response).to be_ok } + example { expect(JSON.load(body).to_s).to include( + "@type", + "requests", + "/v3/repo/#{repo.id}/requests", + "repository", + "commit", + "message", + "the commit message", + "branch_name", + "representation", + "@pagination", + "owner", + "created_at", + "result", + "sha", + "svenfuchs/minimal", + "event_type", + "push") + } + end + + describe "fetching requests on private repository, private API, authenticated as user with access" do + let(:token) { Travis::Api::App::AccessToken.create(user: repo.owner, app_id: 1) } + let(:headers) {{ 'HTTP_AUTHORIZATION' => "token #{token}" }} + before { Travis::API::V3::Models::Permission.create(repository: repo, user: repo.owner, pull: true) } + before { repo.update_attribute(:private, true) } + before { get("/v3/repo/#{repo.id}/requests", {}, headers) } + after { repo.update_attribute(:private, false) } + example { expect(last_response).to be_ok } + example { expect(JSON.load(body).to_s).to include( + "@type", + "requests", + "/v3/repo/#{repo.id}/requests", + "repository", + "commit", + "message", + "the commit message", + "branch_name", + "representation", + "@pagination", + "owner", + "created_at", + "result", + "sha", + "svenfuchs/minimal", + "event_type", + "push") + } + + end +end