gitlab-org--gitlab-foss/lib/api/builds.rb

148 lines
5.0 KiB
Ruby
Raw Normal View History

module API
# Projects builds API
class Builds < Grape::API
before { authenticate! }
resource :projects do
# Get a project builds
#
# Parameters:
# id (required) - The ID of a project
# scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
# if none provided showing all builds)
# Example Request:
2015-12-24 18:18:01 +00:00
# GET /projects/:id/builds
get ':id/builds' do
builds = user_project.builds.order('id DESC')
builds = filter_builds(builds, params[:scope])
2016-01-08 21:57:42 +00:00
present paginate(builds), with: Entities::Build,
user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
end
# Get builds for a specific commit of a project
#
# Parameters:
# id (required) - The ID of a project
# sha (required) - The SHA id of a commit
# scope (optional) - The scope of builds to show (one or array of: pending, running, failed, success, canceled;
# if none provided showing all builds)
# Example Request:
2016-01-11 09:20:45 +00:00
# GET /projects/:id/repository/commits/:sha/builds
get ':id/repository/commits/:sha/builds' do
2015-12-29 22:12:36 +00:00
commit = user_project.ci_commits.find_by_sha(params[:sha])
return not_found! unless commit
builds = commit.builds.order('id DESC')
builds = filter_builds(builds, params[:scope])
2016-01-08 21:57:42 +00:00
present paginate(builds), with: Entities::Build,
user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
end
# Get a specific build of a project
#
# Parameters:
# id (required) - The ID of a project
# build_id (required) - The ID of a build
# Example Request:
# GET /projects/:id/builds/:build_id
get ':id/builds/:build_id' do
build = get_build(params[:build_id])
return not_found!(build) unless build
2016-01-08 21:57:42 +00:00
present build, with: Entities::Build,
user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
end
# Get a trace of a specific build of a project
#
# Parameters:
# id (required) - The ID of a project
# build_id (required) - The ID of a build
# Example Request:
# GET /projects/:id/build/:build_id/trace
#
# TODO: We should use `present_file!` and leave this implementation for backward compatibility (when build trace
# is saved in the DB instead of file). But before that, we need to consider how to replace the value of
# `runners_token` with some mask (like `xxxxxx`) when sending trace file directly by workhorse.
get ':id/builds/:build_id/trace' do
2015-12-28 12:09:51 +00:00
build = get_build(params[:build_id])
return not_found!(build) unless build
2015-12-28 12:09:51 +00:00
header 'Content-Disposition', "infile; filename=\"#{build.id}.log\""
content_type 'text/plain'
env['api.format'] = :binary
2015-12-28 12:09:51 +00:00
trace = build.trace
body trace
end
2015-12-29 22:12:36 +00:00
# Cancel a specific build of a project
#
# parameters:
# id (required) - the id of a project
# build_id (required) - the id of a build
# example request:
# post /projects/:id/build/:build_id/cancel
post ':id/builds/:build_id/cancel' do
authorize_manage_builds!
build = get_build(params[:build_id])
return not_found!(build) unless build
build.cancel
2016-01-08 21:57:42 +00:00
present build, with: Entities::Build,
user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
end
2015-12-29 22:12:36 +00:00
# Retry a specific build of a project
#
# parameters:
# id (required) - the id of a project
# build_id (required) - the id of a build
# example request:
# post /projects/:id/build/:build_id/retry
post ':id/builds/:build_id/retry' do
authorize_manage_builds!
build = get_build(params[:build_id])
return forbidden!('Build is not retryable') unless build && build.retryable?
build = Ci::Build.retry(build)
2016-01-08 21:57:42 +00:00
present build, with: Entities::Build,
user_can_download_artifacts: can?(current_user, :download_build_artifacts, user_project)
end
end
helpers do
def get_build(id)
user_project.builds.where(id: id).first
end
def filter_builds(builds, scope)
available_scopes = Ci::Build.available_statuses
scope =
if scope.is_a?(String) || scope.is_a?(Symbol)
available_scopes & [scope.to_s]
elsif scope.is_a?(Array)
available_scopes & scope
elsif scope.respond_to?(:to_h)
available_scopes & scope.to_h.values
else
[]
end
return builds if scope.empty?
builds.where(status: scope)
end
def authorize_manage_builds!
authorize! :manage_builds, user_project
end
end
end
end