summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShinya Maeda <shinya@gitlab.com>2018-10-15 20:39:30 +0900
committerShinya Maeda <shinya@gitlab.com>2018-10-15 20:39:30 +0900
commitfaeb32b947559908255f44c57283a3644a479808 (patch)
treeb33034cccb24f32d617505be64126cdf64daecaa
parent75b6ed8d2d0591efa19b02173c0524551e95f691 (diff)
downloadgitlab-ce-calculate-virtual-deployment-status.tar.gz
Virtual deployment status calculationcalculate-virtual-deployment-status
-rw-r--r--app/models/ci/build.rb6
-rw-r--r--app/models/ci/pipeline.rb8
-rw-r--r--app/serializers/build_details_entity.rb6
-rw-r--r--app/serializers/deployment_status_entity.rb8
-rw-r--r--app/serializers/environment_entity.rb2
-rw-r--r--app/serializers/pipeline_entity.rb5
-rw-r--r--lib/gitlab/ci/status/build/deployed_failed.rb25
-rw-r--r--lib/gitlab/ci/status/build/deployed_latest.rb27
-rw-r--r--lib/gitlab/ci/status/build/deployed_outdated.rb27
-rw-r--r--lib/gitlab/ci/status/build/deploying.rb25
-rw-r--r--lib/gitlab/ci/status/build/factory.rb8
-rw-r--r--lib/gitlab/ci/status/build/manual_deploy.rb25
-rw-r--r--lib/gitlab/ci/status/build/will_deploy.rb25
-rw-r--r--lib/gitlab/ci/status/core.rb8
14 files changed, 200 insertions, 5 deletions
diff --git a/app/models/ci/build.rb b/app/models/ci/build.rb
index cdfe8175a42..519dfe8b3e0 100644
--- a/app/models/ci/build.rb
+++ b/app/models/ci/build.rb
@@ -116,6 +116,8 @@ module Ci
where("EXISTS (?)", matcher)
end
+ scope :with_environment, ->() { where("environment <> ''") }
+
mount_uploader :legacy_artifacts_file, LegacyArtifactUploader, mount_on: :artifacts_file
mount_uploader :legacy_artifacts_metadata, LegacyArtifactUploader, mount_on: :artifacts_metadata
@@ -327,6 +329,10 @@ module Ci
success? && !last_deployment.try(:last?)
end
+ def has_latest_deployment?
+ last_deployment.try(:last?)
+ end
+
def depends_on_builds
# Get builds of the same type
latest_builds = self.pipeline.builds.latest
diff --git a/app/models/ci/pipeline.rb b/app/models/ci/pipeline.rb
index 17024e8a0af..cad6ee5791d 100644
--- a/app/models/ci/pipeline.rb
+++ b/app/models/ci/pipeline.rb
@@ -614,6 +614,14 @@ module Ci
.fabricate!
end
+ def detailed_deployments_status(current_user)
+ builds.latest.with_environment.map do |deployable|
+ Gitlab::Ci::Status::Build::Factory
+ .new(deployable, current_user)
+ .fabricate!
+ end
+ end
+
def latest_builds_with_artifacts
# We purposely cast the builds to an Array here. Because we always use the
# rows if there are more than 0 this prevents us from having to run two
diff --git a/app/serializers/build_details_entity.rb b/app/serializers/build_details_entity.rb
index 7bdcfcc38f7..786534d591d 100644
--- a/app/serializers/build_details_entity.rb
+++ b/app/serializers/build_details_entity.rb
@@ -10,9 +10,9 @@ class BuildDetailsEntity < JobEntity
expose :pipeline, using: PipelineEntity
expose :deployment_status, if: -> (*) { build.has_environment? } do
- expose :deployment_status, as: :status
-
- expose :persisted_environment, as: :environment, with: EnvironmentEntity
+ expose :deployments_detail, with: DeploymentStatusEntity do |build|
+ detailed_status
+ end
end
expose :metadata, using: BuildMetadataEntity
diff --git a/app/serializers/deployment_status_entity.rb b/app/serializers/deployment_status_entity.rb
new file mode 100644
index 00000000000..d9639d76b4e
--- /dev/null
+++ b/app/serializers/deployment_status_entity.rb
@@ -0,0 +1,8 @@
+# frozen_string_literal: true
+
+class DeploymentStatusEntity < Grape::Entity
+ include RequestAwareEntity
+
+ expose :deployment_status, as: :status, if: -> (status, _) { status.has_deployments? }
+ expose :environment, with: EnvironmentEntity, if: -> (status, _) { status.has_deployments? }
+end
diff --git a/app/serializers/environment_entity.rb b/app/serializers/environment_entity.rb
index 07a13c33b89..63f83021b13 100644
--- a/app/serializers/environment_entity.rb
+++ b/app/serializers/environment_entity.rb
@@ -8,7 +8,7 @@ class EnvironmentEntity < Grape::Entity
expose :state
expose :external_url
expose :environment_type
- expose :last_deployment, using: DeploymentEntity
+ # expose :last_deployment, using: DeploymentEntity # TODO: Fix cycle reference
expose :stop_action_available?, as: :has_stop_action
expose :metrics_path, if: -> (environment, _) { environment.has_metrics? } do |environment|
diff --git a/app/serializers/pipeline_entity.rb b/app/serializers/pipeline_entity.rb
index aef838409e0..9653b98108e 100644
--- a/app/serializers/pipeline_entity.rb
+++ b/app/serializers/pipeline_entity.rb
@@ -33,6 +33,7 @@ class PipelineEntity < Grape::Entity
expose :detailed_status, as: :status, with: DetailedStatusEntity
expose :duration
expose :finished_at
+ expose :deployments_details, with: DeploymentStatusEntity
end
expose :ref do
@@ -82,4 +83,8 @@ class PipelineEntity < Grape::Entity
def detailed_status
pipeline.detailed_status(request.current_user)
end
+
+ def deployments_details
+ pipeline.detailed_deployments_status(request.current_user)
+ end
end
diff --git a/lib/gitlab/ci/status/build/deployed_failed.rb b/lib/gitlab/ci/status/build/deployed_failed.rb
new file mode 100644
index 00000000000..d470e75e14c
--- /dev/null
+++ b/lib/gitlab/ci/status/build/deployed_failed.rb
@@ -0,0 +1,25 @@
+module Gitlab
+ module Ci
+ module Status
+ module Build
+ class DeployedFailed < Status::Extended
+ def deployment_status
+ :failed
+ end
+
+ def has_deployments?
+ true
+ end
+
+ def environment
+ subject.persisted_environment
+ end
+
+ def self.matches?(build, user)
+ build.has_environment? && build.failed?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/deployed_latest.rb b/lib/gitlab/ci/status/build/deployed_latest.rb
new file mode 100644
index 00000000000..6e23b9ae326
--- /dev/null
+++ b/lib/gitlab/ci/status/build/deployed_latest.rb
@@ -0,0 +1,27 @@
+module Gitlab
+ module Ci
+ module Status
+ module Build
+ class DeployedLatest < Status::Extended
+ def deployment_status
+ :last
+ end
+
+ def has_deployments?
+ true
+ end
+
+ def environment
+ subject.persisted_environment
+ end
+
+ def self.matches?(build, user)
+ build.has_environment? &&
+ build.success? &&
+ build.has_latest_deployment?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/deployed_outdated.rb b/lib/gitlab/ci/status/build/deployed_outdated.rb
new file mode 100644
index 00000000000..d426b4553b6
--- /dev/null
+++ b/lib/gitlab/ci/status/build/deployed_outdated.rb
@@ -0,0 +1,27 @@
+module Gitlab
+ module Ci
+ module Status
+ module Build
+ class DeployedOutdated < Status::Extended
+ def deployment_status
+ :out_of_date
+ end
+
+ def has_deployments?
+ true
+ end
+
+ def environment
+ subject.persisted_environment
+ end
+
+ def self.matches?(build, user)
+ build.has_environment? &&
+ build.success? &&
+ !build.has_latest_deployment?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/deploying.rb b/lib/gitlab/ci/status/build/deploying.rb
new file mode 100644
index 00000000000..e5a79f8bf92
--- /dev/null
+++ b/lib/gitlab/ci/status/build/deploying.rb
@@ -0,0 +1,25 @@
+module Gitlab
+ module Ci
+ module Status
+ module Build
+ class Deploying < Status::Extended
+ def deployment_status
+ :creating
+ end
+
+ def has_deployments?
+ true
+ end
+
+ def environment
+ subject.persisted_environment
+ end
+
+ def self.matches?(build, user)
+ build.has_environment? && build.running?
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/factory.rb b/lib/gitlab/ci/status/build/factory.rb
index 4a74d6d6ed1..3e7fc0d42d6 100644
--- a/lib/gitlab/ci/status/build/factory.rb
+++ b/lib/gitlab/ci/status/build/factory.rb
@@ -19,7 +19,13 @@ module Gitlab
Status::Build::Play,
Status::Build::Stop],
[Status::Build::Action],
- [Status::Build::Retried]]
+ [Status::Build::Retried],
+ [Status::Build::WillDeploy,
+ Status::Build::ManualDeploy,
+ Status::Build::Deploying,
+ Status::Build::DeployedLatest,
+ Status::Build::DeployedOutdated,
+ Status::Build::DeployedFailed]]
end
def self.common_helpers
diff --git a/lib/gitlab/ci/status/build/manual_deploy.rb b/lib/gitlab/ci/status/build/manual_deploy.rb
new file mode 100644
index 00000000000..62310ca81e4
--- /dev/null
+++ b/lib/gitlab/ci/status/build/manual_deploy.rb
@@ -0,0 +1,25 @@
+module Gitlab
+ module Ci
+ module Status
+ module Build
+ class ManualDeploy < Status::Extended
+ def deployment_status
+ :manual_deploy
+ end
+
+ def has_deployments?
+ true
+ end
+
+ def environment
+ subject.persisted_environment
+ end
+
+ def self.matches?(build, user)
+ build.has_environment? && (build.manual?)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/build/will_deploy.rb b/lib/gitlab/ci/status/build/will_deploy.rb
new file mode 100644
index 00000000000..a446a7c87cb
--- /dev/null
+++ b/lib/gitlab/ci/status/build/will_deploy.rb
@@ -0,0 +1,25 @@
+module Gitlab
+ module Ci
+ module Status
+ module Build
+ class WillDeploy < Status::Extended
+ def deployment_status
+ :will_deploy
+ end
+
+ def has_deployments?
+ true
+ end
+
+ def environment
+ subject.persisted_environment
+ end
+
+ def self.matches?(build, user)
+ build.has_environment? && (build.created? || build.pending?)
+ end
+ end
+ end
+ end
+ end
+end
diff --git a/lib/gitlab/ci/status/core.rb b/lib/gitlab/ci/status/core.rb
index 9d6a2f51c11..f5dc23cf2f5 100644
--- a/lib/gitlab/ci/status/core.rb
+++ b/lib/gitlab/ci/status/core.rb
@@ -66,6 +66,14 @@ module Gitlab
raise NotImplementedError
end
+ def has_deployments?
+ false
+ end
+
+ def environment
+ raise NotImplementedError
+ end
+
# Hint that appears on all the pipeline graph tooltips and builds on the right sidebar in Job detail view
def status_tooltip
label