(window.webpackJsonp=window.webpackJsonp||[]).push([[35],{102:function(e,r,t){"use strict";t.r(r),t.d(r,"frontMatter",(function(){return i})),t.d(r,"metadata",(function(){return s})),t.d(r,"toc",(function(){return c})),t.d(r,"default",(function(){return u}));var n=t(3),a=t(7),o=(t(0),t(136)),i={title:"Apache Submarine Release 0.4.0"},s={unversionedId:"releases/submarine-release-0.4.0",id:"releases/submarine-release-0.4.0",isDocsHomePage:!1,title:"Apache Submarine Release 0.4.0",description:"\x3c!--",source:"@site/docs/releases/submarine-release-0.4.0.md",slug:"/releases/submarine-release-0.4.0",permalink:"/docs/releases/submarine-release-0.4.0",editUrl:"https://github.com/apache/submarine/edit/master/website/docs/releases/submarine-release-0.4.0.md",version:"current",sidebar:"docs",previous:{title:"Apache Submarine Release 0.3.0",permalink:"/docs/releases/submarine-release-0.3.0"},next:{title:"Apache Submarine Release 0.5.0",permalink:"/docs/releases/submarine-release-0.5.0"}},c=[],l={toc:c};function u(e){var r=e.components,t=Object(a.a)(e,["components"]);return Object(o.b)("wrapper",Object(n.a)({},l,t,{components:r,mdxType:"MDXLayout"}),Object(o.b)("p",null,"The Apache Submarine Community is pleased to announce the availability of the ",Object(o.b)("inlineCode",{parentName:"p"},"0.4.0")," release."),Object(o.b)("p",null,"The community put significant effort into improving Apache Submarine since the last release.\n175 patches for improvements and bug fixes. The highlighted features are as follows:"),Object(o.b)("ul",null,Object(o.b)("li",{parentName:"ul"},"Submarine Experiments: Refactor the Job to experiment and redefined the experiment spec"),Object(o.b)("li",{parentName:"ul"},"Submarine Helm Charts: Provides one command to install the submarine into the Kubernetes cluster"),Object(o.b)("li",{parentName:"ul"},"PySubmarine: Submarine Python SDK")),Object(o.b)("p",null,"We encourage to ",Object(o.b)("a",{parentName:"p",href:"../download"},"download")," the latest release. Feedback through the ",Object(o.b)("a",{parentName:"p",href:"../community/README"},"mailing lists")," is very welcome."),Object(o.b)("p",null,"You can visit ",Object(o.b)("a",{parentName:"p",href:"https://issues.apache.org/jira/secure/ReleaseNote.jspa?projectId=12322824&version=12346621"},"issue tracker")," for full list of issues that are resolved."))}u.isMDXComponent=!0},136:function(e,r,t){"use strict";t.d(r,"a",(function(){return p})),t.d(r,"b",(function(){return f}));var n=t(0),a=t.n(n);function o(e,r,t){return r in e?Object.defineProperty(e,r,{value:t,enumerable:!0,configurable:!0,writable:!0}):e[r]=t,e}function i(e,r){var t=Object.keys(e);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(e);r&&(n=n.filter((function(r){return Object.getOwnPropertyDescriptor(e,r).enumerable}))),t.push.apply(t,n)}return t}function s(e){for(var r=1;r<arguments.length;r++){var t=null!=arguments[r]?arguments[r]:{};r%2?i(Object(t),!0).forEach((function(r){o(e,r,t[r])})):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(t)):i(Object(t)).forEach((function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(t,r))}))}return e}function c(e,r){if(null==e)return{};var t,n,a=function(e,r){if(null==e)return{};var t,n,a={},o=Object.keys(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||(a[t]=e[t]);return a}(e,r);if(Object.getOwnPropertySymbols){var o=Object.getOwnPropertySymbols(e);for(n=0;n<o.length;n++)t=o[n],r.indexOf(t)>=0||Object.prototype.propertyIsEnumerable.call(e,t)&&(a[t]=e[t])}return a}var l=a.a.createContext({}),u=function(e){var r=a.a.useContext(l),t=r;return e&&(t="function"==typeof e?e(r):s(s({},r),e)),t},p=function(e){var r=u(e.components);return a.a.createElement(l.Provider,{value:r},e.children)},b={inlineCode:"code",wrapper:function(e){var r=e.children;return a.a.createElement(a.a.Fragment,{},r)}},m=a.a.forwardRef((function(e,r){var t=e.components,n=e.mdxType,o=e.originalType,i=e.parentName,l=c(e,["components","mdxType","originalType","parentName"]),p=u(t),m=n,f=p["".concat(i,".").concat(m)]||p[m]||b[m]||o;return t?a.a.createElement(f,s(s({ref:r},l),{},{components:t})):a.a.createElement(f,s({ref:r},l))}));function f(e,r){var t=arguments,n=r&&r.mdxType;if("string"==typeof e||n){var o=t.length,i=new Array(o);i[0]=m;var s={};for(var c in r)hasOwnProperty.call(r,c)&&(s[c]=r[c]);s.originalType=e,s.mdxType="string"==typeof e?e:n,i[1]=s;for(var l=2;l<o;l++)i[l]=t[l];return a.a.createElement.apply(null,i)}return a.a.createElement.apply(null,t)}m.displayName="MDXCreateElement"}}]);