diff options
-rw-r--r-- | app/models/deployment.rb | 6 | ||||
-rw-r--r-- | app/models/environment.rb | 1 | ||||
-rw-r--r-- | lib/gitlab/ci/status/core.rb | 4 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/canceled.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/common.rb | 29 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/created.rb | 27 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/factory.rb | 25 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/failed.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/manual.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/pending.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/running.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/scheduled.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/skipped.rb | 17 | ||||
-rw-r--r-- | lib/gitlab/ci/status/deployment/success.rb | 27 |
14 files changed, 238 insertions, 0 deletions
diff --git a/app/models/deployment.rb b/app/models/deployment.rb index 73689efaecc..98d1b13d829 100644 --- a/app/models/deployment.rb +++ b/app/models/deployment.rb @@ -72,6 +72,12 @@ class Deployment < ActiveRecord::Base super end + def detailed_status(current_user) + Gitlab::Ci::Status::Deployment::Factory + .new(self, current_user) + .fabricate! + end + def self.last_for_environment(environment) ids = self .for_environment(environment) diff --git a/app/models/environment.rb b/app/models/environment.rb index 00279e8db86..c584e4e563b 100644 --- a/app/models/environment.rb +++ b/app/models/environment.rb @@ -11,6 +11,7 @@ class Environment < ActiveRecord::Base has_many :deployments, dependent: :destroy # rubocop:disable Cop/ActiveRecordDependent has_one :last_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment' + has_one :last_successful_deployment, -> { success.order('deployments.id DESC') }, class_name: 'Deployment' before_validation :nullify_external_url before_validation :generate_slug, if: ->(env) { env.slug.blank? } diff --git a/lib/gitlab/ci/status/core.rb b/lib/gitlab/ci/status/core.rb index 9d6a2f51c11..befde27cdf7 100644 --- a/lib/gitlab/ci/status/core.rb +++ b/lib/gitlab/ci/status/core.rb @@ -66,6 +66,10 @@ module Gitlab raise NotImplementedError end + def has_deployment? + false + end + # Hint that appears on all the pipeline graph tooltips and builds on the right sidebar in Job detail view def status_tooltip label diff --git a/lib/gitlab/ci/status/deployment/canceled.rb b/lib/gitlab/ci/status/deployment/canceled.rb new file mode 100644 index 00000000000..21dc5191a5e --- /dev/null +++ b/lib/gitlab/ci/status/deployment/canceled.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Canceled < Status::Extended + def environment_text + "This job was canceled to deploy to %{environment_path}." + end + + def self.matches?(deployment, user) + deployment.canceled? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/common.rb b/lib/gitlab/ci/status/deployment/common.rb new file mode 100644 index 00000000000..07944117f75 --- /dev/null +++ b/lib/gitlab/ci/status/deployment/common.rb @@ -0,0 +1,29 @@ +module Gitlab + module Ci + module Status + module Deployment + module Common + def has_details? + can?(user, :read_deployment, subject) + end + + def details_path + project_job_path(subject.project, subject.deployable) + end + + def environment_path + project_environment_path(subject.project, subject.environment) + end + + def deployment_path + project_job_path(subject.project, subject.deployable) + end + + def has_deployment? + true + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/created.rb b/lib/gitlab/ci/status/deployment/created.rb new file mode 100644 index 00000000000..66866a9690b --- /dev/null +++ b/lib/gitlab/ci/status/deployment/created.rb @@ -0,0 +1,27 @@ +module Gitlab + module Ci + module Status + module Deployment + class Created < Status::Extended + def environment_text + if subject.environment.deployments.any? + "This job will deploy to %{environment_path} and overwrite the %{deployment_path}." + else + "This job will deploy to %{environment_path}." + end + end + + def deployment_path + return unless subject.environment.last_successful_deployment + + project_job_path(subject.project, subject.environment.last_successful_deployment.deployable) + end + + def self.matches?(deployment, user) + deployment.created? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/factory.rb b/lib/gitlab/ci/status/deployment/factory.rb new file mode 100644 index 00000000000..0b5ceaed986 --- /dev/null +++ b/lib/gitlab/ci/status/deployment/factory.rb @@ -0,0 +1,25 @@ +module Gitlab + module Ci + module Status + module Deployment + class Factory < Status::Factory + def self.extended_statuses + [[Status::Deployment::Canceled, + Status::Deployment::Created, + Status::Deployment::Failed, + Status::Deployment::Manual, + Status::Deployment::Pending, + Status::Deployment::Running, + Status::Deployment::Scheduled, + Status::Deployment::Skipped, + Status::Deployment::Success]] + end + + def self.common_helpers + Status::Deployment::Common + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/failed.rb b/lib/gitlab/ci/status/deployment/failed.rb new file mode 100644 index 00000000000..38af2a36c02 --- /dev/null +++ b/lib/gitlab/ci/status/deployment/failed.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Failed < Status::Extended + def environment_text + "The deployment of this job to %{environment_path} did not succeed." + end + + def self.matches?(deployment, user) + deployment.failed? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/manual.rb b/lib/gitlab/ci/status/deployment/manual.rb new file mode 100644 index 00000000000..cc871685a6d --- /dev/null +++ b/lib/gitlab/ci/status/deployment/manual.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Manual < Status::Extended + def environment_text + "Please trigger the build to deploy to %{environment_path}." + end + + def self.matches?(deployment, user) + deployment.manual? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/pending.rb b/lib/gitlab/ci/status/deployment/pending.rb new file mode 100644 index 00000000000..d0f2588c9e5 --- /dev/null +++ b/lib/gitlab/ci/status/deployment/pending.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Pending < Status::Extended + def environment_text + "This job deploys to %{environment_path} soon." + end + + def self.matches?(deployment, user) + deployment.pending? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/running.rb b/lib/gitlab/ci/status/deployment/running.rb new file mode 100644 index 00000000000..3a95710c740 --- /dev/null +++ b/lib/gitlab/ci/status/deployment/running.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Running < Status::Extended + def environment_text + "This job is deploying to %{environment_path}." + end + + def self.matches?(deployment, user) + deployment.running? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/scheduled.rb b/lib/gitlab/ci/status/deployment/scheduled.rb new file mode 100644 index 00000000000..311b8dcd4ee --- /dev/null +++ b/lib/gitlab/ci/status/deployment/scheduled.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Scheduled < Status::Extended + def environment_text + "This job is scheduled to deploy to %{environment_path}." + end + + def self.matches?(deployment, user) + deployment.scheduled? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/skipped.rb b/lib/gitlab/ci/status/deployment/skipped.rb new file mode 100644 index 00000000000..928879194dd --- /dev/null +++ b/lib/gitlab/ci/status/deployment/skipped.rb @@ -0,0 +1,17 @@ +module Gitlab + module Ci + module Status + module Deployment + class Skipped < Status::Extended + def environment_text + "This job was skipped and did not deploy to %{environment_path}." + end + + def self.matches?(deployment, user) + deployment.skipped? + end + end + end + end + end +end diff --git a/lib/gitlab/ci/status/deployment/success.rb b/lib/gitlab/ci/status/deployment/success.rb new file mode 100644 index 00000000000..72f87cb6b1a --- /dev/null +++ b/lib/gitlab/ci/status/deployment/success.rb @@ -0,0 +1,27 @@ +module Gitlab + module Ci + module Status + module Deployment + class Success < Status::Extended + def environment_text + if subject.last? + "This job is the most recent deployment to %{environment_path}." + else + "This job is an out-of-date deployment to %{environment_path}. View the most recent deployment %{deployment_path}." + end + end + + def deployment_path + return unless subject.environment.last_successful_deployment + + project_job_path(subject.project, subject.environment.last_successful_deployment.deployable) + end + + def self.matches?(deployment, user) + deployment.success? + end + end + end + end + end +end |