diff options
author | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-03-01 11:39:36 +0100 |
---|---|---|
committer | Grzegorz Bizon <grzesiek.bizon@gmail.com> | 2017-03-01 11:39:36 +0100 |
commit | dd9d8ce82e5957974f87401d6dd437e4d2f3ad38 (patch) | |
tree | 35f8f2b95e3791cf995dbc794a92c1ace00dfc12 | |
parent | 48d7ed63912053a2a20f4352b7119ce267eb06fa (diff) | |
download | gitlab-ce-dd9d8ce82e5957974f87401d6dd437e4d2f3ad38.tar.gz |
Fix runner tags assignment when retrying a job
-rw-r--r-- | app/services/ci/retry_build_service.rb | 31 | ||||
-rw-r--r-- | spec/factories/ci/builds.rb | 4 | ||||
-rw-r--r-- | spec/services/ci/retry_build_service_spec.rb | 29 |
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 |