vidar 0.1.5 → 0.1.6

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 39bab664337e5a4ff3a1a94ab654a9aa1243c21684896cd09f38b9c8bf012a64
4
- data.tar.gz: 550b5a6b1102c328d94b40cfcbaef9e5d400713e560e08f9899256ddc8d0172a
3
+ metadata.gz: cb4f731d2ecb43dbab6e252579b755bc1098a307abf207016b030250fe7a521c
4
+ data.tar.gz: 0f33ac809ea03301a9fba6d6d8aada53e45c06b7c31e8a0d45e50770d39efa80
5
5
  SHA512:
6
- metadata.gz: e20c5780fdd46521e51d37fe2c08ab1d1d8d034a0241142b518f1164dbeef37145b14a08ea55ee5bac44f9e1f43fbdc46702cf0c1cfbb60c1060d970cd44c41b
7
- data.tar.gz: 1a53963ffcbfde5f641a96da266d9a469cf35ae8b47f504411c4696e51f471ce8128204e12b60f39c7807fe8eff5ed64ba67577bc91439904c3084dc2ff687ad
6
+ metadata.gz: 62042e2e8463466d35ad3fe7ab0bc983802d0068b3de11f9defa8c2c9d3014d063ea62e8699f6915a7d97a0eeac7f8280d5f7c5d75d404e0b605686fcbe3a809
7
+ data.tar.gz: a4584dd019975cd299a2addbc0e01e417fa623ce1cfd7b5693cdbcb119f7883715edca4523cb774721b7c4acd7a0b8ecc735d38f185b04c394fc75cb8c403f9e
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- vidar (0.1.5)
4
+ vidar (0.1.6)
5
5
  colorize
6
6
  thor (~> 0.20)
7
7
 
data/lib/vidar.rb CHANGED
@@ -9,6 +9,7 @@ require 'colorized_string'
9
9
 
10
10
  require 'vidar/version'
11
11
  require 'vidar/config'
12
+ require 'vidar/interpolation'
12
13
  require 'vidar/log'
13
14
  require 'vidar/run'
14
15
  require 'vidar/slack_notification'
data/lib/vidar/cli.rb CHANGED
@@ -14,61 +14,61 @@ module Vidar
14
14
 
15
15
  desc "pull", "Pulls existing docker images to leverage docker caching"
16
16
  def pull
17
- Log.info "Pulling #{Config.get(:image)} tags"
18
- Run.docker "pull #{Config.get(:image)}:builder-#{Config.get(:current_branch)} 2> /dev/null || true"
19
- Run.docker "pull #{Config.get(:image)}:builder 2> /dev/null || true"
20
- Run.docker "pull #{Config.get(:image)}:release 2> /dev/null || true"
17
+ Log.info "Pulling #{Config.get!(:image)} tags"
18
+ Run.docker "pull #{Config.get!(:image)}:builder-#{Config.get!(:current_branch)} 2> /dev/null || true"
19
+ Run.docker "pull #{Config.get!(:image)}:builder 2> /dev/null || true"
20
+ Run.docker "pull #{Config.get!(:image)}:release 2> /dev/null || true"
21
21
  Log.info "Docker images:"
22
22
  puts Run.docker "images"
23
23
  end
24
24
 
25
25
  desc "build", "Builds docker stages"
26
26
  def build
27
- Log.info "Building #{Config.get(:image)}:builder-#{Config.get(:current_branch)}"
27
+ Log.info "Building #{Config.get!(:image)}:builder-#{Config.get!(:current_branch)}"
28
28
  Run.docker_compose "build builder"
29
29
 
30
- Log.info "Building #{Config.get(:image)}:runner-#{Config.get(:current_branch)}"
30
+ Log.info "Building #{Config.get!(:image)}:runner-#{Config.get!(:current_branch)}"
31
31
  Run.docker_compose "build runner"
32
32
 
33
- Log.info "Building #{Config.get(:image)}:release"
33
+ Log.info "Building #{Config.get!(:image)}:release"
34
34
  Run.docker_compose "build release"
35
35
  end
36
36
 
37
37
  desc "cache", "Caches intermediate docker stages"
38
38
  def cache
39
- Log.info "Publish #{Config.get(:image)}:builder-#{Config.get(:current_branch)}"
40
- Run.docker "push #{Config.get(:image)}:builder-#{Config.get(:current_branch)}"
39
+ Log.info "Publish #{Config.get!(:image)}:builder-#{Config.get!(:current_branch)}"
40
+ Run.docker "push #{Config.get!(:image)}:builder-#{Config.get!(:current_branch)}"
41
41
  end
