diff --git a/app/models/deploy_service.rb b/app/models/deploy_service.rb index 95cc61d929..72023aab30 100644 --- a/app/models/deploy_service.rb +++ b/app/models/deploy_service.rb @@ -78,6 +78,7 @@ def latest_approved_deploy(reference, project) def copy_approval_from_last_deploy(deploy) return false unless last_deploy = latest_approved_deploy(deploy.reference, deploy.stage.project) + return false if deploy.changeset_to(last_deploy).commits.any? return false if stage_script_changed_after?(last_deploy) deploy.buddy = (last_deploy.buddy == @user ? last_deploy.job.user : last_deploy.buddy) diff --git a/test/models/deploy_service_test.rb b/test/models/deploy_service_test.rb index fc904dc4e4..c5feba1afd 100644 --- a/test/models/deploy_service_test.rb +++ b/test/models/deploy_service_test.rb @@ -33,8 +33,9 @@ before { BuddyCheck.stubs(:enabled?).returns(true) } let(:deploy) { deploys(:succeeded_production_test) } - def create_previous_deploy(ref, stage, successful: true, bypassed: false) - job = project.jobs.create!(user: user, command: "foo", status: successful ? "succeeded" : 'failed') + def create_previous_deploy(ref, stage, successful: true, bypassed: false, commit: nil) + status = successful ? "succeeded" : 'failed' + job = project.jobs.create!(user: user, command: "foo", status: status, commit: commit) buddy = bypassed ? user : other_user Deploy.create!(job: job, reference: ref, stage: stage, buddy: buddy, started_at: Time.now, project: project) end @@ -85,6 +86,15 @@ def create_previous_deploy(ref, stage, successful: true, bypassed: false) end end + describe "similar deploy reference with different commit sha" do + it "does not start the deploy" do + create_previous_deploy(ref1, stage_production_1, commit: 'xyz') + Changeset.any_instance.expects(:commits).returns(['xyz']) + service.expects(:confirm_deploy).never + service.deploy(stage_production_1, reference: ref1) + end + end + describe "if deploy groups are enabled" do before do DeployGroup.stubs(:enabled?).returns(true)