blob: 9d801f29a912d44e8f81508d9545d484344c052c [file] [log] [blame]
<!DOCTYPE html><html lang="en"><head><meta charSet="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><title>How to Prepare a Release · Apache SINGA</title><meta name="viewport" content="width=device-width"/><meta name="generator" content="Docusaurus"/><meta name="description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --&gt;"/><meta name="docsearch:version" content="3.2.0"/><meta name="docsearch:language" content="en"/><meta property="og:title" content="How to Prepare a Release · Apache SINGA"/><meta property="og:type" content="website"/><meta property="og:url" content="https://singa.apache.org/"/><meta property="og:description" content="&lt;!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the &quot;License&quot;); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. --&gt;"/><meta property="og:image" content="https://singa.apache.org/img/singa_twitter_banner.jpeg"/><meta name="twitter:card" content="summary"/><meta name="twitter:image" content="https://singa.apache.org/img/singa_twitter_banner.jpeg"/><link rel="shortcut icon" href="/img/favicon.ico"/><link rel="stylesheet" href="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.css"/><link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/9.12.0/styles/atom-one-dark.min.css"/><link rel="alternate" type="application/atom+xml" href="https://singa.apache.org/blog/atom.xml" title="Apache SINGA Blog ATOM Feed"/><link rel="alternate" type="application/rss+xml" href="https://singa.apache.org/blog/feed.xml" title="Apache SINGA Blog RSS Feed"/><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:400,400i,700"/><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Baloo+Paaji+2&amp;family=Source+Sans+Pro:wght@200;300&amp;display=swap"/><script type="text/javascript" src="https://buttons.github.io/buttons.js"></script><script src="https://unpkg.com/vanilla-back-to-top@7.1.14/dist/vanilla-back-to-top.min.js"></script><script>
document.addEventListener('DOMContentLoaded', function() {
addBackToTop(
{"zIndex":100}
)
});
</script><script src="/js/scrollSpy.js"></script><link rel="stylesheet" href="/css/main.css"/><script src="/js/codetabs.js"></script></head><body class="sideNavVisible separateOnPageNav"><div class="fixedHeaderContainer"><div class="headerWrapper wrapper"><header><a href="/"><img class="logo" src="/img/singa.png" alt="Apache SINGA"/></a><a href="/versions"><h3>3.2.0</h3></a><div class="navigationWrapper navigationSlider"><nav class="slidingNav"><ul class="nav-site nav-site-internal"><li class="siteNavGroupActive"><a href="/docs/3.2.0/installation" target="_self">Docs</a></li><li class=""><a href="/docs/3.2.0/source-repository" target="_self">Community</a></li><li class=""><a href="/blog/" target="_self">News</a></li><li class=""><a href="https://apache-singa.readthedocs.io/en/latest/" target="_self">API</a></li><li class="navSearchWrapper reactNavSearchWrapper"><input type="text" id="search_input_react" placeholder="Search" title="Search"/></li><li class=""><a href="https://github.com/apache/singa" target="_self">GitHub</a></li></ul></nav></div></header></div></div><div class="navPusher"><div class="docMainWrapper wrapper"><div class="docsNavContainer" id="docsNav"><nav class="toc"><div class="toggleNav"><section class="navWrapper wrapper"><div class="navBreadcrumb wrapper"><div class="navToggle" id="navToggler"><div class="hamburger-menu"><div class="line1"></div><div class="line2"></div><div class="line3"></div></div></div><h2><i></i><span>Development</span></h2><div class="tocToggler" id="tocToggler"><i class="icon-toc"></i></div></div><div class="navGroups"><div class="navGroup"><h3 class="navGroupCategoryTitle">Getting Started</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/3.2.0/installation">Installation</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/software-stack">Software Stack</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/examples">Examples</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Guides</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/3.2.0/device">Device</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/tensor">Tensor</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/autograd">Autograd</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/optimizer">Optimizer</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/graph">Model</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/onnx">ONNX</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/dist-train">Distributed Training</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/time-profiling">Time Profiling</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/half-precision">Half Precision</a></li></ul></div><div class="navGroup"><h3 class="navGroupCategoryTitle">Development</h3><ul class=""><li class="navListItem"><a class="navItem" href="/docs/3.2.0/downloads">Download SINGA</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/build">Build SINGA from Source</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/contribute-code">How to Contribute Code</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/contribute-docs">How to Contribute to Documentation</a></li><li class="navListItem navListItemActive"><a class="navItem" href="/docs/3.2.0/how-to-release">How to Prepare a Release</a></li><li class="navListItem"><a class="navItem" href="/docs/3.2.0/git-workflow">Git Workflow</a></li></ul></div></div></section></div><script>
var coll = document.getElementsByClassName('collapsible');
var checkActiveCategory = true;
for (var i = 0; i < coll.length; i++) {
var links = coll[i].nextElementSibling.getElementsByTagName('*');
if (checkActiveCategory){
for (var j = 0; j < links.length; j++) {
if (links[j].classList.contains('navListItemActive')){
coll[i].nextElementSibling.classList.toggle('hide');
coll[i].childNodes[1].classList.toggle('rotate');
checkActiveCategory = false;
break;
}
}
}
coll[i].addEventListener('click', function() {
var arrow = this.childNodes[1];
arrow.classList.toggle('rotate');
var content = this.nextElementSibling;
content.classList.toggle('hide');
});
}
document.addEventListener('DOMContentLoaded', function() {
createToggler('#navToggler', '#docsNav', 'docsSliderActive');
createToggler('#tocToggler', 'body', 'tocActive');
var headings = document.querySelector('.toc-headings');
headings && headings.addEventListener('click', function(event) {
var el = event.target;
while(el !== headings){
if (el.tagName === 'A') {
document.body.classList.remove('tocActive');
break;
} else{
el = el.parentNode;
}
}
}, false);
function createToggler(togglerSelector, targetSelector, className) {
var toggler = document.querySelector(togglerSelector);
var target = document.querySelector(targetSelector);
if (!toggler) {
return;
}
toggler.onclick = function(event) {
event.preventDefault();
target.classList.toggle(className);
};
}
});
</script></nav></div><div class="container mainContainer docsContainer"><div class="wrapper"><div class="post"><header class="postHeader"><a class="edit-page-link button" href="https://github.com/apache/singa-doc/blob/master/docs-site/docs/how-to-release.md" target="_blank" rel="noreferrer noopener">Edit</a><h1 id="__docusaurus" class="postHeaderTitle">How to Prepare a Release</h1></header><article><div><span><!--- Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with this work for additional information regarding copyright ownership. The ASF licenses this file to you under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. -->
<p>This is a guide for the
<a href="http://www.apache.org/dev/release-publishing.html">release preparing process</a>
in SINGA.</p>
<ol>
<li><p>Select a release manager. The release manager (RM) is the coordinator for the
release process. It is the RM's signature (.asc) that is uploaded together
with the release. The RM generates KEY (RSA 4096-bit) and uploads it to a
public key server. The RM needs to get his key endorsed (signed) by other
Apache user, to be connected to the web of trust. He should first ask the
mentor to help signing his key.
<a href="http://www.apache.org/dev/release-signing.html">How to generate the key</a>?</p></li>
<li><p>Check license. <a href="https://www.apache.org/legal/src-headers.html#faq-docs">FAQ</a>;
<a href="https://issues.apache.org/jira/projects/SINGA/issues/SINGA-447">SINGA Issue</a></p>
<ul>
<li>The codebase does not include third-party code which is not compatible to
APL;</li>
<li>The dependencies are compatible with APL. GNU-like licenses are NOT
compatible;</li>
<li>All source files written by us MUST include the Apache license header:
<a href="http://www.apache.org/legal/src-headers.html">http://www.apache.org/legal/src-headers.html</a>. There's a script in there
which helps propagating the header to all files.</li>
<li>Update the LICENSE file. If we include any third party code in the release
package which is not APL, must state it at the end of the NOTICE file.</li>
</ul></li>
<li><p>Bump the version. Check code and documentation</p>
<ul>
<li>The build process is error-free.</li>
<li>Unit tests are included (as much as possible)</li>
<li>Conda packages run without errors.</li>
<li>The online documentation on the Apache website is up to date.</li>
</ul></li>
<li><p>Prepare the RELEASE_NOTES file. Include the following items, Introduction,
Features, Bugs (link to JIRA or Github PR), Changes, Dependency list,
Incompatibility issues. Follow this
<a href="http://commons.apache.org/proper/commons-digester/commons-digester-3.0/RELEASE-NOTES.txt">example</a>.</p></li>
<li><p>Package the release candidate. The release should be packaged into :
apache-singa-VERSION.tar.gz. The release should not include any binary files
including git files. However, the CMake compilation depends on the git tag to
get the version numbers; to remove this dependency, you need to manually
update the CMakeLists.txt file to set the version numbers.</p>
<pre><code class="hljs"># remove the following lines
include(GetGitRevisionDescription)
git_describe(VERSION --tags --dirty=-d)
<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^([0-9]+)<span class="hljs-subst">\\</span>..*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_MAJOR <span class="hljs-string">"${VERSION}"</span>)
<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^[0-9]+<span class="hljs-subst">\\</span>.([0-9]+).*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_MINOR <span class="hljs-string">"${VERSION}"</span>)
<span class="hljs-type">string</span>(REGEX REPLACE <span class="hljs-string">"^[0-9]+<span class="hljs-subst">\\</span>.[0-9]+<span class="hljs-subst">\\</span>.([0-9]+).*"</span> <span class="hljs-string">"<span class="hljs-subst">\\</span>1"</span> VERSION_PATCH <span class="hljs-string">"${VERSION}"</span>)
# set the numbers manually
SET(PACKAGE_VERSION <span class="hljs-number">3.0</span><span class="hljs-number">.0</span>)
SET(VERSION <span class="hljs-number">3.0</span><span class="hljs-number">.0</span>)
SET(SINGA_MAJOR_VERSION <span class="hljs-number">3</span>) # <span class="hljs-number">0</span> -
SET(SINGA_MINOR_VERSION <span class="hljs-number">0</span>) # <span class="hljs-number">0</span> - <span class="hljs-number">9</span>
SET(SINGA_PATCH_VERSION <span class="hljs-number">0</span>) # <span class="hljs-number">0</span> - <span class="hljs-number">99</span>
</code></pre>
<p>Upload the package to the
<a href="https://dist.apache.org/repos/dist/dev/singa/">stage repo</a>. The tar file,
signature, KEY and SHA256 checksum file should be included. MD5 is no longer
used. Policy is
<a href="http://www.apache.org/dev/release-distribution#sigs-and-sums">here</a>. The
stage folder should include:</p>
<ul>
<li>apache-singa-VERSION.tar.gz</li>
<li>apache-singa-VERSION.acs</li>
<li>apache-singa-VERSION.SHA256</li>
</ul>
<p>The commands to create these files and upload them to the stage svn repo:</p>
<pre><code class="hljs css language-sh"><span class="hljs-comment"># in singa repo</span>
rm -rf .git
rm -rf rafiki/*
<span class="hljs-built_in">cd</span> ..
tar -czvf apache-singa-VERSION.tar.gz singa/
mkdir stage
<span class="hljs-built_in">cd</span> stage
svn co https://dist.apache.org/repos/dist/dev/singa/
<span class="hljs-built_in">cd</span> singa
<span class="hljs-comment"># copy the KEYS file from singa repo to this folder if it is not here</span>
cp ../../singa/KEYS .
mkdir VERSION
<span class="hljs-comment"># copy the tar.gz file</span>
mv ../../apache-singa-VERSION.tar.gz VERSION/
<span class="hljs-built_in">cd</span> VERSION
sha512sum apache-singa-VERSION.tar.gz &gt; apache-singa-VERSION.tar.gz.sha512
gpg --armor --output apache-singa-VERSION.tar.gz.asc --detach-sig apache-singa-VERSION.tar.gz
<span class="hljs-built_in">cd</span> ..
svn add VERSION
svn commit
</code></pre></li>
</ol>
<ol start="6">
<li><p>Call for vote by sending an email. An example is provided as follows.</p>
<pre><code class="hljs"><span class="hljs-attribute">To</span>: dev<span class="hljs-variable">@singa</span>.apache.org
<span class="hljs-attribute">Subject</span>: [VOTE] Release apache-singa-X.Y.Z (release candidate N)
Hi all,
I have created a build for Apache SINGA <span class="hljs-number">3.1</span>.<span class="hljs-number">0</span>, release candidate <span class="hljs-number">2</span>.
The release note is at
<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/blob/master/RELEASE_NOTES.</span>
The artifacts to be voted on are located <span class="hljs-attribute">here</span>:
<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/3.1.0.rc2/apache-singa-3.1.0.rc2.tar.gz</span>
The hashes of the artifacts are as <span class="hljs-attribute">follows</span>:
<span class="hljs-attribute">SHA512</span>: <span class="hljs-number">84545499</span>ad36da108c6a599edd1d853f82d331bc03273b5278515554866f0c698e881f956b2eabcb6b29c07fa9fa4ff1add5a777b58db8a6a2362cf383b5c04d
Release artifacts are signed with the <span class="hljs-attribute">followingkey</span>:
<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/KEYS</span>
The signature file <span class="hljs-attribute">is</span>:
<span class="hljs-attribute">https</span>:<span class="hljs-comment">//dist.apache.org/repos/dist/dev/singa/3.1.0.rc2/apache-singa-3.1.0.rc2.tar.gz.asc</span>
The Github tag is <span class="hljs-attribute">at</span>:
<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/releases/tag/3.1.0.rc2</span>
The documentation website is at
<span class="hljs-attribute">http</span>:<span class="hljs-comment">//singa.apache.org/docs/next/installation/</span>
Some examples are available for <span class="hljs-attribute">testing</span>:
<span class="hljs-attribute">https</span>:<span class="hljs-comment">//github.com/apache/singa/tree/master/examples</span>
</code></pre></li>
</ol>
<p>Please vote on releasing this package. The vote is open for at least 72 hours
and passes if a majority of at least three +1 votes are cast.</p>
<p>[ ] +1 Release this package as Apache SINGA X.Y.Z [ ] 0 I don't feel strongly
about it, but I'm okay with the release [ ] -1 Do not release this package
because...</p>
<p>Here is my vote: +1</p>
<pre><code class="hljs">
7) Wait at least 48 hours for test responses. Any PMC, committer<span class="hljs-built_in"> or </span>contributor
can test features for releasing,<span class="hljs-built_in"> and </span>feedback. Everyone should<span class="hljs-built_in"> check </span>these
before vote +1. If the vote passes, then send the result email. Otherwise,
repeat from the beginning.
</code></pre>
<p>To: <a href="mailto:dev@singa.apache.org">dev@singa.apache.org</a> Subject: [RESULT][vote] Release apache-singa-X.Y.Z
(release candidate N)</p>
<p>Thanks to everyone who has voted and given their comments. The tally is as
follows.</p>
<p>N binding +1s: <names></p>
<p>N non-binding +1s: <names></p>
<p>No 0s or -1s.</p>
<p>I am delighted to announce that the proposal to release Apache SINGA X.Y.Z has
passed.</p>
<pre><code class="hljs">
8) Upload the package for
[<span class="hljs-string">distribution</span>](<span class="hljs-link">http://www.apache.org/dev/release-publishing.html#distribution</span>)
to https://dist.apache.org/repos/dist/release/singa/.
9) Update the Download page of SINGA website. The tar.gz file MUST be downloaded
from mirror, using closer.cgi script; other artifacts MUST be downloaded from
main Apache site. More details
[<span class="hljs-string">here</span>](<span class="hljs-link">http://www.apache.org/dev/release-download-pages.html</span>). Some feedback
we got during the previous releases: "Download pages must only link to formal
releases, so must not include links to GitHub.", "Links to KEYS, sigs and
hashes must not use dist.apache.org; instead use
https://www.apache.org/dist/singa/...;", "Also you only need one KEYS link,
and there should be a description of how to use KEYS + sig or hash to verify
the downloads."
10) Remove the RC tag and compile the conda packages.
11) Publish the release information.
<span class="hljs-code">```</span>
To: announce@apache.org, dev@singa.apache.org
Subject: [ANNOUNCE] Apache SINGA X.Y.Z released
We are pleased to announce that SINGA X.Y.Z is released.
SINGA is a general distributed deep learning platform
for training big deep learning models over large datasets.
The release is available at: http://singa.apache.org/downloads.html
The main features of this release include XXX
We look forward to hearing your feedback, suggestions,
and contributions to the project.
On behalf of the SINGA team, {SINGA Team Member Name}
<span class="hljs-code">```</span>
</code></pre>
</span></div></article></div><div class="docLastUpdate"><em>Last updated on 10/21/2020</em></div><div class="docs-prevnext"><a class="docs-prev button" href="/docs/3.2.0/contribute-docs"><span class="arrow-prev"></span><span>How to Contribute to Documentation</span></a><a class="docs-next button" href="/docs/3.2.0/git-workflow"><span>Git Workflow</span><span class="arrow-next"></span></a></div></div></div><nav class="onPageNav"></nav></div><footer class="nav-footer" id="footer"><section class="sitemap"><a href="/" class="nav-home"><img src="/img/singa-logo-square.png" alt="Apache SINGA" width="66" height="58"/></a><div><h5>Docs</h5><a href="/docs/installation">Getting Started</a><a href="/docs/device">Guides</a><a href="/en/https://apache-singa.readthedocs.io/en/latest/">API Reference</a><a href="/docs/examples">Examples</a><a href="/docs/download-singa">Development</a></div><div><h5>Community</h5><a href="/en/users.html">User Showcase</a><a href="/docs/history-singa">SINGA History</a><a href="/docs/team-list">SINGA Team</a><a href="/blog">SINGA News</a><a href="https://github.com/apache/singa">GitHub</a><div class="social"><a class="github-button" href="https://github.com/apache/singa" data-count-href="/apache/singa/stargazers" data-show-count="true" data-count-aria-label="# stargazers on GitHub" aria-label="Star this project on GitHub">apache/singa-doc</a></div><div class="social"><a href="https://twitter.com/ApacheSINGA" class="twitter-follow-button">Follow @ApacheSINGA</a></div></div><div><h5>Apache Software Foundation</h5><a href="https://apache.org/" target="_blank" rel="noreferrer noopener">Foundation</a><a href="http://www.apache.org/licenses/" target="_blank" rel="noreferrer noopener">License</a><a href="http://www.apache.org/foundation/sponsorship.html" target="_blank" rel="noreferrer noopener">Sponsorship</a><a href="http://www.apache.org/foundation/thanks.html" target="_blank" rel="noreferrer noopener">Thanks</a><a href="http://www.apache.org/events/current-event" target="_blank" rel="noreferrer noopener">Events</a><a href="http://www.apache.org/security/" target="_blank" rel="noreferrer noopener">Security</a></div></section><div style="width:100%;text-align:center"><a href="https://apache.org/" target="_blank" rel="noreferrer noopener" class="ApacheOpenSource"><img src="/img/asf_logo_wide.svg" alt="Apache Open Source"/></a><section class="copyright" style="max-width:60%;margin:0 auto">Copyright © 2023
The Apache Software Foundation. All rights reserved.
Apache SINGA, Apache, the Apache feather logo, and
the Apache SINGA project logos are trademarks of The
Apache Software Foundation. All other marks mentioned
may be trademarks or registered trademarks of their
respective owners.</section></div></footer></div><script type="text/javascript" src="https://cdn.jsdelivr.net/docsearch.js/1/docsearch.min.js"></script><script>window.twttr=(function(d,s, id){var js,fjs=d.getElementsByTagName(s)[0],t=window.twttr||{};if(d.getElementById(id))return t;js=d.createElement(s);js.id=id;js.src='https://platform.twitter.com/widgets.js';fjs.parentNode.insertBefore(js, fjs);t._e = [];t.ready = function(f) {t._e.push(f);};return t;}(document, 'script', 'twitter-wjs'));</script><script>
document.addEventListener('keyup', function(e) {
if (e.target !== document.body) {
return;
}
// keyCode for '/' (slash)
if (e.keyCode === 191) {
const search = document.getElementById('search_input_react');
search && search.focus();
}
});
</script><script>
var search = docsearch({
apiKey: '45202133606c0b5fa6d21cddc4725dd8',
indexName: 'apache_singa',
inputSelector: '#search_input_react',
algoliaOptions: {"facetFilters":["language:en","version:3.0.0"]}
});
</script></body></html>