pipelines_controller.rb 6,1 КБ
Newer Older
gfyoung's avatar
gfyoung включено в состав коммита
1
2
# frozen_string_literal: true

Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
3
class Projects::PipelinesController < Projects::ApplicationController
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
4
  before_action :whitelist_query_limiting, only: [:create, :retry]
Kushal Pandya's avatar
Kushal Pandya включено в состав коммита
5
  before_action :pipeline, except: [:index, :new, :create, :charts]
Alex Ives's avatar
Alex Ives включено в состав коммита
6
  before_action :set_pipeline_path, only: [:show]
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
7
  before_action :authorize_read_pipeline!
Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
8
  before_action :authorize_read_build!, only: [:index]
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
9
10
11
  before_action :authorize_create_pipeline!, only: [:new, :create]
  before_action :authorize_update_pipeline!, only: [:retry, :cancel]

Stan Hu's avatar
Stan Hu включено в состав коммита
12
13
  around_action :allow_gitaly_ref_name_caching, only: [:index, :show]

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
14
15
  wrap_parameters Ci::Pipeline

Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
16
17
  POLLING_INTERVAL = 10_000

Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
18
19
  def index
    @scope = params[:scope]
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
20
    @pipelines = PipelinesFinder
Bob Van Landuyt's avatar
Bob Van Landuyt включено в состав коммита
21
      .new(project, current_user, scope: @scope)
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
22
      .execute
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
23
24
      .page(params[:page])
      .per(30)
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
25

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
26
27
28
29
    @running_count = limited_pipelines_count(project, 'running')
    @pending_count = limited_pipelines_count(project, 'pending')
    @finished_count = limited_pipelines_count(project, 'finished')
    @pipelines_count = limited_pipelines_count(project)
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
30
31
32
33

    respond_to do |format|
      format.html
      format.json do
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
34
        Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL)
Toon Claes's avatar
Toon Claes включено в состав коммита
35

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
36
        render json: {
Stan Hu's avatar
Stan Hu включено в состав коммита
37
          pipelines: serialize_pipelines,
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
38
39
          count: {
            all: @pipelines_count,
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
40
41
            running: @running_count,
            pending: @pending_count,
Rémy Coutable's avatar
Rémy Coutable включено в состав коммита
42
            finished: @finished_count
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
43
44
          }
        }
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
45
46
      end
    end
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
47
48
49
  end

  def new
Francisco Javier López's avatar
Francisco Javier López включено в состав коммита
50
    @pipeline = project.all_pipelines.new(ref: @project.default_branch)
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
51
52
53
  end

  def create
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
54
55
    @pipeline = Ci::CreatePipelineService
      .new(project, current_user, create_params)
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
56
      .execute(:web, ignore_skip_ci: true, save_on_errors: false)
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
57
58

    if @pipeline.persisted?
Douwe Maan's avatar
Douwe Maan включено в состав коммита
59
      redirect_to project_pipeline_path(project, @pipeline)
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
60
    else
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
61
      render 'new'
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
62
63
64
65
    end
  end

  def show
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
66
67
68
69
70
71
    respond_to do |format|
      format.html
      format.json do
        Gitlab::PollingInterval.set_header(response, interval: POLLING_INTERVAL)

        render json: PipelineSerializer
Fatih Acet's avatar
Fatih Acet включено в состав коммита
72
          .new(project: @project, current_user: @current_user)
Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
73
          .represent(@pipeline, show_represent_params)
Zeger-Jan van de Weg's avatar
Zeger-Jan van de Weg включено в состав коммита
74
75
      end
    end
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
76
77
  end

Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
78
  def builds
James Edwards-Jones's avatar
James Edwards-Jones включено в состав коммита
79
80
81
82
    render_show
  end

  def failures
Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
83
    if @pipeline.failed_builds.present?
James Edwards-Jones's avatar
James Edwards-Jones включено в состав коммита
84
85
86
      render_show
    else
      redirect_to pipeline_path(@pipeline)
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
87
    end
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
88
89
  end

Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
90
  def status
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
91
    render json: PipelineSerializer
Fatih Acet's avatar
Fatih Acet включено в состав коммита
92
      .new(project: @project, current_user: @current_user)
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
93
      .represent_status(@pipeline)
Shinya Maeda's avatar
Shinya Maeda включено в состав коммита
94
95
  end

Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
96
  def stage
Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
97
    @stage = pipeline.legacy_stage(params[:stage])
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
98
99
    return not_found unless @stage

Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
100
101
    render json: StageSerializer
      .new(project: @project, current_user: @current_user)
Steve Azzopardi's avatar
Steve Azzopardi включено в состав коммита
102
      .represent(@stage, details: true, retried: params[:retried])
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
103
104
  end

Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
105
106
107
108
109
110
  # TODO: This endpoint is used by mini-pipeline-graph
  # TODO: This endpoint should be migrated to `stage.json`
  def stage_ajax
    @stage = pipeline.legacy_stage(params[:stage])
    return not_found unless @stage

Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
111
    render json: { html: view_to_html_string('projects/pipelines/_stage') }
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
112
113
  end

Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
114
  def retry
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
115
    pipeline.retry_failed(current_user)
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
116

Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
117
118
    respond_to do |format|
      format.html do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
