summaryrefslogtreecommitdiff
path: root/app
diff options
context:
space:
mode:
Diffstat (limited to 'app')
-rw-r--r--app/controllers/projects/deployments_controller.rb4
-rw-r--r--app/controllers/projects/environments_controller.rb2
-rw-r--r--app/finders/environments_finder.rb2
-rw-r--r--app/models/concerns/deployable.rb5
-rw-r--r--app/models/deployment.rb21
-rw-r--r--app/models/environment.rb15
-rw-r--r--app/models/environment_status.rb2
-rw-r--r--app/models/project.rb2
-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.rb18
-rw-r--r--app/workers/build_success_worker.rb7
-rw-r--r--app/workers/deployments/success_worker.rb8
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