vidar 0.0.1 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/.gitignore +3 -0
- data/.rubocop.yml +6 -60
- data/.travis.yml +1 -3
- data/Gemfile.lock +11 -8
- data/README.md +3 -0
- data/bin/vidar +6 -0
- data/exe/vidar +5 -0
- data/lib/vidar.rb +18 -1
- data/lib/vidar/cli.rb +124 -0
- data/lib/vidar/config.rb +37 -0
- data/lib/vidar/k8s/container_status.rb +71 -0
- data/lib/vidar/k8s/pods.rb +40 -0
- data/lib/vidar/log.rb +13 -0
- data/lib/vidar/run.rb +18 -0
- data/lib/vidar/slack_notification.rb +59 -0
- data/lib/vidar/version.rb +1 -1
- data/vidar.gemspec +7 -6
- metadata +48 -24
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: d76eee317ea354bb1372becb1ceff870a1e194e3781b38e877ae4ebf5d75ec38
|
|
4
|
+
data.tar.gz: 85a8bcb00c32cb181f8aef9e9f372bddba7614bca548417cd7e7e4897172c390
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 635f242141f0760c1469cc6e26a871cf552f3d85f237b54c742dad358bc2701108b9db6155184d30a5068090cd6f801ce91ffb32c01b5b85874c4f0ee2f64697
|
|
7
|
+
data.tar.gz: f84d3772de7d823d95b304e4dfc3d2260d6c4d201c101c3296b8409b7fa0bc4708d723ff71ec4b855b17a8432bfb5f4bf3b711b127efe7b4ba5b9a8b581eea50
|
data/.gitignore
CHANGED
data/.rubocop.yml
CHANGED
|
@@ -1,62 +1,8 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
- 2.4
|
|
4
|
-
- 2.5
|
|
5
|
-
- 2.6
|
|
1
|
+
require:
|
|
2
|
+
- rubocop-performance
|
|
6
3
|
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
inherit_from:
|
|
5
|
+
- https://raw.githubusercontent.com/RenoFi/rubocop/master/ruby.yml
|
|
9
6
|
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
Naming/FileName:
|
|
14
|
-
Enabled: false
|
|
15
|
-
|
|
16
|
-
Metrics/BlockLength:
|
|
17
|
-
Max: 30
|
|
18
|
-
Exclude:
|
|
19
|
-
- '**/*_spec.rb'
|
|
20
|
-
|
|
21
|
-
Metrics/LineLength:
|
|
22
|
-
Max: 140
|
|
23
|
-
|
|
24
|
-
Metrics/MethodLength:
|
|
25
|
-
Max: 20
|
|
26
|
-
|
|
27
|
-
Security/YAMLLoad:
|
|
28
|
-
Enabled: false
|
|
29
|
-
|
|
30
|
-
Style/BlockDelimiters:
|
|
31
|
-
EnforcedStyle: braces_for_chaining
|
|
32
|
-
|
|
33
|
-
Style/Documentation:
|
|
34
|
-
Enabled: false
|
|
35
|
-
|
|
36
|
-
Style/GuardClause:
|
|
37
|
-
Enabled: false
|
|
38
|
-
|
|
39
|
-
Style/EachWithObject:
|
|
40
|
-
Enabled: false
|
|
41
|
-
|
|
42
|
-
Style/MethodMissingSuper:
|
|
43
|
-
Enabled: false
|
|
44
|
-
|
|
45
|
-
Style/MissingRespondToMissing:
|
|
46
|
-
Enabled: false
|
|
47
|
-
|
|
48
|
-
Style/FrozenStringLiteralComment:
|
|
49
|
-
Enabled: false
|
|
50
|
-
|
|
51
|
-
Style/PercentLiteralDelimiters:
|
|
52
|
-
Enabled: false
|
|
53
|
-
|
|
54
|
-
Style/RescueStandardError:
|
|
55
|
-
Exclude:
|
|
56
|
-
- 'spec/*.rb'
|
|
57
|
-
|
|
58
|
-
Style/SymbolArray:
|
|
59
|
-
EnforcedStyle: brackets
|
|
60
|
-
|
|
61
|
-
Style/TrivialAccessors:
|
|
62
|
-
Enabled: false
|
|
7
|
+
AllCops:
|
|
8
|
+
TargetRubyVersion: 2.6
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
vidar (0.
|
|
4
|
+
vidar (0.1.4)
|
|
5
5
|
colorize
|
|
6
6
|
thor (~> 0.20)
|
|
7
7
|
|
|
@@ -15,13 +15,13 @@ GEM
|
|
|
15
15
|
jaro_winkler (1.5.3)
|
|
16
16
|
method_source (0.9.2)
|
|
17
17
|
parallel (1.17.0)
|
|
18
|
-
parser (2.6.
|
|
18
|
+
parser (2.6.4.0)
|
|
19
19
|
ast (~> 2.4.0)
|
|
20
20
|
pry (0.12.2)
|
|
21
21
|
coderay (~> 1.1.0)
|
|
22
22
|
method_source (~> 0.9.0)
|
|
23
23
|
rainbow (3.0.0)
|
|
24
|
-
rake (
|
|
24
|
+
rake (12.3.3)
|
|
25
25
|
rspec (3.8.0)
|
|
26
26
|
rspec-core (~> 3.8.0)
|
|
27
27
|
rspec-expectations (~> 3.8.0)
|
|
@@ -42,6 +42,8 @@ GEM
|
|
|
42
42
|
rainbow (>= 2.2.2, < 4.0)
|
|
43
43
|
ruby-progressbar (~> 1.7)
|
|
44
44
|
unicode-display_width (>= 1.4.0, < 1.7)
|
|
45
|
+
rubocop-performance (1.4.1)
|
|
46
|
+
rubocop (>= 0.71.0)
|
|
45
47
|
ruby-progressbar (1.10.1)
|
|
46
48
|
thor (0.20.3)
|
|
47
49
|
unicode-display_width (1.6.0)
|
|
@@ -50,11 +52,12 @@ PLATFORMS
|
|
|
50
52
|
ruby
|
|
51
53
|
|
|
52
54
|
DEPENDENCIES
|
|
53
|
-
bundler
|
|
54
|
-
pry
|
|
55
|
-
rake
|
|
56
|
-
rspec
|
|
57
|
-
rubocop
|
|
55
|
+
bundler
|
|
56
|
+
pry
|
|
57
|
+
rake
|
|
58
|
+
rspec
|
|
59
|
+
rubocop
|
|
60
|
+
rubocop-performance
|
|
58
61
|
vidar!
|
|
59
62
|
|
|
60
63
|
BUNDLED WITH
|
data/README.md
CHANGED
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
[](https://rubygems.org/gems/vidar)
|
|
2
|
+
[](https://travis-ci.org/RenoFi/vidar)
|
|
3
|
+
|
|
1
4
|
# Vidar
|
|
2
5
|
|
|
3
6
|
Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/vidar`. To experiment with that code, run `bin/console` for an interactive prompt.
|
data/bin/vidar
ADDED
data/exe/vidar
ADDED
data/lib/vidar.rb
CHANGED
|
@@ -1,5 +1,22 @@
|
|
|
1
|
+
require 'yaml'
|
|
2
|
+
require 'json'
|
|
3
|
+
require 'open3'
|
|
4
|
+
require 'ostruct'
|
|
5
|
+
require 'yaml'
|
|
6
|
+
|
|
7
|
+
require 'thor'
|
|
8
|
+
require 'colorized_string'
|
|
9
|
+
|
|
1
10
|
require 'vidar/version'
|
|
11
|
+
require 'vidar/config'
|
|
12
|
+
require 'vidar/log'
|
|
13
|
+
require 'vidar/run'
|
|
14
|
+
require 'vidar/slack_notification'
|
|
15
|
+
require 'vidar/k8s/container_status'
|
|
16
|
+
require 'vidar/k8s/pods'
|
|
17
|
+
require 'vidar/cli'
|
|
2
18
|
|
|
3
19
|
module Vidar
|
|
4
|
-
|
|
20
|
+
Error = Class.new(StandardError)
|
|
21
|
+
MissingConfigError = Class.new(StandardError)
|
|
5
22
|
end
|
data/lib/vidar/cli.rb
ADDED
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
class CLI < Thor
|
|
3
|
+
include Thor::Shell
|
|
4
|
+
|
|
5
|
+
def self.exit_on_failure?
|
|
6
|
+
true
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
desc "run_runner", "Runs any given command in runner image"
|
|
10
|
+
option :command
|
|
11
|
+
def run_runner
|
|
12
|
+
Run.docker_compose("run runner #{options[:command]}") || exit(1)
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
desc "pull", "Pulls existing docker images to leverage docker caching"
|
|
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"
|
|
21
|
+
Log.info "Docker images:"
|
|
22
|
+
puts Run.docker "images"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
desc "build", "Builds docker stages"
|
|
26
|
+
def build
|
|
27
|
+
Log.info "Building #{Config.get(:image)}:builder-#{Config.get(:current_branch)}"
|
|
28
|
+
Run.docker_compose "build builder"
|
|
29
|
+
|
|
30
|
+
Log.info "Building #{Config.get(:image)}:runner-#{Config.get(:current_branch)}"
|
|
31
|
+
Run.docker_compose "build runner"
|
|
32
|
+
|
|
33
|
+
Log.info "Building #{Config.get(:image)}:release"
|
|
34
|
+
Run.docker_compose "build release"
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
desc "cache", "Caches intermediate docker stages"
|
|
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)}"
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
desc "publish", "Publishes docker images on docker registry"
|
|
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)}"
|
|
48
|
+
|
|
49
|
+
return unless Config.get(:current_branch) == Config.get(:default_branch)
|
|
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"
|
|
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"
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
desc "deploy", "Performs k8s deployment with deploy hook"
|
|
62
|
+
method_option :revision, default: nil
|
|
63
|
+
def deploy
|
|
64
|
+
revision = options[:revision] || Config.get(:revision)
|
|
65
|
+
Log.info "Current cluster: #{Config.get(:cluster)} ###"
|
|
66
|
+
|
|
67
|
+
Log.info "Set kubectl image..."
|
|
68
|
+
Run.kubectl "set image deployments,cronjobs *=#{Config.get(:image)}:#{revision} --all"
|
|
69
|
+
|
|
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"
|
|
72
|
+
|
|
73
|
+
if status.success?
|
|
74
|
+
if template_name.to_s.empty?
|
|
75
|
+
Log.info "No deploy hook found"
|
|
76
|
+
else
|
|
77
|
+
Log.info "Executing deploy hook #{template_name.strip!}..."
|
|
78
|
+
Run.kubectl "delete job deploy-hook --ignore-not-found=true"
|
|
79
|
+
Run.kubectl "create job deploy-hook --from=#{template_name}"
|
|
80
|
+
end
|
|
81
|
+
else
|
|
82
|
+
Log.info "Error getting deploy hook template: #{error}"
|
|
83
|
+
exit(1)
|
|
84
|
+
end
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
desc "monitor_deploy_status", "Checks is deployment has finished and sends post-deploy notification"
|
|
88
|
+
def monitor_deploy_status
|
|
89
|
+
Log.info "Current cluster: #{Config.get(:cluster)} ###"
|
|
90
|
+
Log.info "Checking is all containers on #{Config.get(:cluster)} in #{Config.get(:namespace)} are ready..."
|
|
91
|
+
|
|
92
|
+
sleep(2)
|
|
93
|
+
error = false
|
|
94
|
+
tries = 0
|
|
95
|
+
max_tries = 30
|
|
96
|
+
until K8s::Pods.new(Config.get(:namespace)).all_ready?
|
|
97
|
+
tries += 1
|
|
98
|
+
sleep(10)
|
|
99
|
+
if tries > max_tries
|
|
100
|
+
error = true
|
|
101
|
+
break
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
slack_notification = SlackNotification.new(
|
|
106
|
+
webhook_url: Config.get(:slack_webhook_url),
|
|
107
|
+
github: Config.get(:github),
|
|
108
|
+
revision: Config.get(:revision),
|
|
109
|
+
revision_name: Config.get(:revision_name),
|
|
110
|
+
cluster: Config.get(:cluster),
|
|
111
|
+
cluster_url: Config.get(:cluster_url)
|
|
112
|
+
)
|
|
113
|
+
|
|
114
|
+
if error
|
|
115
|
+
Log.error "ERROR: Some of containers are not ready."
|
|
116
|
+
slack_notification.error
|
|
117
|
+
exit(1)
|
|
118
|
+
else
|
|
119
|
+
Log.info "OK: All containers are ready."
|
|
120
|
+
slack_notification.success
|
|
121
|
+
end
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
end
|
data/lib/vidar/config.rb
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
class Config
|
|
3
|
+
DEFAULT_MANIFEST_FILE = "vidar.yml".freeze
|
|
4
|
+
|
|
5
|
+
DEFAULT_OPTIONS = {
|
|
6
|
+
compose_file: -> { "docker-compose.ci.yml" },
|
|
7
|
+
default_branch: -> { "master" },
|
|
8
|
+
current_branch: -> { `git rev-parse --abbrev-ref HEAD`.strip.tr("/", "-") },
|
|
9
|
+
revision: -> { `git rev-parse HEAD`.strip },
|
|
10
|
+
revision_name: -> { `git show --pretty=format:"%s (%h)" -s HEAD`.strip },
|
|
11
|
+
cluster: -> { `kubectl config current-context`.strip.split("_", 4)[-1] } # TODO: improve context cleanup
|
|
12
|
+
}.freeze
|
|
13
|
+
|
|
14
|
+
class << self
|
|
15
|
+
attr_reader :data
|
|
16
|
+
attr_writer :manifest_file
|
|
17
|
+
|
|
18
|
+
def load(file_path = manifest_file)
|
|
19
|
+
@data = YAML.load_file(file_path)
|
|
20
|
+
@loaded = true
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
def manifest_file
|
|
24
|
+
@manifest_file || DEFAULT_MANIFEST_FILE
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def loaded?
|
|
28
|
+
@loaded
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def get(key)
|
|
32
|
+
load unless loaded?
|
|
33
|
+
@data[key.to_s] || DEFAULT_OPTIONS[key.to_sym]&.call || fail(MissingConfigError, key)
|
|
34
|
+
end
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
end
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
module K8s
|
|
3
|
+
class ContainerStatus
|
|
4
|
+
attr_reader :data, :state
|
|
5
|
+
|
|
6
|
+
def initialize(data)
|
|
7
|
+
@data = data
|
|
8
|
+
@state = data["state"]
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def name
|
|
12
|
+
data["name"]
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def ok?
|
|
16
|
+
(ready? && running?) || terminated_completed?
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
def to_text
|
|
20
|
+
parts = ["Name: #{name}"] + text_statuses
|
|
21
|
+
parts.map { |s| s.ljust(50, " ") }.join(" | ")
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def text_statuses
|
|
25
|
+
if running?
|
|
26
|
+
if ready?
|
|
27
|
+
[ColorizedString["Status: Ready & Running"].light_green, "Started at: #{running_started_at}"]
|
|
28
|
+
else
|
|
29
|
+
[ColorizedString["Status: Not ready"].light_red, "Started at: #{running_started_at}"]
|
|
30
|
+
end
|
|
31
|
+
elsif terminated_completed?
|
|
32
|
+
[ColorizedString["Status: Terminated/Completed"].light_green, "Finished at: #{terminated_finished_at}"]
|
|
33
|
+
elsif terminated_error?
|
|
34
|
+
[ColorizedString["Status: Terminated/Error"].light_red]
|
|
35
|
+
elsif waiting?
|
|
36
|
+
[ColorizedString["Status: Waiting"].light_green]
|
|
37
|
+
else
|
|
38
|
+
[ColorizedString[state.inspect].light_red]
|
|
39
|
+
end
|
|
40
|
+
end
|
|
41
|
+
|
|
42
|
+
def waiting?
|
|
43
|
+
state["waiting"]
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
def ready?
|
|
47
|
+
data["ready"]
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
def running?
|
|
51
|
+
!running_started_at.nil?
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def running_started_at
|
|
55
|
+
state.dig("running", "startedAt")
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
def terminated_completed?
|
|
59
|
+
state.dig("terminated", "reason") == "Completed" || state.dig("terminated", "exitCode") == 0
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def terminated_finished_at
|
|
63
|
+
state.dig("terminated", "finishedAt")
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
def terminated_error?
|
|
67
|
+
state.dig("terminated", "reason") == "Error" || state.dig("terminated", "exitCode")
|
|
68
|
+
end
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
module K8s
|
|
3
|
+
class Pods
|
|
4
|
+
def initialize(namespace)
|
|
5
|
+
@namespace = namespace
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def all_ready?
|
|
9
|
+
if items.empty?
|
|
10
|
+
Log.error "Could not fetch pod list"
|
|
11
|
+
return false
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
container_statuses.each do |container_status|
|
|
15
|
+
Log.info container_status.to_text
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
Log.info "-", "-"
|
|
19
|
+
|
|
20
|
+
container_statuses.all?(&:ok?)
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
private
|
|
24
|
+
|
|
25
|
+
attr_reader :pods, :namespace
|
|
26
|
+
|
|
27
|
+
def items
|
|
28
|
+
@items ||= begin
|
|
29
|
+
output = `kubectl get pods -n #{Config.get(:namespace)} -o json`
|
|
30
|
+
json = JSON.parse(output.strip)
|
|
31
|
+
json["items"] || []
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def container_statuses
|
|
36
|
+
@container_statuses ||= items.map { |i| i.dig("status", "containerStatuses") }.flatten.compact.map { |status| ContainerStatus.new(status) }
|
|
37
|
+
end
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
end
|
data/lib/vidar/log.rb
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
class Log
|
|
3
|
+
class << self
|
|
4
|
+
def info(text, fill_with = "#")
|
|
5
|
+
puts ColorizedString["#{fill_with} #{text} ".ljust(100, fill_with)].colorize(:light_green)
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def error(text, fill_with = "#")
|
|
9
|
+
puts ColorizedString["#{fill_with} #{text} ".ljust(100, fill_with)].colorize(:light_red)
|
|
10
|
+
end
|
|
11
|
+
end
|
|
12
|
+
end
|
|
13
|
+
end
|
data/lib/vidar/run.rb
ADDED
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
class Run
|
|
3
|
+
class << self
|
|
4
|
+
def docker(command)
|
|
5
|
+
system("docker #{command}") || exit(1)
|
|
6
|
+
end
|
|
7
|
+
|
|
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)
|
|
11
|
+
end
|
|
12
|
+
|
|
13
|
+
def kubectl(command)
|
|
14
|
+
system("kubectl --namespace=#{Config.get(:namespace)} #{command}") || exit(1)
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
module Vidar
|
|
2
|
+
class SlackNotification
|
|
3
|
+
SUCCESS_COLOR = "good".freeze
|
|
4
|
+
ERROR_COLOR = "danger".freeze
|
|
5
|
+
|
|
6
|
+
def initialize(webhook_url:, github:, revision:, revision_name:, cluster:, cluster_url:)
|
|
7
|
+
@webhook_url = webhook_url
|
|
8
|
+
@github = github
|
|
9
|
+
@revision = revision
|
|
10
|
+
@revision_name = revision_name
|
|
11
|
+
@cluster = cluster
|
|
12
|
+
@cluster_url = cluster_url
|
|
13
|
+
end
|
|
14
|
+
|
|
15
|
+
def error
|
|
16
|
+
message = "Failed deploy of #{github_link} to #{cluster_link} :fire: <!channel>"
|
|
17
|
+
perform data(message: message, color: ERROR_COLOR)
|
|
18
|
+
end
|
|
19
|
+
|
|
20
|
+
def success
|
|
21
|
+
message = "Successful deploy of #{github_link} to #{cluster_link}"
|
|
22
|
+
perform data(message: message, color: SUCCESS_COLOR)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def perform(data)
|
|
26
|
+
`curl -X POST -H "Content-type: application/json" --data '#{data}' '#{webhook_url}' 2>&1 /dev/null`
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
private
|
|
30
|
+
|
|
31
|
+
attr_reader :webhook_url, :github, :revision, :revision_name, :cluster, :cluster_url
|
|
32
|
+
|
|
33
|
+
def data(message:, color:)
|
|
34
|
+
{
|
|
35
|
+
"attachments": [
|
|
36
|
+
{
|
|
37
|
+
"title": github,
|
|
38
|
+
"title_link": github_url,
|
|
39
|
+
"color": color,
|
|
40
|
+
"text": message,
|
|
41
|
+
"fallback": message
|
|
42
|
+
}
|
|
43
|
+
]
|
|
44
|
+
}.to_json
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
def github_url
|
|
48
|
+
"https://github.com/#{github}/commit/#{revision}"
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
def github_link
|
|
52
|
+
"<#{github_url}|#{revision_name}>"
|
|
53
|
+
end
|
|
54
|
+
|
|
55
|
+
def cluster_link
|
|
56
|
+
"<#{cluster_url}|#{cluster}>"
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
end
|
data/lib/vidar/version.rb
CHANGED
data/vidar.gemspec
CHANGED
|
@@ -22,14 +22,15 @@ Gem::Specification.new do |spec|
|
|
|
22
22
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
|
23
23
|
spec.require_paths = ['lib']
|
|
24
24
|
|
|
25
|
-
spec.required_ruby_version = '>= 2.
|
|
25
|
+
spec.required_ruby_version = '>= 2.6'
|
|
26
26
|
|
|
27
27
|
spec.add_dependency 'colorize'
|
|
28
28
|
spec.add_dependency 'thor', '~> 0.20'
|
|
29
29
|
|
|
30
|
-
spec.add_development_dependency 'bundler'
|
|
31
|
-
spec.add_development_dependency 'pry'
|
|
32
|
-
spec.add_development_dependency 'rake'
|
|
33
|
-
spec.add_development_dependency 'rspec'
|
|
34
|
-
spec.add_development_dependency 'rubocop'
|
|
30
|
+
spec.add_development_dependency 'bundler'
|
|
31
|
+
spec.add_development_dependency 'pry'
|
|
32
|
+
spec.add_development_dependency 'rake'
|
|
33
|
+
spec.add_development_dependency 'rspec'
|
|
34
|
+
spec.add_development_dependency 'rubocop'
|
|
35
|
+
spec.add_development_dependency 'rubocop-performance'
|
|
35
36
|
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.
|
|
4
|
+
version: 0.1.4
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Krzysztof Knapik
|
|
@@ -9,7 +9,7 @@ authors:
|
|
|
9
9
|
autorequire:
|
|
10
10
|
bindir: exe
|
|
11
11
|
cert_chain: []
|
|
12
|
-
date: 2019-
|
|
12
|
+
date: 2019-09-05 00:00:00.000000000 Z
|
|
13
13
|
dependencies:
|
|
14
14
|
- !ruby/object:Gem::Dependency
|
|
15
15
|
name: colorize
|
|
@@ -43,77 +43,92 @@ dependencies:
|
|
|
43
43
|
name: bundler
|
|
44
44
|
requirement: !ruby/object:Gem::Requirement
|
|
45
45
|
requirements:
|
|
46
|
-
- - "
|
|
46
|
+
- - ">="
|
|
47
47
|
- !ruby/object:Gem::Version
|
|
48
|
-
version: '
|
|
48
|
+
version: '0'
|
|
49
49
|
type: :development
|
|
50
50
|
prerelease: false
|
|
51
51
|
version_requirements: !ruby/object:Gem::Requirement
|
|
52
52
|
requirements:
|
|
53
|
-
- - "
|
|
53
|
+
- - ">="
|
|
54
54
|
- !ruby/object:Gem::Version
|
|
55
|
-
version: '
|
|
55
|
+
version: '0'
|
|
56
56
|
- !ruby/object:Gem::Dependency
|
|
57
57
|
name: pry
|
|
58
58
|
requirement: !ruby/object:Gem::Requirement
|
|
59
59
|
requirements:
|
|
60
|
-
- - "
|
|
60
|
+
- - ">="
|
|
61
61
|
- !ruby/object:Gem::Version
|
|
62
|
-
version: '0
|
|
62
|
+
version: '0'
|
|
63
63
|
type: :development
|
|
64
64
|
prerelease: false
|
|
65
65
|
version_requirements: !ruby/object:Gem::Requirement
|
|
66
66
|
requirements:
|
|
67
|
-
- - "
|
|
67
|
+
- - ">="
|
|
68
68
|
- !ruby/object:Gem::Version
|
|
69
|
-
version: '0
|
|
69
|
+
version: '0'
|
|
70
70
|
- !ruby/object:Gem::Dependency
|
|
71
71
|
name: rake
|
|
72
72
|
requirement: !ruby/object:Gem::Requirement
|
|
73
73
|
requirements:
|
|
74
|
-
- - "
|
|
74
|
+
- - ">="
|
|
75
75
|
- !ruby/object:Gem::Version
|
|
76
|
-
version: '
|
|
76
|
+
version: '0'
|
|
77
77
|
type: :development
|
|
78
78
|
prerelease: false
|
|
79
79
|
version_requirements: !ruby/object:Gem::Requirement
|
|
80
80
|
requirements:
|
|
81
|
-
- - "
|
|
81
|
+
- - ">="
|
|
82
82
|
- !ruby/object:Gem::Version
|
|
83
|
-
version: '
|
|
83
|
+
version: '0'
|
|
84
84
|
- !ruby/object:Gem::Dependency
|
|
85
85
|
name: rspec
|
|
86
86
|
requirement: !ruby/object:Gem::Requirement
|
|
87
87
|
requirements:
|
|
88
|
-
- - "
|
|
88
|
+
- - ">="
|
|
89
89
|
- !ruby/object:Gem::Version
|
|
90
|
-
version: '
|
|
90
|
+
version: '0'
|
|
91
91
|
type: :development
|
|
92
92
|
prerelease: false
|
|
93
93
|
version_requirements: !ruby/object:Gem::Requirement
|
|
94
94
|
requirements:
|
|
95
|
-
- - "
|
|
95
|
+
- - ">="
|
|
96
96
|
- !ruby/object:Gem::Version
|
|
97
|
-
version: '
|
|
97
|
+
version: '0'
|
|
98
98
|
- !ruby/object:Gem::Dependency
|
|
99
99
|
name: rubocop
|
|
100
100
|
requirement: !ruby/object:Gem::Requirement
|
|
101
101
|
requirements:
|
|
102
|
-
- - "
|
|
102
|
+
- - ">="
|
|
103
103
|
- !ruby/object:Gem::Version
|
|
104
|
-
version: '0
|
|
104
|
+
version: '0'
|
|
105
105
|
type: :development
|
|
106
106
|
prerelease: false
|
|
107
107
|
version_requirements: !ruby/object:Gem::Requirement
|
|
108
108
|
requirements:
|
|
109
|
-
- - "
|
|
109
|
+
- - ">="
|
|
110
110
|
- !ruby/object:Gem::Version
|
|
111
|
-
version: '0
|
|
111
|
+
version: '0'
|
|
112
|
+
- !ruby/object:Gem::Dependency
|
|
113
|
+
name: rubocop-performance
|
|
114
|
+
requirement: !ruby/object:Gem::Requirement
|
|
115
|
+
requirements:
|
|
116
|
+
- - ">="
|
|
117
|
+
- !ruby/object:Gem::Version
|
|
118
|
+
version: '0'
|
|
119
|
+
type: :development
|
|
120
|
+
prerelease: false
|
|
121
|
+
version_requirements: !ruby/object:Gem::Requirement
|
|
122
|
+
requirements:
|
|
123
|
+
- - ">="
|
|
124
|
+
- !ruby/object:Gem::Version
|
|
125
|
+
version: '0'
|
|
112
126
|
description:
|
|
113
127
|
email:
|
|
114
128
|
- knapo@knapo.net
|
|
115
129
|
- engineering@renofi.com
|
|
116
|
-
executables:
|
|
130
|
+
executables:
|
|
131
|
+
- vidar
|
|
117
132
|
extensions: []
|
|
118
133
|
extra_rdoc_files: []
|
|
119
134
|
files:
|
|
@@ -128,7 +143,16 @@ files:
|
|
|
128
143
|
- Rakefile
|
|
129
144
|
- bin/console
|
|
130
145
|
- bin/setup
|
|
146
|
+
- bin/vidar
|
|
147
|
+
- exe/vidar
|
|
131
148
|
- lib/vidar.rb
|
|
149
|
+
- lib/vidar/cli.rb
|
|
150
|
+
- lib/vidar/config.rb
|
|
151
|
+
- lib/vidar/k8s/container_status.rb
|
|
152
|
+
- lib/vidar/k8s/pods.rb
|
|
153
|
+
- lib/vidar/log.rb
|
|
154
|
+
- lib/vidar/run.rb
|
|
155
|
+
- lib/vidar/slack_notification.rb
|
|
132
156
|
- lib/vidar/version.rb
|
|
133
157
|
- vidar.gemspec
|
|
134
158
|
homepage: https://github.com/RenoFi/vidar
|
|
@@ -145,7 +169,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
|
145
169
|
requirements:
|
|
146
170
|
- - ">="
|
|
147
171
|
- !ruby/object:Gem::Version
|
|
148
|
-
version: '2.
|
|
172
|
+
version: '2.6'
|
|
149
173
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
|
150
174
|
requirements:
|
|
151
175
|
- - ">="
|