1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
|
# frozen_string_literal: true
module Atlassian
module JiraConnect
module Serializers
class DeploymentEntity < Grape::Entity
include Gitlab::Routing
COMMITS_LIMIT = 5_000
format_with(:iso8601, &:iso8601)
expose :schema_version, as: :schemaVersion
expose :iid, as: :deploymentSequenceNumber
expose :update_sequence_id, as: :updateSequenceNumber
expose :display_name, as: :displayName
expose :description
expose :associations
expose :url
expose :label
expose :state
expose :updated_at, as: :lastUpdated, format_with: :iso8601
expose :pipeline_entity, as: :pipeline
expose :environment_entity, as: :environment
def issue_keys
@issue_keys ||= (issue_keys_from_pipeline + issue_keys_from_commits_since_last_deploy).uniq
end
private
delegate :project, :deployable, :environment, :iid, :ref, :short_sha, to: :object
alias_method :deployment, :object
alias_method :build, :deployable
def associations
keys = issue_keys
[{ associationType: :issueKeys, values: keys }] if keys.present?
end
def display_name
"Deployment #{iid} (#{ref}@#{short_sha}) to #{environment.name}"
end
def label
"#{project.full_path}-#{environment.name}-#{iid}-#{short_sha}"
end
def description
"Deployment #{deployment.iid} of #{project.name} at #{short_sha} (#{build&.name}) to #{environment.name}"
end
def url
# There is no controller action to show a single deployment, so we
# link to the build instead
project_job_url(project, build) if build
end
def state
case deployment.status
when 'created' then 'pending'
when 'running' then 'in_progress'
when 'success' then 'successful'
when 'failed' then 'failed'
when 'canceled', 'skipped' then 'cancelled'
else
'unknown'
end
end
def schema_version
'1.0'
end
def pipeline_entity
PipelineEntity.new(build.pipeline) if pipeline?
end
def environment_entity
EnvironmentEntity.new(environment)
end
def update_sequence_id
options[:update_sequence_id] || Client.generate_update_sequence_id
end
def pipeline?
build&.pipeline.present?
end
def issue_keys_from_pipeline
return [] unless pipeline?
BuildEntity.new(build.pipeline).issue_keys
end
# Extract Jira issue keys from commits made to the deployment's branch or tag
# since the last successful deployment was made to the environment.
def issue_keys_from_commits_since_last_deploy
return [] if Feature.disabled?(:jira_deployment_issue_keys, project)
last_deployed_commit = environment
.successful_deployments
.id_not_in(deployment.id)
.ordered
.find_by_ref(deployment.ref)
&.commit
commits = project.repository.commits(
deployment.ref,
before: deployment.commit.created_at,
after: last_deployed_commit&.created_at,
skip_merges: true,
limit: COMMITS_LIMIT
)
# Include this deploy's commit, as the `before:` param in `Repository#list_commits_by` excluded it.
commits << deployment.commit
commits.flat_map do |commit|
JiraIssueKeyExtractor.new(commit.message).issue_keys
end.compact
end
end
end
end
end
|