Class: Shipit::DeploySpec

Inherits:
Object
  • Object
show all
Defined in:
app/models/shipit/deploy_spec.rb,
app/models/shipit/deploy_spec/file_system.rb,
app/models/shipit/deploy_spec/npm_discovery.rb,
app/models/shipit/deploy_spec/pypi_discovery.rb,
app/models/shipit/deploy_spec/lerna_discovery.rb,
app/models/shipit/deploy_spec/bundler_discovery.rb,
app/models/shipit/deploy_spec/rubygems_discovery.rb,
app/models/shipit/deploy_spec/capistrano_discovery.rb,
app/models/shipit/deploy_spec/kubernetes_discovery.rb

Defined Under Namespace

Modules: BundlerDiscovery, CapistranoDiscovery, KubernetesDiscovery, LernaDiscovery, NpmDiscovery, PypiDiscovery, RubygemsDiscovery Classes: FileSystem

Constant Summary collapse

Error =
Class.new(StandardError)

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(config) ⇒ DeploySpec

Returns a new instance of DeploySpec.



38
39
40
# File 'app/models/shipit/deploy_spec.rb', line 38

def initialize(config)
  @config = config
end

Class Attribute Details

.pretty_generateObject

Returns the value of attribute pretty_generate.



10
11
12
# File 'app/models/shipit/deploy_spec.rb', line 10

def pretty_generate
  @pretty_generate
end

Class Method Details

.bundle_pathObject



27
28
29
# File 'app/models/shipit/deploy_spec.rb', line 27

def bundle_path
  Rails.root.join('data', 'bundler')
end

.dump(spec) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'app/models/shipit/deploy_spec.rb', line 17

def dump(spec)
  return unless spec

  if pretty_generate?
    JSON.pretty_generate(spec.cacheable.config)
  else
    JSON.dump(spec.cacheable.config)
  end
end

.load(json) ⇒ Object



12
13
14
15
# File 'app/models/shipit/deploy_spec.rb', line 12

def load(json)
  config = json.blank? ? {} : JSON.parse(json)
  new(config)
end

.pretty_generate?Boolean

Returns:

  • (Boolean)


31
32
33
# File 'app/models/shipit/deploy_spec.rb', line 31

def pretty_generate?
  @pretty_generate
end

Instance Method Details

#blank?Boolean

Returns:

  • (Boolean)


57
58
59
# File 'app/models/shipit/deploy_spec.rb', line 57

def blank?
  config.empty?
end

#blocking_statusesObject



202
203
204
# File 'app/models/shipit/deploy_spec.rb', line 202

def blocking_statuses
  Array.wrap(config('ci', 'blocking'))
end

#cacheableObject



44
45
46
# File 'app/models/shipit/deploy_spec.rb', line 44

def cacheable
  self
end

#clear_working_directory?Boolean

Returns:

  • (Boolean)


257
258
259
# File 'app/models/shipit/deploy_spec.rb', line 257

def clear_working_directory?
  config('machine', 'cleanup') { true }
end

#config(*keys, &default) ⇒ Object



48
49
50
51
52
53
54
55
# File 'app/models/shipit/deploy_spec.rb', line 48

def config(*keys, &default)
  default ||= -> { nil }
  keys.flatten.reduce(@config) do |hash, key|
    return default.call unless hash.is_a?(Hash)

    hash.fetch(key) { return default.call }
  end
end

#default_deploy_envObject



124
125
126
# File 'app/models/shipit/deploy_spec.rb', line 124

def default_deploy_env
  deploy_variables.map { |v| [v.name, v.default] }.to_h
end

#dependencies_stepsObject Also known as: dependencies_steps!



77
78
79
80
81
# File 'app/models/shipit/deploy_spec.rb', line 77

def dependencies_steps
  around_steps('dependencies') do
    config('dependencies', 'override') { discover_dependencies_steps || [] }
  end
end

#deploy_stepsObject



110
111
112
113
114
# File 'app/models/shipit/deploy_spec.rb', line 110

def deploy_steps
  around_steps('deploy') do
    config('deploy', 'override') { discover_deploy_steps }
  end
end

#deploy_steps!Object



