Class: Projects::PipelinesController

Inherits:
ApplicationController show all
Includes:
Analytics::UniqueVisitsHelper, Gitlab::Utils::StrongMemoize
Defined in:
app/controllers/projects/pipelines_controller.rb

Constant Summary collapse

POLLING_INTERVAL =
10_000

Constants included from CookiesHelper

CookiesHelper::COOKIE_TYPE_ENCRYPTED, CookiesHelper::COOKIE_TYPE_PERMANENT

Constants inherited from ApplicationController

ApplicationController::DEFAULT_GITLAB_CACHE_CONTROL

Constants included from Gitlab::Logging::CloudflareHelper

Gitlab::Logging::CloudflareHelper::CLOUDFLARE_CUSTOM_HEADERS

Constants included from Gitlab::NoCacheHeaders

Gitlab::NoCacheHeaders::DEFAULT_GITLAB_NO_CACHE_HEADERS

Instance Method Summary collapse

Methods included from Analytics::UniqueVisitsHelper

#track_visit, #visitor_id

Methods included from Gitlab::Utils::StrongMemoize

#clear_memoization, #strong_memoize, #strong_memoized?

Methods included from ChecksCollaboration

#can_collaborate_with_project?, #user_access

Methods included from RoutableActions

#ensure_canonical_path, #find_routable!, #not_found_actions, #perform_not_found_actions, #routable_authorized?

Methods included from CookiesHelper

#set_secure_cookie

Methods inherited from ApplicationController

#not_found, #redirect_back_or_default, #render, #route_not_found

Methods included from Gitlab::Logging::CloudflareHelper

#store_cloudflare_headers!, #valid_cloudflare_header?

Methods included from Impersonation

#current_user

Methods included from InitializesCurrentUserMode

#current_user_mode

Methods included from Gitlab::Experimentation::ControllerConcern

#experiment_enabled?, #experiment_tracking_category_and_group, #frontend_experimentation_tracking_data, #record_experiment_user, #set_experimentation_subject_id_cookie, #track_experiment_event

Methods included from SessionsHelper

#limit_session_time, #unconfirmed_email?

Methods included from SessionlessAuthentication

#authenticate_sessionless_user!, #sessionless_bypass_admin_mode!, #sessionless_sign_in, #sessionless_user?

Methods included from Gitlab::SearchContext::ControllerConcern

#search_context

Methods included from EnforcesTwoFactorAuthentication

#check_two_factor_requirement, #current_user_requires_two_factor?, #skip_two_factor?, #two_factor_authentication_reason, #two_factor_authentication_required?, #two_factor_grace_period, #two_factor_grace_period_expired?, #two_factor_skippable?, #two_factor_verifier

Methods included from WorkhorseHelper

#send_artifacts_entry, #send_git_archive, #send_git_blob, #send_git_diff, #send_git_patch, #set_workhorse_internal_api_content_type, #workhorse_set_content_type!

Methods included from SafeParamsHelper

#safe_params

Methods included from PageLayoutHelper

#blank_container, #container_class, #favicon, #fluid_layout, #header_title, #nav, #page_card_attributes, #page_card_meta_tags, #page_description, #page_image, #page_title, #search_context, #sidebar

Methods included from GitlabRoutingHelper

#approve_access_request_group_member_path, #approve_access_request_project_member_path, #artifacts_action_path, #commit_url, #commits_url, #edit_milestone_path, #edit_pipeline_schedule_path, #environment_delete_path, #environment_metrics_path, #environment_path, #expose_fast_artifacts_path, #fast_browse_project_job_artifacts_path, #fast_download_project_job_artifacts_path, #fast_keep_project_job_artifacts_path, #gitlab_dashboard_snippets_path, #gitlab_raw_snippet_blob_path, #gitlab_raw_snippet_blob_url, #gitlab_raw_snippet_path, #gitlab_raw_snippet_url, #gitlab_snippet_note_path, #gitlab_snippet_note_url, #gitlab_snippet_notes_path, #gitlab_snippet_notes_url, #gitlab_snippet_path, #gitlab_snippet_url, #gitlab_toggle_award_emoji_snippet_note_path, #gitlab_toggle_award_emoji_snippet_note_url, #gitlab_toggle_award_emoji_snippet_path, #gitlab_toggle_award_emoji_snippet_url, #group_member_path, #group_members_url, #issue_path, #issue_url, #leave_group_members_path, #leave_project_members_path, #merge_request_path, #merge_request_url, #pipeline_job_url, #pipeline_path, #pipeline_schedule_path, #pipeline_schedules_path, #pipeline_url, #play_pipeline_schedule_path, #preview_markdown_path, #project_commits_path, #project_member_path, #project_members_url, #project_ref_path, #project_tree_path, #request_access_group_members_path, #request_access_project_members_path, #resend_invite_group_member_path, #resend_invite_project_member_path, #take_ownership_pipeline_schedule_path, #toggle_award_emoji_personal_snippet_path, #toggle_award_emoji_project_project_snippet_path, #toggle_award_emoji_project_project_snippet_url, #toggle_subscription_path, #wiki_page_path, #wiki_path

Methods included from API::Helpers::RelatedResourcesHelpers

#expose_path, #expose_url, #issues_available?, #mrs_available?

Methods included from Gitlab::NoCacheHeaders

#no_cache_headers

Methods included from Gitlab::GonHelper

#add_gon_variables, #default_avatar_url, #push_frontend_feature_flag

Methods included from WebpackHelper

#webpack_bundle_tag, #webpack_controller_bundle_tags, #webpack_entrypoint_paths, #webpack_public_host, #webpack_public_path

Methods included from StartupCssHelper

#use_startup_css?

Dynamic Method Handling

