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