From 2a9a01b955c1f8081d669724d8592e4cac7d5f19 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Wed, 18 Apr 2018 18:42:58 +0200 Subject: Add variables option to Ci::CreatePipelineService --- app/services/ci/create_pipeline_service.rb | 1 + 1 file changed, 1 insertion(+) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 6ce86983287..4bbda434c6c 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -24,6 +24,7 @@ module Ci ignore_skip_ci: ignore_skip_ci, save_incompleted: save_on_errors, seeds_block: block, + variables: params[:variables_attributes], project: project, current_user: current_user) -- cgit v1.2.1 From 80cc9df926b5dddfa0d8eeeeaba43bda8fdba401 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matija=20=C4=8Cupi=C4=87?= Date: Wed, 18 Apr 2018 19:28:34 +0200 Subject: Use variables_attributes intead of variables --- app/services/ci/create_pipeline_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/create_pipeline_service.rb b/app/services/ci/create_pipeline_service.rb index 4bbda434c6c..17a53b6a8fd 100644 --- a/app/services/ci/create_pipeline_service.rb +++ b/app/services/ci/create_pipeline_service.rb @@ -24,7 +24,7 @@ module Ci ignore_skip_ci: ignore_skip_ci, save_incompleted: save_on_errors, seeds_block: block, - variables: params[:variables_attributes], + variables_attributes: params[:variables_attributes], project: project, current_user: current_user) -- cgit v1.2.1 From d8675bd45f6f9b5af701343fbff7650f49559048 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Wed, 4 Oct 2017 17:37:05 +0200 Subject: select group runners also in build queue service --- app/services/ci/update_build_queue_service.rb | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index 152c8ae5006..4fb03d2fa1b 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -7,11 +7,19 @@ module Ci end end - return unless build.project.shared_runners_enabled? + if build.project.group_runners_enabled? + Ci::Runner.belonging_to_group(build.project_id).each do |runner| + if runner.can_pick?(build) + runner.tick_runner_queue + end + end + end - Ci::Runner.shared.each do |runner| - if runner.can_pick?(build) - runner.tick_runner_queue + if build.project.shared_runners_enabled? + Ci::Runner.shared.each do |runner| + if runner.can_pick?(build) + runner.tick_runner_queue + end end end end -- cgit v1.2.1 From 743c32270e2913a19999bd32d6208e80dd62dc2a Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Thu, 5 Oct 2017 13:29:21 +0200 Subject: select group runners also in register_job_service --- app/services/ci/register_job_service.rb | 45 ++++++++++++++++++++++++++------- 1 file changed, 36 insertions(+), 9 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 0b087ad73da..000ae3539e3 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -17,6 +17,8 @@ module Ci builds = if runner.shared? builds_for_shared_runner + elsif runner.group? + builds_for_group_runner else builds_for_specific_runner end @@ -69,16 +71,33 @@ module Ci private def builds_for_shared_runner - new_builds. - # don't run projects which have not enabled shared runners and builds - joins(:project).where(projects: { shared_runners_enabled: true, pending_delete: false }) + builds_for_scheduled_runner( + running_builds_for_shared_runners, + projects: { shared_runners_enabled: true } + ) + end + + def builds_for_group_runner + builds_for_scheduled_runner( + running_builds_for_group_runners, + projects: { group_runners_enabled: true } + ) + end + + def builds_for_scheduled_runner(build_join, project_where) + project_where = project_where.deep_merge(projects: { pending_delete: false }) + + # don't run projects which have not enabled group runners and builds + builds = new_builds + .joins(:project).where(project_where) .joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id') - .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0'). + .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0') - # Implement fair scheduling - # 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.project_id=project_builds.project_id") + # Implement fair scheduling + # this returns builds that are ordered by number of running builds + # we prefer projects that don't use group runners at all + builds + .joins("LEFT JOIN (#{build_join.to_sql}) AS project_builds ON ci_builds.project_id=project_builds.project_id") .order('COALESCE(project_builds.running_builds, 0) ASC', 'ci_builds.id ASC') end @@ -87,7 +106,15 @@ module Ci end def running_builds_for_shared_runners - Ci::Build.running.where(runner: Ci::Runner.shared) + running_builds_for_runners(Ci::Runner.shared) + end + + def running_builds_for_group_runners + running_builds_for_runners(Ci::Runner.joins(:runner_groups)) + end + + def running_builds_for_runners(runners) + Ci::Build.running.where(runner: runners) .group(:project_id).select(:project_id, 'count(*) AS running_builds') end -- cgit v1.2.1 From d66941002ed946b6266642515a91284dec4105c6 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 30 Oct 2017 16:17:17 +0100 Subject: dry up: extract method --- app/services/ci/update_build_queue_service.rb | 26 +++++++++++--------------- 1 file changed, 11 insertions(+), 15 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index 4fb03d2fa1b..ab81766abf3 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -1,26 +1,22 @@ module Ci class UpdateBuildQueueService def execute(build) - build.project.runners.each do |runner| - if runner.can_pick?(build) - runner.tick_runner_queue - end - end + tick_for(build, build.project.runners) if build.project.group_runners_enabled? - Ci::Runner.belonging_to_group(build.project_id).each do |runner| - if runner.can_pick?(build) - runner.tick_runner_queue - end - end + tick_for(build, Ci::Runner.belonging_to_group(build.project_id)) end if build.project.shared_runners_enabled? - Ci::Runner.shared.each do |runner| - if runner.can_pick?(build) - runner.tick_runner_queue - end - end + tick_for(build, Ci::Runner.shared) + end + end + + private + + def tick_for(build, runners) + runners.each do |runner| + runner.tick_runner_queue if runner.can_pick?(build) end end end -- cgit v1.2.1 From 9bed8de9100a394257a4a55e8b87bcfd015f0fbd Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Tue, 19 Dec 2017 15:12:21 +0100 Subject: simplify runner selection don't differentiate between the different runner types, instead we rely on the Runner model to provide the available projects. scheduling is now applied to all runners equally. --- app/services/ci/register_job_service.rb | 70 +++++++-------------------------- 1 file changed, 14 insertions(+), 56 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 000ae3539e3..64549ea3ce2 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -14,14 +14,7 @@ module Ci end def execute - builds = - if runner.shared? - builds_for_shared_runner - elsif runner.group? - builds_for_group_runner - else - builds_for_specific_runner - end + builds = builds_for_runner valid = true @@ -70,62 +63,27 @@ module Ci private - def builds_for_shared_runner - builds_for_scheduled_runner( - running_builds_for_shared_runners, - projects: { shared_runners_enabled: true } - ) - end - - def builds_for_group_runner - builds_for_scheduled_runner( - running_builds_for_group_runners, - projects: { group_runners_enabled: true } - ) - end - - def builds_for_scheduled_runner(build_join, project_where) - project_where = project_where.deep_merge(projects: { pending_delete: false }) - - # don't run projects which have not enabled group runners and builds - builds = new_builds - .joins(:project).where(project_where) - .joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id') - .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0') - - # Implement fair scheduling - # this returns builds that are ordered by number of running builds - # we prefer projects that don't use group runners at all - builds - .joins("LEFT JOIN (#{build_join.to_sql}) AS project_builds ON ci_builds.project_id=project_builds.project_id") - .order('COALESCE(project_builds.running_builds, 0) ASC', 'ci_builds.id ASC') - end - - def builds_for_specific_runner - new_builds.where(project: runner.projects.without_deleted.with_builds_enabled).order('created_at ASC') + def builds_for_runner + new_builds + .joins("LEFT JOIN (#{running_projects.to_sql}) AS running_projects ON ci_builds.project_id=running_projects.project_id") + .order('COALESCE(running_projects.running_builds, 0) ASC', 'ci_builds.id ASC') end - def running_builds_for_shared_runners - running_builds_for_runners(Ci::Runner.shared) - end - - def running_builds_for_group_runners - running_builds_for_runners(Ci::Runner.joins(:runner_groups)) + # New builds from the accessible projects + def new_builds + filter_builds(Ci::Build.pending.unstarted) end - def running_builds_for_runners(runners) - Ci::Build.running.where(runner: runners) + # Count running builds from the accessible projects + def running_projects + filter_builds(Ci::Build.running) .group(:project_id).select(:project_id, 'count(*) AS running_builds') end - def new_builds - builds = Ci::Build.pending.unstarted + # Filter the builds from the accessible projects + def filter_builds(builds) builds = builds.ref_protected if runner.ref_protected? - builds - end - - def shared_runner_build_limits_feature_enabled? - ENV['DISABLE_SHARED_RUNNER_BUILD_MINUTES_LIMIT'].to_s != 'true' + builds.where(project: runner.accessible_projects) end def register_failure -- cgit v1.2.1 From 9447e5c27d8f840eaf4eee9635a5149ab36d93b6 Mon Sep 17 00:00:00 2001 From: Alexis Reigel Date: Mon, 26 Feb 2018 16:20:29 +0100 Subject: extract method to adhere to "tell, don't ask" --- app/services/ci/update_build_queue_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index ab81766abf3..05dbebc4f8d 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -16,7 +16,7 @@ module Ci def tick_for(build, runners) runners.each do |runner| - runner.tick_runner_queue if runner.can_pick?(build) + runner.invalidate_build_cache!(build) end end end -- cgit v1.2.1 From 8d8139862aee97d7fadc0563e7df9842f5bd46ac Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Fri, 27 Apr 2018 09:15:54 +0800 Subject: Rename `runner.belonging_to_group(project.id) -> runner.belonging_to_parent_group_of_project(project.id)` --- app/services/ci/update_build_queue_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index 05dbebc4f8d..c991f04ab30 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -4,7 +4,7 @@ module Ci tick_for(build, build.project.runners) if build.project.group_runners_enabled? - tick_for(build, Ci::Runner.belonging_to_group(build.project_id)) + tick_for(build, Ci::Runner.belonging_to_parent_group_of_project(build.project_id)) end if build.project.shared_runners_enabled? -- cgit v1.2.1 From 87740df2ba7153439c30544f299b235632717738 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 09:39:47 +0400 Subject: Revert fair scheduling for all builds Per discussion in https://gitlab.com/gitlab-org/gitlab-ce/merge_requests/9646#note_65730532 this logic is being optimized elsewhere and it will simplify things if we make less changes to this code right now. --- app/services/ci/register_job_service.rb | 47 +++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 14 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 64549ea3ce2..55d0273847c 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -14,7 +14,14 @@ module Ci end def execute - builds = builds_for_runner + builds = + if runner.shared? + builds_for_shared_runner + elsif runner.group? + builds_for_group_runner + else + builds_for_project_runner + end valid = true @@ -63,27 +70,39 @@ module Ci private - def builds_for_runner - new_builds - .joins("LEFT JOIN (#{running_projects.to_sql}) AS running_projects ON ci_builds.project_id=running_projects.project_id") - .order('COALESCE(running_projects.running_builds, 0) ASC', 'ci_builds.id ASC') + def builds_for_shared_runner + new_builds. + # don't run projects which have not enabled shared runners and builds + joins(:project).where(projects: { shared_runners_enabled: true, pending_delete: false }) + .joins('LEFT JOIN project_features ON ci_builds.project_id = project_features.project_id') + .where('project_features.builds_access_level IS NULL or project_features.builds_access_level > 0'). + + # Implement fair scheduling + # 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.project_id=project_builds.project_id") + .order('COALESCE(project_builds.running_builds, 0) ASC', 'ci_builds.id ASC') end - # New builds from the accessible projects - def new_builds - filter_builds(Ci::Build.pending.unstarted) + def builds_for_project_runner + new_builds.where(project: runner.projects.without_deleted.with_builds_enabled).order('created_at ASC') end - # Count running builds from the accessible projects - def running_projects - filter_builds(Ci::Build.running) + def builds_for_group_runner + hierarchy_groups = Gitlab::GroupHierarchy.new(runner.groups).base_and_descendants + projects = Project.where(namespace_id: hierarchy_groups).without_deleted.with_builds_enabled + new_builds.where(project: projects.without_deleted.with_builds_enabled).order('created_at ASC') + end + + def running_builds_for_shared_runners + Ci::Build.running.where(runner: Ci::Runner.shared) .group(:project_id).select(:project_id, 'count(*) AS running_builds') end - # Filter the builds from the accessible projects - def filter_builds(builds) + def new_builds + builds = Ci::Build.pending.unstarted builds = builds.ref_protected if runner.ref_protected? - builds.where(project: runner.accessible_projects) + builds end def register_failure -- cgit v1.2.1 From 5652ff953cba9773edbcb677908fe3f18b103be3 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 10:43:29 +0400 Subject: Rename Runner#group? -> #assigned_to_group? and Runner#project? -> #assigned_to_project? --- app/services/ci/register_job_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 55d0273847c..647bceb3b36 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -17,7 +17,7 @@ module Ci builds = if runner.shared? builds_for_shared_runner - elsif runner.group? + elsif runner.assigned_to_group? builds_for_group_runner else builds_for_project_runner -- cgit v1.2.1 From dad35d6284edfb5c5555e028405d7dc8e984b2f4 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 17:14:39 +0400 Subject: Remove redundant scopes in Ci::RegisterJobService#builds_for_group_runner --- app/services/ci/register_job_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 647bceb3b36..138bab88059 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -90,7 +90,7 @@ module Ci def builds_for_group_runner hierarchy_groups = Gitlab::GroupHierarchy.new(runner.groups).base_and_descendants - projects = Project.where(namespace_id: hierarchy_groups).without_deleted.with_builds_enabled + projects = Project.where(namespace_id: hierarchy_groups) new_builds.where(project: projects.without_deleted.with_builds_enabled).order('created_at ASC') end -- cgit v1.2.1 From d8dd25a60e7c96a24d33cfe1b93be09085a1b86c Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Mon, 30 Apr 2018 17:25:49 +0400 Subject: Introduce Project#all_runners and use in Ci::UpdateBuildQueueService --- app/services/ci/update_build_queue_service.rb | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index c991f04ab30..674782df00e 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -1,15 +1,7 @@ module Ci class UpdateBuildQueueService def execute(build) - tick_for(build, build.project.runners) - - if build.project.group_runners_enabled? - tick_for(build, Ci::Runner.belonging_to_parent_group_of_project(build.project_id)) - end - - if build.project.shared_runners_enabled? - tick_for(build, Ci::Runner.shared) - end + tick_for(build, build.project.all_runners) end private -- cgit v1.2.1 From 36cdd1e7179aedee7af42d100a208fc1c01e6c63 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Tue, 1 May 2018 13:11:57 +0400 Subject: Use group_type? where possible during transition period --- app/services/ci/register_job_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 138bab88059..8f8a5fbb2b0 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -17,7 +17,7 @@ module Ci builds = if runner.shared? builds_for_shared_runner - elsif runner.assigned_to_group? + elsif runner.group_type? builds_for_group_runner else builds_for_project_runner -- cgit v1.2.1 From 2261188f48dff25c5bfbbca739c5f570849155f4 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Wed, 2 May 2018 16:42:12 +0200 Subject: Rename Runner#invalidate_build_cache -> Runner#pick_build --- app/services/ci/update_build_queue_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/update_build_queue_service.rb b/app/services/ci/update_build_queue_service.rb index 674782df00e..41b1c144c3e 100644 --- a/app/services/ci/update_build_queue_service.rb +++ b/app/services/ci/update_build_queue_service.rb @@ -8,7 +8,7 @@ module Ci def tick_for(build, runners) runners.each do |runner| - runner.invalidate_build_cache!(build) + runner.pick_build!(build) end end end -- cgit v1.2.1 From af15b6f0e144762a38591c53b970e312c35fe65f Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 14:37:01 +0200 Subject: Fix Project#group_runners_enabled as it was doing nothing --- app/services/ci/register_job_service.rb | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index 8f8a5fbb2b0..a7d8ad93f38 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -91,7 +91,10 @@ module Ci def builds_for_group_runner hierarchy_groups = Gitlab::GroupHierarchy.new(runner.groups).base_and_descendants projects = Project.where(namespace_id: hierarchy_groups) - new_builds.where(project: projects.without_deleted.with_builds_enabled).order('created_at ASC') + .with_group_runners_enabled + .with_builds_enabled + .without_deleted + new_builds.where(project: projects).order('created_at ASC') end def running_builds_for_shared_runners -- cgit v1.2.1 From 0ae300578139c0e71e8748b6106f673e4b3d19c8 Mon Sep 17 00:00:00 2001 From: Dylan Griffith Date: Thu, 3 May 2018 14:54:08 +0200 Subject: Order builds by id instead of created_at in RegisterJobService --- app/services/ci/register_job_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/ci/register_job_service.rb b/app/services/ci/register_job_service.rb index a7d8ad93f38..4291631913a 100644 --- a/app/services/ci/register_job_service.rb +++ b/app/services/ci/register_job_service.rb @@ -85,7 +85,7 @@ module Ci end def builds_for_project_runner - new_builds.where(project: runner.projects.without_deleted.with_builds_enabled).order('created_at ASC') + new_builds.where(project: runner.projects.without_deleted.with_builds_enabled).order('id ASC') end def builds_for_group_runner @@ -94,7 +94,7 @@ module Ci .with_group_runners_enabled .with_builds_enabled .without_deleted - new_builds.where(project: projects).order('created_at ASC') + new_builds.where(project: projects).order('id ASC') end def running_builds_for_shared_runners -- cgit v1.2.1 From 3d6d0a09b65f032bbe1bd5ad4736dd764195bbe1 Mon Sep 17 00:00:00 2001 From: Bob Van Landuyt Date: Tue, 24 Apr 2018 18:28:04 +0200 Subject: Store application wide terms This allows admins to define terms in the application settings. Every time the terms are adjusted, a new version is stored and becomes the 'active' version. This allows tracking which specific version was accepted by a user. --- app/services/application_settings/update_service.rb | 15 +++++++++++++++ 1 file changed, 15 insertions(+) (limited to 'app/services') diff --git a/app/services/application_settings/update_service.rb b/app/services/application_settings/update_service.rb index 61589a07250..d6d3a661dab 100644 --- a/app/services/application_settings/update_service.rb +++ b/app/services/application_settings/update_service.rb @@ -1,7 +1,22 @@ module ApplicationSettings class UpdateService < ApplicationSettings::BaseService def execute + update_terms(@params.delete(:terms)) + @application_setting.update(@params) end + + private + + def update_terms(terms) + return unless terms.present? + + # Avoid creating a new terms record if the text is exactly the same. + terms = terms.strip + return if terms == @application_setting.terms + + ApplicationSetting::Term.create(terms: terms) + @application_setting.reset_memoized_terms + end end end -- cgit v1.2.1 From 10aa55a770c2985c22c92d17b8a7ea90b0a09085 Mon Sep 17 00:00:00 2001 From: Bob Van Landuyt Date: Fri, 27 Apr 2018 14:56:50 +0200 Subject: Allow a user to accept/decline terms When a user accepts, we store this in the agreements to keep track of which terms they accepted. We also update the flag on the user. --- app/services/users/respond_to_terms_service.rb | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 app/services/users/respond_to_terms_service.rb (limited to 'app/services') diff --git a/app/services/users/respond_to_terms_service.rb b/app/services/users/respond_to_terms_service.rb new file mode 100644 index 00000000000..06d660186cf --- /dev/null +++ b/app/services/users/respond_to_terms_service.rb @@ -0,0 +1,24 @@ +module Users + class RespondToTermsService + def initialize(user, term) + @user, @term = user, term + end + + def execute(accepted:) + agreement = @user.term_agreements.find_or_initialize_by(term: @term) + agreement.accepted = accepted + + if agreement.save + store_accepted_term(accepted) + end + + agreement + end + + private + + def store_accepted_term(accepted) + @user.update_column(:accepted_term_id, accepted ? @term.id : nil) + end + end +end -- cgit v1.2.1 From 5d003f3d1dfcc5f743c6c1bcd17e84bf4646bf78 Mon Sep 17 00:00:00 2001 From: Douwe Maan Date: Fri, 4 May 2018 14:47:47 +0200 Subject: Ensure web hook 'blocked URL' errors are stored in as web hook logs and properly surfaced to the user --- app/services/web_hook_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/web_hook_service.rb b/app/services/web_hook_service.rb index 809ce1303d8..7ec52b6ce2b 100644 --- a/app/services/web_hook_service.rb +++ b/app/services/web_hook_service.rb @@ -41,7 +41,7 @@ class WebHookService http_status: response.code, message: response.to_s } - rescue SocketError, OpenSSL::SSL::SSLError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Net::OpenTimeout, Net::ReadTimeout => e + rescue SocketError, OpenSSL::SSL::SSLError, Errno::ECONNRESET, Errno::ECONNREFUSED, Errno::EHOSTUNREACH, Net::OpenTimeout, Net::ReadTimeout, Gitlab::HTTP::BlockedUrlError => e log_execution( trigger: hook_name, url: hook.url, -- cgit v1.2.1 From bddbcaefc2389e4c61763472cecbea150f10cd75 Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Wed, 2 May 2018 14:35:04 +0100 Subject: Backports every CE related change from ee-44542 to CE --- app/services/projects/create_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/create_service.rb b/app/services/projects/create_service.rb index d361d070993..d16ecdb7b9b 100644 --- a/app/services/projects/create_service.rb +++ b/app/services/projects/create_service.rb @@ -142,7 +142,7 @@ module Projects if @project @project.errors.add(:base, message) - @project.mark_import_as_failed(message) if @project.import? + @project.mark_import_as_failed(message) if @project.persisted? && @project.import? end @project -- cgit v1.2.1 From 5c2078838bb9de710f9025513c4b6ec664bba313 Mon Sep 17 00:00:00 2001 From: Mario de la Ossa Date: Thu, 26 Apr 2018 13:53:13 -0600 Subject: Backport of 4084-epics-username-autocomplete --- .../concerns/users/participable_service.rb | 41 ++++++++++++++++++++++ app/services/projects/participants_service.rb | 32 +---------------- 2 files changed, 42 insertions(+), 31 deletions(-) create mode 100644 app/services/concerns/users/participable_service.rb (limited to 'app/services') diff --git a/app/services/concerns/users/participable_service.rb b/app/services/concerns/users/participable_service.rb new file mode 100644 index 00000000000..bf60b96938d --- /dev/null +++ b/app/services/concerns/users/participable_service.rb @@ -0,0 +1,41 @@ +module Users + module ParticipableService + extend ActiveSupport::Concern + + included do + attr_reader :noteable + end + + def noteable_owner + return [] unless noteable && noteable.author.present? + + [as_hash(noteable.author)] + end + + def participants_in_noteable + return [] unless noteable + + users = noteable.participants(current_user) + sorted(users) + end + + def sorted(users) + users.uniq.to_a.compact.sort_by(&:username).map do |user| + as_hash(user) + end + end + + def groups + current_user.authorized_groups.sort_by(&:path).map do |group| + count = group.users.count + { username: group.full_path, name: group.full_name, count: count, avatar_url: group.avatar_url } + end + end + + private + + def as_hash(user) + { username: user.username, name: user.name, avatar_url: user.avatar_url } + end + end +end diff --git a/app/services/projects/participants_service.rb b/app/services/projects/participants_service.rb index e6193fcacee..eb0472c6024 100644 --- a/app/services/projects/participants_service.rb +++ b/app/services/projects/participants_service.rb @@ -1,6 +1,6 @@ module Projects class ParticipantsService < BaseService - attr_reader :noteable + include Users::ParticipableService def execute(noteable) @noteable = noteable @@ -10,36 +10,6 @@ module Projects participants.uniq end - def noteable_owner - return [] unless noteable && noteable.author.present? - - [{ - name: noteable.author.name, - username: noteable.author.username, - avatar_url: noteable.author.avatar_url - }] - end - - def participants_in_noteable - return [] unless noteable - - users = noteable.participants(current_user) - sorted(users) - end - - def sorted(users) - users.uniq.to_a.compact.sort_by(&:username).map do |user| - { username: user.username, name: user.name, avatar_url: user.avatar_url } - end - end - - def groups - current_user.authorized_groups.sort_by(&:path).map do |group| - count = group.users.count - { username: group.full_path, name: group.full_name, count: count, avatar_url: group.avatar_url } - end - end - def all_members count = project.team.members.flatten.count [{ username: "all", name: "All Project and Group Members", count: count }] -- cgit v1.2.1 From 9a13059332a0c81b3a953f57bb9e40346eba951d Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Thu, 3 May 2018 13:55:14 +0100 Subject: Backports every CE related change from ee-5484 to CE --- app/services/git_push_service.rb | 8 ++++++ .../projects/update_remote_mirror_service.rb | 30 ++++++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 app/services/projects/update_remote_mirror_service.rb (limited to 'app/services') diff --git a/app/services/git_push_service.rb b/app/services/git_push_service.rb index c037141fcde..f3bfc53dcd3 100644 --- a/app/services/git_push_service.rb +++ b/app/services/git_push_service.rb @@ -55,6 +55,7 @@ class GitPushService < BaseService execute_related_hooks perform_housekeeping + update_remote_mirrors update_caches update_signatures @@ -119,6 +120,13 @@ class GitPushService < BaseService protected + def update_remote_mirrors + return unless @project.has_remote_mirror? + + @project.mark_stuck_remote_mirrors_as_failed! + @project.update_remote_mirrors + end + def execute_related_hooks # Update merge requests that may be affected by this push. A new branch # could cause the last commit of a merge request to change. diff --git a/app/services/projects/update_remote_mirror_service.rb b/app/services/projects/update_remote_mirror_service.rb new file mode 100644 index 00000000000..8183a2f26d7 --- /dev/null +++ b/app/services/projects/update_remote_mirror_service.rb @@ -0,0 +1,30 @@ +module Projects + class UpdateRemoteMirrorService < BaseService + attr_reader :errors + + def execute(remote_mirror) + @errors = [] + + return success unless remote_mirror.enabled? + + begin + repository.fetch_remote(remote_mirror.remote_name, no_tags: true) + + opts = {} + if remote_mirror.only_protected_branches? + opts[:only_branches_matching] = project.protected_branches.select(:name).map(&:name) + end + + remote_mirror.update_repository(opts) + rescue => e + errors << e.message.strip + end + + if errors.present? + error(errors.join("\n\n")) + else + success + end + end + end +end -- cgit v1.2.1 From 961255b107370a1350f91d0835cf0e849d237f7d Mon Sep 17 00:00:00 2001 From: Tiago Botelho Date: Thu, 3 May 2018 15:19:21 +0100 Subject: Adds remote mirror table migration --- app/services/concerns/exclusive_lease_guard.rb | 52 ++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 app/services/concerns/exclusive_lease_guard.rb (limited to 'app/services') diff --git a/app/services/concerns/exclusive_lease_guard.rb b/app/services/concerns/exclusive_lease_guard.rb new file mode 100644 index 00000000000..30be6accc32 --- /dev/null +++ b/app/services/concerns/exclusive_lease_guard.rb @@ -0,0 +1,52 @@ +# +# Concern that helps with getting an exclusive lease for running a block +# of code. +# +# `#try_obtain_lease` takes a block which will be run if it was able to +# obtain the lease. Implement `#lease_timeout` to configure the timeout +# for the exclusive lease. Optionally override `#lease_key` to set the +# lease key, it defaults to the class name with underscores. +# +module ExclusiveLeaseGuard + extend ActiveSupport::Concern + + def try_obtain_lease + lease = exclusive_lease.try_obtain + + unless lease + log_error('Cannot obtain an exclusive lease. There must be another instance already in execution.') + return + end + + begin + yield lease + ensure + release_lease(lease) + end + end + + def exclusive_lease + @lease ||= Gitlab::ExclusiveLease.new(lease_key, timeout: lease_timeout) + end + + def lease_key + @lease_key ||= self.class.name.underscore + end + + def lease_timeout + raise NotImplementedError, + "#{self.class.name} does not implement #{__method__}" + end + + def release_lease(uuid) + Gitlab::ExclusiveLease.cancel(lease_key, uuid) + end + + def renew_lease! + exclusive_lease.renew + end + + def log_error(message, extra_args = {}) + logger.error(message) + end +end -- cgit v1.2.1 From 02741ca4c58c625070d06c248125b2f510ac2c0b Mon Sep 17 00:00:00 2001 From: Mario de la Ossa Date: Thu, 3 May 2018 15:32:20 -0600 Subject: Backport 5480-epic-notifications from EE --- app/services/notification_recipient_service.rb | 35 ++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 5 deletions(-) (limited to 'app/services') diff --git a/app/services/notification_recipient_service.rb b/app/services/notification_recipient_service.rb index 83e59a649b6..5658699664d 100644 --- a/app/services/notification_recipient_service.rb +++ b/app/services/notification_recipient_service.rb @@ -45,6 +45,10 @@ module NotificationRecipientService target.project end + def group + project&.group || target.try(:group) + end + def recipients @recipients ||= [] end @@ -67,6 +71,7 @@ module NotificationRecipientService user, type, reason: reason, project: project, + group: group, custom_action: custom_action, target: target, acting_user: acting_user @@ -107,11 +112,11 @@ module NotificationRecipientService # Users with a notification setting on group or project user_ids += user_ids_notifiable_on(project, :custom) - user_ids += user_ids_notifiable_on(project.group, :custom) + user_ids += user_ids_notifiable_on(group, :custom) # Users with global level custom user_ids_with_project_level_global = user_ids_notifiable_on(project, :global) - user_ids_with_group_level_global = user_ids_notifiable_on(project.group, :global) + user_ids_with_group_level_global = user_ids_notifiable_on(group, :global) global_users_ids = user_ids_with_project_level_global.concat(user_ids_with_group_level_global) user_ids += user_ids_with_global_level_custom(global_users_ids, custom_action) @@ -123,6 +128,10 @@ module NotificationRecipientService add_recipients(project_watchers, :watch, nil) end + def add_group_watchers + add_recipients(group_watchers, :watch, nil) + end + # Get project users with WATCH notification level def project_watchers project_members_ids = user_ids_notifiable_on(project) @@ -138,6 +147,14 @@ module NotificationRecipientService user_scope.where(id: user_ids_with_project_setting.concat(user_ids_with_group_setting).uniq) end + def group_watchers + user_ids_with_group_global = user_ids_notifiable_on(group, :global) + user_ids = user_ids_with_global_level_watch(user_ids_with_group_global) + user_ids_with_group_setting = select_group_members_ids(group, [], user_ids_with_group_global, user_ids) + + user_scope.where(id: user_ids_with_group_setting) + end + def add_subscribed_users return unless target.respond_to? :subscribers @@ -281,6 +298,14 @@ module NotificationRecipientService note.project end + def group + if note.for_project_noteable? + project.group + else + target.try(:group) + end + end + def build! # Add all users participating in the thread (author, assignee, comment authors) add_participants(note.author) @@ -289,11 +314,11 @@ module NotificationRecipientService if note.for_project_noteable? # Merge project watchers add_project_watchers - - # Merge project with custom notification - add_custom_notifications + else + add_group_watchers end + add_custom_notifications add_subscribed_users end -- cgit v1.2.1 From 065d44538b0fdf8ee6a2fb9e676123a790ddcb29 Mon Sep 17 00:00:00 2001 From: Olivier Gonzalez Date: Mon, 7 May 2018 23:34:19 -0400 Subject: Cleanly handle plural name for ghost user migration --- app/services/users/migrate_to_ghost_user_service.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'app/services') diff --git a/app/services/users/migrate_to_ghost_user_service.rb b/app/services/users/migrate_to_ghost_user_service.rb index 976017dfa82..a2833b1e051 100644 --- a/app/services/users/migrate_to_ghost_user_service.rb +++ b/app/services/users/migrate_to_ghost_user_service.rb @@ -49,7 +49,7 @@ module Users migrate_merge_requests migrate_notes migrate_abuse_reports - migrate_award_emojis + migrate_award_emoji end def migrate_issues @@ -70,7 +70,7 @@ module Users user.reported_abuse_reports.update_all(reporter_id: ghost_user.id) end - def migrate_award_emojis + def migrate_award_emoji user.award_emoji.update_all(user_id: ghost_user.id) end end -- cgit v1.2.1 From f7eca91677722f2cdaa57ec95e10075aae659925 Mon Sep 17 00:00:00 2001 From: Ash McKenzie Date: Thu, 10 May 2018 16:24:57 +1000 Subject: Include project.full_path when moving repo This is especially helpful when hashed storage is enabled --- app/services/projects/destroy_service.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'app/services') diff --git a/app/services/projects/destroy_service.rb b/app/services/projects/destroy_service.rb index 71c93660b4b..adbc498d0bf 100644 --- a/app/services/projects/destroy_service.rb +++ b/app/services/projects/destroy_service.rb @@ -87,7 +87,7 @@ module Projects new_path = removal_path(path) if mv_repository(path, new_path) - log_info("Repository \"#{path}\" moved to \"#{new_path}\"") + log_info(%Q{Repository "#{path}" moved to "#{new_path}" for project "#{project.full_path}"}) project.run_after_commit do # self is now project -- cgit v1.2.1