blob: 0b1902188dd286608d7aebe574b8fe7e8d2b704a [file] [log] [blame]
<!doctype html>
<html lang="en" dir="ltr" class="mdx-wrapper mdx-page plugin-pages plugin-id-default">
<head>
<meta charset="UTF-8">
<meta name="generator" content="Docusaurus v2.4.0">
<title data-rh="true">Apache BookKeeper Release Guide | Apache BookKeeper</title><meta data-rh="true" name="viewport" content="width=device-width,initial-scale=1"><meta data-rh="true" name="twitter:card" content="summary_large_image"><meta data-rh="true" property="og:url" content="https://bookkeeper.apache.org/community/release-guide"><meta data-rh="true" name="docusaurus_locale" content="en"><meta data-rh="true" name="docusaurus_tag" content="default"><meta data-rh="true" name="docsearch:language" content="en"><meta data-rh="true" name="docsearch:docusaurus_tag" content="default"><meta data-rh="true" property="og:title" content="Apache BookKeeper Release Guide | Apache BookKeeper"><meta data-rh="true" name="description" content="This page documents the procedure to make an Apache BookKeeper release."><meta data-rh="true" property="og:description" content="This page documents the procedure to make an Apache BookKeeper release."><link data-rh="true" rel="icon" href="/img/favicon.ico"><link data-rh="true" rel="canonical" href="https://bookkeeper.apache.org/community/release-guide"><link data-rh="true" rel="alternate" href="https://bookkeeper.apache.org/community/release-guide" hreflang="en"><link data-rh="true" rel="alternate" href="https://bookkeeper.apache.org/community/release-guide" hreflang="x-default"><link rel="stylesheet" href="/assets/css/styles.49914aab.css">
<link rel="preload" href="/assets/js/runtime~main.793d926f.js" as="script">
<link rel="preload" href="/assets/js/main.c5d52852.js" as="script">
</head>
<body class="navigation-with-keyboard">
<script>!function(){function t(t){document.documentElement.setAttribute("data-theme",t)}var e=function(){var t=null;try{t=new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}return t}()||function(){var t=null;try{t=localStorage.getItem("theme")}catch(t){}return t}();t(null!==e?e:"light")}()</script><div id="__docusaurus">
<div role="region" aria-label="Skip to main content"><a class="skipToContent_fXgn" href="#docusaurus_skipToContent_fallback">Skip to main content</a></div><nav aria-label="Main" class="navbar navbar--fixed-top"><div class="navbar__inner"><div class="navbar__items"><button aria-label="Toggle navigation bar" aria-expanded="false" class="navbar__toggle clean-btn" type="button"><svg width="30" height="30" viewBox="0 0 30 30" aria-hidden="true"><path stroke="currentColor" stroke-linecap="round" stroke-miterlimit="10" stroke-width="2" d="M4 7h22M4 15h22M4 23h22"></path></svg></button><a class="navbar__brand" href="/"><div class="navbar__logo"><img src="/img/bk-logo.svg" alt="Apache Bookkeeper" class="themedImage_ToTc themedImage--light_HNdA"><img src="/img/bk-logo.svg" alt="Apache Bookkeeper" class="themedImage_ToTc themedImage--dark_i4oU"></div><b class="navbar__title text--truncate">Apache BookKeeper</b></a><a class="navbar__item navbar__link" href="/docs/overview/">Documentation</a><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Community</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/community/mailing-lists">Mailing lists</a></li><li><a class="dropdown__link" href="/community/slack">Slack</a></li><li><a href="https://github.com/apache/bookkeeper/issues" target="_blank" rel="noopener noreferrer" class="dropdown__link">Github issues<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a class="dropdown__link" href="/community/releases">Release management</a></li><li><a class="dropdown__link" href="/community/meeting">Community meetings</a></li><li><a class="dropdown__link" href="/community/contributing">Contribution guide</a></li><li><a class="dropdown__link" href="/community/coding-guide">Coding guide</a></li><li><a class="dropdown__link" href="/community/testing">Testing guide</a></li><li><a class="dropdown__link" href="/community/issue-report">Issue report guide</a></li><li><a aria-current="page" class="dropdown__link dropdown__link--active" href="/community/release-guide">Release guide</a></li><li><a class="dropdown__link" href="/community/presentations">Presentations</a></li><li><a class="dropdown__link" href="/community/bookkeeper-proposals">BookKeeper proposals (BP)</a></li></ul></div><div class="navbar__item dropdown dropdown--hoverable"><a href="#" aria-haspopup="true" aria-expanded="false" role="button" class="navbar__link">Project</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/project/who">Who are we?</a></li><li><a class="dropdown__link" href="/project/bylaws">Bylaws</a></li><li><a href="https://apache.org/licenses" target="_blank" rel="noopener noreferrer" class="dropdown__link">License<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a class="dropdown__link" href="/project/privacy">Privacy policy</a></li><li><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Sponsorship<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="dropdown__link">Thanks<svg width="12" height="12" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a class="navbar__link" aria-haspopup="true" aria-expanded="false" role="button" href="/docs/overview/">4.16.5</a><ul class="dropdown__menu"><li><a class="dropdown__link" href="/docs/next/overview/">Next</a></li><li><a class="dropdown__link" href="/docs/overview/">4.16.5</a></li><li><a class="dropdown__link" href="/docs/4.15.5/overview/">4.15.5</a></li><li><a class="dropdown__link" href="/docs/4.14.8/overview/">4.14.8</a></li><li><a class="dropdown__link" href="/docs/4.13.0/overview/">4.13.0</a></li><li><a class="dropdown__link" href="/docs/4.12.1/overview/">4.12.1</a></li><li><a class="dropdown__link" href="/docs/4.11.1/overview/">4.11.1</a></li><li><a class="dropdown__link" href="/docs/4.10.0/overview/">4.10.0</a></li><li><a class="dropdown__link" href="/docs/4.9.2/overview/">4.9.2</a></li><li><a class="dropdown__link" href="/docs/4.8.2/overview/">4.8.2</a></li><li><a class="dropdown__link" href="/docs/4.7.3/overview/">4.7.3</a></li><li><a class="dropdown__link" href="/docs/4.6.2/overview/">4.6.2</a></li><li><a class="dropdown__link" href="/docs/4.5.1/overview/">4.5.1</a></li></ul></div><a class="navbar__item navbar__link" href="/releases">Download</a><div class="toggle_vylO colorModeToggle_DEke"><button class="clean-btn toggleButton_gllP toggleButtonDisabled_aARS" type="button" disabled="" title="Switch between dark and light mode (currently light mode)" aria-label="Switch between dark and light mode (currently light mode)" aria-live="polite"><svg viewBox="0 0 24 24" width="24" height="24" class="lightToggleIcon_pyhR"><path fill="currentColor" d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"></path></svg><svg viewBox="0 0 24 24" width="24" height="24" class="darkToggleIcon_wfgR"><path fill="currentColor" d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"></path></svg></button></div><div class="searchBox_ZlJk"></div></div></div><div role="presentation" class="navbar-sidebar__backdrop"></div></nav><div id="docusaurus_skipToContent_fallback" class="main-wrapper mainWrapper_z2l0"><main class="container container--fluid margin-vert--lg"><div class="row mdxPageWrapper_j9I6"><div class="col col--8"><article><h1>Apache BookKeeper Release Guide</h1><p>This page documents the procedure to make an Apache BookKeeper release.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="introduction">Introduction<a href="#introduction" class="hash-link" aria-label="Direct link to Introduction" title="Direct link to Introduction"></a></h2><p>The Apache BookKeeper project periodically declares and publishes releases. A release is one or more packages of the project artifact(s) that are approved for general public distribution and use. They may come with various degrees of caveat regarding their perceived quality and potential for change, such as “alpha”, “beta”, “incubating”, “stable”, etc.</p><p>The BookKeeper community treats releases with great importance. They are a public face of the project and most users interact with the project only through the releases. Releases are signed off by the entire BookKeeper community in a public vote.</p><p>Each release is executed by a <em>Release Manager</em>, who is selected among the <a href="https://bookkeeper.apache.org/project/who" target="_blank" rel="noopener noreferrer">BookKeeper committers</a>. This document describes the process that the Release Manager follows to perform a release. Any changes to this process should be discussed and adopted on the <a href="https://lists.apache.org/list.html?dev@bookkeeper.apache.org" target="_blank" rel="noopener noreferrer">dev@ mailing list</a>.</p><p>Please remember that publishing software has legal consequences. This guide complements the foundation-wide <a href="http://www.apache.org/dev/release.html" target="_blank" rel="noopener noreferrer">Product Release Policy</a> and <a href="http://www.apache.org/dev/release-distribution" target="_blank" rel="noopener noreferrer">Release Distribution Policy</a>.</p><h2 class="anchor anchorWithStickyNavbar_LWe7" id="overview">Overview<a href="#overview" class="hash-link" aria-label="Direct link to Overview" title="Direct link to Overview"></a></h2><p>The release process consists of several steps:</p><ol><li>Decide to release</li><li>Prepare for the release</li><li>Build a release candidate</li><li>Vote on the release candidate</li><li>If necessary, fix any issues and go back to step 3.</li><li>Finalize the release</li><li>Promote the release</li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="decide-to-release">Decide to release<a href="#decide-to-release" class="hash-link" aria-label="Direct link to Decide to release" title="Direct link to Decide to release"></a></h2><p>Deciding to release and selecting a Release Manager is the first step of the release process. This is a consensus-based decision of the entire community.</p><p>Anybody can propose a release on the dev@ mailing list, giving a solid argument and nominating a committer as the Release Manager (including themselves). There’s no formal process, no vote requirements, and no timing requirements. Any objections should be resolved by consensus before starting the release.</p><p>In general, the community prefers to have a rotating set of 3-5 Release Managers. Keeping a small core set of managers allows enough people to build expertise in this area and improve processes over time, without Release Managers needing to re-learn the processes for each release. That said, if you are a committer interested in serving the community in this way, please reach out to the community on the dev@ mailing list.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-proceed-to-the-next-step">Checklist to proceed to the next step<a href="#checklist-to-proceed-to-the-next-step" class="hash-link" aria-label="Direct link to Checklist to proceed to the next step" title="Direct link to Checklist to proceed to the next step"></a></h3><ol><li>Community agrees to release</li><li>Community selects a Release Manager</li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="prepare-for-the-release">Prepare for the release<a href="#prepare-for-the-release" class="hash-link" aria-label="Direct link to Prepare for the release" title="Direct link to Prepare for the release"></a></h2><p>Before your first release, you should perform one-time configuration steps. This will set up your security keys for signing the release and access to various release repositories.</p><p>To prepare for each release, you should audit the project status in Github issue tracker, and do necessary bookkeeping. Finally, you should create a release branch from which individual release candidates will be built.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="one-time-setup-instructions">One-time setup instructions<a href="#one-time-setup-instructions" class="hash-link" aria-label="Direct link to One-time setup instructions" title="Direct link to One-time setup instructions"></a></h3><h4 class="anchor anchorWithStickyNavbar_LWe7" id="gpg-key">GPG Key<a href="#gpg-key" class="hash-link" aria-label="Direct link to GPG Key" title="Direct link to GPG Key"></a></h4><p>You need to have a GPG key to sign the release artifacts. Please be aware of the ASF-wide <a href="https://www.apache.org/dev/release-signing.html" target="_blank" rel="noopener noreferrer">release signing guidelines</a>.
If you don’t have a GPG key associated with your Apache account, please create one according to the <a href="http://apache.org/dev/openpgp.html#generate-key" target="_blank" rel="noopener noreferrer">guidelines</a> and <a href="https://www.apache.org/dev/release-signing.html#keyserver-upload" target="_blank" rel="noopener noreferrer">upload</a> your key to a public key server.</p><blockquote><p>It is important to <a href="https://www.apache.org/dev/release-signing.html#apache-wot" target="_blank" rel="noopener noreferrer">link</a> your GPG key into the Apache web of trust.
You can reach out other committers in Apache BookKeeper community for signing your key.</p></blockquote><p>Once you have a GPG key associated with your Apache count, then:</p><p><strong>First</strong>, Determine your Apache GPG Key and Key ID, as follows:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">gpg --list-keys</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>This will list your GPG keys. One of these should reflect your Apache account, for example:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">--------------------------------------------------</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">pub 2048R/845E6689 2016-02-23</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">uid Nomen Nescio &lt;anonymous@apache.org&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">sub 2048R/BA4D50BE 2016-02-23</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Here, the key ID is the 8-digit hex string in the <code>pub</code> line: <code>845E6689</code>.</p><p><strong>Second</strong>, add your Apache GPG key to the BookKeeper’s <code>KEYS</code> file in <a href="https://dist.apache.org/repos/dist/release/bookkeeper/KEYS" target="_blank" rel="noopener noreferrer"><code>dist</code></a>.</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># checkout the svn folder that contains the KEYS file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">svn co https://dist.apache.org/repos/dist/release/bookkeeper bookkeeper_dist</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token builtin class-name">cd</span><span class="token plain"> bookkeeper_dist</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Export the key in ascii format and append it to the file</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token punctuation" style="color:#393A34">(</span><span class="token plain"> gpg --list-sigs </span><span class="token environment constant" style="color:#36acaa">$USER</span><span class="token plain">@apache.org</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> gpg --export --armor </span><span class="token environment constant" style="color:#36acaa">$USER</span><span class="token plain">@apache.org </span><span class="token punctuation" style="color:#393A34">)</span><span class="token plain"> </span><span class="token operator" style="color:#393A34">&gt;&gt;</span><span class="token plain"> KEYS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Commit to svn</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">svn ci -m </span><span class="token string" style="color:#e3116c">&quot;Added gpg key for </span><span class="token string environment constant" style="color:#36acaa">$USER</span><span class="token string" style="color:#e3116c">&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Once you committed, please verify if your GPG key shows up in the BookkKeeper&#x27;s <code>KEYS</code> file in <a href="https://dist.apache.org/repos/dist/release/bookkeeper/KEYS" target="_blank" rel="noopener noreferrer"><code>dist</code></a>.</p><p><strong>Third</strong>, configure <code>git</code> to use this key when signing code by giving it your key ID, as follows:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git config --global user.signingkey 845E6689</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>You may drop the <code>--global</code> option if you’d prefer to use this key for the current repository only.</p><p>You may wish to start <code>gpg-agent</code> to unlock your GPG key only once using your passphrase. Otherwise, you may need to enter this passphrase hundreds of times. The setup for <code>gpg-agent</code> varies based on operating system, but may be something like this:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export GPG_TTY=$(tty)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export GPG_AGENT_INFO</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="access-to-apache-nexus-repository">Access to Apache Nexus repository<a href="#access-to-apache-nexus-repository" class="hash-link" aria-label="Direct link to Access to Apache Nexus repository" title="Direct link to Access to Apache Nexus repository"></a></h4><p>Configure access to the <a href="http://repository.apache.org/" target="_blank" rel="noopener noreferrer">Apache Nexus repository</a>, which enables final deployment of releases to the Maven Central Repository.</p><ol><li><p>You log in with your Apache account.</p></li><li><p>Confirm you have appropriate access by finding <code>org.apache.bookkeeper</code> under <code>Staging Profiles</code>.</p></li><li><p>Navigate to your <code>Profile</code> (top right dropdown menu of the page).</p></li><li><p>Choose <code>User Token</code> from the dropdown, then click <code>Access User Token</code>. Copy a snippet of the Maven XML configuration block.</p></li><li><p>Insert this snippet twice into your global Maven <code>settings.xml</code> file (use command <code>mvn -X | grep settings</code>, and read out the global Maven setting file), typically <code>${HOME}/.m2/settings.xml</code>. The end result should look like this, where <code>TOKEN_NAME</code> and <code>TOKEN_PASSWORD</code> are your secret tokens:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">&lt;settings&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;servers&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;server&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;id&gt;apache.releases.https&lt;/id&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;username&gt;TOKEN_NAME&lt;/username&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;password&gt;TOKEN_PASSWORD&lt;/password&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;/server&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;server&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;id&gt;apache.snapshots.https&lt;/id&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;username&gt;TOKEN_NAME&lt;/username&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;password&gt;TOKEN_PASSWORD&lt;/password&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;/server&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> &lt;/servers&gt;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">&lt;/settings&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li></ol><h4 class="anchor anchorWithStickyNavbar_LWe7" id="create-an-account-on-pypi">Create an account on PyPi<a href="#create-an-account-on-pypi" class="hash-link" aria-label="Direct link to Create an account on PyPi" title="Direct link to Create an account on PyPi"></a></h4><p>Since 4.9.0 we are releasing a python client for table service during release process. In order to publishing
a python package to PyPi, you need to <a href="https://pypi.org/account/register/" target="_blank" rel="noopener noreferrer">create an account</a> there. After
you create the account successfully, you also need to add the account as a maintainer
for <a href="https://pypi.org/project/apache-bookkeeper-client/" target="_blank" rel="noopener noreferrer">bookkeeper-client</a> project. You can checkout who
are the maintainers at the project page and ask them for adding your account as the maintainer.</p><p>You can also read the instructions on <a href="https://twine.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer">how to upload packages to PyPi</a>
if you are interested in learning more details.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-a-new-version-in-github">Create a new version in Github<a href="#create-a-new-version-in-github" class="hash-link" aria-label="Direct link to Create a new version in Github" title="Direct link to Create a new version in Github"></a></h3><p>When contributors resolve an issue in GitHub, they are tagging it with a release that will contain their changes. With the release currently underway, new issues should be resolved against a subsequent future release. Therefore, you should create a release item for this subsequent release, as follows:</p><ol><li>In Github, navigate to the <a href="https://github.com/apache/bookkeeper/milestones" target="_blank" rel="noopener noreferrer"><code>Issues &gt; Milestones</code></a>.</li><li>Add a new milestone: choose the next minor version number compared to the one currently underway, select a day that is 3-months from now as the <code>Due Date</code>, write a description <code>Release x.y.z</code> and choose <code>Create milestone</code>.</li></ol><p>Skip this step in case of a minor release, as milestones are only for major releases.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="triage-release-blocking-issues-in-github">Triage release-blocking issues in Github<a href="#triage-release-blocking-issues-in-github" class="hash-link" aria-label="Direct link to Triage release-blocking issues in Github" title="Direct link to Triage release-blocking issues in Github"></a></h3><p>There could be outstanding release-blocking issues, which should be triaged before proceeding to build a release candidate. We track them by assigning a specific <code>Milestone</code> field even before the issue resolved.</p><p>The list of release-blocking issues is available at the <a href="https://github.com/apache/bookkeeper/milestones" target="_blank" rel="noopener noreferrer">milestones page</a>. Triage each unresolved issue with one of the following resolutions:</p><ul><li>If the issue has been resolved and was not updated, close it accordingly.</li><li>If the issue has not been resolved and it is acceptable to defer this until the next release, update the <code>Milestone</code> field to the new milestone you just created. Please consider discussing this with stakeholders and the dev@ mailing list, as appropriate.</li><li>If the issue has not been resolved and it is not acceptable to release until it is fixed, the release cannot proceed. Instead, work with the BookKeeper community to resolve the issue.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="change-python-client-version">Change Python Client Version<a href="#change-python-client-version" class="hash-link" aria-label="Direct link to Change Python Client Version" title="Direct link to Change Python Client Version"></a></h3><p>Before cutting a release, you need to update the python client version in
<a href="https://github.com/apache/bookkeeper/blob/master/stream/clients/python/setup.py#L22" target="_blank" rel="noopener noreferrer">setup.py</a>
from <code>SNAPSHOT</code> version to a release version and get the change merge to master. For example,
in release 4.10.0, you need to change the version from <code>4.10.0-alpha-0</code> to <code>4.10.0</code>.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="review-release-notes-in-github">Review Release Notes in Github<a href="#review-release-notes-in-github" class="hash-link" aria-label="Direct link to Review Release Notes in Github" title="Direct link to Review Release Notes in Github"></a></h3><p>From GitHub, verify the milestone link in the Release Notes. E.g. <a href="https://github.com/apache/bookkeeper/milestone/1?closed=1" target="_blank" rel="noopener noreferrer">Release 4.5.0 milestone</a>.</p><p>For each release, you should verify that all the PRs have the correct label assigned (release:x.y.z), otherwise they won&#x27;t appear in the release notes.
To compare, you can use the following link from GitHub:</p><ul><li>PR filter: <a href="https://github.com/apache/bookkeeper/pulls?q=is%3Apr+is%3Amerged+label%3Arelease%2F4.16.5" target="_blank" rel="noopener noreferrer">https://github.com/apache/bookkeeper/pulls?q=is%3Apr+is%3Amerged+label%3Arelease%2F4.16.5</a></li><li>Commits: <a href="https://github.com/apache/bookkeeper/compare/release-4.16.4...branch-4.16" target="_blank" rel="noopener noreferrer">https://github.com/apache/bookkeeper/compare/release-4.16.4...branch-4.16</a></li></ul><h4 class="anchor anchorWithStickyNavbar_LWe7" id="prepare-release-notes">Prepare Release Notes<a href="#prepare-release-notes" class="hash-link" aria-label="Direct link to Prepare Release Notes" title="Direct link to Prepare Release Notes"></a></h4><p>After reviewing the release notes on both GitHub, you should write the release notes under <code>site3/website/src/release-notes.md</code> and then send out a pull request for review.</p><p>To export the PR descriptions, you can use the <a href="https://cli.github.com/" target="_blank" rel="noopener noreferrer">GitHub CLI</a>.
After the setup, you can run this command to get the list of changes. Then they can be copied in the release notes file:</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># for a milestone release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gh pr list -R apache/bookkeeper -S &quot;milestone:4.17.0 is:closed &quot; --json title,url,number -t &#x27;{{range .}}* {{.title}} [PR #{{.number}}]({{.url}}) {{&quot;\n&quot;}}{{end}}&#x27; -L 500</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"># for a path release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">gh pr list -R apache/bookkeeper -l release/4.16.5 -s merged --json title,url,number -t &#x27;{{range .}}* {{.title}} [PR #{{.number}}]({{.url}}) {{&quot;\n&quot;}}{{end}}&#x27; -L 1000</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>After copying the list, you will have to manually split them into bugs, features and dependency upgrades.
Internal changes (CI, tests) that don&#x27;t modify the production code can be omitted (if not relevant for users).</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="prepare-release-branch">Prepare release branch<a href="#prepare-release-branch" class="hash-link" aria-label="Direct link to Prepare release branch" title="Direct link to Prepare release branch"></a></h3><p>Release candidates are built from a release branch. As a final step in preparation for the release, you should create the release branch, push it to the code repository, and update version information on the original branch.</p><p>Check out the version of the codebase from which you start the release. For a new minor or major release, this may be <code>HEAD</code> of the <code>master</code> branch. To build a hotfix/incremental release, instead of the <code>master</code> branch, use the release tag of the release being patched. (Please make sure your cloned repository is up-to-date before starting.)</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git checkout &lt;master branch OR release tag&gt;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Set up a few environment variables to simplify Maven commands that follow. (We use <code>bash</code> Unix syntax in this guide.)</p><p>For a major release (for instance 4.5.0):</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">MAJOR_VERSION=&quot;4.5&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">VERSION=&quot;4.5.0&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NEXT_VERSION=&quot;4.6.0&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BRANCH_NAME=&quot;branch-${MAJOR_VERSION}&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DEVELOPMENT_VERSION=&quot;${NEXT_VERSION}-SNAPSHOT&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>For a minor release (for instance 4.5.1):</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">MAJOR_VERSION=&quot;4.5&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">VERSION=&quot;4.5.1&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">NEXT_VERSION=&quot;4.5.2&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BRANCH_NAME=&quot;branch-${MAJOR_VERSION}&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">DEVELOPMENT_VERSION=&quot;${NEXT_VERSION}-SNAPSHOT&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Version represents the release currently underway, while next version specifies the anticipated next version to be released from that branch. Normally, 4.5.0 is followed by 4.6.0, while 4.5.0 is followed by 4.5.1.</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="create-branch-for-major-release">Create branch for major release<a href="#create-branch-for-major-release" class="hash-link" aria-label="Direct link to Create branch for major release" title="Direct link to Create branch for major release"></a></h4><p>If you are cutting a minor release, you can skip this step and go to section <a href="#checkout-release-branch">Checkout release branch</a>.</p><p>If you are cutting a major release use Maven release plugin to create the release branch and update the current branch to use the new development version. This command applies for the new major or minor version.</p><blockquote><p>This command automatically check in and tag your code in the code repository configured in the SCM.
It is recommended to do a &quot;dry run&quot; before executing the command. To &quot;dry run&quot;, you can provide &quot;-DdryRun&quot;
at the end of this command. &quot;dry run&quot; will generate some temporary files in the project folder, you can remove
them by running &quot;mvn release:clean&quot;.</p></blockquote><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mvn release:branch \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> -DbranchName=${BRANCH_NAME} \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> -DdevelopmentVersion=${DEVELOPMENT_VERSION} \</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> [-DdryRun]</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>If you failed at the middle of running this command, please check if you have <code>push</code> permissions on <code>github.com</code>.
You need use <a href="https://help.github.com/articles/creating-a-personal-access-token-for-the-command-line/" target="_blank" rel="noopener noreferrer">personal access token</a> rather than your own password, if you enabled <code>2 factor authentication</code>.</p><p>On failures, you need to reset on failures:</p><p>$ git reset --hard apache/<!-- -->&lt;<!-- -->master branch OR release tag<!-- -->&gt;<!-- -->
$ git branch -D $BRANCH_NAME</p></blockquote><h5 class="anchor anchorWithStickyNavbar_LWe7" id="create-ci-jobs-for-release-branch">Create CI jobs for release branch<a href="#create-ci-jobs-for-release-branch" class="hash-link" aria-label="Direct link to Create CI jobs for release branch" title="Direct link to Create CI jobs for release branch"></a></h5><p>Once the release branch is created, please create corresponding CI jobs for the release branch. These CI jobs includes postcommit jobs for different java versions and
integration tests.</p><p>Example PR: <a href="https://github.com/apache/bookkeeper/pull/1328" target="_blank" rel="noopener noreferrer">release-4.7.0</a> <a href="https://github.com/apache/bookkeeper/pull/1353" target="_blank" rel="noopener noreferrer">integration tests for release-4.7.0</a></p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="checkout-release-branch">Checkout release branch<a href="#checkout-release-branch" class="hash-link" aria-label="Direct link to Checkout release branch" title="Direct link to Checkout release branch"></a></h4><a name="checkout-release-branch"></a><p>Check out the release branch.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">git checkout ${BRANCH_NAME}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>The rest of this guide assumes that commands are run in the root of a repository on <code>${BRANCH_NAME}</code> with the above environment variables set.</p><p>Verify that pom.xml contains the correct VERSION, it should still end with the &#x27;-SNAPSHOT&#x27; suffix.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-proceed-to-the-next-step-1">Checklist to proceed to the next step<a href="#checklist-to-proceed-to-the-next-step-1" class="hash-link" aria-label="Direct link to Checklist to proceed to the next step" title="Direct link to Checklist to proceed to the next step"></a></h3><ol><li>Release Manager’s GPG key is published to <code>dist.apache.org</code></li><li>Release Manager’s GPG key is configured in <code>git</code> configuration</li><li>Release Manager has <code>org.apache.bookkeeper</code> listed under <code>Staging Profiles</code> in Nexus</li><li>Release Manager’s Nexus User Token is configured in <code>settings.xml</code></li><li>Github milestone item for the subsequet release has been created</li><li>There are no release blocking Github issues</li><li>Release Notes for Github Milestone is generated, audited and adjusted</li><li>Release branch has been created</li><li>Originating branch has the version information updated to the new version</li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="build-a-release-candidate">Build a release candidate<a href="#build-a-release-candidate" class="hash-link" aria-label="Direct link to Build a release candidate" title="Direct link to Build a release candidate"></a></h2><p>The core of the release process is the build-vote-fix cycle. Each cycle produces one release candidate. The Release Manager repeats this cycle until the community approves one release candidate, which is then finalized.</p><blockquote><p>Since 4.7.0, bookkeeper is releasing a CRC32C module <code>circe-checksum</code>. so all the steps on building a release candidate should happen in linux environment.
It ensures the release candidate built with right jni library for <code>circe-checksum</code>.</p></blockquote><p>Set up a few environment variables to simplify Maven commands that follow. This identifies the release candidate being built. Start with <code>release candidate number</code> equal to <code>0</code> and increment it for each candidate.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">RC_NUM=&quot;0&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">TAG=&quot;release-${VERSION}&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RC_DIR=&quot;bookkeeper-${VERSION}-rc${RC_NUM}&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">RC_TAG=&quot;v${VERSION}-rc${RC_NUM}&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>Please make sure <code>gpg</code> command is in your $PATH. The maven release plugin use <code>gpg</code> to sign generated jars and packages.</p></blockquote><h3 class="anchor anchorWithStickyNavbar_LWe7" id="run-linux-docker-container-to-build-release-candidate">Run linux docker container to build release candidate<a href="#run-linux-docker-container-to-build-release-candidate" class="hash-link" aria-label="Direct link to Run linux docker container to build release candidate" title="Direct link to Run linux docker container to build release candidate"></a></h3><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./dev/release/000-run-docker.sh </span><span class="token variable" style="color:#36acaa">${RC_NUM}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>After the docker process is lauched, use <code>cache</code> credential helper to cache github credentials during releasing process.</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> config --global credential.helper </span><span class="token string" style="color:#e3116c">&quot;cache --timeout=3600&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Then run a dry-run github push to apache github repo. You will be asked for typing your github password, so the password will be cached for the whole releasing process.
If your account is configured with 2FA, use your personal token as the github password.</p><p>The remote <code>apache</code> should point to <code>https://github.com/apache/bookkeeper</code>.</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">$ </span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push apache --dry-run</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="build-and-stage-java-artifacts-with-maven">Build and stage Java artifacts with Maven<a href="#build-and-stage-java-artifacts-with-maven" class="hash-link" aria-label="Direct link to Build and stage Java artifacts with Maven" title="Direct link to Build and stage Java artifacts with Maven"></a></h3><p>Use Maven release plugin to build the release artifacts, as follows:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./dev/release/002-release-prepare.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Use Maven release plugin to stage these artifacts on the Apache Nexus repository, as follows:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./dev/release/003-release-perform.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><blockquote><p>If <code>release:perform</code> failed,
delete the release tag: git tag -d release-${VERSION} &amp;&amp; git push apache :refs/tags/release-${VERSION}</p><p>Also, you need to check the git commits on the github and if needed you may have to
force push backed out local git branch to github again.</p><p>After reset, run <code>./dev/release/002-release-prepare.sh</code> again.</p></blockquote><p>Review all staged artifacts. They should contain all relevant parts for each module, including <code>pom.xml</code>, jar, test jar, source, test source, javadoc, etc. Artifact names should follow <a href="https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.bookkeeper%22" target="_blank" rel="noopener noreferrer">the existing format</a> in which artifact name mirrors directory structure, e.g., <code>bookkeeper-server</code>. Carefully review any new artifacts.</p><p>Close the staging repository on Apache Nexus. When prompted for a description, enter “Apache BookKeeper, version X, release candidate Y”.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="stage-source-release-on-distapacheorg">Stage source release on dist.apache.org<a href="#stage-source-release-on-distapacheorg" class="hash-link" aria-label="Direct link to Stage source release on dist.apache.org" title="Direct link to Stage source release on dist.apache.org"></a></h3><ol><li>Copy the source release to the dev repository of <code>dist.apache.org</code>.</li></ol><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">./dev/release/004-stage-packages.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><ol start="2"><li>Verify that files are <a href="https://dist.apache.org/repos/dist/dev/bookkeeper" target="_blank" rel="noopener noreferrer">present</a>.</li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-proceed-to-the-next-step-2">Checklist to proceed to the next step<a href="#checklist-to-proceed-to-the-next-step-2" class="hash-link" aria-label="Direct link to Checklist to proceed to the next step" title="Direct link to Checklist to proceed to the next step"></a></h3><ol><li>Maven artifacts deployed to the staging repository of <a href="https://repository.apache.org/content/repositories/" target="_blank" rel="noopener noreferrer">repository.apache.org</a></li><li>Source and Binary distribution deployed to the dev repository of <a href="https://dist.apache.org/repos/dist/dev/bookkeeper/" target="_blank" rel="noopener noreferrer">dist.apache.org</a></li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="vote-on-the-release-candidate">Vote on the release candidate<a href="#vote-on-the-release-candidate" class="hash-link" aria-label="Direct link to Vote on the release candidate" title="Direct link to Vote on the release candidate"></a></h2><p>Once you have built and individually reviewed the release candidate, please share it for the community-wide review. Please review foundation-wide <a href="http://www.apache.org/foundation/voting.html" target="_blank" rel="noopener noreferrer">voting guidelines</a> for more information.</p><p>Start the review-and-vote thread on the dev@ mailing list. Here’s an email template; please adjust as you see fit.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">From: Release Manager</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">To: dev@bookkeeper.apache.org</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Subject: [VOTE] Release 4.5.0, release candidate #0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Hi everyone,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Please review and vote on the release candidate #0 for the version 0.4.0, as follows:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[ ] +1, Approve the release</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[ ] -1, Do not approve the release (please provide specific comments)</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The complete staging area is available for your review, which includes:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* Release notes [1]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* The official Apache source and binary distributions to be deployed to dist.apache.org [2]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* All artifacts to be deployed to the Maven Central Repository [3]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* Source code tag &quot;release-4.5.0&quot; [4] with git sha XXXXXXXXXXXXXXXXXXXX</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BookKeeper&#x27;s KEYS file contains PGP keys we used to sign this release:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">https://dist.apache.org/repos/dist/release/bookkeeper/KEYS</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Please download these packages and review this release candidate:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Review release notes</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Download the source package (verify shasum, and asc) and follow the</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">instructions to build and run the bookkeeper service.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Download the binary package (verify shasum, and asc) and follow the</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">instructions to run the bookkeeper service.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">- Review maven repo, release tag, licenses, and any other things you think</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">it is important to a release.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The vote will be open for at least 72 hours. It is adopted by majority approval, with at least 3 PMC affirmative votes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Thanks,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Release Manager</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[1] link</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[2] link</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[3] link</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[4] link</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[5] link</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>If there are any issues found in the release candidate, reply on the vote thread to cancel the vote. There’s no need to wait 72 hours. Proceed to the <code>Fix Issues</code> step below and address the problem. However, some issues don’t require cancellation. For example, if an issue is found in the website pull request, just correct it on the spot and the vote can continue as-is.</p><p>If there are no issues, reply on the vote thread to close the voting. Then, tally the votes in a separate email. Here’s an email template; please adjust as you see fit. (NOTE: the approver list are binding approvers.)</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">From: Release Manager</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">To: dev@bookkeeper.apache.org</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Subject: [RESULT] [VOTE] Release 0.4.0, release candidate #0</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">I&#x27;m happy to announce that we have unanimously approved this release.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">There are XXX approving votes, XXX of which are binding:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* approver 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* approver 2</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* approver 3</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">* approver 4</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">There are no disapproving votes.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Thanks everyone!</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-proceed-to-the-finalization-step">Checklist to proceed to the finalization step<a href="#checklist-to-proceed-to-the-finalization-step" class="hash-link" aria-label="Direct link to Checklist to proceed to the finalization step" title="Direct link to Checklist to proceed to the finalization step"></a></h3><ol><li>Community votes to release the proposed candidate</li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="fix-any-issues">Fix any issues<a href="#fix-any-issues" class="hash-link" aria-label="Direct link to Fix any issues" title="Direct link to Fix any issues"></a></h2><p>Any issues identified during the community review and vote should be fixed in this step.</p><p>Code changes should be proposed as standard pull requests to the <code>master</code> branch and reviewed using the normal contributing process. Then, relevant changes should be cherry-picked into the release branch. The cherry-pick commits should then be proposed as the pull requests against the release branch, again reviewed and merged using the normal contributing process.</p><p>Once all issues have been resolved, you should go back and build a new release candidate with these changes.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-proceed-to-the-next-step-3">Checklist to proceed to the next step<a href="#checklist-to-proceed-to-the-next-step-3" class="hash-link" aria-label="Direct link to Checklist to proceed to the next step" title="Direct link to Checklist to proceed to the next step"></a></h3><ol><li>Issues identified during vote have been resolved, with fixes committed to the release branch.</li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="finalize-the-release">Finalize the release<a href="#finalize-the-release" class="hash-link" aria-label="Direct link to Finalize the release" title="Direct link to Finalize the release"></a></h2><p>Once the release candidate has been reviewed and approved by the community, the release should be finalized. This involves the final deployment of the release candidate to the release repositories, merging of the website changes, etc.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="deploy-artifacts-to-maven-central-repository">Deploy artifacts to Maven Central Repository<a href="#deploy-artifacts-to-maven-central-repository" class="hash-link" aria-label="Direct link to Deploy artifacts to Maven Central Repository" title="Direct link to Deploy artifacts to Maven Central Repository"></a></h3><p>Use the Apache Nexus repository to release the staged binary artifacts to the Maven Central repository. In the <code>Staging Repositories</code> section, find the relevant release candidate <code>orgapachebookkeeper-XXX</code> entry and click <code>Release</code>. Drop all other release candidates that are not being released.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="deploy-source-release-to-distapacheorg">Deploy source release to dist.apache.org<a href="#deploy-source-release-to-distapacheorg" class="hash-link" aria-label="Direct link to Deploy source release to dist.apache.org" title="Direct link to Deploy source release to dist.apache.org"></a></h3><p>Copy the source release from the <code>dev</code> repository to the <code>release</code> repository at <code>dist.apache.org</code> using Subversion.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">svn move https://dist.apache.org/repos/dist/dev/bookkeeper/bookkeeper-${VERSION}-rc${RC_NUM} https://dist.apache.org/repos/dist/release/bookkeeper/bookkeeper-${VERSION}</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="update-website">Update Website<a href="#update-website" class="hash-link" aria-label="Direct link to Update Website" title="Direct link to Update Website"></a></h3><ol><li><p>Create the documentation for the release</p><h4 class="anchor anchorWithStickyNavbar_LWe7" id="patch-release">Patch release<a href="#patch-release" class="hash-link" aria-label="Direct link to Patch release" title="Direct link to Patch release"></a></h4><p>For each minor release only the latest patch version documentation is kept.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">export LATEST_RELEASED= # version to replace</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">export NEW_RELEASE=${VERSION}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./site3/website/scripts/release-minor.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h4 class="anchor anchorWithStickyNavbar_LWe7" id="majorminor-release">Major/minor release<a href="#majorminor-release" class="hash-link" aria-label="Direct link to Major/minor release" title="Direct link to Major/minor release"></a></h4><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain"> export NEW_RELEASE=${VERSION}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> ./site3/website/scripts/release-major.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Update the <code>latest_release</code> and <code>stable_release</code> in the docusaurus.config.js file if needed.
Once run the above commands, please send a pull request for it and get approval from any committers, then merge it.
The CI job will automatically update the website in a few minutes. Please review the website to make sure the
documentation for <code>${VERSION}</code> is live.</p></li><li><p>Merge the Release Notes pull request and make sure the <a href="/release-notes">release notes page</a> is updated.</p></li></ol><p>Note: you can put the 1. and 2. in the same pull. </p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="git-tag">Git tag<a href="#git-tag" class="hash-link" aria-label="Direct link to Git tag" title="Direct link to Git tag"></a></h3><blockquote><p>NOTE: Only create the release tag after the release package is showed up under <a href="https://archive.apache.org/dist/bookkeeper/" target="_blank" rel="noopener noreferrer">https://archive.apache.org/dist/bookkeeper/</a> as creating the tag triggers a docker autobuild which needs the package to exist. If you forget to do so, the build will fail. In this case you can delete the tag from github and push it again.</p></blockquote><p>Create and push a new signed for the released version by copying the tag for the final release tag, as follows</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag -s </span><span class="token string" style="color:#e3116c">&quot;</span><span class="token string variable" style="color:#36acaa">${TAG}</span><span class="token string" style="color:#e3116c">&quot;</span><span class="token plain"> </span><span class="token string" style="color:#e3116c">&quot;</span><span class="token string variable" style="color:#36acaa">${RC_TAG}</span><span class="token string" style="color:#e3116c">&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token comment" style="color:#999988;font-style:italic"># Message: &quot;Release ${VERSION}&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push apache </span><span class="token string" style="color:#e3116c">&quot;</span><span class="token string variable" style="color:#36acaa">${TAG}</span><span class="token string" style="color:#e3116c">&quot;</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Remove rc tags:</p><div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-shell codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token keyword" style="color:#00009f">for</span><span class="token plain"> </span><span class="token for-or-select variable" style="color:#36acaa">num</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">in</span><span class="token plain"> </span><span class="token variable" style="color:#36acaa">$(</span><span class="token variable function" style="color:#d73a49">seq</span><span class="token variable" style="color:#36acaa"> </span><span class="token variable number" style="color:#36acaa">0</span><span class="token variable" style="color:#36acaa"> $</span><span class="token variable punctuation" style="color:#393A34">{</span><span class="token variable" style="color:#36acaa">RC_NUM</span><span class="token variable punctuation" style="color:#393A34">}</span><span class="token variable" style="color:#36acaa">)</span><span class="token punctuation" style="color:#393A34">;</span><span class="token plain"> </span><span class="token keyword" style="color:#00009f">do</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> tag -d </span><span class="token string" style="color:#e3116c">&quot;v</span><span class="token string variable" style="color:#36acaa">${VERSION}</span><span class="token string" style="color:#e3116c">-rc</span><span class="token string variable" style="color:#36acaa">${num}</span><span class="token string" style="color:#e3116c">&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><span class="token function" style="color:#d73a49">git</span><span class="token plain"> push apache </span><span class="token builtin class-name">:</span><span class="token string" style="color:#e3116c">&quot;v</span><span class="token string variable" style="color:#36acaa">${VERSION}</span><span class="token string" style="color:#e3116c">-rc</span><span class="token string variable" style="color:#36acaa">${num}</span><span class="token string" style="color:#e3116c">&quot;</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token keyword" style="color:#00009f">done</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="verify-docker-image">Verify Docker Image<a href="#verify-docker-image" class="hash-link" aria-label="Direct link to Verify Docker Image" title="Direct link to Verify Docker Image"></a></h3><blockquote><p>After release tag is created, it will automatically trigger docker auto build. </p></blockquote><ol><li><p>Verify the <a href="https://hub.docker.com/r/apache/bookkeeper/" target="_blank" rel="noopener noreferrer">docker hub</a> to see if a new build for the given tag is build.</p></li><li><p>Once the new docker image is built, update BC tests to include new docker image. Example: <a href="https://github.com/apache/bookkeeper/pull/1352" target="_blank" rel="noopener noreferrer">release-4.7.0</a></p></li></ol><h3 class="anchor anchorWithStickyNavbar_LWe7" id="release-python-client">Release Python Client<a href="#release-python-client" class="hash-link" aria-label="Direct link to Release Python Client" title="Direct link to Release Python Client"></a></h3><p>Make sure you have installed <a href="https://pypi.org/project/pip/" target="_blank" rel="noopener noreferrer"><code>pip</code></a> and
<a href="https://twine.readthedocs.io/en/latest/" target="_blank" rel="noopener noreferrer"><code>twine</code></a>.</p><ul><li><p>Install Pip</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">brew </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> pip</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li><li><p>Install Twine</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">pip </span><span class="token function" style="color:#d73a49">install</span><span class="token plain"> twine</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div></li></ul><p>After install <code>twine</code>, make sure <code>twine</code> exist in your PATH before releasing python client.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">twine --version</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Now, you are ready to publish the python client.</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token builtin class-name">cd</span><span class="token plain"> stream/clients/python</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">./scripts/publish.sh</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>Check the PyPi project package to make sure the python client is uploaded to <a href="https://pypi.org/project/apache-bookkeeper-client/" target="_blank" rel="noopener noreferrer">https://pypi.org/project/apache-bookkeeper-client/</a> .</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="advance-version-on-release-branch">Advance version on release branch<a href="#advance-version-on-release-branch" class="hash-link" aria-label="Direct link to Advance version on release branch" title="Direct link to Advance version on release branch"></a></h3><blockquote><p>only do this for minor release</p></blockquote><p>Use the Maven Release plugin in order to advance the version in all poms.</p><blockquote><p>This command will upgrade the <!-- -->&lt;<!-- -->version<!-- -->&gt;<!-- --> tag on every pom.xml locally to your workspace.</p></blockquote><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">mvn release:update-versions</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> -DdevelopmentVersion=${DEVELOPMENT_VERSION}</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> -Dstream</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><p>For instance if you have released 4.5.1, you have to change version to 4.5.2-SNAPSHOT.
Then you have to create a PR and submit it for review.</p><p>Example PR: <a href="https://github.com/apache/bookkeeper/pull/1350" target="_blank" rel="noopener noreferrer">release-4.7.0</a></p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="create-release-in-github">Create release in Github<a href="#create-release-in-github" class="hash-link" aria-label="Direct link to Create release in Github" title="Direct link to Create release in Github"></a></h3><p>Create a new release on Github. Under <a href="https://github.com/apache/bookkeeper/releases" target="_blank" rel="noopener noreferrer">releases</a>, click &quot;Draft a new release&quot;, select the tag and the publish the release.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="mark-the-version-as-released-in-github">Mark the version as released in Github<a href="#mark-the-version-as-released-in-github" class="hash-link" aria-label="Direct link to Mark the version as released in Github" title="Direct link to Mark the version as released in Github"></a></h3><blockquote><p>only do this for feature release</p></blockquote><p>In Github, inside <a href="https://github.com/apache/bookkeeper/milestones" target="_blank" rel="noopener noreferrer">milestones</a>, hover over the current milestone and click <code>close</code> button to close a milestone and set today&#x27;s date as due-date.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="update-release-schedule">Update Release Schedule<a href="#update-release-schedule" class="hash-link" aria-label="Direct link to Update Release Schedule" title="Direct link to Update Release Schedule"></a></h3><blockquote><p>only do this for feature release</p></blockquote><p>Update the <a href="/community/releases">release schedule</a> page:</p><ul><li>Bump the next feature release version and update its release window.</li><li>Update the release schedule to remove released version and add a new release.</li></ul><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-proceed-to-the-next-step-4">Checklist to proceed to the next step<a href="#checklist-to-proceed-to-the-next-step-4" class="hash-link" aria-label="Direct link to Checklist to proceed to the next step" title="Direct link to Checklist to proceed to the next step"></a></h3><ul><li>Maven artifacts released and indexed in the <a href="https://search.maven.org/#search%7Cga%7C1%7Cg%3A%22org.apache.bookkeeper%22" target="_blank" rel="noopener noreferrer">Maven Central Repository</a></li><li>Source and Binary distribution available in the release repository of <a href="https://dist.apache.org/repos/dist/release/bookkeeper/" target="_blank" rel="noopener noreferrer">dist.apache.org</a></li><li>Website is updated with new release</li><li>Docker image is built with new release</li><li>Release tagged in the source code repository</li><li>Release exists in Github</li><li>Release version finalized in Github</li><li>Release schedule page is updated</li></ul><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="promote-the-release">Promote the release<a href="#promote-the-release" class="hash-link" aria-label="Direct link to Promote the release" title="Direct link to Promote the release"></a></h2><p>Once the release has been finalized, the last step of the process is to promote the release within the project and beyond.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="apache-mailing-lists">Apache mailing lists<a href="#apache-mailing-lists" class="hash-link" aria-label="Direct link to Apache mailing lists" title="Direct link to Apache mailing lists"></a></h3><ul><li>Announce on the dev@ mailing list that the release has been finished.</li><li>Announce on the release on the user@ mailing list, listing major improvements and contributions.</li><li>Announce the release on the <a href="mailto:announce@apache.org" target="_blank" rel="noopener noreferrer">announce@apache.org</a> mailing list</li></ul><p>Use the template below for all the messages.</p><blockquote><p>NOTE: Make sure sending the announce email using apache email, otherwise <a href="mailto:announce@apache.org" target="_blank" rel="noopener noreferrer">announce@apache.org</a> will reject your email.</p></blockquote><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">From: xxx@apache.org</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">To: dev@bookkeeper.apache.org, user@bookkeeper.apache.org, announce@apache.org</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Subject: [ANNOUNCE] Apache BookKeeper x.y.z released</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The Apache BookKeeper team is proud to announce Apache BookKeeper version</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">x.y.z.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Apache BookKeeper is a scalable, fault-tolerant, and low-latency storage service optimized for</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">real-time workloads. It has been used for a fundamental service to build reliable services.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">It is also the log segment store for Apache DistributedLog and the message store for Apache Pulsar.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">This is the N release of the Apache BookKeeper.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[highlights the release and why users need to try the release]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">For BookKeeper release details and downloads, visit:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[download link]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">BookKeeper x.y.z Release Notes are at:</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[release notes link]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">We would like to thank the contributors that made the release possible.</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">Regards,</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"> </span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">The BookKeeper Team</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="recordkeeping">Recordkeeping<a href="#recordkeeping" class="hash-link" aria-label="Direct link to Recordkeeping" title="Direct link to Recordkeeping"></a></h3><p>Use reporter.apache.org to seed the information about the release into future project reports.</p><p>This step can be done only by PMC.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="social-media">Social media<a href="#social-media" class="hash-link" aria-label="Direct link to Social media" title="Direct link to Social media"></a></h3><p>Tweet, post on Facebook, LinkedIn, and other platforms. Ask other contributors to do the same.</p><p>This step can be done only by PMC.</p><h3 class="anchor anchorWithStickyNavbar_LWe7" id="cleanup-old-releases">Cleanup old releases<a href="#cleanup-old-releases" class="hash-link" aria-label="Direct link to Cleanup old releases" title="Direct link to Cleanup old releases"></a></h3><p>According to <a href="http://www.apache.org/legal/release-policy.html#when-to-archive" target="_blank" rel="noopener noreferrer">ASF policy</a>, <code>/www.apache.org/dist</code> should contain the latest release in each branch that
is currently under development. We need to remove the old releases from <code>release</code> repository.</p><p>For example, if 4.6.1 is a newer release, we need to remove releases older than 4.6.1.</p><div class="codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_biex"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">```shell</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">$ svn del https://dist.apache.org/repos/dist/release/bookkeeper/bookkeeper-${old-release} -m &quot;remove bookkeeper release &lt;old-release&gt;&quot;</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">```</span><br></span></code></pre><div class="buttonGroup__atx"><button type="button" aria-label="Copy code to clipboard" title="Copy" class="clean-btn"><span class="copyButtonIcons_eSgA" aria-hidden="true"><svg class="copyButtonIcon_y97N" viewBox="0 0 24 24"><path d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"></path></svg><svg class="copyButtonSuccessIcon_LjdS" viewBox="0 0 24 24"><path d="M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z"></path></svg></span></button></div></div></div><h3 class="anchor anchorWithStickyNavbar_LWe7" id="checklist-to-declare-the-process-completed">Checklist to declare the process completed<a href="#checklist-to-declare-the-process-completed" class="hash-link" aria-label="Direct link to Checklist to declare the process completed" title="Direct link to Checklist to declare the process completed"></a></h3><ol><li>Release announced on the user@ mailing list.</li><li>Blog post published, if applicable.</li><li>Apache Software Foundation press release published.</li><li>Release announced on social media.</li><li>Completion declared on the dev@ mailing list.</li></ol><hr><h2 class="anchor anchorWithStickyNavbar_LWe7" id="improve-the-process">Improve the process<a href="#improve-the-process" class="hash-link" aria-label="Direct link to Improve the process" title="Direct link to Improve the process"></a></h2><p>It is important that we improve the release processes over time. Once you’ve finished the release, please take a step back and look what areas of this process and be improved. Perhaps some part of the process can be simplified. Perhaps parts of this guide can be clarified.</p><p>If we have specific ideas, please start a discussion on the dev@ mailing list and/or propose a pull request to update this guide. Thanks!</p></article></div><div class="col col--2"><div class="tableOfContents_bqdL thin-scrollbar"><ul class="table-of-contents table-of-contents__left-border"><li><a href="#introduction" class="table-of-contents__link toc-highlight">Introduction</a></li><li><a href="#overview" class="table-of-contents__link toc-highlight">Overview</a></li><li><a href="#decide-to-release" class="table-of-contents__link toc-highlight">Decide to release</a><ul><li><a href="#checklist-to-proceed-to-the-next-step" class="table-of-contents__link toc-highlight">Checklist to proceed to the next step</a></li></ul></li><li><a href="#prepare-for-the-release" class="table-of-contents__link toc-highlight">Prepare for the release</a><ul><li><a href="#one-time-setup-instructions" class="table-of-contents__link toc-highlight">One-time setup instructions</a></li><li><a href="#create-a-new-version-in-github" class="table-of-contents__link toc-highlight">Create a new version in Github</a></li><li><a href="#triage-release-blocking-issues-in-github" class="table-of-contents__link toc-highlight">Triage release-blocking issues in Github</a></li><li><a href="#change-python-client-version" class="table-of-contents__link toc-highlight">Change Python Client Version</a></li><li><a href="#review-release-notes-in-github" class="table-of-contents__link toc-highlight">Review Release Notes in Github</a></li><li><a href="#prepare-release-branch" class="table-of-contents__link toc-highlight">Prepare release branch</a></li><li><a href="#checklist-to-proceed-to-the-next-step-1" class="table-of-contents__link toc-highlight">Checklist to proceed to the next step</a></li></ul></li><li><a href="#build-a-release-candidate" class="table-of-contents__link toc-highlight">Build a release candidate</a><ul><li><a href="#run-linux-docker-container-to-build-release-candidate" class="table-of-contents__link toc-highlight">Run linux docker container to build release candidate</a></li><li><a href="#build-and-stage-java-artifacts-with-maven" class="table-of-contents__link toc-highlight">Build and stage Java artifacts with Maven</a></li><li><a href="#stage-source-release-on-distapacheorg" class="table-of-contents__link toc-highlight">Stage source release on dist.apache.org</a></li><li><a href="#checklist-to-proceed-to-the-next-step-2" class="table-of-contents__link toc-highlight">Checklist to proceed to the next step</a></li></ul></li><li><a href="#vote-on-the-release-candidate" class="table-of-contents__link toc-highlight">Vote on the release candidate</a><ul><li><a href="#checklist-to-proceed-to-the-finalization-step" class="table-of-contents__link toc-highlight">Checklist to proceed to the finalization step</a></li></ul></li><li><a href="#fix-any-issues" class="table-of-contents__link toc-highlight">Fix any issues</a><ul><li><a href="#checklist-to-proceed-to-the-next-step-3" class="table-of-contents__link toc-highlight">Checklist to proceed to the next step</a></li></ul></li><li><a href="#finalize-the-release" class="table-of-contents__link toc-highlight">Finalize the release</a><ul><li><a href="#deploy-artifacts-to-maven-central-repository" class="table-of-contents__link toc-highlight">Deploy artifacts to Maven Central Repository</a></li><li><a href="#deploy-source-release-to-distapacheorg" class="table-of-contents__link toc-highlight">Deploy source release to dist.apache.org</a></li><li><a href="#update-website" class="table-of-contents__link toc-highlight">Update Website</a></li><li><a href="#git-tag" class="table-of-contents__link toc-highlight">Git tag</a></li><li><a href="#verify-docker-image" class="table-of-contents__link toc-highlight">Verify Docker Image</a></li><li><a href="#release-python-client" class="table-of-contents__link toc-highlight">Release Python Client</a></li><li><a href="#advance-version-on-release-branch" class="table-of-contents__link toc-highlight">Advance version on release branch</a></li><li><a href="#create-release-in-github" class="table-of-contents__link toc-highlight">Create release in Github</a></li><li><a href="#mark-the-version-as-released-in-github" class="table-of-contents__link toc-highlight">Mark the version as released in Github</a></li><li><a href="#update-release-schedule" class="table-of-contents__link toc-highlight">Update Release Schedule</a></li><li><a href="#checklist-to-proceed-to-the-next-step-4" class="table-of-contents__link toc-highlight">Checklist to proceed to the next step</a></li></ul></li><li><a href="#promote-the-release" class="table-of-contents__link toc-highlight">Promote the release</a><ul><li><a href="#apache-mailing-lists" class="table-of-contents__link toc-highlight">Apache mailing lists</a></li><li><a href="#recordkeeping" class="table-of-contents__link toc-highlight">Recordkeeping</a></li><li><a href="#social-media" class="table-of-contents__link toc-highlight">Social media</a></li><li><a href="#cleanup-old-releases" class="table-of-contents__link toc-highlight">Cleanup old releases</a></li><li><a href="#checklist-to-declare-the-process-completed" class="table-of-contents__link toc-highlight">Checklist to declare the process completed</a></li></ul></li><li><a href="#improve-the-process" class="table-of-contents__link toc-highlight">Improve the process</a></li></ul></div></div></div></main></div><footer class="footer footer--dark"><div class="container container-fluid"><div class="row footer__links"><div class="col footer__col"><div class="footer__title">Documentation</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/docs/overview">Overview</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/getting-started/installation">Getting started</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/deployment/manual">Deployment</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/admin/bookies">Administration</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/api/overview">API</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/security/overview">Security</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/development/protocol">Development</a></li><li class="footer__item"><a class="footer__link-item" href="/docs/reference/config">Reference</a></li></ul></div><div class="col footer__col"><div class="footer__title">Community</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/community/mailing-lists">Mailing lists</a></li><li class="footer__item"><a class="footer__link-item" href="/community/slack">Slack</a></li><li class="footer__item"><a href="https://github.com/apache/bookkeeper" target="_blank" rel="noopener noreferrer" class="footer__link-item">Github<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://twitter.com/asfbookkeeper" target="_blank" rel="noopener noreferrer" class="footer__link-item">Twitter<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div><div class="col footer__col"><div class="footer__title">Project</div><ul class="footer__items clean-list"><li class="footer__item"><a class="footer__link-item" href="/project/who">Who are we?</a></li><li class="footer__item"><a class="footer__link-item" href="/project/bylaws">Bylaws</a></li><li class="footer__item"><a href="https://apache.org/licenses" target="_blank" rel="noopener noreferrer" class="footer__link-item">License<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a class="footer__link-item" href="/project/privacy">Privacy policy</a></li><li class="footer__item"><a href="https://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Sponsorship<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li><li class="footer__item"><a href="https://www.apache.org/foundation/thanks.html" target="_blank" rel="noopener noreferrer" class="footer__link-item">Thanks<svg width="13.5" height="13.5" aria-hidden="true" viewBox="0 0 24 24" class="iconExternalLink_nPIU"><path fill="currentColor" d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"></path></svg></a></li></ul></div></div><div class="footer__bottom text--center"><div class="footer__copyright"><footer class="footer">
<div class="container">
<div class="content has-text-centered">
<p>
Copyright &copy; 2016 - 2024 <a href="https://www.apache.org/">The Apache Software Foundation</a>,<br> licensed under the <a href="http://www.apache.org/licenses/LICENSE-2.0">Apache License, version 2.0</a>.
</p>
<p>
Apache BookKeeper, BookKeeper®, Apache®, the Apache feature logo, and the Apache BookKeeper logo are either registered trademarks or trademarks of The Apache Software Foundation.
</p>
</div>
</div>
</footer>
</div></div></div></footer></div>
<script src="/assets/js/runtime~main.793d926f.js"></script>
<script src="/assets/js/main.c5d52852.js"></script>
</body>
</html>