119
        redirect_back_or_default default: project_pipelines_path(project)
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
120
121
      end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
122
      format.json { head :no_content }
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
123
    end
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
124
125
126
  end

  def cancel
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
127
    pipeline.cancel_running
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
128

Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
129
130
    respond_to do |format|
      format.html do
Douwe Maan's avatar
Douwe Maan включено в состав коммита
131
        redirect_back_or_default default: project_pipelines_path(project)
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
132
133
      end

Grzegorz Bizon's avatar
Grzegorz Bizon включено в состав коммита
134
      format.json { head :no_content }
Filipa Lacerda's avatar
Filipa Lacerda включено в состав коммита
135
    end
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
136
137
  end

Kushal Pandya's avatar
Kushal Pandya включено в состав коммита
138
139
  def charts
    @charts = {}
maks.rydkin's avatar
maks.rydkin включено в состав коммита
140
141
142
143
    @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)
Z.J. van de Weg's avatar
Z.J. van de Weg включено в состав коммита
144
145

    @counts = {}
Francisco Javier López's avatar
Francisco Javier López включено в состав коммита
146
147
148
    @counts[:total] = @project.all_pipelines.count(:all)
    @counts[:success] = @project.all_pipelines.success.count(:all)
    @counts[:failed] = @project.all_pipelines.failed.count(:all)
Kushal Pandya's avatar
Kushal Pandya включено в состав коммита
149
150
  end

Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
151
152
  private

Stan Hu's avatar
Stan Hu включено в состав коммита
153
  def serialize_pipelines
Stan Hu's avatar
Stan Hu включено в состав коммита
154
155
156
157
    PipelineSerializer
      .new(project: @project, current_user: @current_user)
      .with_pagination(request, response)
      .represent(@pipelines, disable_coverage: true, preload: true)
Stan Hu's avatar
Stan Hu включено в состав коммита
158
159
  end

James Edwards-Jones's avatar
James Edwards-Jones включено в состав коммита
160
161
162
163
164
165
166
167
  def render_show
    respond_to do |format|
      format.html do
        render 'show'
      end
    end
  end

Kamil Trzciński's avatar
Kamil Trzciński включено в состав коммита
168
169
170
171
  def show_represent_params
    { grouped: true }
  end

Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
172
  def create_params
Krasimir Angelov's avatar
Krasimir Angelov включено в состав коммита
173
    params.require(:pipeline).permit(:ref, variables_attributes: %i[key variable_type secret_value])
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
174
175
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
176
  # rubocop: disable CodeReuse/ActiveRecord
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
177
  def pipeline
Alex Ives's avatar
Alex Ives включено в состав коммита
178
179
180
181
182
183
184
185
186
    @pipeline ||= if params[:id].blank? && params[:latest]
                    latest_pipeline
                  else
                    project
                      .all_pipelines
                      .includes(user: :status)
                      .find_by!(id: params[:id])
                      .present(current_user: current_user)
                  end
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
187
  end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
188
  # rubocop: enable CodeReuse/ActiveRecord
Kamil Trzcinski's avatar
Kamil Trzcinski включено в состав коммита
189

Alex Ives's avatar
Alex Ives включено в состав коммита
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
  def set_pipeline_path
    @pipeline_path ||= if params[:id].blank? && params[:latest]
                         latest_project_pipelines_path(@project, params['ref'])
                       else
                         project_pipeline_path(@project, @pipeline)
                       end
  end

  def latest_pipeline
    ref = params['ref'].presence || @project.default_branch
    sha = @project.commit(ref)&.sha

    @project.ci_pipelines
            .newest_first(ref: ref, sha: sha)
            .first
            &.present(current_user: current_user)
  end

Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
208
209
210
211
  def whitelist_query_limiting
    # Also see https://gitlab.com/gitlab-org/gitlab-ce/issues/42343
    Gitlab::QueryLimiting.whitelist('https://gitlab.com/gitlab-org/gitlab-ce/issues/42339')
  end
Jan Provaznik's avatar
Jan Provaznik включено в состав коммита
212
213
214
215

  def authorize_update_pipeline!
    return access_denied! unless can?(current_user, :update_pipeline, @pipeline)
  end
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
216
217

  def limited_pipelines_count(project, scope = nil)
Bob Van Landuyt's avatar
Bob Van Landuyt включено в состав коммита
218
    finder = PipelinesFinder.new(project, current_user, scope: scope)
Yorick Peterse's avatar
Yorick Peterse включено в состав коммита
219
220
221

    view_context.limited_counter_with_delimiter(finder.execute)
  end
Kamil Trzcinski's avatar
WIP    
Kamil Trzcinski включено в состав коммита
222
end