doc/versioning.md
All gRPC implementations use a three-part version number (vX.Y.Z) and follow semantic versioning, which defines the semantics of major, minor and patch components of the version number. In addition to that, gRPC versions evolve according to these rules:
There are a few situations where we don't adhere to the Semantic Versioning 2.0.0 strictly:
There are also a few extra rules regarding adding new gRPC implementations (e.g. adding support for a new language)
To avoid user confusion and simplify reasoning, the gRPC releases in different languages try to stay synchronized in terms of major and minor version (all languages follow the same release schedule). Nevertheless, because we also strictly follow semantic versioning, there are circumstances in which a gRPC implementation needs to break the version synchronicity and do a major version bump independently of other languages.
change forced by the language ecosystem: when the language itself or its standard libraries that we depend on make a breaking change (something which is out of our control), reacting with updating gRPC APIs may be the only adequate response.
voluntary change: Even in non-forced situations, there might be circumstances in which a breaking API change makes sense and represents a net win, but as a rule of thumb breaking changes are very disruptive for users, cause user fragmentation and incur high maintenance costs. Therefore, breaking API changes should be very rare events that need to be considered with extreme care and the bar for accepting such changes is intentionally set very high. Example scenarios where a breaking API change might be adequate:
All proposals to make a breaking change need to be documented as a gRFC document (in the grpc/proposal repository) that covers at least these areas:
Note that while major version bump allows changing APIs used by the users, it must not impact the interoperability of the implementation with other gRPC implementations and the previous major version released. That means that no backward incompatible protocol changes are allowed: old clients must continue interoperating correctly with new servers and new servers with old clients.