summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/models/deployment.rb6
-rw-r--r--app/models/environment.rb1
-rw-r--r--lib/gitlab/ci/status/core.rb4
-rw-r--r--lib/gitlab/ci/status/deployment/canceled.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/common.rb29
-rw-r--r--lib/gitlab/ci/status/deployment/created.rb27
-rw-r--r--lib/gitlab/ci/status/deployment/factory.rb25
-rw-r--r--lib/gitlab/ci/status/deployment/failed.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/manual.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/pending.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/running.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/scheduled.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/skipped.rb17
-rw-r--r--lib/gitlab/ci/status/deployment/success.rb27
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