Welcome to mirror list, hosted at ThFree Co, Russian Federation.

gitlab.com/gitlab-org/gitlab-foss.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/lib/api
diff options
context:
space:
mode:
authorKamil Trzciński <ayufan@ayufan.eu>2015-11-11 15:44:37 +0300
committerKamil Trzciński <ayufan@ayufan.eu>2015-11-11 15:44:37 +0300
commitfb5c3c70216d7a1151fa4ec767cd034bbb435587 (patch)
treef4858bc2d5671afa0d55f53f349c7609628d8819 /lib/api
parentdfa09789061bbd3891c17ebbcc23f7bd6b95336c (diff)
parentd70f1f35b13411adf184fafb750ae8d8fb6badea (diff)
Merge branch 'artifacts' into 'master'
Implement Build Artifacts This implements #3028 1. It stores artifacts in shared/artifacts, 1. It adds `artifacts` to `.gitlab-ci.yml`, 1. We use GitLab Workhorse to offload artifacts uploading, 1. To download artifacts it uses GitLab Workhorse X-Sendfile extension, 1. There's one "artifact" per-build. The new upload removes previous one and creates a new one, 1. Default max artifact size is set to 100MB - this can be changed in settings. Missing things: 1. Support for `.gitlab-ci.yml`: `artifacts: true or git-ls-files` which will upload all non tracked files, 1. Artifacts passing between builds. GitLab Workhorse changes: https://gitlab.com/gitlab-org/gitlab-workhorse/merge_requests/5 GitLab Runner changes: https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/merge_requests/46 Syntax: ``` artifacts: untracked: true # default: false paths: # default: empty - bin/files ``` See merge request !1584
Diffstat (limited to 'lib/api')
-rw-r--r--lib/api/helpers.rb48
1 files changed, 48 insertions, 0 deletions
diff --git a/lib/api/helpers.rb b/lib/api/helpers.rb
index 652bdf9b278..92540ccf2b1 100644
--- a/lib/api/helpers.rb
+++ b/lib/api/helpers.rb
@@ -133,6 +133,12 @@ module API
authorize! :admin_project, user_project
end
+ def require_gitlab_workhorse!
+ unless env['HTTP_GITLAB_WORKHORSE'].present?
+ forbidden!('Request should be executed via GitLab Workhorse')
+ end
+ end
+
def can?(object, action, subject)
abilities.allowed?(object, action, subject)
end
@@ -234,6 +240,10 @@ module API
render_api_error!(message || '409 Conflict', 409)
end
+ def file_to_large!
+ render_api_error!('413 Request Entity Too Large', 413)
+ end
+
def render_validation_error!(model)
if model.errors.any?
render_api_error!(model.errors.messages || '400 Bad Request', 400)
@@ -282,6 +292,44 @@ module API
end
end
+ # file helpers
+
+ def uploaded_file!(field, uploads_path)
+ if params[field]
+ bad_request!("#{field} is not a file") unless params[field].respond_to?(:filename)
+ return params[field]
+ end
+
+ # sanitize file paths
+ # this requires all paths to exist
+ required_attributes! %W(#{field}.path)
+ uploads_path = File.realpath(uploads_path)
+ file_path = File.realpath(params["#{field}.path"])
+ bad_request!('Bad file path') unless file_path.start_with?(uploads_path)
+
+ UploadedFile.new(
+ file_path,
+ params["#{field}.name"],
+ params["#{field}.type"] || 'application/octet-stream',
+ )
+ end
+
+ def present_file!(path, filename, content_type = 'application/octet-stream')
+ filename ||= File.basename(path)
+ header['Content-Disposition'] = "attachment; filename=#{filename}"
+ header['Content-Transfer-Encoding'] = 'binary'
+ content_type content_type
+
+ # Support download acceleration
+ case headers['X-Sendfile-Type']
+ when 'X-Sendfile'
+ header['X-Sendfile'] = path
+ body
+ else
+ file FileStreamer.new(path)
+ end
+ end
+
private
def add_pagination_headers(paginated, per_page)