diff options
author | Shinya Maeda <shinya@gitlab.com> | 2018-10-15 20:39:30 +0900 |
---|---|---|
committer | Shinya Maeda <shinya@gitlab.com> | 2018-10-15 20:39:30 +0900 |
commit | faeb32b947559908255f44c57283a3644a479808 (patch) | |
tree | b33034cccb24f32d617505be64126cdf64daecaa | |
parent | 75b6ed8d2d0591efa19b02173c0524551e95f691 (diff) | |
download | gitlab-ce-calculate-virtual-deployment-status.tar.gz |
Virtual deployment status calculationcalculate-virtual-deployment-status
-rw-r--r-- | app/models/ci/build.rb | 6 | ||||
-rw-r--r-- | app/models/ci/pipeline.rb | 8 | ||||
-rw-r--r-- | app/serializers/build_details_entity.rb | 6 | ||||
-rw-r--r-- | app/serializers/deployment_status_entity.rb | 8 | ||||
-rw-r--r-- | app/serializers/environment_entity.rb | 2 | ||||
-rw-r--r-- | app/serializers/pipeline_entity.rb | 5 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/deployed_failed.rb | 25 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/deployed_latest.rb | 27 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/deployed_outdated.rb | 27 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/deploying.rb | 25 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/factory.rb | 8 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/manual_deploy.rb | 25 | ||||
-rw-r--r-- | lib/gitlab/ci/status/build/will_deploy.rb | 25 | ||||
-rw-r--r-- | lib/gitlab/ci/status/core.rb | 8 |
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 |