diff options
Diffstat (limited to 'app')
-rw-r--r-- | app/controllers/projects/deployments_controller.rb | 4 | ||||
-rw-r--r-- | app/controllers/projects/environments_controller.rb | 2 | ||||
-rw-r--r-- | app/finders/environments_finder.rb | 2 | ||||
-rw-r--r-- | app/models/concerns/deployable.rb | 5 | ||||
-rw-r--r-- | app/models/deployment.rb | 21 | ||||
-rw-r--r-- | app/models/environment.rb | 15 | ||||
-rw-r--r-- | app/models/environment_status.rb | 2 | ||||
-rw-r--r-- | app/models/project.rb | 2 | ||||
-rw-r--r-- | app/services/start_environment_service.rb (renamed from app/services/update_deployment_service.rb) | 11 | ||||
-rw-r--r-- | app/services/stop_environment_service.rb | 18 | ||||
-rw-r--r-- | app/workers/build_success_worker.rb | 7 | ||||
-rw-r--r-- | app/workers/deployments/success_worker.rb | 8 |
12 files changed, 56 insertions, 41 deletions
diff --git a/app/controllers/projects/deployments_controller.rb b/app/controllers/projects/deployments_controller.rb index 0a009477d61..bd4102d4531 100644 --- a/app/controllers/projects/deployments_controller.rb +++ b/app/controllers/projects/deployments_controller.rb @@ -6,7 +6,7 @@ class Projects::DeploymentsController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def index - deployments = environment.deployments.reorder(created_at: :desc) + deployments = environment.deployments.deployed.reorder(created_at: :desc) deployments = deployments.where('created_at > ?', params[:after].to_time) if params[:after]&.to_time render json: { deployments: DeploymentSerializer.new(project: project) @@ -47,7 +47,7 @@ class Projects::DeploymentsController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def deployment - @deployment ||= environment.deployments.find_by(iid: params[:id]) + @deployment ||= environment.deployments.deployed.find_by(iid: params[:id]) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/controllers/projects/environments_controller.rb b/app/controllers/projects/environments_controller.rb index de10783df1a..ab3ad9bf090 100644 --- a/app/controllers/projects/environments_controller.rb +++ b/app/controllers/projects/environments_controller.rb @@ -58,7 +58,7 @@ class Projects::EnvironmentsController < Projects::ApplicationController # rubocop: disable CodeReuse/ActiveRecord def show - @deployments = environment.deployments.order(id: :desc).page(params[:page]) + @deployments = environment.deployments.deployed.order(id: :desc).page(params[:page]) end # rubocop: enable CodeReuse/ActiveRecord diff --git a/app/finders/environments_finder.rb b/app/finders/environments_finder.rb index 32f41314359..156d49745c9 100644 --- a/app/finders/environments_finder.rb +++ b/app/finders/environments_finder.rb @@ -9,7 +9,7 @@ class EnvironmentsFinder # rubocop: disable CodeReuse/ActiveRecord def execute - deployments = project.deployments.success + deployments = project.deployments.deployed deployments = if ref deployments_query = params[:with_tags] ? 'ref = :ref OR tag IS TRUE' : 'ref = :ref' diff --git a/app/models/concerns/deployable.rb b/app/models/concerns/deployable.rb index f4f1989f0a9..d85d624fff3 100644 --- a/app/models/concerns/deployable.rb +++ b/app/models/concerns/deployable.rb @@ -7,7 +7,7 @@ module Deployable after_create :create_deployment def create_deployment - return unless starts_environment? && !has_deployment? + return unless has_environment? && !has_deployment? environment = project.environments.find_or_create_by( name: expanded_environment_name @@ -21,7 +21,8 @@ module Deployable sha: sha, user: user, deployable: self, - on_stop: on_stop).tap do |_| + on_stop: on_stop, + action: environment_action).tap do |_| self.reload # Reload relationships end end diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 305922611a6..322b3139759 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -10,9 +10,7 @@ class Deployment < ActiveRecord::Base belongs_to :user belongs_to :deployable, polymorphic: true # rubocop:disable Cop/PolymorphicAssociations - has_internal_id :iid, scope: :project, init: ->(s) do - Deployment.where(project: s.project).maximum(:iid) if s&.project - end + has_internal_id :iid, scope: :project, init: ->(s) { s&.project&.deployments&.maximum(:iid) } validates :sha, presence: true validates :ref, presence: true @@ -20,6 +18,8 @@ class Deployment < ActiveRecord::Base delegate :name, to: :environment, prefix: true scope :for_environment, -> (environment) { where(environment_id: environment) } + scope :deployed, -> { success.start } + scope :stopped, -> { success.stop } state_machine :status, initial: :created do event :run do @@ -57,6 +57,11 @@ class Deployment < ActiveRecord::Base canceled: 4 } + enum action: { + start: 1, + stop: 2 + } + def self.last_for_environment(environment) ids = self .for_environment(environment) @@ -132,7 +137,7 @@ class Deployment < ActiveRecord::Base def previous_deployment @previous_deployment ||= - project.deployments.success.joins(:environment) + project.deployments.deployed.joins(:environment) .where(environments: { name: self.environment.name }, ref: self.ref) .where.not(id: self.id) .take @@ -177,6 +182,14 @@ class Deployment < ActiveRecord::Base metrics&.merge(deployment_time: finished_at.to_i) || {} end + def deployed? + success? && start? + end + + def stopped? + success? && stop? + end + private def prometheus_adapter diff --git a/app/models/environment.rb b/app/models/environment.rb index 581c870b2c5..1a535ba6b18 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -8,9 +8,9 @@ class Environment < ActiveRecord::Base belongs_to :project, required: true - has_many :deployments, -> { success }, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent + has_many :deployments, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent - has_one :last_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment' + has_one :last_deployment, -> { deployed.order('deployments.id DESC') }, class_name: 'Deployment' before_validation :nullify_external_url before_validation :generate_slug, if: ->(env) { env.slug.blank? } @@ -50,7 +50,7 @@ class Environment < ActiveRecord::Base scope :in_review_folder, -> { where(environment_type: "review") } scope :for_name, -> (name) { where(name: name) } scope :for_project, -> (project) { where(project_id: project) } - scope :with_deployment, -> (sha) { where('EXISTS (?)', Deployment.select(1).where('deployments.environment_id = environments.id').where(sha: sha)) } + scope :with_deployment, -> (sha) { where('EXISTS (?)', Deployment.select(1).start.where('deployments.environment_id = environments.id').where(sha: sha)) } state_machine :state, initial: :available do event :start do @@ -103,15 +103,6 @@ class Environment < ActiveRecord::Base folder_name == "production" end - def first_deployment_for(commit_sha) - ref = project.repository.ref_name_for_sha(ref_path, commit_sha) - - return nil unless ref - - deployment_iid = ref.split('/').last - deployments.find_by(iid: deployment_iid) - end - def ref_path "refs/#{Repository::REF_ENVIRONMENTS}/#{slug}" end diff --git a/app/models/environment_status.rb b/app/models/environment_status.rb index 76fd0241239..b33c4f2738d 100644 --- a/app/models/environment_status.rb +++ b/app/models/environment_status.rb @@ -28,7 +28,7 @@ class EnvironmentStatus def deployment strong_memoize(:deployment) do - Deployment.where(environment: environment).find_by_sha(sha) + environment.deployments.start.find_by_sha(sha) end end diff --git a/app/models/project.rb b/app/models/project.rb index d5a4ae79c47..d3b148d0ac0 100644 --- a/app/models/project.rb +++ b/app/models/project.rb @@ -254,7 +254,7 @@ class Project < ActiveRecord::Base has_many :variables, class_name: 'Ci::Variable' has_many :triggers, class_name: 'Ci::Trigger' has_many :environments - has_many :deployments, -> { success } + has_many :deployments has_many :pipeline_schedules, class_name: 'Ci::PipelineSchedule' has_many :project_deploy_tokens has_many :deploy_tokens, through: :project_deploy_tokens diff --git a/app/services/update_deployment_service.rb b/app/services/start_environment_service.rb index aa7fcca1e2a..138ee55f6dc 100644 --- a/app/services/update_deployment_service.rb +++ b/app/services/start_environment_service.rb @@ -1,6 +1,6 @@ # frozen_string_literal: true -class UpdateDeploymentService +class StartEnvironmentService attr_reader :deployment attr_reader :deployable @@ -13,6 +13,8 @@ class UpdateDeploymentService end def execute + return unless deployment.deployed? + deployment.create_ref deployment.invalidate_cache @@ -20,10 +22,9 @@ class UpdateDeploymentService environment.external_url = expanded_environment_url if expanded_environment_url - environment.fire_state_event(action) + environment.fire_state_event(:start) break unless environment.save - break if environment.stopped? deployment.tap(&:update_merge_request_metrics!) end @@ -46,8 +47,4 @@ class UpdateDeploymentService def environment_url environment_options[:url] end - - def action - environment_options[:action] || 'start' - end end diff --git a/app/services/stop_environment_service.rb b/app/services/stop_environment_service.rb new file mode 100644 index 00000000000..79dbf292123 --- /dev/null +++ b/app/services/stop_environment_service.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +class StopEnvironmentService + attr_reader :deployment + + delegate :environment, to: :deployment + + def initialize(deployment) + @deployment = deployment + end + + def execute + return unless deployment.stopped? + + environment.fire_state_event(:stop) + environment.expire_etag_cache + end +end diff --git a/app/workers/build_success_worker.rb b/app/workers/build_success_worker.rb index 9a865fea621..f3530317090 100644 --- a/app/workers/build_success_worker.rb +++ b/app/workers/build_success_worker.rb @@ -10,7 +10,6 @@ class BuildSuccessWorker def perform(build_id) Ci::Build.find_by(id: build_id).try do |build| create_deployment(build) if build.has_environment? - stop_environment(build) if build.stops_environment? end end # rubocop: enable CodeReuse/ActiveRecord @@ -27,10 +26,4 @@ class BuildSuccessWorker deployment.succeed end end - - ## - # TODO: This should be processed in DeploymentSuccessWorker once we started storing `action` value in `deployments` records - def stop_environment(build) - build.persisted_environment.fire_state_event(:stop) - end end diff --git a/app/workers/deployments/success_worker.rb b/app/workers/deployments/success_worker.rb index da517f3fb26..68fe8997f12 100644 --- a/app/workers/deployments/success_worker.rb +++ b/app/workers/deployments/success_worker.rb @@ -8,9 +8,11 @@ module Deployments def perform(deployment_id) Deployment.find_by_id(deployment_id).try do |deployment| - break unless deployment.success? - - UpdateDeploymentService.new(deployment).execute + if deployment.deployed? + StartEnvironmentService.new(deployment).execute + elsif deployment.stopped? + StopEnvironmentService.new(deployment).execute + end end end end |