42
42
 
43
43
  desc "publish", "Publishes docker images on docker registry"
44
44
  def publish
45
- Log.info "Publish #{Config.get(:image)}:#{Config.get(:revision)}"
46
- Run.docker "tag #{Config.get(:image)}:release #{Config.get(:image)}:#{Config.get(:revision)}"
47
- Run.docker "push #{Config.get(:image)}:#{Config.get(:revision)}"
45
+ Log.info "Publish #{Config.get!(:image)}:#{Config.get!(:revision)}"
46
+ Run.docker "tag #{Config.get!(:image)}:release #{Config.get!(:image)}:#{Config.get!(:revision)}"
47
+ Run.docker "push #{Config.get!(:image)}:#{Config.get!(:revision)}"
48
48
 
49
- return unless Config.get(:current_branch) == Config.get(:default_branch)
49
+ return unless Config.get!(:current_branch) == Config.get!(:default_branch)
50
50
 
51
- Log.info "Publish #{Config.get(:image)}:builder"
52
- Run.docker "tag #{Config.get(:image)}:builder-#{Config.get(:current_branch)} #{Config.get(:image)}:builder"
53
- Run.docker "push #{Config.get(:image)}:builder"
51
+ Log.info "Publish #{Config.get!(:image)}:builder"
52
+ Run.docker "tag #{Config.get!(:image)}:builder-#{Config.get!(:current_branch)} #{Config.get!(:image)}:builder"
53
+ Run.docker "push #{Config.get!(:image)}:builder"
54
54
 
55
- Log.info "Publish #{Config.get(:image)}:latest"
56
- Run.docker "tag #{Config.get(:image)}:release #{Config.get(:image)}:latest"
57
- Run.docker "push #{Config.get(:image)}:release"
58
- Run.docker "push #{Config.get(:image)}:latest"
55
+ Log.info "Publish #{Config.get!(:image)}:latest"
56
+ Run.docker "tag #{Config.get!(:image)}:release #{Config.get!(:image)}:latest"
57
+ Run.docker "push #{Config.get!(:image)}:release"
58
+ Run.docker "push #{Config.get!(:image)}:latest"
59
59
  end
60
60
 
61
61
  desc "deploy", "Performs k8s deployment with deploy hook"
62
62
  method_option :revision, default: nil
63
63
  def deploy
64
- revision = options[:revision] || Config.get(:revision)
65
- Log.info "Current cluster: #{Config.get(:cluster)} ###"
64
+ revision = options[:revision] || Config.get!(:revision)
65
+ Log.info "Current cluster: #{Config.get!(:cluster)} ###"
66
66
 
67
67
  Log.info "Set kubectl image..."
68
- Run.kubectl "set image deployments,cronjobs *=#{Config.get(:image)}:#{revision} --all"
68
+ Run.kubectl "set image deployments,cronjobs *=#{Config.get!(:image)}:#{revision} --all"
69
69
 
70
70
  Log.info "Looking for deploy hook..."
71
- template_name, error, status = Open3.capture3 "kubectl get cronjob deploy-hook-template -n #{Config.get(:namespace)} -o name --ignore-not-found=true"
71
+ template_name, error, status = Open3.capture3 "kubectl get cronjob deploy-hook-template -n #{Config.get!(:namespace)} -o name --ignore-not-found=true"
72
72
 
73
73
  if status.success?
74
74
  if template_name.to_s.empty?
@@ -86,7 +86,7 @@ module Vidar
86
86
 
87
87
  desc "release", "Builds and publishes docker images"
88
88
  def release
89
- Log.info "Release #{options[:image]}:#{options[:revision]}"
89
+ Log.info "Release #{options[:image]}:#{options[:revision]}"
90
90
  pull
91
91
  build
92
92
  cache
@@ -95,14 +95,14 @@ module Vidar
95
95
 
96
96
  desc "monitor_deploy_status", "Checks is deployment has finished and sends post-deploy notification"
97
97
  def monitor_deploy_status
98
- Log.info "Current cluster: #{Config.get(:cluster)} ###"
99
- Log.info "Checking is all containers on #{Config.get(:cluster)} in #{Config.get(:namespace)} are ready..."
98
+ Log.info "Current cluster: #{Config.get!(:cluster)} ###"
99
+ Log.info "Checking is all containers on #{Config.get!(:cluster)} in #{Config.get!(:namespace)} are ready..."
100
100
 
