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' ,
2022-08-10 20:09:45 -04:00
values : :: CommitStatus :: AVAILABLE_STATUSES ,
coerce_with : - > ( scope ) {
case scope
when String
[ scope ]
when :: Array
scope
else
[ 'unknown' ]
end
}
2020-09-11 08:08:50 -04:00
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'
2022-11-04 02:09:23 -04:00
optional :variables , type : Array , desc : 'Array of variables available in the pipeline' do
optional :key , type : String , desc : 'The key of the variable'
optional :value , type : String , desc : 'The value of the variable'
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-10 20:09:17 -04:00
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