2020-07-10 20:09:17 -04:00
|
|
|
# frozen_string_literal: true
|
|
|
|
|
|
|
|
module API
|
|
|
|
module Ci
|
2020-10-14 20:08:42 -04:00
|
|
|
class Pipelines < ::API::Base
|
2020-07-10 20:09:17 -04:00
|
|
|
include PaginationParams
|
|
|
|
|
2022-05-30 08:08:23 -04:00
|
|
|
helpers ::API::Helpers::ProjectStatsRefreshConflictsHelpers
|
|
|
|
|
2020-07-10 20:09:17 -04:00
|
|
|
before { authenticate_non_get! }
|
|
|
|
|
|
|
|
params do
|
|
|
|
requires :id, type: String, desc: 'The project ID'
|
|
|
|
end
|
|
|
|
resource :projects, requirements: ::API::API::NAMESPACE_OR_PROJECT_REQUIREMENTS do
|
|
|
|
desc 'Get all Pipelines of the project' do
|
|
|
|
detail 'This feature was introduced in GitLab 8.11.'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::PipelineBasic
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
2020-09-11 08:08:50 -04:00
|
|
|
|
|
|
|
helpers do
|
|
|
|
params :optional_scope do
|
|
|
|
optional :scope, types: [String, Array[String]], desc: 'The scope of builds to show',
|
|
|
|
values: ::CommitStatus::AVAILABLE_STATUSES,
|
|
|
|
coerce_with: ->(scope) {
|
|
|
|
case scope
|
|
|
|
when String
|
|
|
|
[scope]
|
|
|
|
when ::Array
|
|
|
|
scope
|
|
|
|
else
|
|
|
|
['unknown']
|
|
|
|
end
|
|
|
|
}
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2020-07-10 20:09:17 -04:00
|
|
|
params do
|
|
|
|
use :pagination
|
|
|
|
optional :scope, type: String, values: %w[running pending finished branches tags],
|
|
|
|
desc: 'The scope of pipelines'
|
|
|
|
optional :status, type: String, values: ::Ci::HasStatus::AVAILABLE_STATUSES,
|
|
|
|
desc: 'The status of pipelines'
|
|
|
|
optional :ref, type: String, desc: 'The ref of pipelines'
|
|
|
|
optional :sha, type: String, desc: 'The sha of pipelines'
|
|
|
|
optional :yaml_errors, type: Boolean, desc: 'Returns pipelines with invalid configurations'
|
|
|
|
optional :username, type: String, desc: 'The username of the user who triggered pipelines'
|
|
|
|
optional :updated_before, type: DateTime, desc: 'Return pipelines updated before the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
|
|
|
|
optional :updated_after, type: DateTime, desc: 'Return pipelines updated after the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ'
|
|
|
|
optional :order_by, type: String, values: ::Ci::PipelinesFinder::ALLOWED_INDEXED_COLUMNS, default: 'id',
|
|
|
|
desc: 'Order pipelines'
|
|
|
|
optional :sort, type: String, values: %w[asc desc], default: 'desc',
|
|
|
|
desc: 'Sort pipelines'
|
2021-08-13 17:09:54 -04:00
|
|
|
optional :source, type: String, values: ::Ci::Pipeline.sources.keys
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
get ':id/pipelines', urgency: :low, feature_category: :continuous_integration do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :read_pipeline, user_project
|
|
|
|
authorize! :read_build, user_project
|
|
|
|
|
|
|
|
pipelines = ::Ci::PipelinesFinder.new(user_project, current_user, params).execute
|
2021-08-13 17:09:54 -04:00
|
|
|
present paginate(pipelines), with: Entities::Ci::PipelineBasic, project: user_project
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Create a new pipeline' do
|
|
|
|
detail 'This feature was introduced in GitLab 8.14'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :ref, type: String, desc: 'Reference'
|
|
|
|
optional :variables, Array, desc: 'Array of variables available in the pipeline'
|
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
post ':id/pipeline', urgency: :low, feature_category: :continuous_integration do
|
2021-03-24 23:09:35 -04:00
|
|
|
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20711')
|
2020-07-10 20:09:17 -04:00
|
|
|
|
|
|
|
authorize! :create_pipeline, user_project
|
|
|
|
|
|
|
|
pipeline_params = declared_params(include_missing: false)
|
|
|
|
.merge(variables_attributes: params[:variables])
|
|
|
|
.except(:variables)
|
|
|
|
|
2021-07-20 08:10:29 -04:00
|
|
|
response = ::Ci::CreatePipelineService.new(user_project, current_user, pipeline_params)
|
|
|
|
.execute(:api, ignore_skip_ci: true, save_on_errors: false)
|
|
|
|
new_pipeline = response.payload
|
2020-07-10 20:09:17 -04:00
|
|
|
|
2021-07-20 08:10:29 -04:00
|
|
|
if response.success?
|
2020-08-13 14:10:36 -04:00
|
|
|
present new_pipeline, with: Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
else
|
|
|
|
render_validation_error!(new_pipeline)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Gets a the latest pipeline for the project branch' do
|
|
|
|
detail 'This feature was introduced in GitLab 12.3'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
params do
|
|
|
|
optional :ref, type: String, desc: 'branch ref of pipeline'
|
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
get ':id/pipelines/latest', urgency: :low, feature_category: :continuous_integration do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :read_pipeline, latest_pipeline
|
|
|
|
|
2020-08-13 14:10:36 -04:00
|
|
|
present latest_pipeline, with: Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Gets a specific pipeline for the project' do
|
|
|
|
detail 'This feature was introduced in GitLab 8.11'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
get ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :read_pipeline, pipeline
|
|
|
|
|
2020-08-13 14:10:36 -04:00
|
|
|
present pipeline, with: Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
|
2020-09-11 08:08:50 -04:00
|
|
|
desc 'Get pipeline jobs' do
|
|
|
|
success Entities::Ci::Job
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
2021-02-16 13:09:24 -05:00
|
|
|
optional :include_retried, type: Boolean, default: false, desc: 'Includes retried jobs'
|
2020-09-11 08:08:50 -04:00
|
|
|
use :optional_scope
|
|
|
|
use :pagination
|
|
|
|
end
|
|
|
|
|
2022-02-24 13:19:04 -05:00
|
|
|
get ':id/pipelines/:pipeline_id/jobs', urgency: :low, feature_category: :continuous_integration do
|
2020-09-11 08:08:50 -04:00
|
|
|
authorize!(:read_pipeline, user_project)
|
|
|
|
|
|
|
|
pipeline = user_project.all_pipelines.find(params[:pipeline_id])
|
|
|
|
|
2020-10-21 05:08:50 -04:00
|
|
|
builds = ::Ci::JobsFinder
|
|
|
|
.new(current_user: current_user, pipeline: pipeline, params: params)
|
|
|
|
.execute
|
2020-09-11 08:08:50 -04:00
|
|
|
|
|
|
|
builds = builds.with_preloads
|
|
|
|
|
|
|
|
present paginate(builds), with: Entities::Ci::Job
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Get pipeline bridge jobs' do
|
|
|
|
success Entities::Ci::Bridge
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
use :optional_scope
|
|
|
|
use :pagination
|
|
|
|
end
|
|
|
|
|
2022-03-23 11:08:38 -04:00
|
|
|
get ':id/pipelines/:pipeline_id/bridges', urgency: :low, feature_category: :pipeline_authoring do
|
2020-09-11 08:08:50 -04:00
|
|
|
authorize!(:read_build, user_project)
|
|
|
|
|
|
|
|
pipeline = user_project.all_pipelines.find(params[:pipeline_id])
|
|
|
|
|
2020-10-21 05:08:50 -04:00
|
|
|
bridges = ::Ci::JobsFinder
|
|
|
|
.new(current_user: current_user, pipeline: pipeline, params: params, type: ::Ci::Bridge)
|
|
|
|
.execute
|
2020-09-11 08:08:50 -04:00
|
|
|
bridges = bridges.with_preloads
|
|
|
|
|
|
|
|
present paginate(bridges), with: Entities::Ci::Bridge
|
|
|
|
end
|
|
|
|
|
2020-07-10 20:09:17 -04:00
|
|
|
desc 'Gets the variables for a given pipeline' do
|
|
|
|
detail 'This feature was introduced in GitLab 11.11'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::Variable
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2021-12-03 07:10:23 -05:00
|
|
|
get ':id/pipelines/:pipeline_id/variables', feature_category: :pipeline_authoring, urgency: :low do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :read_pipeline_variable, pipeline
|
|
|
|
|
2020-08-13 14:10:36 -04:00
|
|
|
present pipeline.variables, with: Entities::Ci::Variable
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Gets the test report for a given pipeline' do
|
2020-08-17 05:10:08 -04:00
|
|
|
detail 'This feature was introduced in GitLab 13.0.'
|
2020-07-10 20:09:17 -04:00
|
|
|
success TestReportEntity
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2022-02-04 10:15:34 -05:00
|
|
|
get ':id/pipelines/:pipeline_id/test_report', feature_category: :code_testing, urgency: :low do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :read_build, pipeline
|
|
|
|
|
|
|
|
present pipeline.test_reports, with: TestReportEntity, details: true
|
|
|
|
end
|
|
|
|
|
2021-07-27 08:10:54 -04:00
|
|
|
desc 'Gets the test report summary for a given pipeline' do
|
|
|
|
detail 'This feature was introduced in GitLab 14.2'
|
|
|
|
success TestReportSummaryEntity
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2021-09-14 17:11:58 -04:00
|
|
|
get ':id/pipelines/:pipeline_id/test_report_summary', feature_category: :code_testing do
|
2021-07-27 08:10:54 -04:00
|
|
|
authorize! :read_build, pipeline
|
|
|
|
|
|
|
|
present pipeline.test_report_summary, with: TestReportSummaryEntity
|
|
|
|
end
|
|
|
|
|
2020-07-10 20:09:17 -04:00
|
|
|
desc 'Deletes a pipeline' do
|
|
|
|
detail 'This feature was introduced in GitLab 11.6'
|
|
|
|
http_codes [[204, 'Pipeline was deleted'], [403, 'Forbidden']]
|
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
delete ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :destroy_pipeline, pipeline
|
|
|
|
|
2022-05-30 08:08:23 -04:00
|
|
|
reject_if_build_artifacts_size_refreshing!(pipeline.project)
|
|
|
|
|
2020-07-10 20:09:17 -04:00
|
|
|
destroy_conditionally!(pipeline) do
|
|
|
|
::Ci::DestroyPipelineService.new(user_project, current_user).execute(pipeline)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Retry builds in the pipeline' do
|
|
|
|
detail 'This feature was introduced in GitLab 8.11.'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
post ':id/pipelines/:pipeline_id/retry', urgency: :low, feature_category: :continuous_integration do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :update_pipeline, pipeline
|
|
|
|
|
2022-03-14 08:07:59 -04:00
|
|
|
response = pipeline.retry_failed(current_user)
|
2020-07-10 20:09:17 -04:00
|
|
|
|
2022-03-14 08:07:59 -04:00
|
|
|
if response.success?
|
|
|
|
present pipeline, with: Entities::Ci::Pipeline
|
|
|
|
else
|
|
|
|
render_api_error!(response.errors.join(', '), response.http_status)
|
|
|
|
end
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
|
|
|
|
desc 'Cancel all builds in the pipeline' do
|
|
|
|
detail 'This feature was introduced in GitLab 8.11.'
|
2020-08-13 14:10:36 -04:00
|
|
|
success Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
params do
|
|
|
|
requires :pipeline_id, type: Integer, desc: 'The pipeline ID'
|
|
|
|
end
|
2022-04-27 11:10:01 -04:00
|
|
|
post ':id/pipelines/:pipeline_id/cancel', urgency: :low, feature_category: :continuous_integration do
|
2020-07-10 20:09:17 -04:00
|
|
|
authorize! :update_pipeline, pipeline
|
|
|
|
|
|
|
|
pipeline.cancel_running
|
|
|
|
|
|
|
|
status 200
|
2020-08-13 14:10:36 -04:00
|
|
|
present pipeline.reset, with: Entities::Ci::Pipeline
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
helpers do
|
|
|
|
def pipeline
|
|
|
|
strong_memoize(:pipeline) do
|
2020-07-17 14:09:20 -04:00
|
|
|
user_project.all_pipelines.find(params[:pipeline_id])
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
def latest_pipeline
|
|
|
|
strong_memoize(:latest_pipeline) do
|
2020-09-08 02:08:57 -04:00
|
|
|
user_project.latest_pipeline(params[:ref])
|
2020-07-10 20:09:17 -04:00
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|