diff --git a/app/controllers/deploys_controller.rb b/app/controllers/deploys_controller.rb index daf37d9670..311557fcdc 100644 --- a/app/controllers/deploys_controller.rb +++ b/app/controllers/deploys_controller.rb @@ -47,8 +47,10 @@ def index end def new + defaults = {reference: @stage.default_reference} deploy_params = params.except(:project_id, :stage_id).permit(:reference).merge(stage: @stage) - @deploy = current_project.deploys.build(deploy_params) + + @deploy = current_project.deploys.build(defaults.merge(deploy_params)) end def create diff --git a/app/controllers/stages_controller.rb b/app/controllers/stages_controller.rb index aca86248b9..f8a1f1d260 100644 --- a/app/controllers/stages_controller.rb +++ b/app/controllers/stages_controller.rb @@ -121,22 +121,23 @@ def find_stage def stage_permitted_params [ - :name, + :builds_in_environment, + :cancel_queued_deploys, :confirm, - :permalink, :dashboard, - :production, - :notify_email_address, + :default_reference, :deploy_on_release, :email_committers_on_automated_deploy_failure, - :static_emails_on_automated_deploy_failure, - :no_code_deployed, :is_template, - :run_in_parallel, - :cancel_queued_deploys, - :periodical_deploy, + :name, + :no_code_deployed, :no_reference_selection, - :builds_in_environment, + :notify_email_address, + :periodical_deploy, + :permalink, + :production, + :run_in_parallel, + :static_emails_on_automated_deploy_failure, { deploy_group_ids: [], command_ids: [] diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index 25aadbae87..6dfdfc3659 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -35,8 +35,10 @@ def deploy_link(project, stage) elsif Lock.locked_for?(stage, current_user) content_tag :a, "Locked", class: "btn btn-primary disabled", disabled: true elsif stage.direct? - path = project_stage_deploys_path(project, stage, deploy: {reference: "master", stage_id: stage.id}) - link_to "Deploy!", path, role: "button", class: "btn btn-warning", data: {method: :post} + path = project_stage_deploys_path( + project, stage, deploy: {reference: stage.default_reference.presence || "master", stage_id: stage.id} + ) + link_to "Deploy", path, role: "button", class: "btn btn-warning", data: {method: :post} else path = new_project_stage_deploy_path(project, stage) link_to "Deploy", path, role: "button", class: "btn btn-primary" diff --git a/app/views/deploys/new.html.erb b/app/views/deploys/new.html.erb index 9f5763d317..223d5eb87c 100644 --- a/app/views/deploys/new.html.erb +++ b/app/views/deploys/new.html.erb @@ -18,7 +18,7 @@
<%= form.label :reference, "Reference", class: "col-lg-2 control-label" %> <% if @stage.no_reference_selection %> - <%= form.object.reference = 'master' %> + <%= form.object.reference = @stage.default_reference.presence || 'master' %> <%= form.hidden_field :reference, id: 'disable_js_hooks' %> <%= additional_info "Reference selection is disabled for this stage." %> <% else %> diff --git a/app/views/stages/_fields.html.erb b/app/views/stages/_fields.html.erb index 4c2f959895..f5d69ea41d 100644 --- a/app/views/stages/_fields.html.erb +++ b/app/views/stages/_fields.html.erb @@ -5,6 +5,7 @@ label: "Notify after deploy", help: "Email addresses to notify of finished deploys, separated by ;".html_safe %> + <%= form.input :default_reference, help: "Default reference to deploy e.g. 'master'" %> <% if DeployGroup.enabled? %> <%= render 'deploy_groups/deploy_group_select', form: form %> @@ -18,7 +19,8 @@ <% confirm_label = "Confirm before deployment" no_code_label = "Does not deploy code" - no_ref_label = "When selected with '#{no_code_label}' and disabled '#{confirm_label}' the stage can be directly executed." + no_ref_label = "Deploys with either the 'Default Reference' value or 'master'." \ + " When selected with '#{no_code_label}' and '#{confirm_label}' is disabled the stage can be directly executed." %> <% help = "Bypass " + [("buddy check" if BuddyCheck.enabled?), "release tracking"].compact.to_sentence %> diff --git a/db/migrate/20180921170100_add_default_reference_to_stages.rb b/db/migrate/20180921170100_add_default_reference_to_stages.rb new file mode 100644 index 0000000000..fbbde9ad5c --- /dev/null +++ b/db/migrate/20180921170100_add_default_reference_to_stages.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +class AddDefaultReferenceToStages < ActiveRecord::Migration[5.2] + def change + add_column :stages, :default_reference, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 2f7370c770..cab6a59a17 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema.define(version: 2018_09_20_200759) do +ActiveRecord::Schema.define(version: 2018_09_21_170100) do create_table "audits" do |t| t.integer "auditable_id", null: false @@ -530,6 +530,7 @@ t.string "notify_email_address" t.float "average_deploy_time" t.string "prerequisite_stage_ids" + t.string "default_reference" t.index ["project_id", "permalink"], name: "index_stages_on_project_id_and_permalink", unique: true, length: { permalink: 191 } t.index ["template_stage_id"], name: "index_stages_on_template_stage_id" end diff --git a/test/controllers/deploys_controller_test.rb b/test/controllers/deploys_controller_test.rb index d2eef2a0c6..7d32e21627 100644 --- a/test/controllers/deploys_controller_test.rb +++ b/test/controllers/deploys_controller_test.rb @@ -368,6 +368,20 @@ def changeset(overrides = {}) deploy.stage.must_equal stage deploy.reference.must_equal "abcd" end + + describe "with default reference" do + before { stage.update_column(:default_reference, 'pandas4lyfe') } + + it "sets default reference" do + get :new, params: {project_id: project.to_param, stage_id: stage.to_param} + assigns(:deploy).reference.must_equal 'pandas4lyfe' + end + + it "sets passed in reference over default reference" do + get :new, params: {project_id: project.to_param, stage_id: stage.to_param, reference: "abcd"} + assigns(:deploy).reference.must_equal "abcd" + end + end end describe "#create" do diff --git a/test/helpers/application_helper_test.rb b/test/helpers/application_helper_test.rb index 2ec1b39229..328eb53193 100644 --- a/test/helpers/application_helper_test.rb +++ b/test/helpers/application_helper_test.rb @@ -112,10 +112,21 @@ assert_includes link, %(href="/projects/#{project.to_param}/deploys/#{deploy.id}") end - it "shows direct link when stage is direct" do - stage.stubs(direct?: true) - link.must_include ">Deploy!<" - link.must_include "btn-warning" + describe "direct stage" do + before { stage.stubs(direct?: true) } + + it "shows direct link when stage is direct" do + link.must_include ">Deploy<" + link.must_include "master" + link.must_include "btn-warning" + end + + it "shows direct link with default ref if set" do + stage.update_column(:default_reference, 'foobar') + link.must_include ">Deploy<" + link.must_include "foobar" + link.must_include "btn-warning" + end end describe "when stage can run in parallel" do