This class handles dynamic methods through the method_missing method in the class Projects::ApplicationController

Instance Method Details

#buildsObject


108
109
110
# File 'app/controllers/projects/pipelines_controller.rb', line 108

def builds
  render_show
end

#cancelObject


167
168
169
170
171
172
173
174
175
176
177
# File 'app/controllers/projects/pipelines_controller.rb', line 167

def cancel
  pipeline.cancel_running

  respond_to do |format|
    format.html do
      redirect_back_or_default default: project_pipelines_path(project)
    end

    format.json { head :no_content }
  end
end

#chartsObject


179
180
181
182
183
184
185
186
187
188
189
190
# File 'app/controllers/projects/pipelines_controller.rb', line 179

def charts
  @charts = {}
  @charts[:week] = Gitlab::Ci::Charts::WeekChart.new(project)
  @charts[:month] = Gitlab::Ci::Charts::MonthChart.new(project)
  @charts[:year] = Gitlab::Ci::Charts::YearChart.new(project)
  @charts[:pipeline_times] = Gitlab::Ci::Charts::PipelineTime.new(project)

  @counts = {}
  @counts[:total] = @project.all_pipelines.count(:all)
  @counts[:success] = @project.all_pipelines.success.count(:all)
  @counts[:failed] = @project.all_pipelines.failed.count(:all)
end

#createObject


61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
# File 'app/controllers/projects/pipelines_controller.rb', line 61

def create
  @pipeline = Ci::CreatePipelineService
    .new(project, current_user, create_params)
    .execute(:web, ignore_skip_ci: true, save_on_errors: false)

  respond_to do |format|
    format.html do
      if @pipeline.created_successfully?
        redirect_to project_pipeline_path(project, @pipeline)
      else
        render 'new', status: :bad_request
      end
    end
    format.json do
      if @pipeline.created_successfully?
        render json: PipelineSerializer
                       .new(project: project, current_user: current_user)
                       .represent(@pipeline),
               status: :created
      else
        render json: @pipeline.errors, status: :bad_request
      end
    end
  end
end

#dagObject


112
113
114
115
116
117
118
119
120
121
# File 'app/controllers/projects/pipelines_controller.rb', line 112

def dag
  respond_to do |format|
    format.html { render_show }
    format.json do
      render json: Ci::DagPipelineSerializer
        .new(project: @project, current_user: @current_user)
        .represent(@pipeline)
    end
  end
end

#destroyObject


102
103
104
105
106
# File 'app/controllers/projects/pipelines_controller.rb', line 102

def destroy
  ::Ci::DestroyPipelineService.new(project, current_user).execute(pipeline)

  redirect_to project_pipelines_path(project), status: :see_other
end

#failuresObject


123
124
125
126
127
128
129
# File 'app/controllers/projects/pipelines_controller.rb', line 123

def failures
  if @pipeline.failed_builds.present?
    render_show
  else
    redirect_to pipeline_path(@pipeline)
  end
end

#indexObject


33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# File 'app/controllers/projects/pipelines_controller.rb', line 33

def index
  @pipelines = Ci::PipelinesFinder
    .new(project, current_user, index_params)
    .execute
    .page(params[:page])
    .per(30)

  @pipelines_count = limited_pipelines_count(project)

  respond_to do |format|
    format.html
    format.json do
      Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL)

      render json: {
        pipelines: serialize_pipelines,
        count: {
          all: @pipelines_count
        }
      }
    end
  end
end

#newObject


57
58
59
# File 'app/controllers/projects/pipelines_controller.rb', line 57

def new
  @pipeline = project.all_pipelines.new(ref: @project.default_branch)
end

#retryObject


155
156
157
158
159
160
161
162
163
164
165
# File 'app/controllers/projects/pipelines_controller.rb', line 155

def retry
  pipeline.retry_failed(current_user)

  respond_to do |format|
    format.html do
      redirect_back_or_default default: project_pipelines_path(project)
    end

    format.json { head :no_content }
  end
end

#showObject


87
88
89
90
91
92
93
94
95
96
97
98
99
100
# File 'app/controllers/projects/pipelines_controller.rb', line 87

def show
  Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab/-/issues/26657')

  respond_to do |format|
    format.html
    format.json do
      Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL)

      render json: PipelineSerializer
        .new(project: @project, current_user: @current_user)
        .represent(@pipeline, show_represent_params)
    end
  end
end

#stageObject


137
138
139
140
141
142
143
144
# File 'app/controllers/projects/pipelines_controller.rb', line 137

def stage
  @stage = pipeline.legacy_stage(params[:stage])
  return not_found unless @stage

  render json: StageSerializer
    .new(project: @project, current_user: @current_user)
    .represent(@stage, details: true, retried: params[:retried])
end

#stage_ajaxObject

TODO: This endpoint is used by mini-pipeline-graph TODO: This endpoint should be migrated to `stage.json`


148
149
150
151
152
153
# File 'app/controllers/projects/pipelines_controller.rb', line 148

def stage_ajax
  @stage = pipeline.legacy_stage(params[:stage])
  return not_found unless @stage

  render json: { html: view_to_html_string('projects/pipelines/_stage') }
end

#statusObject


131
132
133
134
135
# File 'app/controllers/projects/pipelines_controller.rb', line 131

def status
  render json: PipelineSerializer
    .new(project: @project, current_user: @current_user)
    .represent_status(@pipeline)
end

#test_reportObject


192
193
194
195
196
197
198
199
200
201
202
203
204
# File 'app/controllers/projects/pipelines_controller.rb', line 192

def test_report
  respond_to do |format|
    format.html do
      render 'show'
    end

    format.json do
      render json: TestReportSerializer
        .new(current_user: @current_user)
        .represent(pipeline_test_report, project: project, details: true)
    end
  end
end