summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-03-01 11:39:36 +0100
committerGrzegorz Bizon <grzesiek.bizon@gmail.com>2017-03-01 11:39:36 +0100
commitdd9d8ce82e5957974f87401d6dd437e4d2f3ad38 (patch)
tree35f8f2b95e3791cf995dbc794a92c1ace00dfc12
parent48d7ed63912053a2a20f4352b7119ce267eb06fa (diff)
downloadgitlab-ce-dd9d8ce82e5957974f87401d6dd437e4d2f3ad38.tar.gz
Fix runner tags assignment when retrying a job
-rw-r--r--app/services/ci/retry_build_service.rb31
-rw-r--r--spec/factories/ci/builds.rb4
-rw-r--r--spec/services/ci/retry_build_service_spec.rb29
3 files changed, 41 insertions, 23 deletions
diff --git a/app/services/ci/retry_build_service.rb b/app/services/ci/retry_build_service.rb
index 38ef323f6e5..001a3e1214a 100644
--- a/app/services/ci/retry_build_service.rb
+++ b/app/services/ci/retry_build_service.rb
@@ -1,18 +1,21 @@
module Ci
class RetryBuildService < ::BaseService
- CLONE_ATTRIBUTES = %i[pipeline project ref tag options commands name
- allow_failure stage stage_idx trigger_request
- yaml_variables when environment coverage_regex]
- .freeze
-
- REJECT_ATTRIBUTES = %i[id status user token coverage trace runner
- artifacts_expire_at artifacts_file
- artifacts_metadata artifacts_size
- created_at updated_at started_at finished_at
- queued_at erased_by erased_at].freeze
-
- IGNORE_ATTRIBUTES = %i[type lock_version gl_project_id target_url
- deploy job_id description].freeze
+ CLONE_ACCESSORS = %i[pipeline project ref tag options commands name
+ allow_failure stage stage_idx trigger_request
+ yaml_variables when environment coverage_regex
+ description tag_list].freeze
+
+ REJECT_ACCESSORS = %i[id status user token coverage trace runner
+ artifacts_expire_at artifacts_file
+ artifacts_metadata artifacts_size
+ created_at updated_at started_at finished_at
+ queued_at erased_by erased_at].freeze
+
+ IGNORE_ACCESSORS = %i[type lock_version target_url gl_project_id
+ deploy job_id base_tags commit_id deployments
+ erased_by_id last_deployment project_id runner_id
+ tag_taggings taggings tags trigger_request_id
+ user_id].freeze
def execute(build)
reprocess(build).tap do |new_build|
@@ -31,7 +34,7 @@ module Ci
raise Gitlab::Access::AccessDeniedError
end
- attributes = CLONE_ATTRIBUTES.map do |attribute|
+ attributes = CLONE_ACCESSORS.map do |attribute|
[attribute, build.send(attribute)]
end
diff --git a/spec/factories/ci/builds.rb b/spec/factories/ci/builds.rb
index a90534d10ba..8218293604d 100644
--- a/spec/factories/ci/builds.rb
+++ b/spec/factories/ci/builds.rb
@@ -76,6 +76,10 @@ FactoryGirl.define do
manual
end
+ trait :tags do
+ tag_list [:docker, :ruby]
+ end
+
after(:build) do |build, evaluator|
build.project = build.pipeline.project
end
diff --git a/spec/services/ci/retry_build_service_spec.rb b/spec/services/ci/retry_build_service_spec.rb
index d03f7505eac..f4bc05377dc 100644
--- a/spec/services/ci/retry_build_service_spec.rb
+++ b/spec/services/ci/retry_build_service_spec.rb
@@ -13,11 +13,11 @@ describe Ci::RetryBuildService, :services do
shared_examples 'build duplication' do
let(:build) do
create(:ci_build, :failed, :artifacts_expired, :erased, :trace,
- :queued, :coverage, pipeline: pipeline)
+ :queued, :coverage, :tags, pipeline: pipeline)
end
describe 'clone attributes' do
- described_class::CLONE_ATTRIBUTES.each do |attribute|
+ described_class::CLONE_ACCESSORS.each do |attribute|
it "clones #{attribute} build attribute" do
expect(new_build.send(attribute)).to eq build.send(attribute)
end
@@ -25,7 +25,7 @@ describe Ci::RetryBuildService, :services do
end
describe 'reject attributes' do
- described_class::REJECT_ATTRIBUTES.each do |attribute|
+ described_class::REJECT_ACCESSORS.each do |attribute|
it "does not clone #{attribute} build attribute" do
expect(new_build.send(attribute)).not_to eq build.send(attribute)
end
@@ -33,12 +33,23 @@ describe Ci::RetryBuildService, :services do
end
it 'has correct number of known attributes' do
- attributes =
- described_class::CLONE_ATTRIBUTES +
- described_class::IGNORE_ATTRIBUTES +
- described_class::REJECT_ATTRIBUTES
-
- expect(build.attributes.size).to eq(attributes.size)
+ known_accessors =
+ described_class::CLONE_ACCESSORS +
+ described_class::IGNORE_ACCESSORS +
+ described_class::REJECT_ACCESSORS
+
+ # :tag_list is a special case, this accessor does not exist
+ # in reflected associations, comes from `act_as_taggable` and
+ # we use it to copy tags, instead of reusing tags.
+ #
+ current_accessors =
+ build.attribute_names.map.map(&:to_sym) +
+ build._reflections.map { |assoc| assoc.first.to_sym } +
+ [:tag_list]
+
+ current_accessors.uniq!
+
+ expect(known_accessors).to contain_exactly(*current_accessors)
end
end