101
101
  sleep(2)
102
102
  error = false
103
103
  tries = 0
104
104
  max_tries = 30
105
- until K8s::Pods.new(Config.get(:namespace)).all_ready?
105
+ until K8s::Pods.new(Config.get!(:namespace)).all_ready?
106
106
  tries += 1
107
107
  sleep(10)
108
108
  if tries > max_tries
@@ -111,13 +111,15 @@ module Vidar
111
111
  end
112
112
  end
113
113
 
114
+ return unless Config.get(:slack_webhook_url)
115
+
114
116
  slack_notification = SlackNotification.new(
115
- webhook_url: Config.get(:slack_webhook_url),
116
- github: Config.get(:github),
117
- revision: Config.get(:revision),
118
- revision_name: Config.get(:revision_name),
119
- cluster: Config.get(:cluster),
120
- cluster_url: Config.get(:cluster_url)
117
+ webhook_url: Config.get!(:slack_webhook_url),
118
+ github: Config.get!(:github),
119
+ revision: Config.get!(:revision),
120
+ revision_name: Config.get!(:revision_name),
121
+ cluster: Config.get!(:cluster),
122
+ cluster_url: Config.get!(:cluster_url)
121
123
  )
122
124
 
123
125
  if error
data/lib/vidar/config.rb CHANGED
@@ -30,7 +30,13 @@ module Vidar
30
30
 
31
31
  def get(key)
32
32
  load unless loaded?
33
- @data[key.to_s] || DEFAULT_OPTIONS[key.to_sym]&.call || fail(MissingConfigError, key)
33
+ value = @data[key.to_s] || DEFAULT_OPTIONS[key.to_sym]&.call
34
+ Vidar::Interpolation.call(value, self)
35
+ end
36
+
37
+ def get!(key)
38
+ load unless loaded?
39
+ get(key) || fail(MissingConfigError, key)
34
40
  end
35
41
  end
36
42
  end
@@ -0,0 +1,16 @@
1
+ module Vidar
2
+ class Interpolation
3
+ INTERPOLATION_PATTERN = /\{\{(\w+)\}\}/.freeze
4
+
5
+ class << self
6
+ def call(string, getter)
7
+ return unless string
8
+ fail ArgumentError, "getter must respond_to get." unless getter.respond_to?(:get)
9
+
10
+ string.gsub(INTERPOLATION_PATTERN) do |match|
11
+ getter.get($1) || match
12
+ end
13
+ end
14
+ end
15
+ end
16
+ end
@@ -26,7 +26,7 @@ module Vidar
26
26
 
27
27
  def items
28
28
  @items ||= begin
29
- output = `kubectl get pods -n #{Config.get(:namespace)} -o json`
29
+ output = `kubectl get pods -n #{Config.get!(:namespace)} -o json`
30
30
  json = JSON.parse(output.strip)
31
31
  json["items"] || []
32
32
  end
data/lib/vidar/run.rb CHANGED
@@ -6,12 +6,12 @@ module Vidar
6
6
  end
7
7
 
8
8
  def docker_compose(command)
9
- args = %w[revision current_branch].map { |arg| "#{arg.upcase}=#{Config.get(arg.to_sym)}" }
10
- system("#{args.join(' ')} docker-compose -f #{Config.get(:compose_file)} #{command}") || exit(1)
9
+ args = %w[revision current_branch].map { |arg| "#{arg.upcase}=#{Config.get!(arg.to_sym)}" }
10
+ system("#{args.join(' ')} docker-compose -f #{Config.get!(:compose_file)} #{command}") || exit(1)
11
11
  end
12
12
 
13
13
  def kubectl(command)
14
- system("kubectl --namespace=#{Config.get(:namespace)} #{command}") || exit(1)
14
+ system("kubectl --namespace=#{Config.get!(:namespace)} #{command}") || exit(1)
15
15
  end
16
16
  end
17
17
  end
data/lib/vidar/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Vidar
2
- VERSION = '0.1.5'.freeze
2
+ VERSION = '0.1.6'.freeze
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: vidar
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.5
4
+ version: 0.1.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - Krzysztof Knapik
@@ -148,6 +148,7 @@ files:
148
148
  - lib/vidar.rb
149
149
  - lib/vidar/cli.rb
150
150
  - lib/vidar/config.rb
151
+ - lib/vidar/interpolation.rb
151
152
  - lib/vidar/k8s/container_status.rb
152
153
  - lib/vidar/k8s/pods.rb
153
154
  - lib/vidar/log.rb