Commit 70f508f5 authored by Lin Jen-Shin's avatar Lin Jen-Shin

Serve artifacts from Builds

parent a9a8ceeb
...@@ -26,7 +26,6 @@ module API ...@@ -26,7 +26,6 @@ module API
# Ensure the namespace is right, otherwise we might load Grape::API::Helpers # Ensure the namespace is right, otherwise we might load Grape::API::Helpers
helpers ::API::Helpers helpers ::API::Helpers
mount ::API::Artifacts
mount ::API::AwardEmoji mount ::API::AwardEmoji
mount ::API::Branches mount ::API::Branches
mount ::API::Builds 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 ...@@ -71,12 +71,27 @@ module API
build = get_build!(params[:build_id]) build = get_build!(params[:build_id])
artifacts_file = build.artifacts_file artifacts_file = build.artifacts_file
if !artifacts_file.file_storage? present_artifact!(artifacts_file)
redirect_to(build.artifacts_file.url) end
elsif artifacts_file.exists? # Download the artifacts file from ref_name and build_name
present_file!(artifacts_file.path, artifacts_file.filename) #
# 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 else
not_found! not_found!
end end
...@@ -191,6 +206,18 @@ module API ...@@ -191,6 +206,18 @@ module API
get_build(id) || not_found! get_build(id) || not_found!
end 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) def filter_builds(builds, scope)
return builds if scope.nil? || scope.empty? return builds if scope.nil? || scope.empty?
......
require 'spec_helper' require 'spec_helper'
require_relative '../shared/artifacts_context' require_relative '../shared/artifacts_context'
describe API::API, api: true do describe API::API, api: true do
include ApiHelpers include ApiHelpers
describe 'GET /projects/:id/artifacts/:ref_name/:build_name' do describe 'GET /projects/:id/artifacts/:ref_name/:build_name' do
include_context 'artifacts from ref and build name' include_context 'artifacts from ref and build name'
def path_from_ref(ref = pipeline.sha, build_name = build.name, _ = '') def path_from_ref(ref = pipeline.sha, job = build.name)
api("/projects/#{project.id}/artifacts/#{ref}/#{build_name}", user) api("/projects/#{project.id}/builds/artifacts/#{ref}?job=#{job}", user)
end end
context '401' do context '401' do
......
require 'spec_helper' require 'spec_helper'
describe API::API, api: true do describe API::API, api: true do
include ApiHelpers include ApiHelpers
let(:user) { create(:user) } let(:user) { create(:user) }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment