debian-mirror-gitlab/lib/api/ci/pipelines.rb

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

355 lines
15 KiB
Ruby
Raw Normal View History

2020-07-28 23:09:34 +05:30
# frozen_string_literal: true
module API
module Ci
2021-01-03 14:25:43 +05:30
class Pipelines < ::API::Base
2020-07-28 23:09:34 +05:30
include PaginationParams
2022-07-23 23:45:48 +05:30
helpers ::API::Helpers::ProjectStatsRefreshConflictsHelpers
2020-07-28 23:09:34 +05:30
before { authenticate_non_get! }
params do
2023-01-13 00:05:48 +05:30
requires :id, type: String, desc: 'The project ID or URL-encoded path', documentation: { example: 11 }
2020-07-28 23:09:34 +05:30
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.'
2023-01-13 00:05:48 +05:30
success status: 200, model: Entities::Ci::PipelineBasic
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' }
]
is_array true
2020-07-28 23:09:34 +05:30
end
2020-11-24 15:15:51 +05:30
helpers do
params :optional_scope do
optional :scope, types: [String, Array[String]], desc: 'The scope of builds to show',
2022-08-27 11:52:29 +05:30
values: ::CommitStatus::AVAILABLE_STATUSES,
coerce_with: ->(scope) {
case scope
when String
[scope]
when ::Array
scope
else
['unknown']
end
2023-01-13 00:05:48 +05:30
},
documentation: { example: %w[pending running] }
2020-11-24 15:15:51 +05:30
end
end
2020-07-28 23:09:34 +05:30
params do
use :pagination
optional :scope, type: String, values: %w[running pending finished branches tags],
2023-01-13 00:05:48 +05:30
desc: 'The scope of pipelines',
documentation: { example: 'pending' }
2020-07-28 23:09:34 +05:30
optional :status, type: String, values: ::Ci::HasStatus::AVAILABLE_STATUSES,
2023-01-13 00:05:48 +05:30
desc: 'The status of pipelines',
documentation: { example: 'pending' }
optional :ref, type: String, desc: 'The ref of pipelines',
documentation: { example: 'develop' }
optional :sha, type: String, desc: 'The sha of pipelines',
documentation: { example: 'a91957a858320c0e17f3a0eca7cfacbff50ea29a' }
optional :yaml_errors, type: Boolean, desc: 'Returns pipelines with invalid configurations',
documentation: { example: false }
optional :username, type: String, desc: 'The username of the user who triggered pipelines',
documentation: { example: 'root' }
optional :updated_before, type: DateTime, desc: 'Return pipelines updated before the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ',
documentation: { example: '2015-12-24T15:51:21.880Z' }
optional :updated_after, type: DateTime, desc: 'Return pipelines updated after the specified datetime. Format: ISO 8601 YYYY-MM-DDTHH:MM:SSZ',
documentation: { example: '2015-12-24T15:51:21.880Z' }
2020-07-28 23:09:34 +05:30
optional :order_by, type: String, values: ::Ci::PipelinesFinder::ALLOWED_INDEXED_COLUMNS, default: 'id',
2023-01-13 00:05:48 +05:30
desc: 'Order pipelines',
documentation: { example: 'status' }
2020-07-28 23:09:34 +05:30
optional :sort, type: String, values: %w[asc desc], default: 'desc',
2023-01-13 00:05:48 +05:30
desc: 'Sort pipelines',
documentation: { example: 'asc' }
optional :source, type: String, values: ::Ci::Pipeline.sources.keys,
documentation: { example: 'push' }
2023-06-20 00:43:36 +05:30
optional :name, types: String, desc: 'Filter pipelines by name',
documentation: { example: 'Build pipeline' }
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
get ':id/pipelines', urgency: :low, feature_category: :continuous_integration do
2020-07-28 23:09:34 +05:30
authorize! :read_pipeline, user_project
authorize! :read_build, user_project
2023-06-20 00:43:36 +05:30
params.delete(:name) unless ::Feature.enabled?(:pipeline_name_in_api, user_project)
2020-07-28 23:09:34 +05:30
pipelines = ::Ci::PipelinesFinder.new(user_project, current_user, params).execute
2023-06-20 00:43:36 +05:30
pipelines = pipelines.preload_pipeline_metadata if ::Feature.enabled?(:pipeline_name_in_api, user_project)
present paginate(pipelines), with: Entities::Ci::PipelineBasicWithMetadata, project: user_project
2020-07-28 23:09:34 +05:30
end
desc 'Create a new pipeline' do
detail 'This feature was introduced in GitLab 8.14'
2023-01-13 00:05:48 +05:30
success status: 201, model: Entities::Ci::Pipeline
failure [
{ code: 400, message: 'Bad request' },
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :ref, type: String, desc: 'Reference',
documentation: { example: 'develop' }
optional :variables, type: Array, desc: 'Array of variables available in the pipeline' do
optional :key, type: String, desc: 'The key of the variable', documentation: { example: 'UPLOAD_TO_S3' }
optional :value, type: String, desc: 'The value of the variable', documentation: { example: 'true' }
optional :variable_type, type: String, values: ::Ci::PipelineVariable.variable_types.keys, default: 'env_var', desc: 'The type of variable, must be one of env_var or file. Defaults to env_var'
end
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
post ':id/pipeline', urgency: :low, feature_category: :continuous_integration do
2021-04-29 21:17:54 +05:30
Gitlab::QueryLimiting.disable!('https://gitlab.com/gitlab-org/gitlab/-/issues/20711')
2020-07-28 23:09:34 +05:30
authorize! :create_pipeline, user_project
pipeline_params = declared_params(include_missing: false)
.merge(variables_attributes: params[:variables])
.except(:variables)
2021-10-27 15:23:28 +05:30
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-28 23:09:34 +05:30
2021-10-27 15:23:28 +05:30
if response.success?
2020-10-24 23:57:45 +05:30
present new_pipeline, with: Entities::Ci::Pipeline
2020-07-28 23:09:34 +05:30
else
render_validation_error!(new_pipeline)
end
end
2023-01-13 00:05:48 +05:30
desc 'Gets the latest pipeline for the project branch' do
2020-07-28 23:09:34 +05:30
detail 'This feature was introduced in GitLab 12.3'
2023-06-20 00:43:36 +05:30
success status: 200, model: Entities::Ci::PipelineWithMetadata
2023-01-13 00:05:48 +05:30
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
optional :ref, type: String, desc: 'Branch ref of pipeline. Uses project default branch if not specified.',
documentation: { example: 'develop' }
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
get ':id/pipelines/latest', urgency: :low, feature_category: :continuous_integration do
2020-07-28 23:09:34 +05:30
authorize! :read_pipeline, latest_pipeline
2023-06-20 00:43:36 +05:30
present latest_pipeline, with: Entities::Ci::PipelineWithMetadata
2020-07-28 23:09:34 +05:30
end
desc 'Gets a specific pipeline for the project' do
detail 'This feature was introduced in GitLab 8.11'
2023-06-20 00:43:36 +05:30
success status: 200, model: Entities::Ci::PipelineWithMetadata
2023-01-13 00:05:48 +05:30
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
get ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
2020-07-28 23:09:34 +05:30
authorize! :read_pipeline, pipeline
2023-06-20 00:43:36 +05:30
present pipeline, with: Entities::Ci::PipelineWithMetadata
2020-07-28 23:09:34 +05:30
end
2020-11-24 15:15:51 +05:30
desc 'Get pipeline jobs' do
2023-01-13 00:05:48 +05:30
success status: 200, model: Entities::Ci::Job
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
is_array true
2020-11-24 15:15:51 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2021-03-11 19:13:27 +05:30
optional :include_retried, type: Boolean, default: false, desc: 'Includes retried jobs'
2020-11-24 15:15:51 +05:30
use :optional_scope
use :pagination
end
2022-05-07 20:08:51 +05:30
get ':id/pipelines/:pipeline_id/jobs', urgency: :low, feature_category: :continuous_integration do
2020-11-24 15:15:51 +05:30
authorize!(:read_pipeline, user_project)
pipeline = user_project.all_pipelines.find(params[:pipeline_id])
2021-01-29 00:20:46 +05:30
builds = ::Ci::JobsFinder
.new(current_user: current_user, pipeline: pipeline, params: params)
.execute
2020-11-24 15:15:51 +05:30
builds = builds.with_preloads
present paginate(builds), with: Entities::Ci::Job
end
desc 'Get pipeline bridge jobs' do
2023-01-13 00:05:48 +05:30
success status: 200, model: Entities::Ci::Bridge
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
is_array true
2020-11-24 15:15:51 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-11-24 15:15:51 +05:30
use :optional_scope
use :pagination
end
2023-05-27 22:25:52 +05:30
get ':id/pipelines/:pipeline_id/bridges', urgency: :low, feature_category: :pipeline_composition do
2020-11-24 15:15:51 +05:30
authorize!(:read_build, user_project)
pipeline = user_project.all_pipelines.find(params[:pipeline_id])
2021-01-29 00:20:46 +05:30
bridges = ::Ci::JobsFinder
.new(current_user: current_user, pipeline: pipeline, params: params, type: ::Ci::Bridge)
.execute
2020-11-24 15:15:51 +05:30
bridges = bridges.with_preloads
present paginate(bridges), with: Entities::Ci::Bridge
end
2020-07-28 23:09:34 +05:30
desc 'Gets the variables for a given pipeline' do
detail 'This feature was introduced in GitLab 11.11'
2023-01-13 00:05:48 +05:30
success status: 200, model: Entities::Ci::Variable
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
is_array true
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-07-28 23:09:34 +05:30
end
2023-06-20 00:43:36 +05:30
get ':id/pipelines/:pipeline_id/variables', feature_category: :secrets_management, urgency: :low do
2020-07-28 23:09:34 +05:30
authorize! :read_pipeline_variable, pipeline
2020-10-24 23:57:45 +05:30
present pipeline.variables, with: Entities::Ci::Variable
2020-07-28 23:09:34 +05:30
end
desc 'Gets the test report for a given pipeline' do
2020-10-24 23:57:45 +05:30
detail 'This feature was introduced in GitLab 13.0.'
2023-01-13 00:05:48 +05:30
success status: 200, model: TestReportEntity
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-07-28 23:09:34 +05:30
end
2022-04-04 11:22:00 +05:30
get ':id/pipelines/:pipeline_id/test_report', feature_category: :code_testing, urgency: :low do
2020-07-28 23:09:34 +05:30
authorize! :read_build, pipeline
present pipeline.test_reports, with: TestReportEntity, details: true
end
2021-10-27 15:23:28 +05:30
desc 'Gets the test report summary for a given pipeline' do
detail 'This feature was introduced in GitLab 14.2'
2023-01-13 00:05:48 +05:30
success status: 200, model: TestReportSummaryEntity
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2021-10-27 15:23:28 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2021-10-27 15:23:28 +05:30
end
2021-11-11 11:23:49 +05:30
get ':id/pipelines/:pipeline_id/test_report_summary', feature_category: :code_testing do
2021-10-27 15:23:28 +05:30
authorize! :read_build, pipeline
present pipeline.test_report_summary, with: TestReportSummaryEntity
end
2020-07-28 23:09:34 +05:30
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
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
delete ':id/pipelines/:pipeline_id', urgency: :low, feature_category: :continuous_integration do
2020-07-28 23:09:34 +05:30
authorize! :destroy_pipeline, pipeline
2022-07-23 23:45:48 +05:30
reject_if_build_artifacts_size_refreshing!(pipeline.project)
2020-07-28 23:09:34 +05:30
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.'
2023-01-13 00:05:48 +05:30
success status: 201, model: Entities::Ci::Pipeline
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
post ':id/pipelines/:pipeline_id/retry', urgency: :low, feature_category: :continuous_integration do
2020-07-28 23:09:34 +05:30
authorize! :update_pipeline, pipeline
2022-05-07 20:08:51 +05:30
response = pipeline.retry_failed(current_user)
2020-07-28 23:09:34 +05:30
2022-05-07 20:08:51 +05:30
if response.success?
present pipeline, with: Entities::Ci::Pipeline
else
render_api_error!(response.errors.join(', '), response.http_status)
end
2020-07-28 23:09:34 +05:30
end
desc 'Cancel all builds in the pipeline' do
detail 'This feature was introduced in GitLab 8.11.'
2023-01-13 00:05:48 +05:30
success status: 200, model: Entities::Ci::Pipeline
failure [
{ code: 401, message: 'Unauthorized' },
{ code: 403, message: 'Forbidden' },
{ code: 404, message: 'Not found' }
]
2020-07-28 23:09:34 +05:30
end
params do
2023-01-13 00:05:48 +05:30
requires :pipeline_id, type: Integer, desc: 'The pipeline ID', documentation: { example: 18 }
2020-07-28 23:09:34 +05:30
end
2022-07-16 23:28:13 +05:30
post ':id/pipelines/:pipeline_id/cancel', urgency: :low, feature_category: :continuous_integration do
2020-07-28 23:09:34 +05:30
authorize! :update_pipeline, pipeline
pipeline.cancel_running
status 200
2020-10-24 23:57:45 +05:30
present pipeline.reset, with: Entities::Ci::Pipeline
2020-07-28 23:09:34 +05:30
end
end
helpers do
def pipeline
strong_memoize(:pipeline) do
2020-10-24 23:57:45 +05:30
user_project.all_pipelines.find(params[:pipeline_id])
2020-07-28 23:09:34 +05:30
end
end
def latest_pipeline
strong_memoize(:latest_pipeline) do
2020-11-24 15:15:51 +05:30
user_project.latest_pipeline(params[:ref])
2020-07-28 23:09:34 +05:30
end
end
end
end
end
end