krane 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (100) hide show
  1. checksums.yaml +7 -0
  2. data/.buildkite/pipeline.nightly.yml +43 -0
  3. data/.github/probots.yml +2 -0
  4. data/.gitignore +20 -0
  5. data/.rubocop.yml +17 -0
  6. data/.shopify-build/VERSION +1 -0
  7. data/.shopify-build/kubernetes-deploy.yml +53 -0
  8. data/1.0-Upgrade.md +186 -0
  9. data/CHANGELOG.md +431 -0
  10. data/CODE_OF_CONDUCT.md +46 -0
  11. data/CONTRIBUTING.md +164 -0
  12. data/Gemfile +16 -0
  13. data/ISSUE_TEMPLATE.md +25 -0
  14. data/LICENSE.txt +21 -0
  15. data/README.md +655 -0
  16. data/Rakefile +36 -0
  17. data/bin/ci +21 -0
  18. data/bin/setup +16 -0
  19. data/bin/test +47 -0
  20. data/dev.yml +28 -0
  21. data/dev/flamegraph-from-tests +35 -0
  22. data/exe/krane +5 -0
  23. data/krane.gemspec +44 -0
  24. data/lib/krane.rb +7 -0
  25. data/lib/krane/bindings_parser.rb +88 -0
  26. data/lib/krane/cli/deploy_command.rb +75 -0
  27. data/lib/krane/cli/global_deploy_command.rb +54 -0
  28. data/lib/krane/cli/krane.rb +91 -0
  29. data/lib/krane/cli/render_command.rb +41 -0
  30. data/lib/krane/cli/restart_command.rb +34 -0
  31. data/lib/krane/cli/run_command.rb +54 -0
  32. data/lib/krane/cli/version_command.rb +13 -0
  33. data/lib/krane/cluster_resource_discovery.rb +113 -0
  34. data/lib/krane/common.rb +23 -0
  35. data/lib/krane/concerns/template_reporting.rb +29 -0
  36. data/lib/krane/concurrency.rb +18 -0
  37. data/lib/krane/container_logs.rb +106 -0
  38. data/lib/krane/deferred_summary_logging.rb +95 -0
  39. data/lib/krane/delayed_exceptions.rb +14 -0
  40. data/lib/krane/deploy_task.rb +363 -0
  41. data/lib/krane/deploy_task_config_validator.rb +29 -0
  42. data/lib/krane/duration_parser.rb +27 -0
  43. data/lib/krane/ejson_secret_provisioner.rb +156 -0
  44. data/lib/krane/errors.rb +28 -0
  45. data/lib/krane/formatted_logger.rb +57 -0
  46. data/lib/krane/global_deploy_task.rb +210 -0
  47. data/lib/krane/global_deploy_task_config_validator.rb +12 -0
  48. data/lib/krane/kubeclient_builder.rb +156 -0
  49. data/lib/krane/kubectl.rb +120 -0
  50. data/lib/krane/kubernetes_resource.rb +621 -0
  51. data/lib/krane/kubernetes_resource/cloudsql.rb +43 -0
  52. data/lib/krane/kubernetes_resource/config_map.rb +22 -0
  53. data/lib/krane/kubernetes_resource/cron_job.rb +18 -0
  54. data/lib/krane/kubernetes_resource/custom_resource.rb +87 -0
  55. data/lib/krane/kubernetes_resource/custom_resource_definition.rb +98 -0
  56. data/lib/krane/kubernetes_resource/daemon_set.rb +90 -0
  57. data/lib/krane/kubernetes_resource/deployment.rb +213 -0
  58. data/lib/krane/kubernetes_resource/horizontal_pod_autoscaler.rb +65 -0
  59. data/lib/krane/kubernetes_resource/ingress.rb +18 -0
  60. data/lib/krane/kubernetes_resource/job.rb +60 -0
  61. data/lib/krane/kubernetes_resource/network_policy.rb +22 -0
  62. data/lib/krane/kubernetes_resource/persistent_volume_claim.rb +80 -0
  63. data/lib/krane/kubernetes_resource/pod.rb +269 -0
  64. data/lib/krane/kubernetes_resource/pod_disruption_budget.rb +23 -0
  65. data/lib/krane/kubernetes_resource/pod_set_base.rb +71 -0
  66. data/lib/krane/kubernetes_resource/pod_template.rb +20 -0
  67. data/lib/krane/kubernetes_resource/replica_set.rb +92 -0
  68. data/lib/krane/kubernetes_resource/resource_quota.rb +22 -0
  69. data/lib/krane/kubernetes_resource/role.rb +22 -0
  70. data/lib/krane/kubernetes_resource/role_binding.rb +22 -0
  71. data/lib/krane/kubernetes_resource/secret.rb +24 -0
  72. data/lib/krane/kubernetes_resource/service.rb +104 -0
  73. data/lib/krane/kubernetes_resource/service_account.rb +22 -0
  74. data/lib/krane/kubernetes_resource/stateful_set.rb +70 -0
  75. data/lib/krane/label_selector.rb +42 -0
  76. data/lib/krane/oj.rb +4 -0
  77. data/lib/krane/options_helper.rb +39 -0
  78. data/lib/krane/remote_logs.rb +60 -0
  79. data/lib/krane/render_task.rb +118 -0
  80. data/lib/krane/renderer.rb +118 -0
  81. data/lib/krane/resource_cache.rb +68 -0
  82. data/lib/krane/resource_deployer.rb +265 -0
  83. data/lib/krane/resource_watcher.rb +171 -0
  84. data/lib/krane/restart_task.rb +228 -0
  85. data/lib/krane/rollout_conditions.rb +103 -0
  86. data/lib/krane/runner_task.rb +212 -0
  87. data/lib/krane/runner_task_config_validator.rb +18 -0
  88. data/lib/krane/statsd.rb +65 -0
  89. data/lib/krane/task_config.rb +22 -0
  90. data/lib/krane/task_config_validator.rb +96 -0
  91. data/lib/krane/template_sets.rb +173 -0
  92. data/lib/krane/version.rb +4 -0
  93. data/pull_request_template.md +8 -0
  94. data/screenshots/deploy-demo.gif +0 -0
  95. data/screenshots/migrate-logs.png +0 -0
  96. data/screenshots/missing-secret-fail.png +0 -0
  97. data/screenshots/success.png +0 -0
  98. data/screenshots/test-output.png +0 -0
  99. data/shipit.yml +4 -0
  100. metadata +376 -0
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: ce6000a0253e56d0fe0215667bdfc45a11d8cc9beb5fb336e6dbf825de306bbd
4
+ data.tar.gz: 64dcb7f06f622dc9875cba49197fa7eac60e1d32c16aba2fad216601b0402526
5
+ SHA512:
6
+ metadata.gz: 2893739b4c78a07fabe9992eebdde7e1e1f8d8b5e4d4134adad7a0a67f96920fed53048e5b679130d086f84c6ca03240a5af9b91d529068206de2ba2715a4348
7
+ data.tar.gz: deb41c2fc4a5df2f2d011d1abbec625b60392300fea2b02cbc6d2679596a5662016f11ae0ab5566aeecc2b5daed17acfde726a6af6712de67818a28ff6606ad6
@@ -0,0 +1,43 @@
1
+ steps:
2
+ - name: 'Run Test Suite (:kubernetes: 1.16-latest)'
3
+ command: bin/ci
4
+ agents:
5
+ queue: k8s-ci
6
+ env:
7
+ LOGGING_LEVEL: 4
8
+ KUBERNETES_VERSION: v1.16-latest
9
+ - name: 'Run Test Suite (:kubernetes: 1.15-latest)'
10
+ command: bin/ci
11
+ agents:
12
+ queue: k8s-ci
13
+ env:
14
+ LOGGING_LEVEL: 4
15
+ KUBERNETES_VERSION: v1.15-latest
16
+ - name: 'Run Test Suite (:kubernetes: 1.14-latest)'
17
+ command: bin/ci
18
+ agents:
19
+ queue: k8s-ci
20
+ env:
21
+ LOGGING_LEVEL: 4
22
+ KUBERNETES_VERSION: v1.14-latest
23
+ - name: 'Run Test Suite (:kubernetes: 1.13-latest)'
24
+ command: bin/ci
25
+ agents:
26
+ queue: k8s-ci
27
+ env:
28
+ LOGGING_LEVEL: 4
29
+ KUBERNETES_VERSION: v1.13-latest
30
+ - name: 'Run Test Suite (:kubernetes: 1.12-latest)'
31
+ command: bin/ci
32
+ agents:
33
+ queue: k8s-ci
34
+ env:
35
+ LOGGING_LEVEL: 4
36
+ KUBERNETES_VERSION: v1.12-latest
37
+ - name: 'Run Test Suite (:kubernetes: 1.11-latest)'
38
+ command: bin/ci
39
+ agents:
40
+ queue: k8s-ci
41
+ env:
42
+ LOGGING_LEVEL: 4
43
+ KUBERNETES_VERSION: v1.11-latest
@@ -0,0 +1,2 @@
1
+ enabled:
2
+ - cla
@@ -0,0 +1,20 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /Gemfile.lock
4
+ /_yardoc/
5
+ /coverage/
6
+ /doc/
7
+ /pkg/
8
+ /spec/reports/
9
+ /tmp/
10
+
11
+ # Ignore RuboCop cache
12
+ .rubocop-http---shopify-github-io-ruby-style-guide-rubocop-yml
13
+
14
+ .byebug_history
15
+ .ruby-version
16
+ coverage/*
17
+ dev/flamegraph.svg
18
+ dev/profile
19
+ dev/flamegraph.pl
20
+ .local-context
@@ -0,0 +1,17 @@
1
+ inherit_from:
2
+ - http://shopify.github.io/ruby-style-guide/rubocop.yml
3
+
4
+ AllCops:
5
+ TargetRubyVersion: 2.4
6
+
7
+ Naming/FileName:
8
+ Enabled: true
9
+ Exclude:
10
+ - lib/krane.rb
11
+
12
+ Sorbet/ConstantsFromStrings:
13
+ Enabled: false
14
+
15
+ Layout/Tab:
16
+ Exclude:
17
+ - test/integration/krane_deploy_test.rb
@@ -0,0 +1 @@
1
+ v1
@@ -0,0 +1,53 @@
1
+ containers:
2
+ default:
3
+ docker: circleci/ruby:2.4.6-node-browsers
4
+
5
+ steps:
6
+ - label: Lint
7
+ timeout: 5m
8
+ run:
9
+ - bundle exec rubocop
10
+ dependencies:
11
+ - bundler
12
+ - label: 'Run Test Suite (:kubernetes: 1.16-latest)'
13
+ command: bin/ci
14
+ agents:
15
+ queue: k8s-ci
16
+ env:
17
+ LOGGING_LEVEL: "4"
18
+ KUBERNETES_VERSION: v1.16-latest
19
+ - label: 'Run Test Suite (:kubernetes: 1.15-latest)'
20
+ command: bin/ci
21
+ agents:
22
+ queue: k8s-ci
23
+ env:
24
+ LOGGING_LEVEL: "4"
25
+ KUBERNETES_VERSION: v1.15-latest
26
+ - label: 'Run Test Suite (:kubernetes: 1.14-latest)'
27
+ command: bin/ci
28
+ agents:
29
+ queue: k8s-ci
30
+ env:
31
+ LOGGING_LEVEL: "4"
32
+ KUBERNETES_VERSION: v1.14-latest
33
+ - label: 'Run Test Suite (:kubernetes: 1.13-latest)'
34
+ command: bin/ci
35
+ agents:
36
+ queue: k8s-ci
37
+ env:
38
+ LOGGING_LEVEL: "4"
39
+ KUBERNETES_VERSION: v1.13-latest
40
+ - label: 'Run Test Suite (:kubernetes: 1.12-latest)'
41
+ command: bin/ci
42
+ agents:
43
+ queue: k8s-ci
44
+ env:
45
+ LOGGING_LEVEL: "4"
46
+ KUBERNETES_VERSION: v1.12-latest
47
+ - label: 'Run Test Suite (:kubernetes: 1.11-latest)'
48
+ command: bin/ci
49
+ agents:
50
+ queue: k8s-ci
51
+ env:
52
+ LOGGING_LEVEL: "4"
53
+ KUBERNETES_VERSION: v1.11-latest
@@ -0,0 +1,186 @@
1
+ # kubernetes-deploy 0.31.1 -> krane 1.0.0 migration guide
2
+
3
+ `kubernetes-deploy` was renamed `krane` when version 1.0.0 was released. Version 1.0.0 introduced [new features and breaking changes](CHANGELOG.md). This guide will help you transition to version 1.0.0 as smoothly as possible.
4
+
5
+ **TL;DR**:
6
+ * The command-line interface was redesigned; alongside the name change there are breaking changes in several flags.
7
+ * There are breaking changes in the public API (such as the renaming of the `KubernetesDeploy` namespace to `Krane`, and the change in default values for different arguments of the public interface).
8
+ * StatsD metrics will now be generated with the `krane` prefix.
9
+ * `krane deploy` now considers all namespaced resources eligible for pruning, including
10
+ custom resources. See [blacklist](https://github.com/Shopify/kubernetes-deploy/blob/master/lib/krane/cluster_resource_discovery.rb#L20) for exceptions.
11
+ * `kubernetes-deploy` (now `krane deploy`) / `DeployTask` can no longer deploy global (non-namespaced) resources. A new command called `krane global-deploy` and a related class called `GlobalDeployTask` were added to replace that feature.
12
+ * `krane deploy` will not render erb templates. Use `krane render | krane deploy --stdin` to reproduce this functionality.
13
+ * If you attempt to install two gems that have conflicting executables, `gem install` will warn you but the most recently installed one will win.
14
+
15
+ ## Public API changes
16
+
17
+ Besides the renaming of the `KubernetesDeploy` namespace to `Krane`, we made the public interfaces of the major public classes (`DeployTask`, `RenderTask`, `RunnerTask`, and `RestartTask`) match the CLI flag names more closely.
18
+
19
+ If you're curious about this API, check the comment-based docs on these classes or the [rendered documentation at RubyGems.org](https://www.rubydoc.info/gems/kubernetes-deploy/1.0.0/KubernetesDeploy/DeployTask).
20
+
21
+ #### `DeployTask#new`
22
+
23
+ Old name | New name | Comments
24
+ --- | --- | ---
25
+ template_paths | filenames |
26
+ max_watch_seconds | global_timeout | This is now a duration that can be expressed in a more user-friendly language (e.g. `30s` or `1h`)
27
+ template_dir | [none] | Removed in favour of `filenames`
28
+ allow_globals | [none] | Removed. Use `GlobalDeployTask` instead
29
+
30
+ #### `DeployTask#run`
31
+
32
+ Old name | New name | Comments
33
+ --- | --- | ---
34
+ allow_protected_ns | [none] | This is now an implicit argument derived from the usage of `protected_namespaces` instead
35
+
36
+ #### `RestartTask#new`
37
+
38
+ Old name | New name | Comments
39
+ --- | --- | ---
40
+ max_watch_seconds | global_timeout | This is now a duration that can be expressed in a more user-friendly language (e.g. `30s` or `1h`)
41
+
42
+ #### `RestartTask#run`
43
+
44
+ Method signature changed from this:
45
+
46
+ ```ruby
47
+ def run(deployments, selector:)
48
+ ```
49
+
50
+ ... to this, to maintain the convention of using keyword arguments for all the public interfaces:
51
+
52
+ ```ruby
53
+ def run(deployments:, selector:)
54
+ ```
55
+
56
+ #### `RunnerTask#new`
57
+
58
+ Old name | New name | Comments
59
+ --- | --- | ---
60
+ max_watch_seconds | global_timeout | This is now a duration that can be expressed in a more user-friendly language (e.g. `30s` or `1h`)
61
+
62
+ #### `RunnerTask#run`
63
+
64
+ Old name | New name | Comments
65
+ --- | --- | ---
66
+ task_template | filename |
67
+ entrypoint | command |
68
+ args | arguments |
69
+
70
+
71
+ #### `RenderTask#new`
72
+
73
+ Old name | New name | Comments
74
+ --- | --- | ---
75
+ template_paths | filenames |
76
+ max_watch_seconds | global_timeout | This is now a duration that can be expressed in a more user-friendly language (e.g. `30s` or `1h`)
77
+ template_dir | [none] | Removed in favour of `filenames`
78
+
79
+ #### `RenderTask#run`
80
+
81
+ Old name | New name | Comments
82
+ --- | --- | ---
83
+ only_filenames | [none] | Removed in favour of `filenames` in `RenderTask#new`
84
+
85
+ Method signature changed from this:
86
+
87
+ ```ruby
88
+ def run(stream, only_filenames = [])
89
+ ```
90
+
91
+ ... to this, to maintain the convention of using keyword arguments for all the public interfaces:
92
+
93
+ ```ruby
94
+ def run(stream:)
95
+ ```
96
+
97
+ ## Command-line interface changes
98
+
99
+ Old command | New command
100
+ --- | ---
101
+ `kubernetes-deploy` | `krane deploy`
102
+ `kubernetes-deploy -v` | `krane version`
103
+ `kubernetes-render` | `krane render`
104
+ `kubernetes-run` | `krane run`
105
+ `kubernetes-restart` | `krane restart`
106
+ `[kubernetes-deploy with global resources in templates]` | `krane global-deploy`
107
+
108
+ ### Flag changes
109
+
110
+ The following tables provide a mapping of the flags previously supported in `kubernetes-deploy` and their new version in `krane` (if applicable).
111
+
112
+ Important: you can't repeat flags. If you need to provide multiple arguments for a flag, use a space-separated list (e.g. `-f file1.yml file2.yml`) unless specified otherwise.
113
+
114
+ #### krane deploy
115
+
116
+ Old flag | New flag | Comments
117
+ --- | --- | ---
118
+ --bindings=BINDINGS | --bindings=BINDINGS |
119
+ --skip-wait | --verify-result=true |
120
+ --allow-protected-ns | --protected-namespaces=default,kube-system,kube-public | Added the ability to specify which namespaces are protected
121
+ --no-prune | --prune=true |
122
+ --template-dir | -f, --filename | Makes all krane commands accept this argument, which is now required for the deploy task
123
+ --verbose-log-prefix | --verbose-log-prefix |
124
+ --max-watch-seconds=seconds | --global-timeout=300s | Changed flag name and default value to be a duration (expressed using strings like "300s" or "1h")
125
+ --selector | --selector |
126
+ -h, --help | -h, --help |
127
+ -v, --version | [none] | Replaced with `krane version`
128
+ $ENVIRONMENT | [none] | Dropped in favour of `-f`
129
+ $REVISION | --current-sha | The environment variable REVISION was dropped in favour of an explicit flag
130
+ [none] | --render-erb | **Important:** the new CLI doesn't render ERB by default
131
+ [none] | --stdin | Allow template filenames given from stdin stream
132
+
133
+ #### krane restart
134
+
135
+ Old flag | New flag | Comments
136
+ --- | --- | ---
137
+ --deployments=LIST | --deployments=LIST |
138
+ --max-watch-seconds=seconds | --global-timeout=300s | Changed flag name and default value to be a duration (expressed using strings like "300s" or "1h")
139
+ [none] | --verify-result=true | Defines whether it should wait for results or exit immediately after validation
140
+
141
+ #### krane run
142
+
143
+ Old flag | New flag | Comments
144
+ --- | --- | ---
145
+ --skip-wait | --verify-result=true |
146
+ --max-watch-seconds=seconds | --global-timeout=300s | Changed flag name and default value to be a duration (expressed using strings like "300s" or "1h")
147
+ --entrypoint | --command | Changed flag name to make its purpose clearer
148
+ --template | --template | Changed to be required
149
+ [it is positional now] | --arguments | Optional flag, as `command` or the template might already specify the required arguments
150
+ --env-vars=ENV_VARS | --env-vars=ENV_VARS |
151
+
152
+ #### krane render
153
+
154
+ Old flag | New flag | Comments
155
+ --- | --- | ---
156
+ --bindings=BINDINGS | --bindings=BINDINGS |
157
+ --template-dir | -f, --filename | Changed to be more aligned with `kubectl apply` and other krane tasks
158
+ $REVISION | --current-sha | The environment variable REVISION was dropped in favour of an explicit flag
159
+ [none] | --stdin | Allow template filenames given from stdin stream
160
+
161
+ ## Running `kubernetes-deploy` and `krane` side by side
162
+
163
+ If you attempt to install two gems that have conflicting executables (as is the case here), `gem install` will warn you but the most recently installed one will win. This means that you can run both `kubernetes-deploy` 0.31.1 and `krane` 1.0.0 side by side by doing:
164
+
165
+ ```bash
166
+ gem install kubernetes-deploy -v 0.31.1
167
+ gem install -f krane -v 1.0.0
168
+ ```
169
+
170
+ This can help you incrementally port scripts that use the old CLI to the new one.
171
+
172
+ ## New task: `krane global-deploy`
173
+
174
+ `krane global-deploy` (accessible through the Ruby API as `Krane::GlobalDeployTask`) can deploy global (non-namespaced) resources such as `PersistentVolume`, `Namespace`, and `CustomResourceDefinition`. Its interface is very similar to `krane deploy`. Example usage:
175
+
176
+ ```bash
177
+ $ cat my-template.yml
178
+ apiVersion: storage.k8s.io/v1
179
+ kind: StorageClass
180
+ metadata:
181
+ name: testing-storage-class
182
+ labels:
183
+ app: krane
184
+ provisioner: kubernetes.io/no-provisioner
185
+ $ krane global-deploy my-k8s-context -f my-template.yml --selector app=krane
186
+ ```
@@ -0,0 +1,431 @@
1
+ ## next
2
+
3
+ # 1.0.0
4
+
5
+ We've renamed the gem and cli to Krane.
6
+ See our [migration guide](https://github.com/Shopify/kubernetes-deploy/blob/master/1.0-Upgrade.md) to help navigate the breaking changes.
7
+
8
+ ## 1.0.0.pre.1
9
+
10
+ *Important!*
11
+
12
+ - This is the final release of KubernetesDeploy. Version 1.0.0 will be released
13
+ under the name `Krane`. We've added a migration guide to help make it easier to migrate.
14
+ ([#607](https://github.com/Shopify/kubernetes-deploy/pull/607))
15
+
16
+ *Enhancements*
17
+ - (beta) `krane deploy` will now consider all namespaced resources eligible for pruning
18
+ and does not respect the `krane.shopify.io/prunable` annotation. This adds 5 additional
19
+ types: Endpoints, Event, LimitRange, ReplicationController, and Lease.
20
+ ([#616](https://github.com/Shopify/kubernetes-deploy/pull/616)
21
+
22
+ - (beta) Added the `--stdin` flag to `krane deploy|global-deploy|render` to read resources from stdin. ([#630](https://github.com/Shopify/kubernetes-deploy/pull/630))
23
+
24
+ ## 0.31.1
25
+
26
+ *Bug Fixes*
27
+ - Fix a scoping issue of ClusterResourceDiscovery where it was not visible to kubernetes-run, causing a crash. ([#624](https://github.com/Shopify/kubernetes-deploy/pull/624))
28
+
29
+ ## 0.31.0
30
+
31
+ *Enhancements*
32
+ - (alpha) Add a new krane global-deploy task for deploying global resources. Note that global pruning is turned on by default ([#602](https://github.com/Shopify/kubernetes-deploy/pull/602) and [#612](https://github.com/Shopify/kubernetes-deploy/pull/612))
33
+ - Add support for deploying resources that use `generateName` ([#608](https://github.com/Shopify/kubernetes-deploy/pull/608))
34
+ - ENV["REVISION"] is not transparently passed into krane. Instead, you must now use the `--current-sha` flag to set the `current_sha` ERB binding in your templates. Note that kubernetes-deploy, _but not krane_, can still use ENV["REVISION"] as a fallback if `--current-sha` is not provided. ([#613](https://github.com/Shopify/kubernetes-deploy/pull/613))
35
+
36
+ *Bug Fixes*
37
+ - `krane deploy` can accept multiple filenames with `-f` flag ([#606](https://github.com/Shopify/kubernetes-deploy/pull/606))
38
+ - Ensure DaemonSet status has converged with pod statuses before reporting rollout success ([#617](https://github.com/Shopify/kubernetes-deploy/pull/617))
39
+
40
+ *Other*
41
+ - Update references from using `kubernetes-deploy` to `krane` in preparation for 1.0 release ([#585](https://github.com/Shopify/kubernetes-deploy/pull/585))
42
+ - Refactor StatsD usage so we can depend on the latest version again. ([#594](https://github.com/Shopify/kubernetes-deploy/pull/594))
43
+
44
+ ## 0.30.0
45
+
46
+ *Enhancements*
47
+ - **[Breaking change]** Added PersistentVolumeClaim to the prune whitelist. ([#573](https://github.com/Shopify/kubernetes-deploy/pull/573))
48
+ * To see what resources may be affected, run `kubectl get pvc -o jsonpath='{ range .items[*] }{.metadata.namespace}{ "\t" }{.metadata.name}{ "\t" }{.metadata.annotations}{ "\n" }{ end }' --all-namespaces | grep "last-applied"`
49
+ * To exclude a resource from kubernetes-deploy (and kubectl apply) management, remove the last-applied annotation `kubectl annotate pvc $PVC_NAME kubectl.kubernetes.io/last-applied-configuration-`.
50
+ - Deploying global resources directly from `KubernetesDeploy::DeployTask` is disabled by default. You can use `allow_globals: true` to enable the old behavior. This will be disabled in the Krane version of the task, and a separate purpose-built task will be provided. [#567](https://github.com/Shopify/kubernetes-deploy/pull/567)
51
+ - Deployments to daemonsets now better tolerate autoscaling: nodes that appear mid-deploy aren't required for convergence. [#580](https://github.com/Shopify/kubernetes-deploy/pull/580)
52
+
53
+ ## 0.29.0
54
+
55
+ *Enhancements*
56
+ - The KubernetesDeploy::RenderTask now supports a template_paths argument. ([#555](https://github.com/Shopify/kubernetes-deploy/pull/546))
57
+ - We no longer hide errors from apply if all sensitive resources have passed server-dry-run validation. ([#570](https://github.com/Shopify/kubernetes-deploy/pull/570))
58
+
59
+
60
+ *Bug Fixes*
61
+ - Handle improper duration values more elegantly with better messaging
62
+
63
+
64
+ *Other*
65
+ - We now require Ruby 2.4.x since Ruby 2.3 is past EoL.
66
+ - Lock statsd-instrument to 2.3.X due to breaking changes in 2.5.0
67
+
68
+ ## 0.28.0
69
+
70
+ *Enhancements*
71
+ - Officially support Kubernetes 1.15 ([#546](https://github.com/Shopify/kubernetes-deploy/pull/546))
72
+ - Make sure that we only declare a Service of type LoadBalancer as deployed after its IP address is published. [#547](https://github.com/Shopify/kubernetes-deploy/pull/547)
73
+ - Add more validations to `RunnerTask`. [#554](https://github.com/Shopify/kubernetes-deploy/pull/554)
74
+ - Validate secrets with `--server-dry-run` on supported clusters. [#553](https://github.com/Shopify/kubernetes-deploy/pull/553)
75
+ *Bug Fixes*
76
+ - Fix a bug in rendering where we failed to add a yaml doc separator (`---`) to
77
+ an implicit document if there are multiple documents in the file.
78
+ ([#551](https://github.com/Shopify/kubernetes-deploy/pull/551))
79
+
80
+ *Other*
81
+ - Kubernetes 1.10 is no longer officially supported as of this version ([#546](https://github.com/Shopify/kubernetes-deploy/pull/546))
82
+ - We've added a new Krane cli. This code is in alpha. We are providing
83
+ no warranty at this time and reserve the right to make major breaking changes including
84
+ removing it entirely at any time. ([#256](https://github.com/Shopify/kubernetes-deploy/issues/256))
85
+ - Deprecate `kubernetes-deploy.shopify.io` annotations in favour of `krane.shopify.io` ([#539](https://github.com/Shopify/kubernetes-deploy/pull/539))
86
+
87
+ ## 0.27.0
88
+
89
+ *Enhancements*
90
+ - (alpha) Introduce a new `-f` flag for `kubernetes-deploy`. Allows passing in of multiple directories and/or filenames. Currently only usable by `kubernetes-deploy`, not `kubernetes-render`. [#514](https://github.com/Shopify/kubernetes-deploy/pull/514)
91
+ - Initial implementation of shared task validation objects. [#533](https://github.com/Shopify/kubernetes-deploy/pull/533)
92
+ - Restructure `require`s so that requiring a given task actually gives you the dependencies you need, and doesn't give what you don't need. [#487](https://github.com/Shopify/kubernetes-deploy/pull/487)
93
+ - **[Breaking change]** Added ServiceAccount, PodTemplate, ReplicaSet, Role, and RoleBinding to the prune whitelist.
94
+ * To see what resources may be affected, run `kubectl get $RESOURCE -o jsonpath='{ range .items[*] }{.metadata.namespace}{ "\t" }{.metadata.name}{ "\t" }{.metadata.annotations}{ "\n" }{ end }' --all-namespaces | grep "last-applied"`
95
+ * To exclude a resource from kubernetes-deploy (and kubectl apply) management, remove the last-applied annotation `kubectl annotate $RESOURCE $SECRET_NAME kubectl.kubernetes.io/last-applied-configuration-`.
96
+
97
+ *Bug Fixes*
98
+ - StatefulSets with 0 replicas explicitly specified don't fail deploy. [#540](https://github.com/Shopify/kubernetes-deploy/pull/540)
99
+ - Search all workloads if a Pod selector doesn't match any workloads when deploying a Service. [#541](https://github.com/Shopify/kubernetes-deploy/pull/541)
100
+
101
+ *Other*
102
+ - `EjsonSecretProvisioner#new` signature has changed. `EjsonSecretProvisioner` objects no longer have access to `kubectl`. Rather, the `ejson-keys` secret used for decryption is now passed in via the calling task. Note that we only consider the `new` and `run(!)` methods of tasks (render, deploy, etc) to have inviolable APIs, so we do not consider this change breaking. [#514](https://github.com/Shopify/kubernetes-deploy/pull/514)
103
+
104
+ ## 0.26.7
105
+
106
+ *Other*
107
+ - Bump `googleauth` dependency. ([#512](https://github.com/Shopify/kubernetes-deploy/pull/512))
108
+
109
+ ## 0.26.6
110
+
111
+ *Bug Fixes*
112
+ - Re-enable support for YAML aliases when using YAML.safe_load [#510](https://github.com/Shopify/kubernetes-deploy/pull/510)
113
+
114
+ ## 0.26.5
115
+
116
+ *Bug Fixes*
117
+ - Support 'volumeBindingMode: WaitForFirstConsumer' condition in StorageClass. [#479](https://github.com/Shopify/kubernetes-deploy/pull/479)
118
+ - Fix: Undefined method "merge" on LabelSelector. [#488](https://github.com/Shopify/kubernetes-deploy/pull/488)
119
+
120
+ *Enhancements*
121
+ - Officially support Kubernetes 1.14. [#461](https://github.com/Shopify/kubernetes-deploy/pull/461)
122
+ - Allow customising which custom resources are deployed in the pre-deploy phase. [#505](https://github.com/Shopify/kubernetes-deploy/pull/505)
123
+
124
+ *Other*
125
+ - Removes special treatment of GCP authentication by upgrading to `kubeclient` 4.3. [#465](https://github.com/Shopify/kubernetes-deploy/pull/465)
126
+
127
+ ## 0.26.4
128
+
129
+ *Bug fixes*
130
+ - Adds several additional safeguards against the content of Secret resources being logged. [#474](https://github.com/Shopify/kubernetes-deploy/pull/474)
131
+
132
+ *Enhancements*
133
+ - Improves scalability by removing a check that caused recoverable registry problems to fail deploys. [#477](https://github.com/Shopify/kubernetes-deploy/pull/477)
134
+
135
+ *Other*
136
+ - Relaxes our dependency on the OJ gem. [#471](https://github.com/Shopify/kubernetes-deploy/pull/471)
137
+
138
+ ## 0.26.3
139
+
140
+ *Bug fixes*
141
+ - Fixes a bug introduced in 0.26.0 where listing multiple files in the $KUBECONFIG environment variable would throw an error ([#468](https://github.com/Shopify/kubernetes-deploy/pull/468))
142
+ - Fixes a bug introduced in 0.26.2 where kubernetes-render started adding YAML headers to empty render results ([#467](https://github.com/Shopify/kubernetes-deploy/pull/467))
143
+
144
+ ## 0.26.2
145
+
146
+ *Enhancements*
147
+ - kubernetes-render outputs results of rendering yml.erb files without passing them
148
+ through a yaml parser. ([#454](https://github.com/Shopify/kubernetes-deploy/pull/454))
149
+
150
+ *Bug fixes*
151
+ - Remove use of deprecated feature preventing use with Kubernetes 1.14 ([#460](https://github.com/Shopify/kubernetes-deploy/pull/460))
152
+
153
+ ## 0.26.1
154
+
155
+ *Bug fixes*
156
+ - Fixes a bug where `config/deploy/$ENVIRONMENT` would be used unconditionally if the `ENVIRONMENT` environment variable is set, ignoring any `--template-dir` argument passed.
157
+
158
+ ## 0.26.0
159
+
160
+ *Enhancements*
161
+ - Add support for NetworkPolicies ([#422](https://github.com/Shopify/kubernetes-deploy/pull/422))
162
+ - Setting the REVISION environment variable is now optional ([#429](https://github.com/Shopify/kubernetes-deploy/pull/429))
163
+ - Defaults KUBECONFIG to `~/.kube/config` ([#429](https://github.com/Shopify/kubernetes-deploy/pull/429))
164
+ - Uses `TASK_ID` environment variable as the `deployment_id` when rendering resource templates for better [Shipit](https://github.com/Shopify/shipit) integration. ([#430](https://github.com/Shopify/kubernetes-deploy/pull/430))
165
+ - Arguments to `--bindings` will now be deep merged. ([#419](https://github.com/Shopify/kubernetes-deploy/pull/419))
166
+ - `kubernetes-deploy` and `kubernetes-render` now support reading templates from STDIN. ([#415](https://github.com/Shopify/kubernetes-deploy/pull/415))
167
+ - Support for specifying a `--selector`, a label with which all deployed resources are expected to have, and by which prunable resources will be filtered. This permits sharing a namespace with resources managed by third-parties, including other kubernetes-deploy deployments. ([#439](https://github.com/Shopify/kubernetes-deploy/pull/439))
168
+ - Lists of resources printed during deployments will now be sorted alphabetically. ([#441](https://github.com/Shopify/kubernetes-deploy/pull/441))
169
+ - Bare / unmanaged pods run as pre-deployment tasks will now stream logs if there is only one of them. ([#436](https://github.com/Shopify/kubernetes-deploy/pull/436))
170
+
171
+ *Features*
172
+
173
+ - **[Breaking change]** Support for deploying Secrets from templates ([#424](https://github.com/Shopify/kubernetes-deploy/pull/424)). Non-ejson secrets are now fully supported and therefore **subject to pruning like any other resource**. As a result:
174
+ * If you previously manually `kubectl apply`'d secrets that are not passed to kubernetes-deploy, your first deploy using this version is going to delete them.
175
+ * If you previously passed secrets manifests to kubernetes-deploy and they are no longer in the set you pass to the first deploy using this version, it will delete them.
176
+ * To identify potentially affected secrets in your cluster, run: `kubectl get secrets -o jsonpath='{ range .items[*] }{.metadata.namespace}{ "\t" }{.metadata.name}{ "\t" }{.metadata.annotations}{ "\n" }{ end }' --context=$YOUR_CONTEXT_HERE --all-namespaces | grep -v "kubernetes-deploy.shopify.io/ejson-secret" | grep "last-applied" | cut -f 1,2`. To exclude a secret from kubernetes-deploy (and kubectl apply) management, remove the last-applied annotation `kubectl annotate secret $SECRET_NAME kubectl.kubernetes.io/last-applied-configuration-`.
177
+ * The secret `ejson-keys` will never be pruned by kubernetes-deploy. Instead, it will fail the deploy at the validation stage (unless `--no-prune` is set). ([#447](https://github.com/Shopify/kubernetes-deploy/pull/447))
178
+
179
+ ## 0.25.0
180
+
181
+ #### WARNING
182
+ This version contains an error for handling the `--template-dir` argument. If the `ENVIRONMENT` environment variable is set, the template directory will be forcefully set to `config/deploy/$ENVIRONMENT`. This has been fixed in version 0.26.1
183
+
184
+ *Features*
185
+ - Support timeout overrides on deployments ([#414](https://github.com/Shopify/kubernetes-deploy/pull/414))
186
+
187
+ *Bug fixes*
188
+ - Attempting to deploy from a directory that only contains `secrets.ejson` will no longer fail deploy ([#416](https://github.com/Shopify/kubernetes-deploy/pull/416))
189
+ - Remove the risk of sending decrypted EJSON secrets to output([#431](https://github.com/Shopify/kubernetes-deploy/pull/431))
190
+
191
+ *Other*
192
+ - Update kubeclient gem to 4.2.2. Note this replaces the `KubeclientBuilder::GoogleFriendlyConfig` class with `KubeclientBuilder::KubeConfig` ([#418](https://github.com/Shopify/kubernetes-deploy/pull/418)). This resolves [#396](https://github.com/Shopify/kubernetes-deploy/issues/396) and should allow us to support more authentication methods (e.g. `exec` for EKS).
193
+ - Invalid context when using `kubernetes-run` gives more descriptive error([#423](https://github.com/Shopify/kubernetes-deploy/pull/423))
194
+ - When resources are not found, instead of being `Unknown`, they are now labelled as `Not Found`([#427](https://github.com/Shopify/kubernetes-deploy/pull/427))
195
+
196
+ ## 0.24.0
197
+
198
+ *Features*
199
+ - Add support for specifying pass/fail conditions of Custom Resources ([#376](https://github.com/Shopify/kubernetes-deploy/pull/376)).
200
+ - Add support for custom timeouts for Custom Resources([#376](https://github.com/Shopify/kubernetes-deploy/pull/376))
201
+
202
+ *Enhancements*
203
+ - Officially support Kubernetes 1.13 ([#409](https://github.com/Shopify/kubernetes-deploy/pull/409))
204
+
205
+ *Bug fixes*
206
+ - Fixed bug that caused `NameError: wrong constant name` if custom resources had kind with a lowercase first letter. ([#413](https://github.com/Shopify/kubernetes-deploy/pull/413))
207
+
208
+ *Other*
209
+ - Kubernetes 1.9 is no longer officially supported as of this version
210
+
211
+ ## 0.23.0
212
+
213
+ *Features*
214
+ - New command: `kubernetes-render` is a tool for rendering ERB templates to raw Kubernetes YAML. It's useful for seeing what `kubernetes-deploy` does before actually invoking `kubectl` on the rendered YAML. It's also useful for outputting YAML that can be passed to other tools, for validation or introspection purposes. ([#375](https://github.com/Shopify/kubernetes-deploy/pull/375/files))
215
+ - **[Breaking change]** This release completes the conversion of `kubernetes-deploy` StatsD metrics to `distribution`s, which was done for `kubernetes-restart` and `kubernetes-run` in v0.22.0.
216
+ - Several new distribution metrics are available to give insight into the timing of each step of the deploy process: `KubernetesDeploy.validate_configuration.duration`, `KubernetesDeploy.discover_resources.duration`, `KubernetesDeploy.validate_resources.duration`, `KubernetesDeploy.initial_status.duration`, `KubernetesDeploy.create_ejson_secrets.duration`, `KubernetesDeploy.apply_all.duration`, `KubernetesDeploy.sync.duration`
217
+ - **[Breaking change]** `KubernetesDeploy.resource.duration` no longer includes `sha` or `resource` tags. ([#392](https://github.com/Shopify/kubernetes-deploy/pull/392))
218
+
219
+ *Enhancements*
220
+ - Roles are now predeployed before RoleBindings ([#380](https://github.com/Shopify/kubernetes-deploy/pull/380))
221
+ - Several performance enhancements for deploys to namespaces with hundreds of resources.
222
+ - KubernetesDeploy no longer modifies the global StatsD configuration when used as a gem ([#384](https://github.com/Shopify/kubernetes-deploy/pull/384))
223
+
224
+ *Bug fixes*
225
+ - Handle out-of-order arrival of entries from different streams when processing logs ([#401](https://github.com/Shopify/kubernetes-deploy/pull/401))
226
+
227
+ ## 0.22.0
228
+
229
+ *Features*
230
+ - **[Breaking change]** `kubernetes-restart` now produces StatsD `distribution` instead of `metric`.
231
+ Dashboards that used these metrics will need to be updated. ([#374](https://github.com/Shopify/kubernetes-deploy/pull/374))
232
+ - `kubernetes-run` now produces StatsD `distribution` to aid in tracking usage ([#374](https://github.com/Shopify/kubernetes-deploy/pull/374))
233
+
234
+ *Enhancements*
235
+ - Predeploy RoleBinding before unmanaged pods ([#354](https://github.com/Shopify/kubernetes-deploy/pull/354))
236
+
237
+ *Bug Fixes*
238
+ - Fixed bug in `kubernetes-restart` that caused "Pod spec does not contain a template
239
+ container called 'task-runner'" error message to not be printed
240
+ ([#371](https://github.com/Shopify/kubernetes-deploy/pull/371))
241
+
242
+ *Other*
243
+ - Kubernetes 1.8 is no longer officially supported as of this version
244
+
245
+ ## 0.21.1
246
+
247
+ *Enhancements*
248
+ - Improved failure detection for job resources. ([#355](https://github.com/Shopify/kubernetes-deploy/pull/355))
249
+ - Unmanaged pods are now immediately identified as failed if they are evicted, preempted or deleted out of band. This is especially important to `kubernetes-run`. ([#353](https://github.com/Shopify/kubernetes-deploy/pull/353))
250
+
251
+ *Other*
252
+ - Relaxed our `googleauth` dependency. ([#333](https://github.com/Shopify/kubernetes-deploy/pull/333))
253
+
254
+ ## 0.21.0
255
+
256
+ *Features*
257
+ - **[Breaking change]** `kubernetes-run` now streams container logs and waits for the pod to succeed or fail **by default**. You can disable this using `--skip-wait`, or you can use `--max-watch-seconds=seconds` to set a time limit on the watch. ([#337](https://github.com/Shopify/kubernetes-deploy/pull/337))
258
+
259
+
260
+ *Other*
261
+ - Kubernetes 1.7 is no longer officially supported as of this version
262
+
263
+ ## 0.20.6
264
+
265
+ *Enhancements*
266
+ - All resources marked as prunable will now be added to the prune whitelist ([#326](https://github.com/Shopify/kubernetes-deploy/pull/326))
267
+ - Improve deploy status detection by ensuring we examine the correct generation ([#325](https://github.com/Shopify/kubernetes-deploy/pull/325))
268
+
269
+
270
+ ## 0.20.5
271
+ *Enhancements*
272
+ - Add Job resource class ([#295](https://github.com/Shopify/kubernetes-deploy/pull/296))
273
+ - Add CustomResourceDefinition resource class ([#306](https://github.com/Shopify/kubernetes-deploy/pull/306))
274
+ - Officially support Kubernetes 1.10 ([#308](https://github.com/Shopify/kubernetes-deploy/pull/308))
275
+ - SyncMediator will only batch fetch resources when there is a sufficiently large enough set of resources
276
+ being tracked ([#316](https://github.com/Shopify/kubernetes-deploy/pull/316))
277
+ - Allow CRs to be pruned based on `kubernetes-deploy.shopify.io/prunable` annotation on the custom resource definitions ([312](https://github.com/Shopify/kubernetes-deploy/pull/312))
278
+ - Add HorizontalPodAutoscaler resource class ([#305](https://github.com/Shopify/kubernetes-deploy/pull/305))
279
+
280
+ *Bug Fixes*
281
+ - Prevent crash when STATSD_IMPLEMENTATION isn't set. ([#3242](https://github.com/Shopify/kubernetes-deploy/pull/324))
282
+
283
+ ### 0.20.4
284
+ *Enhancements*
285
+ - Don't consider pod preempting a failure ([#317](https://github.com/shopify/kubernetes-deploy/pull/317))
286
+
287
+ ### 0.20.3
288
+ *Enhancements*
289
+ - Evictions are recoverable so prevent them from triggering fast failure detection ([#293](https://github.com/Shopify/kubernetes-deploy/pull/293)).
290
+ - Use YAML.safe_load over YAML.load_file ([#295](https://github.com/Shopify/kubernetes-deploy/pull/295)).
291
+
292
+ *Bug Fixes*
293
+ - Default rollout strategy is compatible required-rollout annotation ([#289](https://github.com/Shopify/kubernetes-deploy/pull/289)).
294
+
295
+ ### 0.20.2
296
+ *Enhancements*
297
+ - Emit data dog events when deploys succeed, time out or fail ([#292](https://github.com/Shopify/kubernetes-deploy/pull/292)).
298
+ ### 0.20.1
299
+
300
+ *Bug Fixes*
301
+ - Display a nice error instead of crashing when a YAML document is missing 'Kind'
302
+ ([#280](https://github.com/Shopify/kubernetes-deploy/pull/280))
303
+ - Prevent DaemonSet from succeeding before rollout finishes
304
+ ([#288](https://github.com/Shopify/kubernetes-deploy/issues/288))
305
+
306
+ *Enhancements*
307
+ - Merge multiple `--bindings` arguments, to allow a composite bindings map (multiple arguments or files)
308
+
309
+ ### 0.20.0
310
+
311
+ *Features*
312
+ - Automatically add all Kubernetes namespace labels to StatsD tags ([#278](https://github.com/Shopify/kubernetes-deploy/pull/278))
313
+
314
+ *Bug Fixes*
315
+ - Prevent calling sleep with a negative value ([#273](https://github.com/Shopify/kubernetes-deploy/pull/273))
316
+ - Prevent no-op redeploys of bad code from hanging forever ([#262](https://github.com/Shopify/kubernetes-deploy/pull/262))
317
+
318
+ *Enhancements*
319
+ - Improve output for rendering errors ([#253](https://github.com/Shopify/kubernetes-deploy/pull/253))
320
+
321
+ ### 0.19.0
322
+ *Features*
323
+ - Added `--max-watch-seconds=seconds` to kubernetes-restart and kubernetes-deploy. When set
324
+ a timeout error is raised if it takes longer than _seconds_ for any resource to deploy.
325
+ - Adds YAML and JSON file reference support to the kubernetes-deploy `--bindings` argument ([#269](https://github.com/Shopify/kubernetes-deploy/pull/269))
326
+
327
+ *Enhancements*
328
+ - Prune resource quotas ([#264](https://github.com/Shopify/kubernetes-deploy/pull/264/files))
329
+
330
+ *Bug Fixes*
331
+ - Update gemspec to reflect need for ActiveSupport >= 5.0([#270](https://github.com/Shopify/kubernetes-deploy/pull/270))
332
+
333
+ ### 0.18.1
334
+ *Enhancements*
335
+ - Change the way the resource watcher fetches resources to make it more efficient for large deploys. Deploys with hundreds of resources are expected to see a measurable performance improvement from this change. ([#251](https://github.com/Shopify/kubernetes-deploy/pull/251))
336
+
337
+ ### 0.18.0
338
+ *Features*
339
+ - kubernetes-restart and kubernetes-deploy use exit code 70 when a
340
+ deploy fails due to one or more resources failing to deploy in time.
341
+ ([#244](https://github.com/Shopify/kubernetes-deploy/pull/244))
342
+
343
+ *Bug Fixes*
344
+ - Handle deploying thousands of resources at a time, previously kubernetes-deploy would fail with
345
+ `Argument list too long - kubectl (Errno::E2BIG)`. ([#257](https://github.com/Shopify/kubernetes-deploy/pull/257))
346
+
347
+ ### 0.17.0
348
+ *Enhancements*
349
+
350
+ - Add the `--cascade` flag when we force replace a resource. ([#250](https://github.com/Shopify/kubernetes-deploy/pull/250))
351
+
352
+ ### 0.16.0
353
+ **Important:** This release changes the officially supported Kubernetes versions to v1.7 through v1.9. Other versions may continue to work, but we are no longer running our test suite against them.
354
+
355
+ *Features*
356
+ - Support partials to reduce duplication in yaml files ([#207](https://github.com/Shopify/kubernetes-deploy/pull/207))
357
+
358
+ *Bug Fixes*
359
+ - Handle podless deamon sets properly ([#242](https://github.com/Shopify/kubernetes-deploy/pull/242))
360
+
361
+ ### 0.15.2
362
+ *Enhancements*
363
+ - Print warnings if kubernetes server version is not supported ([#237](https://github.com/Shopify/kubernetes-deploy/pull/237)).
364
+ - Possible via env var to disable fetching logs and/or events on deployment failure ([#239](https://github.com/Shopify/kubernetes-deploy/pull/239)).
365
+ - The `kubernetes-deploy.shopify.io/required-rollout` annotation now takes a percent (e.g. 90%) ([#240](https://github.com/Shopify/kubernetes-deploy/pull/240)).
366
+
367
+ ### 0.15.1
368
+ *Enhancements*
369
+ - Fetch debug events and logs for failed resources in parallel ([#238](https://github.com/Shopify/kubernetes-deploy/pull/238))
370
+
371
+ ### 0.15.0
372
+ *Bug Fixes*
373
+ - None
374
+
375
+ *Enhancements*
376
+ - Support for cronjob resource ([#206](https://github.com/Shopify/kubernetes-deploy/pull/206])).
377
+ - Make it possible to override the tool's hard timeout for one specific resource via the `kubernetes-deploy.shopify.io/timeout-override`
378
+ annotation ([#232](https://github.com/Shopify/kubernetes-deploy/pull/232)).
379
+ - Make it possible to modify how many replicas need to be updated and available before a deployment is considered
380
+ successful via the `kubernetes-deploy.shopify.io/required-rollout` annotation ([#208](https://github.com/Shopify/kubernetes-deploy/pull/208)).
381
+
382
+ ### 0.14.1
383
+ *Bug Fixes*
384
+ - Make deployments whose pods crash because of CreateContainerConfigError fail fast in 1.8+ too (they would previously time out).
385
+ - Fix crashes when deploying ExternalName services or services without selectors ([#211](https://github.com/Shopify/kubernetes-deploy/pull/211))
386
+ - Predeploy ServiceAccount resources ([#221](https://github.com/Shopify/kubernetes-deploy/pull/221))
387
+
388
+ *Enhancements*
389
+ - Make it possible to pass bindings (via the --bindings flag) for which the value contains commas or is a JSON encoded hash ([#219](https://github.com/Shopify/kubernetes-deploy/pull/219))
390
+ - Support KUBECONFIG referencing multiple files ([#222](https://github.com/Shopify/kubernetes-deploy/pull/222))
391
+
392
+ ### 0.14.0
393
+ *Bug Fixes*
394
+ - Fix incorrect timeouts occasionally observed on deployments using progressDeadlineSeconds in Kubernetes <1.7.7
395
+
396
+ *Enhancements*
397
+ - Renamed `KubernetesDeploy::Runner` (which powers `exe/kubernetes-deploy`) to `KubernetesDeploy::DeployTask`. This increases consistency between our primary class names and avoids confusion with `KubernetesDeploy::RunnerTask` (which powers `exe/kubernetes-run`).
398
+ - Improved output related to timeouts. For deployments, both failure and timeout output now mentions the referenced replica set.
399
+ - Small improvements to the reliability of the success polling.
400
+ - EjsonSecretProvisioner no longer logs kubectl command output (which may contain secret data) when debug-level logging is enabled.
401
+
402
+ ### 0.13.0
403
+ *Features*
404
+ - Added support for StatefulSets for kubernetes 1.7+ using RollingUpdate
405
+
406
+ *Bug Fixes*
407
+ - Explicitly require the minimum rest-client version required by kubeclient ([#202](https://github.com/Shopify/kubernetes-deploy/pull/202))
408
+
409
+ *Enhancements*
410
+ - Begin official support for Kubernetes v1.8 ([#198](https://github.com/Shopify/kubernetes-deploy/pull/198), [#200](https://github.com/Shopify/kubernetes-deploy/pull/200))
411
+
412
+ ### 0.12.12
413
+ *Bug Fixes*
414
+ - Fix an issue deploying Shopify's internal custom resources.
415
+
416
+ ### 0.12.11
417
+ *Bug Fixes*
418
+ - Stop appending newlines to the base64-encoded values of secrets created from ejson. These extra newlines were preventing the ejson->k8s secret feature from working with v1.8 (https://github.com/Shopify/kubernetes-deploy/pull/196).
419
+
420
+ ### 0.12.10
421
+ *Enhancement*
422
+ - Log reason if deploy times out due to `progressDeadlineSeconds` being exceeded
423
+
424
+ ### 0.12.9
425
+ *Bug Fixes*
426
+ - Retry discovering namespace and kubernetes context
427
+ - Expose real error during namespace discovery
428
+
429
+ ### 0.12.8
430
+ *Bug Fixes*
431
+ - Force deployment to use its own hard timeout instead of relying on the replica set