kubernetes-deploy 0.3.0 → 0.3.1

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
  SHA1:
3
- metadata.gz: 3658ae1e0a4c2163f17843504df7fe4252f7f0ea
4
- data.tar.gz: 78b8016923a5cbccda633cb9651e12fe678f2cc6
3
+ metadata.gz: 821c10919c954524f0e04068a6335ca187e83282
4
+ data.tar.gz: 0e63e63103fd2a0c5e8725553649b710670401bc
5
5
  SHA512:
6
- metadata.gz: 88e9824411a939c1d5c864602a512d4ec420f18984e54138c0cf8bc9edbbc0e82190499b74900bcc624dfd190b6b766e83c78d491f5ca5c9c128c03284cb63bb
7
- data.tar.gz: 5d663ab66c6d2fdeb41dbafa4289c129bc43bd8eb68b84d4feba3062bde215133c80f8521dc58b8f43032ac3616dfc13b69edea9f3992a77c7fe3dbd1ded78dc
6
+ metadata.gz: 0981745c90e24271e2c95ee825a62c57bb86823d3de470109151187f0adc085f6812402a1cbf50df751e43083cce5f5de9883f1147f2aab53296e93647ce5da0
7
+ data.tar.gz: d608ff476b6e72ec54b5501ef3ff31a3f20218295623a72b3dde8ae2a15f81a1ccd073e6026de120ab84e8a28663039033494f78f1e40d53dde9963eea70d732
data/Gemfile CHANGED
@@ -4,3 +4,4 @@ source 'https://rubygems.org'
4
4
  gemspec
5
5
 
6
6
  gem 'pry'
7
+ gem 'kubeclient'
data/README.md CHANGED
@@ -1,8 +1,8 @@
1
1
  # Kubernetes::Deploy
2
2
 
3
- 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/kubernetes/deploy`. To experiment with that code, run `bin/console` for an interactive prompt.
3
+ [![Build status](https://badge.buildkite.com/0f2d4956d49fbc795f9c17b0a741a6aa9ea532738e5f872ac8.svg)](https://buildkite.com/shopify/kubernetes-deploy-gem)
4
4
 
5
- TODO: Delete this and the text above, and describe your gem
5
+ Deploy script used to manage a Kubernetes application's namespace with [Shipit](https://github.com/Shopify/shipit-engine).
6
6
 
7
7
  ## Installation
8
8
 
@@ -22,14 +22,38 @@ Or install it yourself as:
22
22
 
23
23
  ## Usage
24
24
 
25
- TODO: Write usage instructions here
25
+ `kubernetes-deploy <app's namespace> <kube context> --template-dir=DIR`
26
+
27
+ Requirements:
28
+
29
+ - kubectl 1.5.1+ binary must be available in your path
30
+ - `ENV['KUBECONFIG']` must point to a valid kubeconfig file that includes the context you want to deploy to
31
+ - The target namespace must already exist in the target context
32
+ - `ENV['GOOGLE_APPLICATION_CREDENTIALS']` must point to the credentials for an authenticated service account if your user's auth provider is gcp
33
+ - `ENV['ENVIRONMENT']` must be set to use the default template path (`config/deploy/$ENVIRONMENT`) in the absence of the `--template-dir=DIR` option
34
+
26
35
 
27
36
  ## Development
28
37
 
