debian-mirror-gitlab/app/services/ci/register_build_service.rb

53 lines
1.9 KiB
Ruby
Raw Normal View History

2015-09-25 12:07:36 +05:30
module Ci
# This class responsible for assigning
# proper pending build to runner on runner API request
class RegisterBuildService
def execute(current_runner)
builds = Ci::Build.pending.unstarted
builds =
if current_runner.shared?
2016-06-22 15:30:34 +05:30
builds.
2016-09-29 09:46:39 +05:30
# don't run projects which have not enabled shared runners and builds
joins(:project).where(projects: { shared_runners_enabled: true }).
joins('LEFT JOIN project_features ON ci_builds.gl_project_id = project_features.project_id').
2016-06-22 15:30:34 +05:30
# this returns builds that are ordered by number of running builds
# we prefer projects that don't use shared runners at all
joins("LEFT JOIN (#{running_builds_for_shared_runners.to_sql}) AS project_builds ON ci_builds.gl_project_id=project_builds.gl_project_id").
2016-09-29 09:46:39 +05:30
where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0').
2016-06-22 15:30:34 +05:30
order('COALESCE(project_builds.running_builds, 0) ASC', 'ci_builds.id ASC')
2015-09-25 12:07:36 +05:30
else
2016-06-22 15:30:34 +05:30
# do run projects which are only assigned to this runner (FIFO)
2016-09-29 09:46:39 +05:30
builds.where(project: current_runner.projects.with_builds_enabled).order('created_at ASC')
2015-09-25 12:07:36 +05:30
end
build = builds.find do |build|
2016-06-22 15:30:34 +05:30
current_runner.can_pick?(build)
2015-09-25 12:07:36 +05:30
end
2015-10-24 18:46:33 +05:30
2015-09-25 12:07:36 +05:30
if build
# In case when 2 runners try to assign the same build, second runner will be declined
2015-12-23 02:04:40 +05:30
# with StateMachines::InvalidTransition in run! method.
2015-09-25 12:07:36 +05:30
build.with_lock do
build.runner_id = current_runner.id
build.save!
build.run!
end
end
build
2015-12-23 02:04:40 +05:30
rescue StateMachines::InvalidTransition
2015-09-25 12:07:36 +05:30
nil
end
2016-06-22 15:30:34 +05:30
private
def running_builds_for_shared_runners
Ci::Build.running.where(runner: Ci::Runner.shared).
group(:gl_project_id).select(:gl_project_id, 'count(*) AS running_builds')
end
2015-09-25 12:07:36 +05:30
end
end