From 0dc1009ab42132b63a8cd047d20e544de9e69ef3 Mon Sep 17 00:00:00 2001 From: bnferguson Date: Mon, 1 Aug 2016 11:32:16 +0200 Subject: [PATCH 01/18] Patch in AMQPS support from travis-core since its vendored here --- lib/travis/config/url.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/travis/config/url.rb b/lib/travis/config/url.rb index 26e3cc6d..038fb57c 100644 --- a/lib/travis/config/url.rb +++ b/lib/travis/config/url.rb @@ -19,6 +19,8 @@ module Travis end end + Ampqs = Amqp + class << self def parse(url) return Generic.new if url.nil? || url.empty? From edf889b55fdd8c6856cb1ed9a6352c5d727dbdb3 Mon Sep 17 00:00:00 2001 From: bnferguson Date: Mon, 1 Aug 2016 11:33:52 +0200 Subject: [PATCH 02/18] fix typo --- lib/travis/config/url.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/config/url.rb b/lib/travis/config/url.rb index 038fb57c..e44400a7 100644 --- a/lib/travis/config/url.rb +++ b/lib/travis/config/url.rb @@ -19,7 +19,7 @@ module Travis end end - Ampqs = Amqp + Amqps = Amqp class << self def parse(url) From 4888c2c905638758f430fb3252c5e1efe371a425 Mon Sep 17 00:00:00 2001 From: bnferguson Date: Mon, 1 Aug 2016 11:53:11 +0200 Subject: [PATCH 03/18] Add specs for patched in travis-config updates --- spec/lib/travis/config_spec.rb | 163 +++++++++++++++++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 spec/lib/travis/config_spec.rb diff --git a/spec/lib/travis/config_spec.rb b/spec/lib/travis/config_spec.rb new file mode 100644 index 00000000..f0989e2d --- /dev/null +++ b/spec/lib/travis/config_spec.rb @@ -0,0 +1,163 @@ +require 'spec_helper' +require 'active_support/core_ext/hash/slice' + +describe Travis::Config do + let(:config) { Travis::Config.load(:files, :env, :heroku, :docker) } + + describe 'endpoints' do + it 'returns an object even without endpoints entry' do + config.endpoints.foo.should be_nil + end + + it 'returns endpoints if it is set' do + ENV['travis_config'] = YAML.dump('endpoints' => { 'ssh_key' => true }) + config.endpoints.ssh_key.should be_true + end + + it 'allows to set keys on enpoints when it is nil' do + config.endpoints.foo.should be_nil + + config.endpoints.foo = true + + config.endpoints.foo.should be_true + end + end + + describe 'defaults' do + it 'notifications defaults to []' do + config.notifications.should == [] + end + + it 'notifications.email defaults to {}' do + config.email.should == {} + end + + it 'queues defaults to []' do + config.queues.should == [] + end + + it 'ampq.host defaults to "localhost"' do + config.amqp.host.should == 'localhost' + end + + it 'ampq.prefetch defaults to 1' do + config.amqp.prefetch.should == 1 + end + + it 'queue.limit.by_owner defaults to {}' do + config.queue.limit.by_owner.should == {} + end + + it 'queue.limit.default defaults to 5' do + config.queue.limit.default.should == 5 + end + + it 'queue.interval defaults to 3' do + config.queue.interval.should == 3 + end + + it 'queue.interval defaults to 3' do + config.queue.interval.should == 3 + end + + it 'logs.shards defaults to 1' do + config.logs.shards.should == 1 + end + + it 'database' do + config.database.should == { + :adapter => 'postgresql', + :database => 'travis_test', + :encoding => 'unicode', + :min_messages => 'warning', + :variables => { :statement_timeout => 10000 } + } + end + end + + describe 'resource urls' do + describe 'with a TRAVIS_DATABASE_URL set' do + before { ENV['TRAVIS_DATABASE_URL'] = 'postgres://username:password@host:1234/database' } + after { ENV.delete('TRAVIS_DATABASE_URL') } + + it { config.database.username.should == 'username' } + it { config.database.password.should == 'password' } + it { config.database.host.should == 'host' } + it { config.database.port.should == 1234 } + it { config.database.database.should == 'database' } + it { config.database.encoding.should == 'unicode' } + end + + describe 'with a DATABASE_URL set' do + before { ENV['DATABASE_URL'] = 'postgres://username:password@host:1234/database' } + after { ENV.delete('DATABASE_URL') } + + it { config.database.username.should == 'username' } + it { config.database.password.should == 'password' } + it { config.database.host.should == 'host' } + it { config.database.port.should == 1234 } + it { config.database.database.should == 'database' } + it { config.database.encoding.should == 'unicode' } + end + + describe 'with a TRAVIS_LOGS_DATABASE_URL set' do + before { ENV['TRAVIS_LOGS_DATABASE_URL'] = 'postgres://username:password@host:1234/database' } + after { ENV.delete('TRAVIS_LOGS_DATABASE_URL') } + + it { config.logs_database.username.should == 'username' } + it { config.logs_database.password.should == 'password' } + it { config.logs_database.host.should == 'host' } + it { config.logs_database.port.should == 1234 } + it { config.logs_database.database.should == 'database' } + it { config.logs_database.encoding.should == 'unicode' } + end + + describe 'with a LOGS_DATABASE_URL set' do + before { ENV['LOGS_DATABASE_URL'] = 'postgres://username:password@host:1234/database' } + after { ENV.delete('LOGS_DATABASE_URL') } + + it { config.logs_database.username.should == 'username' } + it { config.logs_database.password.should == 'password' } + it { config.logs_database.host.should == 'host' } + it { config.logs_database.port.should == 1234 } + it { config.logs_database.database.should == 'database' } + it { config.logs_database.encoding.should == 'unicode' } + end + + describe 'with a TRAVIS_RABBITMQ_URL set' do + before { ENV['TRAVIS_RABBITMQ_URL'] = 'amqp://username:password@host:1234/vhost' } + after { ENV.delete('TRAVIS_RABBITMQ_URL') } + + it { config.amqp.username.should == 'username' } + it { config.amqp.password.should == 'password' } + it { config.amqp.host.should == 'host' } + it { config.amqp.port.should == 1234 } + it { config.amqp.vhost.should == 'vhost' } + end + + describe 'with a RABBITMQ_URL set' do + before { ENV['RABBITMQ_URL'] = 'amqp://username:password@host:1234/vhost' } + after { ENV.delete('RABBITMQ_URL') } + + it { config.amqp.username.should == 'username' } + it { config.amqp.password.should == 'password' } + it { config.amqp.host.should == 'host' } + it { config.amqp.port.should == 1234 } + it { config.amqp.vhost.should == 'vhost' } + end + + describe 'with a TRAVIS_REDIS_URL set' do + before { ENV['TRAVIS_REDIS_URL'] = 'redis://username:password@host:1234' } + after { ENV.delete('TRAVIS_REDIS_URL') } + + it { config.redis.url.should == 'redis://username:password@host:1234' } + end + + describe 'with a REDIS_URL set' do + before { ENV['REDIS_URL'] = 'redis://username:password@host:1234' } + after { ENV.delete('REDIS_URL') } + + it { config.redis.url.should == 'redis://username:password@host:1234' } + end + end +end From f4cb24c4b47c8015fe770a10ba771fd3ae393bc2 Mon Sep 17 00:00:00 2001 From: bnferguson Date: Mon, 1 Aug 2016 12:01:34 +0200 Subject: [PATCH 04/18] fix deprecation warnings --- spec/lib/travis/config_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/lib/travis/config_spec.rb b/spec/lib/travis/config_spec.rb index f0989e2d..d3f31d9c 100644 --- a/spec/lib/travis/config_spec.rb +++ b/spec/lib/travis/config_spec.rb @@ -11,7 +11,7 @@ describe Travis::Config do it 'returns endpoints if it is set' do ENV['travis_config'] = YAML.dump('endpoints' => { 'ssh_key' => true }) - config.endpoints.ssh_key.should be_true + config.endpoints.ssh_key.should be_truthy end it 'allows to set keys on enpoints when it is nil' do @@ -19,7 +19,7 @@ describe Travis::Config do config.endpoints.foo = true - config.endpoints.foo.should be_true + config.endpoints.foo.should be_truthy end end From f09e9931b26628bfdcf328af7e7156ae165209e6 Mon Sep 17 00:00:00 2001 From: Ana Rosas Date: Tue, 2 Aug 2016 09:39:00 -0500 Subject: [PATCH 05/18] Restoring requests code --- lib/travis/api/app/endpoint/requests.rb | 11 +++++++---- spec/integration/v2/requests_spec.rb | 9 ++++++++- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/travis/api/app/endpoint/requests.rb b/lib/travis/api/app/endpoint/requests.rb index d8c05a5d..aadec368 100644 --- a/lib/travis/api/app/endpoint/requests.rb +++ b/lib/travis/api/app/endpoint/requests.rb @@ -29,11 +29,14 @@ class Travis::Api::App # # I think we need to properly deprecate this by publishing a blog post. Metriks.meter("api.request.restart").mark + service = Travis::Enqueue::Services::RestartModel.new(current_user, params) + params[:user_id] = service.target.repository.owner.id - service = Travis::Enqueue::Services::RestartModel.new(current_user, { build_id: params[:build_id] }) - payload = {id: params[:build_id], user_id: current_user.id} - service.push("job:restart", payload) - status 202 + type ||= params[:build_id] ? 'build' : 'job' + params[:id] = params[:build_id] || params[:job_id] + + service.push("#{type}:restart", params) + respond_with(result: true, flash: service.messages) end end end diff --git a/spec/integration/v2/requests_spec.rb b/spec/integration/v2/requests_spec.rb index de40b043..60c3eb86 100644 --- a/spec/integration/v2/requests_spec.rb +++ b/spec/integration/v2/requests_spec.rb @@ -30,7 +30,14 @@ describe 'Requests', set_app: true do describe 'POST /requests' do it 'triggers a build request using Hub' do response = post "/requests", { build_id: build.id }, headers - response.status.should be(202) + response.status.should be(200) end end + + it 'triggers a job request' do + payload = { job_id: build.matrix.first.id, user_id: repo.owner.id } + response = post "/requests", payload, headers + response.status.should be(200) + end + end From 0f2b1edae1bc2b3b780369af7989920b98751de1 Mon Sep 17 00:00:00 2001 From: Ana Rosas Date: Tue, 2 Aug 2016 10:02:44 -0500 Subject: [PATCH 06/18] Remove unnecessary sign --- lib/travis/api/app/endpoint/requests.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/api/app/endpoint/requests.rb b/lib/travis/api/app/endpoint/requests.rb index aadec368..d8a18fdf 100644 --- a/lib/travis/api/app/endpoint/requests.rb +++ b/lib/travis/api/app/endpoint/requests.rb @@ -32,7 +32,7 @@ class Travis::Api::App service = Travis::Enqueue::Services::RestartModel.new(current_user, params) params[:user_id] = service.target.repository.owner.id - type ||= params[:build_id] ? 'build' : 'job' + type = params[:build_id] ? 'build' : 'job' params[:id] = params[:build_id] || params[:job_id] service.push("#{type}:restart", params) From d0a143d76a366b5b0a21b197d6da9d1a300eeea5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 19:44:33 -0400 Subject: [PATCH 07/18] ensure that the Time.now builds get started and tag the Sentry errors from cron --- lib/travis/api/v3/models/cron.rb | 2 +- lib/travis/api/v3/queries/crons.rb | 3 ++- spec/v3/models/cron_spec.rb | 22 ++++++++++++++-------- spec/v3/queries/cron_spec.rb | 2 +- 4 files changed, 18 insertions(+), 11 deletions(-) diff --git a/lib/travis/api/v3/models/cron.rb b/lib/travis/api/v3/models/cron.rb index 68f664f2..e86527a9 100644 --- a/lib/travis/api/v3/models/cron.rb +++ b/lib/travis/api/v3/models/cron.rb @@ -13,7 +13,7 @@ module Travis::API::V3 elsif last_cron_build_date >= planned_time(LastBuild) planned_time(ThisBuild) else - Time.now + Time.now - 5.minutes end end diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index d5799d58..b5daefdd 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -7,10 +7,11 @@ module Travis::API::V3 def start_all() Models::Cron.all.select do |cron| + @cron = cron start(cron) if cron.next_enqueuing <= Time.now end rescue => e - Raven.capture_exception(e) + Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) end def start(cron) diff --git a/spec/v3/models/cron_spec.rb b/spec/v3/models/cron_spec.rb index 9e323e66..7b9dd93a 100644 --- a/spec/v3/models/cron_spec.rb +++ b/spec/v3/models/cron_spec.rb @@ -43,11 +43,13 @@ describe Travis::API::V3::Models::Cron do describe "push build is ignored if disable by build is false" do before do + Timecop.return Timecop.travel(DateTime.new(2015, 12, 31, 16)) end after do Timecop.return + Timecop.freeze(Time.now.utc) end it "for daily builds" do @@ -85,11 +87,13 @@ describe Travis::API::V3::Models::Cron do describe "disable by build works with build" do before do + Timecop.return Timecop.travel(DateTime.new(2015, 12, 31, 16)) end after do Timecop.return + Timecop.freeze(Time.now.utc) end it "for daily builds" do @@ -121,11 +125,13 @@ describe Travis::API::V3::Models::Cron do describe "disable by build works without build" do before do + Timecop.return Timecop.travel(DateTime.new(2015, 12, 31, 16)) end after do Timecop.return + Timecop.freeze(Time.now.utc) end it "for daily builds" do @@ -157,12 +163,12 @@ describe Travis::API::V3::Models::Cron do describe "build starts now if next build time is in the past" do before do - # nothing, this time - # time freeze is performed in examples + Timecop.return end after do Timecop.return + Timecop.freeze(Time.now.utc) end it "for daily builds with disable_by_build true" do @@ -170,7 +176,7 @@ describe Travis::API::V3::Models::Cron do cron = Travis::API::V3::Models::Cron.create(branch_id: branch.id, interval: 'daily', disable_by_build: true) build = Travis::API::V3::Models::Build.create(:repository_id => repo.id, :branch_name => branch.name, :event_type => 'cron') Timecop.freeze(DateTime.new(2016, 1, 1, 19)) - expect(cron.next_enqueuing).to be == DateTime.now + expect(cron.next_enqueuing).to be == DateTime.now - 5.minutes build.destroy cron.destroy end @@ -180,7 +186,7 @@ describe Travis::API::V3::Models::Cron do cron = Travis::API::V3::Models::Cron.create(branch_id: branch.id, interval: 'daily', disable_by_build: false) build = Travis::API::V3::Models::Build.create(:repository_id => repo.id, :branch_name => branch.name, :event_type => 'cron') Timecop.freeze(DateTime.new(2016, 1, 1, 19)) - expect(cron.next_enqueuing).to be == DateTime.now + expect(cron.next_enqueuing).to be == DateTime.now - 5.minutes build.destroy cron.destroy end @@ -190,7 +196,7 @@ describe Travis::API::V3::Models::Cron do cron = Travis::API::V3::Models::Cron.create(branch_id: branch.id, interval: 'weekly', disable_by_build: true) build = Travis::API::V3::Models::Build.create(:repository_id => repo.id, :branch_name => branch.name, :event_type => 'cron') Timecop.freeze(DateTime.new(2016, 1, 7, 19)) - expect(cron.next_enqueuing).to be == DateTime.now + expect(cron.next_enqueuing).to be == DateTime.now - 5.minutes build.destroy cron.destroy end @@ -200,7 +206,7 @@ describe Travis::API::V3::Models::Cron do cron = Travis::API::V3::Models::Cron.create(branch_id: branch.id, interval: 'weekly', disable_by_build: false) build = Travis::API::V3::Models::Build.create(:repository_id => repo.id, :branch_name => branch.name, :event_type => 'cron') Timecop.freeze(DateTime.new(2016, 1, 7, 19)) - expect(cron.next_enqueuing).to be == DateTime.now + expect(cron.next_enqueuing).to be == DateTime.now - 5.minutes build.destroy cron.destroy end @@ -210,7 +216,7 @@ describe Travis::API::V3::Models::Cron do cron = Travis::API::V3::Models::Cron.create(branch_id: branch.id, interval: 'monthly', disable_by_build: true) build = Travis::API::V3::Models::Build.create(:repository_id => repo.id, :branch_name => branch.name, :event_type => 'cron') Timecop.freeze(DateTime.new(2016, 1, 31, 19)) - expect(cron.next_enqueuing).to be == DateTime.now + expect(cron.next_enqueuing).to be == DateTime.now - 5.minutes build.destroy cron.destroy end @@ -220,7 +226,7 @@ describe Travis::API::V3::Models::Cron do cron = Travis::API::V3::Models::Cron.create(branch_id: branch.id, interval: 'monthly', disable_by_build: false) build = Travis::API::V3::Models::Build.create(:repository_id => repo.id, :branch_name => branch.name, :event_type => 'cron') Timecop.freeze(DateTime.new(2016, 1, 31, 19)) - expect(cron.next_enqueuing).to be == DateTime.now + expect(cron.next_enqueuing).to be == DateTime.now - 5.minutes build.destroy cron.destroy end diff --git a/spec/v3/queries/cron_spec.rb b/spec/v3/queries/cron_spec.rb index d6d16889..7013495b 100644 --- a/spec/v3/queries/cron_spec.rb +++ b/spec/v3/queries/cron_spec.rb @@ -26,7 +26,7 @@ describe Travis::API::V3::Queries::Crons do cron = Travis::API::V3::Models::Cron.create(branch_id: existing_branch.id, interval: 'daily', disable_by_build: false) error = StandardError.new('Konstantin broke all the thingz!') Travis::API::V3::Models::Cron.any_instance.stubs(:branch).raises(error) - Raven.expects(:capture_exception).with(error) + Raven.expects(:capture_exception).with(error, tags: {'cron_id' => cron.id }) query.start_all end end From 6ca063cf3dbf6fe611ae4dd90952574c82c8fcfb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 21:26:04 -0400 Subject: [PATCH 08/18] adding an error to see if I get it from Sentry --- lib/travis/api/v3/queries/crons.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index b5daefdd..dfa730a5 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -8,6 +8,7 @@ module Travis::API::V3 def start_all() Models::Cron.all.select do |cron| @cron = cron + bad_things start(cron) if cron.next_enqueuing <= Time.now end rescue => e From d41ddd7171af89b71fbc81799a200c29264a04c6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 22:03:31 -0400 Subject: [PATCH 09/18] testing console on staging --- lib/travis/api/app.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/api/app.rb b/lib/travis/api/app.rb index d61a498b..fe1e8e7b 100644 --- a/lib/travis/api/app.rb +++ b/lib/travis/api/app.rb @@ -195,7 +195,7 @@ module Travis::Api end end - if use_monitoring? && !console? + if use_monitoring? #&& !console? setup_monitoring end end From 20d4df8af34e066b0d49389b92ea8de7ad95af1d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 22:34:49 -0400 Subject: [PATCH 10/18] test output for staging --- lib/travis/api/v3/queries/crons.rb | 3 +++ lib/travis/api/v3/service.rb | 2 +- script/start_crons | 4 ++++ 3 files changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index dfa730a5..e1b5af1b 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -6,8 +6,11 @@ module Travis::API::V3 end def start_all() + puts "starting #{Models::Cron.count} crons." Models::Cron.all.select do |cron| @cron = cron + puts cron.next_enqueuing + puts Time.now bad_things start(cron) if cron.next_enqueuing <= Time.now end diff --git a/lib/travis/api/v3/service.rb b/lib/travis/api/v3/service.rb index f3243189..7a87f44c 100644 --- a/lib/travis/api/v3/service.rb +++ b/lib/travis/api/v3/service.rb @@ -68,7 +68,7 @@ module Travis::API::V3 def check_login_and_find(*args) raise LoginRequired unless access_control.full_access_or_logged_in? - find(*args) or raise NotFound + find(*args) or raise NotFound end def not_found(actually_not_found = false, type = nil) diff --git a/script/start_crons b/script/start_crons index 63a0273e..13e69b46 100755 --- a/script/start_crons +++ b/script/start_crons @@ -6,4 +6,8 @@ require 'travis/api/app' Travis::Api::App.setup +puts "start" + Travis::API::V3::Services::Crons::Start.new(nil,nil,nil).run! + +puts "done" From 1788e0c0fb02419a9603ff4e55ab6286f3160739 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 22:42:32 -0400 Subject: [PATCH 11/18] more output for the strange behavior on staging --- lib/travis/api/v3/queries/crons.rb | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index e1b5af1b..2273f4cb 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -15,7 +15,9 @@ module Travis::API::V3 start(cron) if cron.next_enqueuing <= Time.now end rescue => e - Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) + puts "bad things happened" + puts e.inspect + puts Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) end def start(cron) From d42362eacc761f8d3aa2391120428cc38cbf7c7f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 22:49:02 -0400 Subject: [PATCH 12/18] looks like Raven isn't getting the reports because the dyno doesn't exist long enough for the http request to get out :( --- lib/travis/api/v3/queries/crons.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index 2273f4cb..561f269b 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -18,6 +18,7 @@ module Travis::API::V3 puts "bad things happened" puts e.inspect puts Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) + sleep(10) end def start(cron) From 0dc7e2743c4e43984ea3b78d46e53730c38a3c49 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 22:56:13 -0400 Subject: [PATCH 13/18] take intentional error out to see real errors --- lib/travis/api/v3/queries/crons.rb | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index 561f269b..a0420ad3 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -11,7 +11,6 @@ module Travis::API::V3 @cron = cron puts cron.next_enqueuing puts Time.now - bad_things start(cron) if cron.next_enqueuing <= Time.now end rescue => e From abe7b13605ef085300d9e25ff29fbe96ef75a138 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 23:16:00 -0400 Subject: [PATCH 14/18] better output --- lib/travis/api/v3/queries/crons.rb | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index a0420ad3..c6ede5e8 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -6,12 +6,12 @@ module Travis::API::V3 end def start_all() - puts "starting #{Models::Cron.count} crons." + puts "reviewing #{Models::Cron.count} crons." Models::Cron.all.select do |cron| @cron = cron - puts cron.next_enqueuing - puts Time.now - start(cron) if cron.next_enqueuing <= Time.now + ne = cron.next_enqueuing + puts "Next enqueuing: #{ne}, time now: #{Time.now}, will it run? #{ne <= Time.now}" + start(cron) if ne <= Time.now end rescue => e puts "bad things happened" From 779b6a569ebaafc27b7cefafc3c00419205f7657 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Tue, 2 Aug 2016 23:49:47 -0400 Subject: [PATCH 15/18] don't allow one error to stop all crons from running --- lib/travis/api/v3/queries/crons.rb | 19 ++++++++++--------- spec/v3/queries/cron_spec.rb | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 9 deletions(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index c6ede5e8..f848b6e3 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -8,16 +8,17 @@ module Travis::API::V3 def start_all() puts "reviewing #{Models::Cron.count} crons." Models::Cron.all.select do |cron| - @cron = cron - ne = cron.next_enqueuing - puts "Next enqueuing: #{ne}, time now: #{Time.now}, will it run? #{ne <= Time.now}" - start(cron) if ne <= Time.now + begin + @cron = cron + ne = cron.next_enqueuing + puts "Next enqueuing: #{ne}, time now: #{Time.now}, will it run? #{ne <= Time.now}" + start(cron) if ne <= Time.now + rescue => e + Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) + sleep(10) + next + end end - rescue => e - puts "bad things happened" - puts e.inspect - puts Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) - sleep(10) end def start(cron) diff --git a/spec/v3/queries/cron_spec.rb b/spec/v3/queries/cron_spec.rb index 7013495b..1418a6e0 100644 --- a/spec/v3/queries/cron_spec.rb +++ b/spec/v3/queries/cron_spec.rb @@ -4,6 +4,7 @@ describe Travis::API::V3::Queries::Crons do let(:user) { Travis::API::V3::Models::User.find_by_login('svenfuchs') } let(:repo) { Travis::API::V3::Models::Repository.where(owner_name: 'svenfuchs', name: 'minimal').first } let(:existing_branch) { Travis::API::V3::Models::Branch.create(repository: repo, name: 'cron-test-existing', exists_on_github: true) } + let(:existing_branch2) { Travis::API::V3::Models::Branch.create(repository: repo, name: 'cron-test-existing2', exists_on_github: true) } let(:non_existing_branch) { Travis::API::V3::Models::Branch.create(repository: repo, name: 'cron-test-non-existing', exists_on_github: false) } let(:query) { Travis::API::V3::Queries::Crons.new({}, 'Overview') } @@ -25,9 +26,23 @@ describe Travis::API::V3::Queries::Crons do it 'enques error into a thread' do cron = Travis::API::V3::Models::Cron.create(branch_id: existing_branch.id, interval: 'daily', disable_by_build: false) error = StandardError.new('Konstantin broke all the thingz!') + Travis::API::V3::Queries::Crons.any_instance.expects(:sleep).with(10) Travis::API::V3::Models::Cron.any_instance.stubs(:branch).raises(error) Raven.expects(:capture_exception).with(error, tags: {'cron_id' => cron.id }) query.start_all end + + it 'continues running crons if one breaks' do + cron = Travis::API::V3::Models::Cron.create(branch_id: existing_branch.id, interval: 'daily', disable_by_build: false) + cron2 = Travis::API::V3::Models::Cron.create(branch_id: existing_branch2.id, interval: 'daily', disable_by_build: false) + + error = StandardError.new('Konstantin broke all the thingz!') + Travis::API::V3::Models::Cron.any_instance.stubs(:branch).raises(error) + + Travis::API::V3::Queries::Crons.any_instance.expects(:sleep).twice.with(10) + Raven.expects(:capture_exception).with(error, tags: {'cron_id' => cron.id }) + Raven.expects(:capture_exception).with(error, tags: {'cron_id' => cron2.id }) + query.start_all + end end end From 77e47bc41af2d31727acce23a440f41a1d3fa930 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Wed, 3 Aug 2016 00:13:43 -0400 Subject: [PATCH 16/18] don't report console errors to Sentry --- lib/travis/api/app.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/travis/api/app.rb b/lib/travis/api/app.rb index fe1e8e7b..d61a498b 100644 --- a/lib/travis/api/app.rb +++ b/lib/travis/api/app.rb @@ -195,7 +195,7 @@ module Travis::Api end end - if use_monitoring? #&& !console? + if use_monitoring? && !console? setup_monitoring end end From 8655579a94acdc8cb9ecdd31ad72fd427ba9ba67 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Wed, 3 Aug 2016 00:17:11 -0400 Subject: [PATCH 17/18] clean up the debug output --- lib/travis/api/v3/queries/crons.rb | 7 ++----- script/start_crons | 4 ---- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index f848b6e3..0932d178 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -6,16 +6,13 @@ module Travis::API::V3 end def start_all() - puts "reviewing #{Models::Cron.count} crons." Models::Cron.all.select do |cron| begin @cron = cron - ne = cron.next_enqueuing - puts "Next enqueuing: #{ne}, time now: #{Time.now}, will it run? #{ne <= Time.now}" - start(cron) if ne <= Time.now + start(cron) if cron.next_enqueuing <= Time.now rescue => e Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) }) - sleep(10) + sleep(10) # This ensures the dyno does not spin down before the http request to send the error to sentry completes next end end diff --git a/script/start_crons b/script/start_crons index 13e69b46..63a0273e 100755 --- a/script/start_crons +++ b/script/start_crons @@ -6,8 +6,4 @@ require 'travis/api/app' Travis::Api::App.setup -puts "start" - Travis::API::V3::Services::Crons::Start.new(nil,nil,nil).run! - -puts "done" From 885ae009f4cb146211b8518cefa16d05abcf50fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ren=C3=A9e=20Hendricksen?= Date: Thu, 4 Aug 2016 15:05:20 -0400 Subject: [PATCH 18/18] fix the reported error on crons --- lib/travis/api/v3/queries/crons.rb | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/travis/api/v3/queries/crons.rb b/lib/travis/api/v3/queries/crons.rb index 0932d178..83a00245 100644 --- a/lib/travis/api/v3/queries/crons.rb +++ b/lib/travis/api/v3/queries/crons.rb @@ -26,7 +26,8 @@ module Travis::API::V3 return false end - user_id = branch.repository.users.detect { |u| u.github_oauth_token }.id + user_id = branch.repository.users.detect { |u| u.github_oauth_token }.try(:id) + user_id ||= branch.repository.owner.id payload = { repository: { id: branch.repository.github_id, owner_name: branch.repository.owner_name, name: branch.repository.name },