29
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
38
+ After checking out the repo, run `bin/setup` to install dependencies. You currently need to [manually install kubectl version 1.5.1 or higher](https://kubernetes.io/docs/user-guide/prereqs/) as well if you don't already have it.
39
+
40
+ To run the tests:
41
+
42
+ * [Install minikube](https://kubernetes.io/docs/getting-started-guides/minikube/#installation)
43
+ * Start minikube (`minikube start [options]`)
44
+ * Make sure you have a context named "minikube" in your kubeconfig. Minikube adds this context for you when you run `minikube start`; please do not rename it. You can check for it using `kubectl config get-contexts`.
45
+ * Run `bundle exec rake test`
30
46
 
31
47
  To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
32
48
 
49
+ ## CI
50
+
51
+ Buildkite will build branches as you're working on them, but as soon as you create a PR it will stop building new commits from that branch because we disabled PR builds for security reasons.
52
+ As a Shopify employee, you can manually trigger the PR build from the Buildkite UI (just specify the branch, SHA is not required):
53
+
54
+ <img width="464" alt="screen shot 2017-02-21 at 10 55 33" src="https://cloud.githubusercontent.com/assets/522155/23172610/52771a3a-f824-11e6-8c8e-3d59c45e7ff8.png">
55
+
56
+
33
57
  ## Contributing
34
58
 
35
59
  Bug reports and pull requests are welcome on GitHub at https://github.com/[USERNAME]/kubernetes-deploy.
@@ -38,4 +62,3 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/[USERN
38
62
  ## License
39
63
 
40
64
  The gem is available as open source under the terms of the [MIT License](http://opensource.org/licenses/MIT).
41
-
data/bin/ci ADDED
@@ -0,0 +1,32 @@
1
+ #!/bin/bash
2
+ set -eox pipefail
3
+
4
+ MINIKUBE_VER=0.16.0
5
+ KUBERNETES_VER=1.5.2
6
+ DOCKER_MACHINE_KVM_VER=0.7.0
7
+
8
+ echo "--- Installing dependencies"
9
+ curl -Lo minikube https://storage.googleapis.com/minikube/releases/v$MINIKUBE_VER/minikube-linux-amd64
10
+ chmod +x minikube
11
+ sudo mv minikube /usr/local/bin/
12
+
13
+ # minikube requires kubectl
14
+ curl -Lo kubectl https://storage.googleapis.com/kubernetes-release/release/v$KUBERNETES_VER/bin/linux/amd64/kubectl
15
+ chmod +x kubectl
16
+ sudo mv kubectl /usr/local/bin/
17
+
18
+ # KVM support for minikube
19
+ curl -Lo docker-machine-driver-kvm https://github.com/dhiltgen/docker-machine-kvm/releases/download/v$DOCKER_MACHINE_KVM_VER/docker-machine-driver-kvm
20
+ chmod +x docker-machine-driver-kvm
21
+ sudo mv docker-machine-driver-kvm /usr/local/bin/
22
+
23
+ minikube config set vm-driver kvm
24
+
25
+ gem install bundler --no-ri --no-rdoc
26
+ bundle install --jobs 4
27
+
28
+ echo "--- Starting minikube"
29
+ minikube start --cpus 2 --memory 2048 --disk-size=2gb --kubernetes-version=$KUBERNETES_VER
30
+
31
+ echo "--- Running tests"
32
+ bundle exec rake test
data/bin/setup CHANGED
@@ -1,8 +1,16 @@
1
1
  #!/usr/bin/env bash
2
2
  set -euo pipefail
3
3
  IFS=$'\n\t'
4
- set -vx
5
4
 
6
5
  bundle install
7
6
 
8
- # Do any other automated setup that you need to do here
7
+ if [ ! -x "$(which minikube)" ]; then
8
+ echo -e "\n\033[0;33mIf you're going to run the tests, please follow the minikube setup instructions for your operating system:\nhttps://kubernetes.io/docs/getting-started-guides/minikube/#installation\033[0m"
9
+ fi
10
+
11
+ if [ ! -x "$(which kubectl)" ]; then
12
+ echo -e "\n\033[0;33mPlease install kubectl version 1.5.1 or higher:\nhttps://kubernetes.io/docs/user-guide/prereqs/\033[0m"
13
+ else
14
+ KUBECTL_VERSION=$(kubectl version --short --client | grep -oe "v[[:digit:]\.]\+")
15
+ echo -e "\n\033[0;32mKubectl version $KUBECTL_VERSION is already installed. This gem requires version v1.5.1 or greater.\033[0m"
16
+ fi
@@ -1,15 +1,5 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- # Usage: kubernetes-deploy <app's namespace> <kube context>
4
-
5
- # Prerequisites:
6
- # - kubectl 1.5.1+ binary must be available in the shipit machine's path
7
- # - ENV['KUBECONFIG'] must point to a valid kubeconfig file that includes all the contexts you want to deploy to
8
- # - ENV['GOOGLE_APPLICATION_CREDENTIALS'] must point to the credentials for an authenticated service account if your user's auth provider is gcp
9
-
10
- # Optionally, the following variables can be used to override script defaults:
11
- # - ENV['K8S_TEMPLATE_FOLDER']: Location of Kubernetes files to deploy. Default is config/deploy/#{environment}.
12
-
13
3
  require 'kubernetes-deploy'
14
4
 
15
5
  require 'optparse'
@@ -31,11 +21,16 @@ if !template_dir || template_dir.empty?
31
21
  exit 1
32
22
  end
33
23
 
24
+ revision = ENV.fetch('REVISION') do
25
+ puts "ENV['REVISION'] is missing. Please specify the commit SHA"
26
+ exit 1
27
+ end
28
+
34
29
  KubernetesDeploy::Runner.with_friendly_errors do
35
30
  runner = KubernetesDeploy::Runner.new(
36
31
  namespace: ARGV[0],
37
32
  context: ARGV[1],
38
- current_sha: ENV['REVISION'],
33
+ current_sha: revision,
39
34
  template_dir: template_dir,
40
35
  wait_for_completion: !skip_wait,
41
36
  )
@@ -24,6 +24,14 @@ module KubernetesDeploy
24
24
  end
25
25
  end
26
26
 
27
+ def self.timeout
28
+ self::TIMEOUT
29
+ end
30
+
31
+ def timeout
32
+ self.class.timeout
33
+ end
34
+
27
35
  def initialize(name, namespace, context, file)
28
36
  # subclasses must also set these
29
37
  @name, @namespace, @context, @file = name, namespace, context, file
@@ -68,7 +76,7 @@ module KubernetesDeploy
68
76
 
69
77
  def deploy_timed_out?
70
78
  return false unless @deploy_started
71
- !deploy_succeeded? && !deploy_failed? && (Time.now.utc - @deploy_started > self.class::TIMEOUT)
79
+ !deploy_succeeded? && !deploy_failed? && (Time.now.utc - @deploy_started > timeout)
72
80
  end
73
81
 
74
82
  def tpr?
@@ -37,8 +37,8 @@ module KubernetesDeploy
37
37
  def deploy_succeeded?
38
38
  return false unless @rollout_data.key?("availableReplicas")
39
39
  # TODO: this should look at the current replica set's pods too
40
- @rollout_data["availableReplicas"].to_i == @pods.length &&
41
- @rollout_data.values.uniq.length == 1 # num desired, current, up-to-date and available are equal
40
+ @rollout_data["updatedReplicas"].to_i == @rollout_data["replicas"].to_i &&
41
+ @rollout_data["updatedReplicas"].to_i == @rollout_data["availableReplicas"].to_i
42
42
  end
43
43
 
44
44
  def deploy_failed?
@@ -174,7 +174,8 @@ MSG
174
174
  delay_sync_until = Time.now.utc
175
175
  started_at = delay_sync_until
176
176
  human_resources = watched_resources.map(&:id).join(", ")
177
- KubernetesDeploy.logger.info("Waiting for #{human_resources}")
177
+ max_wait_time = watched_resources.map(&:timeout).max
178
+ KubernetesDeploy.logger.info("Waiting for #{human_resources} with #{max_wait_time}s timeout")
178
179
  while watched_resources.present?
179
180
  if Time.now.utc < delay_sync_until
180
181
  sleep (delay_sync_until - Time.now.utc)
@@ -1,3 +1,3 @@
1
1
  module KubernetesDeploy
2
- VERSION = "0.3.0"
2
+ VERSION = "0.3.1"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kubernetes-deploy
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.3.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kir Shatrov
@@ -10,7 +10,7 @@ authors:
10
10
  autorequire:
11
11
  bindir: exe
12
12
  cert_chain: []
13
- date: 2017-02-09 00:00:00.000000000 Z
13
+ date: 2017-02-22 00:00:00.000000000 Z
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency
16
16
  name: activesupport
@@ -81,7 +81,7 @@ files:
81
81
  - LICENSE.txt
82
82
  - README.md
83
83
  - Rakefile
84
- - bin/console
84
+ - bin/ci
85
85
  - bin/setup
86
86
  - exe/kubernetes-deploy
87
87
  - kubernetes-deploy.gemspec
@@ -1,14 +0,0 @@
1
- #!/usr/bin/env ruby
2
-
3
- require "bundler/setup"
4
- require "kubernetes/deploy"
5
-
6
- # You can add fixtures and/or initialization code here to make experimenting
7
- # with your gem easier. You can also use a different console, if you like.
8
-
9
- # (If you use this, don't forget to add pry to your Gemfile!)
10
- # require "pry"
11
- # Pry.start
12
-
13
- require "irb"
14
- IRB.start