keel 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,157 @@
1
+ namespace :keel do
2
+ desc 'Deploy the specified SHA to a given environment'
3
+ task :deploy, [:environment, :deploy_sha] do |_, args|
4
+ prompter = Keel::GCloud::Prompter.new
5
+ config = Keel::GCloud::Config.new
6
+ app = config.app_name
7
+
8
+ # Fetch namespaces from k8s
9
+ namespaces = Keel::GCloud::Kubernetes::Namespace.fetch_all
10
+ unless namespaces
11
+ message = 'Unable to connect to Kubernetes, please try again later...'
12
+ prompter.print message, :error
13
+ abort
14
+ end
15
+
16
+ # Prompt the user for the env and git commit to deploy
17
+ deploy_env = prompter.prompt_for_namespace namespaces, args[:environment]
18
+ deploy_sha = prompter.prompt_for_sha args[:deploy_sha]
19
+
20
+ # Retrieve a replication controller configuration from the cluster
21
+ rcs = Keel::GCloud::Kubernetes::ReplicationController.fetch_all deploy_env, app
22
+ unless rcs
23
+ message = 'Unable to connect to Kubernetes, please try again later...'
24
+ prompter.print message, :error
25
+ abort
26
+ end
27
+ rc = rcs.first
28
+
29
+ unless rc
30
+ message = "Could not find a replication controller for the \"#{deploy_env}\" environment"
31
+ prompter.print message, :error
32
+ abort
33
+ end
34
+
35
+ # Prep deployment:
36
+ # 1. Update image
37
+ # 2. Update replica count
38
+ # 3. Write out to a tmp file
39
+ # 4. Replace the running controller
40
+ # - this will create 1 new pod with the updated code
41
+
42
+ # We can get away with first since it is a single container pod
43
+ container = rc.containers.first
44
+ container['image'] = "gcr.io/quepid-1051/quails:#{deploy_sha}"
45
+ rc.increment_replica_count
46
+ rc.update
47
+
48
+ # Get a list of pods for the RC, this must be done pre-change
49
+ pods = Keel::GCloud::Kubernetes::Pod.fetch_all deploy_env, app
50
+ unless pods
51
+ message = 'Unable to connect to Kubernetes, please try again later...'
52
+ prompter.print message, :error
53
+ abort
54
+ end
55
+
56
+ # Iterate over all pods, checking to see if they are running
57
+ all_pods_running = false
58
+ while !all_pods_running do
59
+ prompter.print 'Waiting for new pods to start', :info
60
+ sleep 5
61
+ new_pods = Keel::GCloud::Kubernetes::Pod.fetch_all deploy_env, app
62
+
63
+ all_pods_running = true
64
+ new_pods.each do |pod|
65
+ if !pod.running?
66
+ prompter.print "Pod \"#{pod.name}\" is not running", :info
67
+ all_pods_running = false
68
+ end
69
+ end
70
+ end
71
+
72
+ # Nuke old pods
73
+ pods.each do |pod|
74
+ pod.delete
75
+ sleep 3
76
+ end
77
+
78
+ # Bring the replica count down and resubmit to the cluster,
79
+ # this kills the 1 extra pod
80
+ rcs = Keel::GCloud::Kubernetes::ReplicationController.fetch_all deploy_env, app
81
+ rc = rcs.first
82
+ rc.decrement_replica_count
83
+ rc.update
84
+
85
+ prompter.print 'Notifying NewRelic of deployment', :info
86
+ notifier = Keel::GCloud::Notifier::NewRelic.new env: deploy_env, sha: deploy_sha
87
+ notifier.notify
88
+
89
+ prompter.print 'Deployment complete', :success
90
+ end
91
+
92
+ desc 'Configures the local machine for communication with gcloud and k8s'
93
+ task :setup do |_|
94
+ prompter = Keel::GCloud::Prompter.new
95
+ config = Keel::GCloud::Config.new
96
+
97
+ if config.executable_missing?
98
+ message = 'Install Google Cloud command line tools'
99
+ message += "\n"
100
+ message += 'See: https://cloud.google.com/sdk/'
101
+
102
+ abort message.red
103
+ end
104
+
105
+ if config.system_configured?
106
+ abort 'App appears to already be configured on your system.'.green
107
+ end
108
+
109
+ prompter.print 'Updating tools', :info
110
+ Keel::GCloud::Component.update
111
+
112
+ prompter.print 'Authenticating with Google Cloud', :info
113
+ Keel::GCloud::Auth.authenticate
114
+
115
+ prompter.print 'Install Kubernetes', :info
116
+ Keel::GCloud::Component.install_k8s
117
+
118
+ prompter.print 'Setting gcloud properties', :info
119
+ config.set_properties
120
+
121
+ prompter.print 'Pulling Kubernetes auth configuration', :info
122
+ auth = Keel::GCloud::Auth.new config: config
123
+ auth.authenticate_k8s
124
+ end
125
+
126
+ desc 'Pulls logs for a given environment'
127
+ task :logs, [:environment] do |_, args|
128
+ prompter = Keel::GCloud::Prompter.new
129
+ config = Keel::GCloud::Config.new
130
+ app = config.app_name
131
+
132
+ # Fetch namespaces from k8s
133
+ namespaces = Keel::GCloud::Kubernetes::Namespace.fetch_all
134
+ unless namespaces
135
+ message = 'Unable to connect to Kubernetes, please try again later...'
136
+ prompter.print message, :error
137
+ abort
138
+ end
139
+
140
+ # Prompt the user for the env and to log and whether to tail the logs
141
+ deploy_env = prompter.prompt_for_namespace namespaces, args[:environment]
142
+ tail = prompter.prompt_for_tailing_logs
143
+
144
+ prompter.print "Getting pod information for #{deploy_env}", :info
145
+ pods = Keel::GCloud::Kubernetes::Pod.fetch_all deploy_env, app
146
+
147
+ unless pods.length > 0
148
+ message = "Could not find pods in the \"#{deploy_env}\" environment."
149
+ prompter.print message, :error
150
+ abort
151
+ end
152
+
153
+ # It seems that the first pod is the one we really want to look at for logs
154
+ pod = pods.first
155
+ pod.logs tail
156
+ end
157
+ end
metadata ADDED
@@ -0,0 +1,147 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: keel
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Youssef Chaker
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2016-06-15 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.11'
20
+ type: :development
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.11'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '10.0'
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '10.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: minitest
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: inquirer
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '0.2'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '0.2'
69
+ - !ruby/object:Gem::Dependency
70
+ name: colorize
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '0.7'
76
+ type: :runtime
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '0.7'
83
+ description: This gem lets you deploy your Rails application to your Kubernetes cluster.
84
+ email:
85
+ - ychaker@o19s.com
86
+ executables: []
87
+ extensions: []
88
+ extra_rdoc_files: []
89
+ files:
90
+ - ".gitignore"
91
+ - ".travis.yml"
92
+ - CODE_OF_CONDUCT.md
93
+ - Gemfile
94
+ - LICENSE.txt
95
+ - README.md
96
+ - Rakefile
97
+ - bin/console
98
+ - bin/setup
99
+ - keel.gemspec
100
+ - lib/generators/keel/config_generator.rb
101
+ - lib/generators/keel/controller_generator.rb
102
+ - lib/generators/keel/service_generator.rb
103
+ - lib/generators/keel/templates/gc-controller.yml.erb
104
+ - lib/generators/keel/templates/gc-service.yml.erb
105
+ - lib/generators/keel/templates/gcloud.yml
106
+ - lib/keel.rb
107
+ - lib/keel/gcloud.rb
108
+ - lib/keel/gcloud/auth.rb
109
+ - lib/keel/gcloud/cli.rb
110
+ - lib/keel/gcloud/component.rb
111
+ - lib/keel/gcloud/config.rb
112
+ - lib/keel/gcloud/kubernetes.rb
113
+ - lib/keel/gcloud/kubernetes/namespace.rb
114
+ - lib/keel/gcloud/kubernetes/pod.rb
115
+ - lib/keel/gcloud/kubernetes/replication_controller.rb
116
+ - lib/keel/gcloud/notifier.rb
117
+ - lib/keel/gcloud/notifier/base.rb
118
+ - lib/keel/gcloud/notifier/new_relic.rb
119
+ - lib/keel/gcloud/prompter.rb
120
+ - lib/keel/railtie.rb
121
+ - lib/keel/version.rb
122
+ - lib/tasks/keel.rake
123
+ homepage: https://github.com/o19s/keel
124
+ licenses:
125
+ - MIT
126
+ metadata: {}
127
+ post_install_message:
128
+ rdoc_options: []
129
+ require_paths:
130
+ - lib
131
+ required_ruby_version: !ruby/object:Gem::Requirement
132
+ requirements:
133
+ - - ">="
134
+ - !ruby/object:Gem::Version
135
+ version: '0'
136
+ required_rubygems_version: !ruby/object:Gem::Requirement
137
+ requirements:
138
+ - - ">="
139
+ - !ruby/object:Gem::Version
140
+ version: '0'
141
+ requirements: []
142
+ rubyforge_project:
143
+ rubygems_version: 2.4.5
144
+ signing_key:
145
+ specification_version: 4
146
+ summary: Deploy your Rails app to Kubernetes.
147
+ test_files: []