提交 70f508f5 编写于 作者: L Lin Jen-Shin

Serve artifacts from Builds

上级 a9a8ceeb
......@@ -26,7 +26,6 @@ module API
# Ensure the namespace is right, otherwise we might load Grape::API::Helpers
helpers ::API::Helpers
mount ::API::Artifacts
mount ::API::AwardEmoji
mount ::API::Branches
mount ::API::Builds
......
module API
# Projects artifacts API
class Artifacts < Grape::API
before do
authenticate!
authorize!(:read_build, user_project)
end
resource :projects do
# Download the artifacts file from ref_name and build_name
#
# Parameters:
# id (required) - The ID of a project
# ref_name (required) - The ref from repository
# build_name (required) - The name for the build
# Example Request:
# GET /projects/:id/artifacts/:ref_name/:build_name
get ':id/artifacts/:ref_name/:build_name',
requirements: { ref_name: /.+/ } do
builds = user_project.builds_for(
params[:build_name], params[:ref_name])
latest_build = builds.success.latest.first
if latest_build
redirect(
"/projects/#{user_project.id}/builds/#{latest_build.id}/artifacts")
else
not_found!
end
end
end
end
end
......@@ -71,12 +71,27 @@ module API
build = get_build!(params[:build_id])
artifacts_file = build.artifacts_file
if !artifacts_file.file_storage?
redirect_to(build.artifacts_file.url)
present_artifact!(artifacts_file)
end
elsif artifacts_file.exists?
present_file!(artifacts_file.path, artifacts_file.filename)
# Download the artifacts file from ref_name and build_name
#
# Parameters:
# id (required) - The ID of a project
# ref_name (required) - The ref from repository
# job (required) - The name for the build
# Example Request:
# GET /projects/:id/artifacts/:ref_name/:build_name
get ':id/builds/artifacts/:ref_name',
requirements: { ref_name: /.+/ } do
builds = user_project.builds_for(
params[:job], params[:ref_name])
latest_build = builds.success.latest.first
if latest_build
redirect(
"/projects/#{user_project.id}/builds/#{latest_build.id}/artifacts")
else
not_found!
end
......@@ -191,6 +206,18 @@ module API
get_build(id) || not_found!
end
def present_artifact!(artifacts_file)
if !artifacts_file.file_storage?
redirect_to(build.artifacts_file.url)
elsif artifacts_file.exists?
present_file!(artifacts_file.path, artifacts_file.filename)
else
not_found!
end
end
def filter_builds(builds, scope)
return builds if scope.nil? || scope.empty?
......
require 'spec_helper'
require_relative '../shared/artifacts_context'
describe API::API, api: true do
describe API::API, api: true do
include ApiHelpers
describe 'GET /projects/:id/artifacts/:ref_name/:build_name' do
include_context 'artifacts from ref and build name'
def path_from_ref(ref = pipeline.sha, build_name = build.name, _ = '')
api("/projects/#{project.id}/artifacts/#{ref}/#{build_name}", user)
def path_from_ref(ref = pipeline.sha, job = build.name)
api("/projects/#{project.id}/builds/artifacts/#{ref}?job=#{job}", user)
end
context '401' do
......
require 'spec_helper'
describe API::API, api: true do
describe API::API, api: true do
include ApiHelpers
let(:user) { create(:user) }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册