116
117
118
# File 'app/models/shipit/deploy_spec.rb', line 116

def deploy_steps!
  deploy_steps || cant_detect!(:deploy)
end

#deploy_variablesObject



120
121
122
# File 'app/models/shipit/deploy_spec.rb', line 120

def deploy_variables
  Array.wrap(config('deploy', 'variables')).map(&VariableDefinition.method(:new))
end

#directoryObject



73
74
75
# File 'app/models/shipit/deploy_spec.rb', line 73

def directory
  config('machine', 'directory')
end

#fetch_deployed_revision_stepsObject



155
156
157
# File 'app/models/shipit/deploy_spec.rb', line 155

def fetch_deployed_revision_steps
  config('fetch') || discover_fetch_deployed_revision_steps
end

#fetch_deployed_revision_steps!Object



159
160
161
# File 'app/models/shipit/deploy_spec.rb', line 159

def fetch_deployed_revision_steps!
  fetch_deployed_revision_steps || cant_detect!(:fetch)
end

#filter_deploy_envs(env) ⇒ Object



174
175
176
# File 'app/models/shipit/deploy_spec.rb', line 174

def filter_deploy_envs(env)
  EnvironmentVariables.with(env).permit(deploy_variables)
end

#filter_rollback_envs(env) ⇒ Object



178
179
180
# File 'app/models/shipit/deploy_spec.rb', line 178

def filter_rollback_envs(env)
  EnvironmentVariables.with(env).permit(rollback_variables)
end

#find_task_definition(id) ⇒ Object



169
170
171
172
# File 'app/models/shipit/deploy_spec.rb', line 169

def find_task_definition(id)
  definition = config('tasks', id) || discover_task_definitions[id]
  TaskDefinition.new(id, coerce_task_definition(definition) || task_not_found!(id))
end

#hidden_statusesObject



190
191
192
# File 'app/models/shipit/deploy_spec.rb', line 190

def hidden_statuses
  Array.wrap(config('ci', 'hide')) + [release_status_context].compact
end


261
262
263
# File 'app/models/shipit/deploy_spec.rb', line 261

def links
  config('links') { {} }
end

#machine_envObject



69
70
71
# File 'app/models/shipit/deploy_spec.rb', line 69

def machine_env
  config('machine', 'environment') || {}
end

#max_divergence_ageObject



240
241
242
243
244
245
246
247
# File 'app/models/shipit/deploy_spec.rb', line 240

def max_divergence_age
  return unless timeout = config('merge', 'max_divergence', 'age')

  begin
    Duration.parse(timeout)
  rescue Duration::ParseError
  end
end

#max_divergence_commitsObject



236
237
238
# File 'app/models/shipit/deploy_spec.rb', line 236

def max_divergence_commits
  config('merge', 'max_divergence', 'commits')
end

#maximum_commits_per_deployObject



84
85
86
# File 'app/models/shipit/deploy_spec.rb', line 84

def maximum_commits_per_deploy
  config('deploy', 'max_commits') { 8 }
end

#merge_request_ignored_statusesObject



219
220
221
222
223
224
225
# File 'app/models/shipit/deploy_spec.rb', line 219

def merge_request_ignored_statuses
  if config('merge', 'require') || config('merge', 'ignore')
    Array.wrap(config('merge', 'ignore')) + [release_status_context].compact
  else
    soft_failing_statuses | hidden_statuses
  end
end

#merge_request_merge_methodObject



206
207
208
209
# File 'app/models/shipit/deploy_spec.rb', line 206

def merge_request_merge_method
  method = config('merge', 'method')
  method if %w[merge rebase squash].include?(method)
end

#merge_request_required_statusesObject



211
212
213
214
215
216
217
# File 'app/models/shipit/deploy_spec.rb', line 211

def merge_request_required_statuses
  if config('merge', 'require') || config('merge', 'ignore')
    Array.wrap(config('merge', 'require'))
  else
    required_statuses
  end
end

#pause_between_deploysObject



102
103
104
# File 'app/models/shipit/deploy_spec.rb', line 102

def pause_between_deploys
  Duration.parse(config('deploy', 'interval') { 0 })
end

#pluginsObject



