Use normal file upload mechanism to upload artifacts
This commit is contained in:
parent
7e4e3fb3b6
commit
db3213fc1c
3 changed files with 34 additions and 23 deletions
|
@ -294,19 +294,23 @@ module API
|
||||||
|
|
||||||
# file helpers
|
# file helpers
|
||||||
|
|
||||||
def uploaded_file!(uploads_path)
|
def uploaded_file!(field, uploads_path)
|
||||||
required_attributes! [:file]
|
if params[field]
|
||||||
|
bad_request!("#{field} is not a file") unless params[field].respond_to?(:filename)
|
||||||
|
return params[field]
|
||||||
|
end
|
||||||
|
|
||||||
# sanitize file paths
|
# sanitize file paths
|
||||||
# this requires for all paths to exist
|
# this requires all paths to exist
|
||||||
|
required_attributes! %W(#{field}.path)
|
||||||
uploads_path = File.realpath(uploads_path)
|
uploads_path = File.realpath(uploads_path)
|
||||||
file_path = File.realpath(params[:file])
|
file_path = File.realpath(params["#{field}.path"])
|
||||||
bad_request!('Bad file path') unless file_path.start_with?(uploads_path)
|
bad_request!('Bad file path') unless file_path.start_with?(uploads_path)
|
||||||
|
|
||||||
UploadedFile.new(
|
UploadedFile.new(
|
||||||
file_path,
|
file_path,
|
||||||
params[:filename],
|
params["#{field}.name"],
|
||||||
params[:filetype] || 'application/octet-stream',
|
params["#{field}.type"] || 'application/octet-stream',
|
||||||
)
|
)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ module Ci
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# id (required) - The ID of a build
|
# id (required) - The ID of a build
|
||||||
# token (required) - The build authorization token
|
# token (required) - The build authorization token
|
||||||
# size (optional) - the size of uploaded file
|
# filesize (optional) - the size of uploaded file
|
||||||
# Example Request:
|
# Example Request:
|
||||||
# POST /builds/:id/artifacts/authorize
|
# POST /builds/:id/artifacts/authorize
|
||||||
post ":id/artifacts/authorize" do
|
post ":id/artifacts/authorize" do
|
||||||
|
@ -77,18 +77,16 @@ module Ci
|
||||||
# Parameters:
|
# Parameters:
|
||||||
# id (required) - The ID of a build
|
# id (required) - The ID of a build
|
||||||
# token (required) - The build authorization token
|
# token (required) - The build authorization token
|
||||||
|
# file (required) - The uploaded file
|
||||||
|
# Parameters (accelerated by GitLab Workhorse):
|
||||||
|
# file.path - path to locally stored body (generated by Workhorse)
|
||||||
|
# file.name - real filename as send in Content-Disposition
|
||||||
|
# file.type - real content type as send in Content-Type
|
||||||
# Headers:
|
# Headers:
|
||||||
# Content-Type - File content type
|
|
||||||
# Content-Disposition - File media type and real name
|
|
||||||
# BUILD-TOKEN (required) - The build authorization token, the same as token
|
# BUILD-TOKEN (required) - The build authorization token, the same as token
|
||||||
# Body:
|
# Body:
|
||||||
# The file content
|
# The file content
|
||||||
#
|
#
|
||||||
# Parameters (set by GitLab Workhorse):
|
|
||||||
# file - path to locally stored body (generated by Workhorse)
|
|
||||||
# filename - real filename as send in Content-Disposition
|
|
||||||
# filetype - real content type as send in Content-Type
|
|
||||||
# filesize - real file size as send in Content-Length
|
|
||||||
# Example Request:
|
# Example Request:
|
||||||
# POST /builds/:id/artifacts
|
# POST /builds/:id/artifacts
|
||||||
post ":id/artifacts" do
|
post ":id/artifacts" do
|
||||||
|
@ -98,7 +96,7 @@ module Ci
|
||||||
authenticate_build_token!(build)
|
authenticate_build_token!(build)
|
||||||
forbidden!('build is not running') unless build.running?
|
forbidden!('build is not running') unless build.running?
|
||||||
|
|
||||||
file = uploaded_file!(ArtifactUploader.artifacts_upload_path)
|
file = uploaded_file!(:file, ArtifactUploader.artifacts_upload_path)
|
||||||
file_to_large! unless file.size < max_artifacts_size
|
file_to_large! unless file.size < max_artifacts_size
|
||||||
|
|
||||||
if build.update_attributes(artifacts_file: file)
|
if build.update_attributes(artifacts_file: file)
|
||||||
|
|
|
@ -194,8 +194,14 @@ describe Ci::API::API do
|
||||||
build.run!
|
build.run!
|
||||||
end
|
end
|
||||||
|
|
||||||
it do
|
it "uses regual file post" do
|
||||||
upload_artifacts(file_upload, headers_with_token)
|
upload_artifacts(file_upload, headers_with_token, false)
|
||||||
|
expect(response.status).to eq(201)
|
||||||
|
expect(json_response["artifacts_file"]["filename"]).to eq(file_upload.original_filename)
|
||||||
|
end
|
||||||
|
|
||||||
|
it "uses accelerated file post" do
|
||||||
|
upload_artifacts(file_upload, headers_with_token, true)
|
||||||
expect(response.status).to eq(201)
|
expect(response.status).to eq(201)
|
||||||
expect(json_response["artifacts_file"]["filename"]).to eq(file_upload.original_filename)
|
expect(json_response["artifacts_file"]["filename"]).to eq(file_upload.original_filename)
|
||||||
end
|
end
|
||||||
|
@ -263,12 +269,15 @@ describe Ci::API::API do
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
def upload_artifacts(file, headers = {})
|
def upload_artifacts(file, headers = {}, accelerated = true)
|
||||||
params = {
|
if accelerated
|
||||||
file: file.path,
|
post post_url, {
|
||||||
filename: file.original_filename,
|
'file.path' => file.path,
|
||||||
}
|
'file.name' => file.original_filename
|
||||||
post post_url, params, headers
|
}, headers
|
||||||
|
else
|
||||||
|
post post_url, { file: file }, headers
|
||||||
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue