Commit fe0c59d2 authored by Lin Jen-Shin's avatar Lin Jen-Shin

Introduce ci_builds.artifacts_sizes as JSON:

We store the sizes as a hash from path to bytes like:

``` ruby
{'ci_artifacts.txt' => 27,
 'other_artifacts_0.1.2/another-subdirectory/banana_sample.gif' =>
71759,
 'other_artifacts_0.1.2/doc_sample.txt' => 1314,
 'rails_sample.jpg' => 35255,
 'tests_encoding/utf8 test dir ✓/regular_file_2' => 7}
```

So that it's easier to access than reading gzip file again.
parent aa3a3fd1
...@@ -5,6 +5,7 @@ module Ci ...@@ -5,6 +5,7 @@ module Ci
belongs_to :erased_by, class_name: 'User' belongs_to :erased_by, class_name: 'User'
serialize :options serialize :options
serialize :artifacts_sizes, JSON
validates :coverage, numericality: true, allow_blank: true validates :coverage, numericality: true, allow_blank: true
validates_presence_of :ref validates_presence_of :ref
...@@ -328,8 +329,19 @@ module Ci ...@@ -328,8 +329,19 @@ module Ci
artifacts? && artifacts_metadata.exists? artifacts? && artifacts_metadata.exists?
end end
def artifacts_metadata_sizes
return unless artifacts_metadata?
entries = new_artifacts_metadata('', recursive: true).find_entries!
entries.inject({}) do |result, (path, metadata)|
result[path] = metadata[:size] if metadata[:size]
result
end
end
def artifacts_metadata_entry(path, **options) def artifacts_metadata_entry(path, **options)
Gitlab::Ci::Build::Artifacts::Metadata.new(artifacts_metadata.path, path, **options).to_entry new_artifacts_metadata(path, **options).to_entry
end end
def erase_artifacts! def erase_artifacts!
...@@ -375,6 +387,13 @@ module Ci ...@@ -375,6 +387,13 @@ module Ci
private private
def new_artifacts_metadata(path, **options)
Gitlab::Ci::Build::Artifacts::Metadata.new(
artifacts_metadata.path,
path,
**options)
end
def erase_trace! def erase_trace!
self.trace = nil self.trace = nil
end end
......
# See http://doc.gitlab.com/ce/development/migration_style_guide.html
# for more information on how to write migrations for GitLab.
class AddArtifactsSizesToCiBuilds < ActiveRecord::Migration
include Gitlab::Database::MigrationHelpers
def change
# Or :json if under PostgreSQL?
add_column(:ci_builds, :artifacts_sizes, :text)
end
end
...@@ -147,6 +147,7 @@ module Ci ...@@ -147,6 +147,7 @@ module Ci
build.artifacts_file = artifacts build.artifacts_file = artifacts
build.artifacts_metadata = metadata build.artifacts_metadata = metadata
build.artifacts_expire_in = params['expire_in'] build.artifacts_expire_in = params['expire_in']
build.artifacts_sizes = build.artifacts_metadata_sizes
if build.save if build.save
present(build, with: Entities::BuildDetails) present(build, with: Entities::BuildDetails)
......
...@@ -309,7 +309,7 @@ describe Ci::API::API do ...@@ -309,7 +309,7 @@ describe Ci::API::API do
shared_examples 'post artifact' do shared_examples 'post artifact' do
it 'updates successfully' do it 'updates successfully' do
response_filename = response_filename =
json_response["artifacts_file"]["filename"] json_response['artifacts_file']['filename']
expect(response).to have_http_status(201) expect(response).to have_http_status(201)
expect(response_filename).to eq(file_upload.original_filename) expect(response_filename).to eq(file_upload.original_filename)
...@@ -344,10 +344,14 @@ describe Ci::API::API do ...@@ -344,10 +344,14 @@ describe Ci::API::API do
context 'should post artifacts file and metadata file' do context 'should post artifacts file and metadata file' do
let!(:artifacts) { file_upload } let!(:artifacts) { file_upload }
let!(:metadata) { file_upload2 } let!(:metadata) do
fixture_file_upload(
Rails.root + 'spec/fixtures/ci_build_artifacts_metadata.gz')
end
let(:stored_artifacts_file) { build.reload.artifacts_file.file } let(:stored_artifacts_file) { build.reload.artifacts_file.file }
let(:stored_metadata_file) { build.reload.artifacts_metadata.file } let(:stored_metadata_file) { build.reload.artifacts_metadata.file }
let(:stored_artifacts_sizes) { build.reload.artifacts_sizes }
before do before do
post(post_url, post_data, headers_with_token) post(post_url, post_data, headers_with_token)
...@@ -365,6 +369,12 @@ describe Ci::API::API do ...@@ -365,6 +369,12 @@ describe Ci::API::API do
expect(response).to have_http_status(201) expect(response).to have_http_status(201)
expect(stored_artifacts_file.original_filename).to eq(artifacts.original_filename) expect(stored_artifacts_file.original_filename).to eq(artifacts.original_filename)
expect(stored_metadata_file.original_filename).to eq(metadata.original_filename) expect(stored_metadata_file.original_filename).to eq(metadata.original_filename)
expect(stored_artifacts_sizes).to eq(
'ci_artifacts.txt' => 27,
'other_artifacts_0.1.2/another-subdirectory/banana_sample.gif' => 71759,
'other_artifacts_0.1.2/doc_sample.txt' => 1314,
'rails_sample.jpg' => 35255,
'tests_encoding/utf8 test dir ✓/regular_file_2' => 7)
end end
end end
......
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