<!DOCTYPE HTML>
<html lang="en-US">
<head>
  <meta http-equiv="CACHE-CONTROL" content="NO-CACHE">
  <meta charset="UTF-8">
  <title>Mnemonic Release Workflow</title>
  <meta name="viewport" content="width=device-width,initial-scale=1">
  <meta name="generator" content="Jekyll v2.4.0">
  <link rel="stylesheet" href="/css/font-awesome.min.css">
  <link rel="stylesheet" href="/css/screen.css">
  <link rel="icon" type="image/x-icon" href="/favicon.ico">
  <script src="/js/jquery-3.2.1.min.js"></script>
  <!--[if lt IE 9]>
  <script src="/js/html5shiv.min.js"></script>
  <script src="/js/respond.min.js"></script>
  <![endif]-->
  <script src="/js/screen.js"></script>
  <script type="text/javascript" src="/assets/javascripts/bundle.js" charset="utf-8"></script>
</head>


<body>
  <header role="banner">
  <nav class="mobile-nav show-on-mobiles">
    <ul>
  <li class="">
    <a href="/">Home</a>
  </li>
  <li class="">
    <a href="/docs/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
  </li>
  </li>
  <li class="">
    <a href="/downloads/">Downloads</a>
  </li>
  <li class="">
    <a href="/talks/">Talks</a>
  </li>
  <li class="">
    <a href="/news/">News</a>
  </li>
  <li class="current">
    <a href="/develop/">Develop</a>
  </li>
  <li class="">
    <a href="/help/">Help</a>
  </li>
</ul>

  </nav>
  <div class="grid">
    <div class="unit one-third center-on-mobiles">
      <h1>
        <a href="/">
          <span class="sr-only">Apache Mnemonic</span>
          <img src="/img/mnemonic_logo_v2.png" width="289" alt="Mnemonic Logo" class="logo">
        </a>
        <a  href="https://www.apache.org/events/current-event.html">
          <img src="https://www.apache.org/events/current-event-234x60.png"/>
        </a>
      </h1>
    </div>
    <nav class="main-nav unit two-thirds hide-on-mobiles">
      <ul>
  <li class="">
    <a href="/">Home</a>
  </li>
  <li class="">
    <a href="/docs/">Doc<span class="show-on-mobiles">s</span><span class="hide-on-mobiles">umentation</span></a>
  </li>
  </li>
  <li class="">
    <a href="/downloads/">Downloads</a>
  </li>
  <li class="">
    <a href="/talks/">Talks</a>
  </li>
  <li class="">
    <a href="/news/">News</a>
  </li>
  <li class="current">
    <a href="/develop/">Develop</a>
  </li>
  <li class="">
    <a href="/help/">Help</a>
  </li>
</ul>

    </nav>
  </div>
  <!-- Return to Top -->
  <a href="#top" id="return-to-top"><i class="fa fa-chevron-up"></i></a>
</header>


  <section class="standalone">
  <div class="grid">

    <div class="unit whole">
      <article>
        <h1>Mnemonic Release Workflow</h1>
        <p>To release a new version of Mnemonic, please refer to following steps.</p>

<ul>
  <li>
    <p>1.Get familiar with Apache <a href="https://infra.apache.org/release-publishing.html" target="_blank">releasing process</a></p>
  </li>
  <li>
    <p>2.Verify the whole project.</p>
  </li>
  <li>
    <p>3.Vote on preparing a release candidate.</p>
  </li>
  <li>
    <p>4.(One time setup) Generate a <a href="https://infra.apache.org/openpgp.html#generate-key" target="_blank">OpenPGP key</a> if the release manager has not yet got one.</p>
  </li>
  <li>
    <p>5.(One time setup) Configure the deployment repositories of Maven and copy the following snippet to settings.xml under &lt;home folder&gt;/.m2/</p>

    <p><code class="xml">
      &lt;settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
      xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd"&gt;
          &lt;profiles&gt;
              &lt;profile&gt;
                  &lt;id&gt;apache-release&lt;/id&gt;
                  &lt;properties&gt;
                      &lt;altSnapshotDeploymentRepository&gt;snapshots::default::file:///${env.HOME}/ws/maven-repository/snapshots&lt;/altSnapshotDeploymentRepository&gt;
                      &lt;altReleaseDeploymentRepository&gt;releases::default::file:///${env.HOME}/ws/maven-repository/releases&lt;/altReleaseDeploymentRepository&gt;
                  &lt;/properties&gt;
              &lt;/profile&gt;
          &lt;/profiles&gt;
      &lt;/settings&gt;
  </code></p>
  </li>
  <li>
    <p>6.Make sure the OpenJDK has been deployed in release machine.</p>
  </li>
  <li>
    <p>7.Configure the signing key in git toolchain (see example below).</p>

    <p><code>
  $ git config --global user.signingkey &lt;your gpg key id&gt;
 </code></p>
  </li>
  <li>
    <p>8.Use release.sh script to prepare a release candidate (see example below).</p>

    <p><code>
  $ tools/release.sh candidate 0.14.0 rc1 no
 </code></p>
  </li>
  <li>
    <p>9.Make sure the tickets belong to current release that got marked in the field of fixed version.</p>
  </li>
  <li>
    <p>11.Collect the change log of current version from <a href="https://issues.apache.org/jira/projects/MNEMONIC/versions/">Apache JIRA</a></p>
  </li>
  <li>
    <p>12.Check in the generated release candidate artifacts to Apache stage repository, add to change log file, and update the key file with new generated key if not included.</p>
  </li>
  <li>
    <p>13.Vote on the release candidate.</p>
  </li>
  <li>
    <p>14.Check the latest candidate to Apache release repository as formal new version release.</p>
  </li>
  <li>
    <p>15.Perform formal release in git (see example below).</p>

    <p><code>
  $ tools/release.sh bump 1.14.0 rc1 0.15.0
 </code></p>
  </li>
  <li>
    <p>16.Announce the new release version with the link of release repository.</p>
  </li>
  <li>
    <p>17.Update the download page in project website.</p>
  </li>
</ul>

      </article>
    </div>

    <div class="clear"></div>

  </div>
</section>


  <footer role="contentinfo">
    <p><div align="center">Apache Mnemonic, Mnemonic, Apache, and the Mnemonic logo are trademarks of The Apache Software Foundation.</div>
<div align="center"> Copyright &copy;&nbsp;2021 <a href="https://www.apache.org/">The Apache Software Foundation</a></div></p>
</footer>

  <script>
  var anchorForId = function (id) {
    var anchor = document.createElement("a");
    anchor.className = "header-link";
    anchor.href      = "#" + id;
    anchor.innerHTML = "<span class=\"sr-only\">Permalink</span><i class=\"fa fa-link\"></i>";
    anchor.title = "Permalink";
    return anchor;
  };

  var linkifyAnchors = function (level, containingElement) {
    var headers = containingElement.getElementsByTagName("h" + level);
    for (var h = 0; h < headers.length; h++) {
      var header = headers[h];

      if (typeof header.id !== "undefined" && header.id !== "") {
        header.appendChild(anchorForId(header.id));
      }
    }
  };

  document.onreadystatechange = function () {
    if (this.readyState === "complete") {
      var contentBlock = document.getElementsByClassName("docs")[0] || document.getElementsByClassName("news")[0];
      if (!contentBlock) {
        return;
      }
      for (var level = 1; level <= 6; level++) {
        linkifyAnchors(level, contentBlock);
      }
    }
  };
</script>


</body>
</html>
