Add artifacts downloading API
This commit is contained in:
parent
c2eb54760d
commit
f7d352341e
|
@ -221,6 +221,31 @@ module API
|
|||
render_validation_error!(job)
|
||||
end
|
||||
end
|
||||
|
||||
desc 'Download the artifacts file for job' do
|
||||
http_codes [[200, 'Upload allowed'],
|
||||
[403, 'Forbidden'],
|
||||
[404, 'Artifact not found']]
|
||||
end
|
||||
params do
|
||||
requires :id, type: Fixnum, desc: %q(Job's ID)
|
||||
optional :token, type: String, desc: %q(Job's authentication token)
|
||||
end
|
||||
get '/:id/artifacts' do
|
||||
job = Ci::Build.find_by_id(params[:id])
|
||||
authenticate_job!(job)
|
||||
|
||||
artifacts_file = job.artifacts_file
|
||||
unless artifacts_file.file_storage?
|
||||
return redirect_to job.artifacts_file.url
|
||||
end
|
||||
|
||||
unless artifacts_file.exists?
|
||||
not_found!
|
||||
end
|
||||
|
||||
present_file!(artifacts_file.path, artifacts_file.filename)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
|
@ -895,6 +895,46 @@ describe API::Runner do
|
|||
post api("/jobs/#{job.id}/artifacts"), params, headers
|
||||
end
|
||||
end
|
||||
|
||||
describe 'GET /api/v4/jobs/:id/artifacts' do
|
||||
let(:token) { job.token }
|
||||
|
||||
before { download_artifact }
|
||||
|
||||
context 'when job has artifacts' do
|
||||
let(:job) { create(:ci_build, :artifacts) }
|
||||
let(:download_headers) do
|
||||
{ 'Content-Transfer-Encoding' => 'binary',
|
||||
'Content-Disposition' => 'attachment; filename=ci_build_artifacts.zip' }
|
||||
end
|
||||
|
||||
context 'when using job token' do
|
||||
it 'download artifacts' do
|
||||
expect(response).to have_http_status(200)
|
||||
expect(response.headers).to include download_headers
|
||||
end
|
||||
end
|
||||
|
||||
context 'when using runnners token' do
|
||||
let(:token) { job.project.runners_token }
|
||||
|
||||
it 'responds with forbidden' do
|
||||
expect(response).to have_http_status(403)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
context 'when job does not has artifacts' do
|
||||
it 'responds with not found' do
|
||||
expect(response).to have_http_status(404)
|
||||
end
|
||||
end
|
||||
|
||||
def download_artifact(params = {}, request_headers = headers)
|
||||
params = params.merge(token: token)
|
||||
get api("/jobs/#{job.id}/artifacts"), params, request_headers
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
|
Loading…
Reference in New Issue