github.com/containerd/Containerd@v1.4.13/RELEASES.md (about) 1 # Versioning and Release 2 3 This document details the versioning and release plan for containerd. Stability 4 is a top goal for this project and we hope that this document and the processes 5 it entails will help to achieve that. It covers the release process, versioning 6 numbering, backporting, API stability and support horizons. 7 8 If you rely on containerd, it would be good to spend time understanding the 9 areas of the API that are and are not supported and how they impact your 10 project in the future. 11 12 This document will be considered a living document. Supported timelines, 13 backport targets and API stability guarantees will be updated here as they 14 change. 15 16 If there is something that you require or this document leaves out, please 17 reach out by [filing an issue](https://github.com/containerd/containerd/issues). 18 19 ## Releases 20 21 Releases of containerd will be versioned using dotted triples, similar to 22 [Semantic Version](http://semver.org/). For the purposes of this document, we 23 will refer to the respective components of this triple as 24 `<major>.<minor>.<patch>`. The version number may have additional information, 25 such as alpha, beta and release candidate qualifications. Such releases will be 26 considered "pre-releases". 27 28 ### Major and Minor Releases 29 30 Major and minor releases of containerd will be made from master. Releases of 31 containerd will be marked with GPG signed tags and announced at 32 https://github.com/containerd/containerd/releases. The tag will be of the 33 format `v<major>.<minor>.<patch>` and should be made with the command `git tag 34 -s v<major>.<minor>.<patch>`. 35 36 After a minor release, a branch will be created, with the format 37 `release/<major>.<minor>` from the minor tag. All further patch releases will 38 be done from that branch. For example, once we release `v1.0.0`, a branch 39 `release/1.0` will be created from that tag. All future patch releases will be 40 done against that branch. 41 42 ### Pre-releases 43 44 Pre-releases, such as alphas, betas and release candidates will be conducted 45 from their source branch. For major and minor releases, these releases will be 46 done from master. For patch releases, these pre-releases should be done within 47 the corresponding release branch. 48 49 While pre-releases are done to assist in the stabilization process, no 50 guarantees are provided. 51 52 ### Upgrade Path 53 54 The upgrade path for containerd is such that the 0.0.x patch releases are 55 always backward compatible with its major and minor version. Minor (0.x.0) 56 version will always be compatible with the previous minor release. i.e. 1.2.0 57 is backwards compatible with 1.1.0 and 1.1.0 is compatible with 1.0.0. There is 58 no compatibility guarantees for upgrades that span multiple, _minor_ releases. 59 For example, 1.0.0 to 1.2.0 is not supported. One should first upgrade to 1.1, 60 then 1.2. 61 62 There are no compatibility guarantees with upgrades to _major_ versions. For 63 example, upgrading from 1.0.0 to 2.0.0 may require resources to migrated or 64 integrations to change. Each major version will be supported for at least 1 65 year with bug fixes and security patches. 66 67 ### Next Release 68 69 The activity for the next release will be tracked in the 70 [milestones](https://github.com/containerd/containerd/milestones). If your 71 issue or PR is not present in a milestone, please reach out to the maintainers 72 to create the milestone or add an issue or PR to an existing milestone. 73 74 ### Support Horizon 75 76 Support horizons will be defined corresponding to a release branch, identified 77 by `<major>.<minor>`. Releases branches will be in one of several states: 78 79 - __*Next*__: The next planned release branch. 80 - __*Active*__: The release branch is currently supported and accepting patches. 81 - __*Extended*__: The release branch is only accepting security patches. 82 - __*End of Life*__: The release branch is no longer supported and no new patches will be accepted. 83 84 Releases will be supported up to one year after a _minor_ release. This means that 85 we will accept bug reports and backports to release branches until the end of 86 life date. If no new _minor_ release has been made, that release will be 87 considered supported until 6 months after the next _minor_ is released or one year, 88 whichever is longer. Additionally, releases may have an extended security support 89 period after the end of the active period to accept security backports. This 90 timeframe will be decided by maintainers before the end of the active status. 91 92 The current state is available in the following table: 93 94 | Release | Status | Start | End of Life | 95 |---------|-------------|------------------|-------------------| 96 | [0.0](https://github.com/containerd/containerd/releases/tag/0.0.5) | End of Life | Dec 4, 2015 | - | 97 | [0.1](https://github.com/containerd/containerd/releases/tag/v0.1.0) | End of Life | Mar 21, 2016 | - | 98 | [0.2](https://github.com/containerd/containerd/tree/v0.2.x) | End of Life | Apr 21, 2016 | December 5, 2017 | 99 | [1.0](https://github.com/containerd/containerd/releases/tag/v1.0.3) | End of Life | December 5, 2017 | December 5, 2018 | 100 | [1.1](https://github.com/containerd/containerd/releases/tag/v1.1.8) | End of Life | April 23, 2018 | October 23, 2019 | 101 | [1.2](https://github.com/containerd/containerd/releases/tag/v1.2.13) | Extended | October 24, 2018 | September 26, 2020 | 102 | [1.3](https://github.com/containerd/containerd/releases/tag/v1.3.7) | Active | September 26, 2019 | February 17, 2021 | 103 | [1.4](https://github.com/containerd/containerd/releases/tag/v1.4.0) | Active | August 17, 2020 | max(August 17, 2021, release of 1.5.0 + 6 months) | 104 | [1.5](https://github.com/containerd/containerd/milestone/30) | Next | TBD | max(TBD+1 year, release of 1.6.0 + 6 months) | 105 106 Note that branches and release from before 1.0 may not follow these rules. 107 108 This table should be updated as part of the release preparation process. 109 110 ### Backporting 111 112 Backports in containerd are community driven. As maintainers, we'll try to 113 ensure that sensible bugfixes make it into _active_ release, but our main focus 114 will be features for the next _minor_ or _major_ release. For the most part, 115 this process is straightforward and we are here to help make it as smooth as 116 possible. 117 118 If there are important fixes that need to be backported, please let use know in 119 one of three ways: 120 121 1. Open an issue. 122 2. Open a PR with cherry-picked change from master. 123 3. Open a PR with a ported fix. 124 125 __If you are reporting a security issue, please reach out discreetly at security@containerd.io__. 126 Remember that backported PRs must follow the versioning guidelines from this document. 127 128 Any release that is "active" can accept backports. Opening a backport PR is 129 fairly straightforward. The steps differ depending on whether you are pulling 130 a fix from master or need to draft a new commit specific to a particular 131 branch. 132 133 To cherry pick a straightforward commit from master, simply use the cherry pick 134 process: 135 136 1. Pick the branch to which you want backported, usually in the format 137 `release/<minor>.<major>`. The following will create a branch you can 138 use to open a PR: 139 140 ```console 141 $ git checkout -b my-backport-branch release/<major>.<minor>. 142 ``` 143 144 2. Find the commit you want backported. 145 3. Apply it to the release branch: 146 147 ```console 148 $ git cherry-pick -xsS <commit> 149 ``` 150 4. Push the branch and open up a PR against the _release branch_: 151 152 ``` 153 $ git push -u stevvooe my-backport-branch 154 ``` 155 156 Make sure to replace `stevvooe` with whatever fork you are using to open 157 the PR. When you open the PR, make sure to switch `master` with whatever 158 release branch you are targeting with the fix. 159 160 If there is no existing fix in master, you should first fix the bug in master, 161 or ask us a maintainer or contributor to do it via an issue. Once that PR is 162 completed, open a PR using the process above. 163 164 Only when the bug is not seen in master and must be made for the specific 165 release branch should you open a PR with new code. 166 167 ## Public API Stability 168 169 The following table provides an overview of the components covered by 170 containerd versions: 171 172 173 | Component | Status | Stabilized Version | Links | 174 |------------------|----------|--------------------|---------------| 175 | GRPC API | Stable | 1.0 | [api/](api) | 176 | Metrics API | Stable | 1.0 | - | 177 | Runtime Shim API | Stable | 1.2 | - | 178 | Daemon Config | Stable | 1.0 | - | 179 | Go client API | Unstable | _future_ | [godoc](https://godoc.org/github.com/containerd/containerd) | 180 | CRI GRPC API | Unstable | v1alpha2 _current_ | [cri-api](https://github.com/kubernetes/cri-api/tree/master/pkg/apis/runtime/v1alpha2) | 181 | `ctr` tool | Unstable | Out of scope | - | 182 183 From the version stated in the above table, that component must adhere to the 184 stability constraints expected in release versions. 185 186 Unless explicitly stated here, components that are called out as unstable or 187 not covered may change in a future minor version. Breaking changes to 188 "unstable" components will be avoided in patch versions. 189 190 ### GRPC API 191 192 The primary product of containerd is the GRPC API. As of the 1.0.0 release, the 193 GRPC API will not have any backwards incompatible changes without a _major_ 194 version jump. 195 196 To ensure compatibility, we have collected the entire GRPC API symbol set into 197 a single file. At each _minor_ release of containerd, we will move the current 198 `next.pb.txt` file to a file named for the minor version, such as `1.0.pb.txt`, 199 enumerating the support services and messages. See [api/](api) for details. 200 201 Note that new services may be added in _minor_ releases. New service methods 202 and new fields on messages may be added if they are optional. 203 204 `*.pb.txt` files are generated at each API release. They prevent unintentional changes 205 to the API by having a diff that the CI can run. These files are not intended to be 206 consumed or used by clients. 207 208 ### Metrics API 209 210 The metrics API that outputs prometheus style metrics will be versioned independently, 211 prefixed with the API version. i.e. `/v1/metrics`, `/v2/metrics`. 212 213 The metrics API version will be incremented when breaking changes are made to the prometheus 214 output. New metrics can be added to the output in a backwards compatible manner without 215 bumping the API version. 216 217 ### Plugins API 218 219 containerd is based on a modular design where plugins are implemented to provide the core functionality. 220 Plugins implemented in tree are supported by the containerd community unless explicitly specified as non-stable. 221 Out of tree plugins are not supported by the containerd maintainers. 222 223 Currently, the Windows runtime and snapshot plugins are not stable and not supported. 224 Please refer to the github milestones for Windows support in a future release. 225 226 #### Error Codes 227 228 Error codes will not change in a patch release, unless a missing error code 229 causes a blocking bug. Error codes of type "unknown" may change to more 230 specific types in the future. Any error code that is not "unknown" that is 231 currently returned by a service will not change without a _major_ release or a 232 new version of the service. 233 234 If you find that an error code that is required by your application is not 235 well-documented in the protobuf service description or tested explicitly, 236 please file and issue and we will clarify. 237 238 #### Opaque Fields 239 240 Unless explicitly stated, the formats of certain fields may not be covered by 241 this guarantee and should be treated opaquely. For example, don't rely on the 242 format details of a URL field unless we explicitly say that the field will 243 follow that format. 244 245 ### Go client API 246 247 The Go client API, documented in 248 [godoc](https://godoc.org/github.com/containerd/containerd), is currently 249 considered unstable. It is recommended to vendor the necessary components to 250 stabilize your project build. Note that because the Go API interfaces with the 251 GRPC API, clients written against a 1.0 Go API should remain compatible with 252 future 1.x series releases. 253 254 We intend to stabilize the API in a future release when more integrations have 255 been carried out. 256 257 Any changes to the API should be detectable at compile time, so upgrading will 258 be a matter of fixing compilation errors and moving from there. 259 260 ### CRI GRPC API 261 262 The CRI (Container Runtime Interface) GRPC API is used by a Kubernetes kubelet 263 to communicate with a container runtime. This interface is used to manage 264 container lifecycles and container images. Currently this API is under 265 development and unstable across Kubernetes releases. Each Kubernetes release 266 only supports a single version of CRI and the CRI plugin only implements a 267 single version of CRI. 268 269 Each _minor_ release will support one version of CRI and at least one version 270 of Kubernetes. Once this API is stable, a _minor_ will be compatible with any 271 version of Kubernetes which supports that version of CRI. 272 273 ### `ctr` tool 274 275 The `ctr` tool provides the ability to introspect and understand the containerd 276 API. It is not considered a primary offering of the project and is unsupported in 277 that sense. While we understand it's value as a debug tool, it may be completely 278 refactored or have breaking changes in _minor_ releases. 279 280 Targeting `ctr` for feature additions reflects a misunderstanding of the containerd 281 architecture. Feature addition should focus on the client Go API and additions to 282 `ctr` may or may not be accepted at the discretion of the maintainers. 283 284 We will do our best to not break compatibility in the tool in _patch_ releases. 285 286 ### Daemon Configuration 287 288 The daemon's configuration file, commonly located in `/etc/containerd/config.toml` 289 is versioned and backwards compatible. The `version` field in the config 290 file specifies the config's version. If no version number is specified inside 291 the config file then it is assumed to be a version 1 config and parsed as such. 292 Use `version = 2` to enable version 2 config. 293 294 ### Not Covered 295 296 As a general rule, anything not mentioned in this document is not covered by 297 the stability guidelines and may change in any release. Explicitly, this 298 pertains to this non-exhaustive list of components: 299 300 - File System layout 301 - Storage formats 302 - Snapshot formats 303 304 Between upgrades of subsequent, _minor_ versions, we may migrate these formats. 305 Any outside processes relying on details of these file system layouts may break 306 in that process. Container root file systems will be maintained on upgrade. 307 308 ### Exceptions 309 310 We may make exceptions in the interest of __security patches__. If a break is 311 required, it will be communicated clearly and the solution will be considered 312 against total impact. 313 314 ## Deprecated features 315 316 The deprecated features are shown in the following table: 317 318 | Component | Deprecation release | Target release for removal | 319 |----------------------------------------------------------------------|---------------------|----------------------------| 320 | Runtime V1 API and implementation (`io.containerd.runtime.v1.linux`) | containerd v1.4 | containerd v2.0 | 321 | Runc V1 implementation of Runtime V2 (`io.containerd.runc.v1`) | containerd v1.4 | containerd v2.0 |