2018-12-05 23:21:45 +05:30
# frozen_string_literal: true
2017-08-17 22:00:37 +05:30
module Projects
module Settings
class CiCdController < Projects :: ApplicationController
2021-01-03 14:25:43 +05:30
include RunnerSetupScripts
2021-01-29 00:20:46 +05:30
NUMBER_OF_RUNNERS_PER_PAGE = 20
2021-04-29 21:17:54 +05:30
layout 'project_settings'
2017-08-17 22:00:37 +05:30
before_action :authorize_admin_pipeline!
2018-05-09 12:01:36 +05:30
before_action :define_variables
2020-04-08 14:13:33 +05:30
before_action do
2020-04-22 19:07:51 +05:30
push_frontend_feature_flag ( :ajax_new_deploy_token , @project )
2021-09-30 23:02:18 +05:30
push_frontend_feature_flag ( :ci_scoped_job_token , @project , default_enabled : :yaml )
2020-04-08 14:13:33 +05:30
end
2017-08-17 22:00:37 +05:30
2021-01-03 14:25:43 +05:30
helper_method :highlight_badge
feature_category :continuous_integration
2017-08-17 22:00:37 +05:30
def show
2021-01-03 14:25:43 +05:30
if Feature . enabled? ( :ci_pipeline_triggers_settings_vue_ui , @project )
@triggers_json = :: Ci :: TriggerSerializer . new . represent (
@project . triggers , current_user : current_user , project : @project
) . to_json
end
2021-11-18 22:05:49 +05:30
# @assignable_runners is using ci_owned_runners
:: Gitlab :: Database . allow_cross_joins_across_databases ( url : 'https://gitlab.com/gitlab-org/gitlab/-/issues/336436' ) do
render
end
2018-05-09 12:01:36 +05:30
end
def update
Projects :: UpdateService . new ( project , current_user , update_params ) . tap do | service |
result = service . execute
if result [ :status ] == :success
2020-01-01 13:55:28 +05:30
flash [ :toast ] = _ ( " Pipelines settings for '%{project_name}' were successfully updated. " ) % { project_name : @project . name }
2018-05-09 12:01:36 +05:30
run_autodevops_pipeline ( service )
redirect_to project_settings_ci_cd_path ( @project )
else
2019-07-07 11:18:12 +05:30
redirect_to project_settings_ci_cd_path ( @project ) , alert : result [ :message ]
2018-05-09 12:01:36 +05:30
end
end
2018-03-17 18:26:18 +05:30
end
def reset_cache
if ResetProjectCacheService . new ( @project , current_user ) . execute
2018-05-09 12:01:36 +05:30
respond_to do | format |
format . json { head :ok }
end
2018-03-17 18:26:18 +05:30
else
2018-05-09 12:01:36 +05:30
respond_to do | format |
format . json { head :bad_request }
end
2018-03-17 18:26:18 +05:30
end
2017-08-17 22:00:37 +05:30
end
2018-12-05 23:21:45 +05:30
def reset_registration_token
@project . reset_runners_token!
2020-01-01 13:55:28 +05:30
flash [ :toast ] = _ ( " New runners registration token has been generated! " )
2018-12-05 23:21:45 +05:30
redirect_to namespace_project_settings_ci_cd_path
end
2021-01-03 14:25:43 +05:30
def runner_setup_scripts
2021-04-29 21:17:54 +05:30
private_runner_setup_scripts
2021-01-03 14:25:43 +05:30
end
2017-08-17 22:00:37 +05:30
private
2021-01-03 14:25:43 +05:30
def highlight_badge ( name , content , language = nil )
Gitlab :: Highlight . highlight ( name , content , language : language )
end
2018-05-09 12:01:36 +05:30
def update_params
2019-12-21 20:55:43 +05:30
params . require ( :project ) . permit ( * permitted_project_params )
end
def permitted_project_params
[
2018-05-09 12:01:36 +05:30
:runners_token , :builds_enabled , :build_allow_git_fetch ,
:build_timeout_human_readable , :build_coverage_regex , :public_builds ,
2021-01-29 00:20:46 +05:30
:auto_cancel_pending_pipelines , :ci_config_path , :auto_rollback_enabled ,
2019-09-04 21:01:54 +05:30
auto_devops_attributes : [ :id , :domain , :enabled , :deploy_strategy ] ,
2021-01-03 14:25:43 +05:30
ci_cd_settings_attributes : [ :default_git_depth , :forward_deployment_enabled ]
2019-12-21 20:55:43 +05:30
] . tap do | list |
list << :max_artifacts_size if can? ( current_user , :update_max_artifacts_size , project )
end
2018-05-09 12:01:36 +05:30
end
def run_autodevops_pipeline ( service )
return unless service . run_auto_devops_pipeline?
if @project . empty_repo?
2020-01-01 13:55:28 +05:30
flash [ :notice ] = _ ( " This repository is currently empty. A new Auto DevOps pipeline will be created after a new file has been pushed to a branch. " )
2018-05-09 12:01:36 +05:30
return
end
2020-03-13 15:44:24 +05:30
# rubocop:disable CodeReuse/Worker
2018-05-09 12:01:36 +05:30
CreatePipelineWorker . perform_async ( project . id , current_user . id , project . default_branch , :web , ignore_skip_ci : true , save_on_errors : false )
2020-03-13 15:44:24 +05:30
# rubocop:enable CodeReuse/Worker
2020-01-01 13:55:28 +05:30
pipelines_link_start = '<a href="%{url}">' . html_safe % { url : project_pipelines_path ( @project ) }
flash [ :toast ] = _ ( " A new Auto DevOps pipeline has been created, go to %{pipelines_link_start}Pipelines page%{pipelines_link_end} for details " ) % { pipelines_link_start : pipelines_link_start , pipelines_link_end : " </a> " . html_safe }
2018-05-09 12:01:36 +05:30
end
def define_variables
define_runners_variables
2018-12-13 13:39:08 +05:30
define_ci_variables
2018-05-09 12:01:36 +05:30
define_triggers_variables
define_badges_variables
define_auto_devops_variables
end
2017-08-17 22:00:37 +05:30
def define_runners_variables
2021-01-29 00:20:46 +05:30
@project_runners = @project . runners . ordered . page ( params [ :project_page ] ) . per ( NUMBER_OF_RUNNERS_PER_PAGE ) . with_tags
2018-10-15 14:42:47 +05:30
@assignable_runners = current_user
2018-11-08 19:23:39 +05:30
. ci_owned_runners
2018-10-15 14:42:47 +05:30
. assignable_for ( project )
. ordered
2021-01-29 00:20:46 +05:30
. page ( params [ :specific_page ] ) . per ( NUMBER_OF_RUNNERS_PER_PAGE )
2021-06-08 01:23:25 +05:30
. with_tags
2018-10-15 14:42:47 +05:30
2021-06-08 01:23:25 +05:30
@shared_runners = :: Ci :: Runner . instance_type . active . with_tags
2018-10-15 14:42:47 +05:30
2017-08-17 22:00:37 +05:30
@shared_runners_count = @shared_runners . count ( :all )
2018-10-15 14:42:47 +05:30
2021-06-08 01:23:25 +05:30
@group_runners = :: Ci :: Runner . belonging_to_parent_group_of_project ( @project . id ) . with_tags
2017-08-17 22:00:37 +05:30
end
2018-12-13 13:39:08 +05:30
def define_ci_variables
2018-05-09 12:01:36 +05:30
@variable = :: Ci :: Variable . new ( project : project )
2017-09-10 17:25:29 +05:30
. present ( current_user : current_user )
@variables = project . variables . order_key_asc
. map { | variable | variable . present ( current_user : current_user ) }
2017-08-17 22:00:37 +05:30
end
def define_triggers_variables
@triggers = @project . triggers
2019-02-02 18:00:53 +05:30
. present ( current_user : current_user )
2021-01-03 14:25:43 +05:30
2018-05-09 12:01:36 +05:30
@trigger = :: Ci :: Trigger . new
2019-02-02 18:00:53 +05:30
. present ( current_user : current_user )
2017-08-17 22:00:37 +05:30
end
def define_badges_variables
2021-06-08 01:23:25 +05:30
@ref = params [ :ref ] || @project . default_branch_or_main
2017-08-17 22:00:37 +05:30
2021-03-11 19:13:27 +05:30
@badges = [ Gitlab :: Ci :: Badge :: Pipeline :: Status ,
Gitlab :: Ci :: Badge :: Coverage :: Report ]
2017-08-17 22:00:37 +05:30
@badges . map! do | badge |
badge . new ( @project , @ref ) . metadata
end
end
2018-03-17 18:26:18 +05:30
def define_auto_devops_variables
@auto_devops = @project . auto_devops || ProjectAutoDevops . new
end
2017-08-17 22:00:37 +05:30
end
end
end
2019-12-04 20:38:33 +05:30
2021-06-08 01:23:25 +05:30
Projects :: Settings :: CiCdController . prepend_mod_with ( 'Projects::Settings::CiCdController' )