Merge branch 'master' into jc-v3-logs

This commit is contained in:
carlad 2016-08-08 11:42:28 +02:00
commit c47e2dd4eb
9 changed files with 222 additions and 20 deletions

View File

@ -29,11 +29,14 @@ class Travis::Api::App
# #
# I think we need to properly deprecate this by publishing a blog post. # I think we need to properly deprecate this by publishing a blog post.
Metriks.meter("api.request.restart").mark 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] }) type = params[:build_id] ? 'build' : 'job'
payload = {id: params[:build_id], user_id: current_user.id} params[:id] = params[:build_id] || params[:job_id]
service.push("job:restart", payload)
status 202 service.push("#{type}:restart", params)
respond_with(result: true, flash: service.messages)
end end
end end
end end

View File

@ -13,7 +13,7 @@ module Travis::API::V3
elsif last_cron_build_date >= planned_time(LastBuild) elsif last_cron_build_date >= planned_time(LastBuild)
planned_time(ThisBuild) planned_time(ThisBuild)
else else
Time.now Time.now - 5.minutes
end end
end end

View File

@ -7,10 +7,15 @@ module Travis::API::V3
def start_all() def start_all()
Models::Cron.all.select do |cron| Models::Cron.all.select do |cron|
begin
@cron = cron
start(cron) if cron.next_enqueuing <= Time.now start(cron) if cron.next_enqueuing <= Time.now
end
rescue => e rescue => e
Raven.capture_exception(e) Raven.capture_exception(e, tags: { 'cron_id' => @cron.try(:id) })
sleep(10) # This ensures the dyno does not spin down before the http request to send the error to sentry completes
next
end
end
end end
def start(cron) def start(cron)
@ -21,7 +26,8 @@ module Travis::API::V3
return false return false
end 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 = { payload = {
repository: { id: branch.repository.github_id, owner_name: branch.repository.owner_name, name: branch.repository.name }, repository: { id: branch.repository.github_id, owner_name: branch.repository.owner_name, name: branch.repository.name },

View File

@ -19,6 +19,8 @@ module Travis
end end
end end
Amqps = Amqp
class << self class << self
def parse(url) def parse(url)
return Generic.new if url.nil? || url.empty? return Generic.new if url.nil? || url.empty?

View File

@ -30,7 +30,14 @@ describe 'Requests', set_app: true do
describe 'POST /requests' do describe 'POST /requests' do
it 'triggers a build request using Hub' do it 'triggers a build request using Hub' do
response = post "/requests", { build_id: build.id }, headers response = post "/requests", { build_id: build.id }, headers
response.status.should be(202) response.status.should be(200)
end end
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 end

View File

@ -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_truthy
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_truthy
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

View File

@ -43,11 +43,13 @@ describe Travis::API::V3::Models::Cron do
describe "push build is ignored if disable by build is false" do describe "push build is ignored if disable by build is false" do
before do before do
Timecop.return
Timecop.travel(DateTime.new(2015, 12, 31, 16)) Timecop.travel(DateTime.new(2015, 12, 31, 16))
end end
after do after do
Timecop.return Timecop.return
Timecop.freeze(Time.now.utc)
end end
it "for daily builds" do it "for daily builds" do
@ -85,11 +87,13 @@ describe Travis::API::V3::Models::Cron do
describe "disable by build works with build" do describe "disable by build works with build" do
before do before do
Timecop.return
Timecop.travel(DateTime.new(2015, 12, 31, 16)) Timecop.travel(DateTime.new(2015, 12, 31, 16))
end end
after do after do
Timecop.return Timecop.return
Timecop.freeze(Time.now.utc)
end end
it "for daily builds" do it "for daily builds" do
@ -121,11 +125,13 @@ describe Travis::API::V3::Models::Cron do
describe "disable by build works without build" do describe "disable by build works without build" do
before do before do
Timecop.return
Timecop.travel(DateTime.new(2015, 12, 31, 16)) Timecop.travel(DateTime.new(2015, 12, 31, 16))
end end
after do after do
Timecop.return Timecop.return
Timecop.freeze(Time.now.utc)
end end
it "for daily builds" do 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 describe "build starts now if next build time is in the past" do
before do before do
# nothing, this time Timecop.return
# time freeze is performed in examples
end end
after do after do
Timecop.return Timecop.return
Timecop.freeze(Time.now.utc)
end end
it "for daily builds with disable_by_build true" do 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) 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') 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)) 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 build.destroy
cron.destroy cron.destroy
end 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) 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') 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)) 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 build.destroy
cron.destroy cron.destroy
end 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) 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') 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)) 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 build.destroy
cron.destroy cron.destroy
end 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) 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') 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)) 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 build.destroy
cron.destroy cron.destroy
end 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) 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') 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)) 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 build.destroy
cron.destroy cron.destroy
end 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) 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') 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)) 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 build.destroy
cron.destroy cron.destroy
end end

View File

@ -4,6 +4,7 @@ describe Travis::API::V3::Queries::Crons do
let(:user) { Travis::API::V3::Models::User.find_by_login('svenfuchs') } 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(: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_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(: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') let(:query) { Travis::API::V3::Queries::Crons.new({}, 'Overview')
} }
@ -25,8 +26,22 @@ describe Travis::API::V3::Queries::Crons do
it 'enques error into a thread' 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) 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!') 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) 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
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 query.start_all
end end
end end