diff --git a/app/services/ci/stop_environment_service.rb b/app/services/ci/stop_environment_service.rb new file mode 100644 index 0000000000000000000000000000000000000000..5c208b738f7f0063c579a9e3fcf8accdc0768902 --- /dev/null +++ b/app/services/ci/stop_environment_service.rb @@ -0,0 +1,31 @@ +module Ci + class StopEnvironmentService < BaseService + def execute(ref) + @ref = ref + @commit = project.commit(ref) + + return unless has_ref_sha_pair? + return unless has_environments? + + environments.each do |environment| + next unless environment.stoppable? + + environment.stop!(current_user) + end + end + + private + + def has_ref_sha_pair? + @ref && @commit + end + + def has_environments? + environments.any? + end + + def environments + @environments ||= project.environments_for(@ref, @commit) + end + end +end diff --git a/app/services/delete_branch_service.rb b/app/services/delete_branch_service.rb index 3e5dd4ebb86b90da2322d91b1c27d38095a1a6d2..ec8ee7452d651b34e0929d4a28274f3b4d496e50 100644 --- a/app/services/delete_branch_service.rb +++ b/app/services/delete_branch_service.rb @@ -21,6 +21,8 @@ class DeleteBranchService < BaseService return error('You dont have push access to repo', 405) end + # StopEnvironmentService + if repository.rm_branch(current_user, branch_name) success('Branch was removed') else diff --git a/spec/services/ci/stop_environment_service_spec.rb b/spec/services/ci/stop_environment_service_spec.rb new file mode 100644 index 0000000000000000000000000000000000000000..40b2a028f67af282dee1fc24fa58b3ab6a68a061 --- /dev/null +++ b/spec/services/ci/stop_environment_service_spec.rb @@ -0,0 +1,35 @@ +require 'spec_helper' + +describe Ci::StopEnvironmentService, services: true do + let(:project) { create(:project) } + let(:user) { create(:user) } + + let(:service) { described_class.new(project, user) } + + describe '#execute' do + context 'when environment exists' do + let(:environment) { create(:environment, project: project) } + let(:deployable) { create(:ci_build) } + + let(:stop_build) do + create(:ci_build, :manual, name: 'environment/teardown', + pipeline: deployable.pipeline) + end + + before do + create(:deployment, environment: environment, + deployable: deployable, + on_stop: stop_build.name, + user: user, + project: project, + sha: project.commit.id) + end + + it 'stops environment' do + expect_any_instance_of(Environment).to receive(:stop!) + + service.execute('master') + end + end + end +end