253
254
255
# File 'app/models/shipit/deploy_spec.rb', line 253

def plugins
  config('plugins') || {}
end

#provisioning_handler_nameObject



106
107
108
# File 'app/models/shipit/deploy_spec.rb', line 106

def provisioning_handler_name
  config('provision', 'handler_name')
end

#release_status?Boolean

Returns:

  • (Boolean)


88
89
90
# File 'app/models/shipit/deploy_spec.rb', line 88

def release_status?
  !!release_status_context
end

#release_status_contextObject



92
93
94
# File 'app/models/shipit/deploy_spec.rb', line 92

def release_status_context
  config('status', 'context')
end

#release_status_delayObject



96
97
98
99
100
# File 'app/models/shipit/deploy_spec.rb', line 96

def release_status_delay
  return unless delay = config('status', 'delay') { config('deploy', 'interval') { 0 } }

  Duration.parse(delay)
end

#required_statusesObject



194
195
196
# File 'app/models/shipit/deploy_spec.rb', line 194

def required_statuses
  (Array.wrap(config('ci', 'require')) + blocking_statuses).uniq
end

#retries_on_deployObject



128
129
130
# File 'app/models/shipit/deploy_spec.rb', line 128

def retries_on_deploy
  config('deploy', 'retries') { nil }
end

#retries_on_rollbackObject



151
152
153
# File 'app/models/shipit/deploy_spec.rb', line 151

def retries_on_rollback
  config('rollback', 'retries') { nil }
end

#revalidate_merge_requests_afterObject



227
228
229
230
231
232
233
234
# File 'app/models/shipit/deploy_spec.rb', line 227

def revalidate_merge_requests_after
  return unless timeout = config('merge', 'revalidate_after')

  begin
    Duration.parse(timeout)
  rescue Duration::ParseError
  end
end

#review_checklistObject



182
183
184
# File 'app/models/shipit/deploy_spec.rb', line 182

def review_checklist
  (config('review', 'checklist') || discover_review_checklist || []).map(&:strip).select(&:present?)
end

#review_checksObject



249
250
251
# File 'app/models/shipit/deploy_spec.rb', line 249

def review_checks
  config('review', 'checks') || []
end

#review_monitoringObject



186
187
188
# File 'app/models/shipit/deploy_spec.rb', line 186

def review_monitoring
  (config('review', 'monitoring') || []).select(&:present?)
end

#rollback_stepsObject



132
133
134
135
136
# File 'app/models/shipit/deploy_spec.rb', line 132

def rollback_steps
  around_steps('rollback') do
    config('rollback', 'override') { discover_rollback_steps }
  end
end

#rollback_steps!Object



138
139
140
# File 'app/models/shipit/deploy_spec.rb', line 138

def rollback_steps!
  rollback_steps || cant_detect!(:rollback)
end

#rollback_variablesObject



142
143
144
145
146
147
148
149
# File 'app/models/shipit/deploy_spec.rb', line 142

def rollback_variables
  if config('rollback', 'variables').nil?
    # For backwards compatibility, fallback to using deploy_variables if no explicit rollback variables are set
    deploy_variables
  else
    Array.wrap(config('rollback', 'variables')).map(&VariableDefinition.method(:new))
  end
end

#soft_failing_statusesObject



198
199
200
# File 'app/models/shipit/deploy_spec.rb', line 198

def soft_failing_statuses
  Array.wrap(config('ci', 'allow_failures'))
end

#supports_fetch_deployed_revision?Boolean

Returns:

  • (Boolean)


61
62
63
# File 'app/models/shipit/deploy_spec.rb', line 61

def supports_fetch_deployed_revision?
  fetch_deployed_revision_steps.present?
end

#supports_rollback?Boolean

Returns:

  • (Boolean)


65
66
67
# File 'app/models/shipit/deploy_spec.rb', line 65

def supports_rollback?
  rollback_steps.present?
end

#task_definitionsObject



163
164
165
166
167
# File 'app/models/shipit/deploy_spec.rb', line 163

def task_definitions
  discover_task_definitions.merge(config('tasks') || {}).map do |name, definition|
    TaskDefinition.new(name, coerce_task_definition(definition))
  end
end