"use strict";(self.webpackChunk=self.webpackChunk||[]).push([[2618],{15680:(e,t,n)=>{n.d(t,{xA:()=>g,yg:()=>m});var r=n(96540);function o(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function a(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter((function(t){return Object.getOwnPropertyDescriptor(e,t).enumerable}))),n.push.apply(n,r)}return n}function i(e){for(var t=1;t<arguments.length;t++){var n=null!=arguments[t]?arguments[t]:{};t%2?a(Object(n),!0).forEach((function(t){o(e,t,n[t])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):a(Object(n)).forEach((function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(n,t))}))}return e}function s(e,t){if(null==e)return{};var n,r,o=function(e,t){if(null==e)return{};var n,r,o={},a=Object.keys(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||(o[n]=e[n]);return o}(e,t);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(e);for(r=0;r<a.length;r++)n=a[r],t.indexOf(n)>=0||Object.prototype.propertyIsEnumerable.call(e,n)&&(o[n]=e[n])}return o}var l=r.createContext({}),c=function(e){var t=r.useContext(l),n=t;return e&&(n="function"==typeof e?e(t):i(i({},t),e)),n},g=function(e){var t=c(e.components);return r.createElement(l.Provider,{value:t},e.children)},u="mdxType",p={inlineCode:"code",wrapper:function(e){var t=e.children;return r.createElement(r.Fragment,{},t)}},d=r.forwardRef((function(e,t){var n=e.components,o=e.mdxType,a=e.originalType,l=e.parentName,g=s(e,["components","mdxType","originalType","parentName"]),u=c(n),d=o,m=u["".concat(l,".").concat(d)]||u[d]||p[d]||a;return n?r.createElement(m,i(i({ref:t},g),{},{components:n})):r.createElement(m,i({ref:t},g))}));function m(e,t){var n=arguments,o=t&&t.mdxType;if("string"==typeof e||o){var a=n.length,i=new Array(a);i[0]=d;var s={};for(var l in t)hasOwnProperty.call(t,l)&&(s[l]=t[l]);s.originalType=e,s[u]="string"==typeof e?e:o,i[1]=s;for(var c=2;c<a;c++)i[c]=n[c];return r.createElement.apply(null,i)}return r.createElement.apply(null,n)}d.displayName="MDXCreateElement"},1186:(e,t,n)=>{n.r(t),n.d(t,{assets:()=>g,contentTitle:()=>l,default:()=>m,frontMatter:()=>s,metadata:()=>c,toc:()=>u});var r=n(58168),o=n(98587),a=(n(96540),n(15680)),i=["components"],s={id:"versioning",title:"Versioning"},l=void 0,c={unversionedId:"development/versioning",id:"development/versioning",title:"Versioning",description:"\x3c!--",source:"@site/docs/29.0.0/development/versioning.md",sourceDirName:"development",slug:"/development/versioning",permalink:"/docs/29.0.0/development/versioning",draft:!1,tags:[],version:"current",frontMatter:{id:"versioning",title:"Versioning"},sidebar:"docs",previous:{title:"Build from source",permalink:"/docs/29.0.0/development/build"},next:{title:"Contribute to Druid docs",permalink:"/docs/29.0.0/development/contribute-to-docs"}},g={},u=[{value:"Versioning Strategy",id:"versioning-strategy",level:2},{value:"Tagging strategy",id:"tagging-strategy",level:2}],p={toc:u},d="wrapper";function m(e){var t=e.components,n=(0,o.A)(e,i);return(0,a.yg)(d,(0,r.A)({},p,n,{components:t,mdxType:"MDXLayout"}),(0,a.yg)("p",null,"This page discusses how we do versioning and provides information on our stable releases."),(0,a.yg)("h2",{id:"versioning-strategy"},"Versioning Strategy"),(0,a.yg)("p",null,"We generally follow ",(0,a.yg)("a",{parentName:"p",href:"http://semver.org/"},"semantic versioning"),". The general idea is"),(0,a.yg)("ul",null,(0,a.yg)("li",{parentName:"ul"},'"Major" version (leftmost): backwards incompatible, no guarantees exist about APIs between the versions'),(0,a.yg)("li",{parentName:"ul"},'"Minor" version (middle number): you can move forward from a smaller number to a larger number, but moving backwards ',(0,a.yg)("em",{parentName:"li"},"might")," be incompatible."),(0,a.yg)("li",{parentName:"ul"},'"bug-fix" version ("patch" or the rightmost): Interchangeable. The higher the number, the more things are fixed (hopefully), but the programming interfaces are completely compatible and you should be able to just drop in a new jar and have it work.')),(0,a.yg)("p",null,"Note that this is defined in terms of programming API, ",(0,a.yg)("strong",{parentName:"p"},"not"),' in terms of functionality. It is possible that a brand new awesome way of doing something is introduced in a "bug-fix" release version if it doesn\u2019t add to the public API or change it.'),(0,a.yg)("p",null,'One exception for right now, while we are still in major version 0, we are considering the APIs to be in beta and are conflating "major" and "minor" so a minor version increase could be backwards incompatible for as long as we are at major version 0. These will be communicated via email on the group.'),(0,a.yg)("p",null,"For external deployments, we recommend running the stable release tag. Releases are considered stable after we have deployed them into our production environment and they have operated bug-free for some time."),(0,a.yg)("h2",{id:"tagging-strategy"},"Tagging strategy"),(0,a.yg)("p",null,"Tags of the codebase are equivalent to release candidates. We tag the code every time we want to take it through our release process, which includes some QA cycles and deployments. So, it is not safe to assume that a tag is a stable release, it is a solidification of the code as it goes through our production QA cycle and deployment. Tags will never change, but we often go through a number of iterations of tags before actually getting a stable release onto production. So, it is recommended that if you are not aware of what is on a tag, to stick to the stable releases listed on the ",(0,a.yg)("a",{parentName:"p",href:"https://github.com/apache/druid/releases"},"Release")," page."))}m.isMDXComponent=!0}}]);