blob: 3f3f48048ae00f411b90f7faf2800f27d7903ce5 [file] [log] [blame]
<!DOCTYPE html>
<html lang="cn" class="js csstransforms3d">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<meta name="generator" content="Hugo 0.70.0" />
<meta name="description" content="">
<meta name="buildDate" content="2022-08-12 13:01:24">
<link rel="shortcut icon" href="https://shardingsphere.apache.org/document/current/img/favicon.png" type="image/x-icon" />
<title>ShardingSphere 发布指南 :: ShardingSphere</title>
<link href="https://shardingsphere.apache.org/community/css/nucleus.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/font-awesome.min.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/hybrid.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/featherlight.min.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/perfect-scrollbar.min.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/auto-complete.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/theme.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/hugo-theme.css?1660280484" rel="stylesheet">
<link href="https://shardingsphere.apache.org/community/css/theme-white.css?1660280484" rel="stylesheet">
<script src="https://shardingsphere.apache.org/community/js/jquery-2.x.min.js?1660280484"></script>
<script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?d5a1dc8dcf63a64ee55b80de01c7fb1a";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script>
<script async src="https://www.googletagmanager.com/gtag/js?id=G-HPVGEN405S"></script>
<script>
window.dataLayer = window.dataLayer || [];
function gtag(){window.dataLayer.push(arguments);}
gtag('js', new Date());
gtag('config', 'G-HPVGEN405S');
</script>
<style type="text/css">
:root #header + #content > #left > #rlblock_left{
display:none !important;
}
</style>
</head>
<body class="" data-url="/cn/contribute/release/">
<div class="change-theme">
<div class="wrap">
<span data-item="retro">
<svg t="1649761460834" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2052" width="16" height="16"><path d="M755.093336 61.436797a511.973304 511.973304 0 1 0 207.495466 693.650688l-99.615377-53.757197a398.827204 398.827204 0 1 1-161.637286-540.351253l53.757197-99.615378z" fill="#ffffff" p-id="2053"></path><path d="M1204.971593 188.84501L534.652259 736.217612l-285.242269-364.086159 86.304071-67.653615 216.199012 275.953611 583.649567-476.574007 69.335813 84.987568z" fill="#ffffff" p-id="2054"></path></svg>
复古
</span>
<span data-item="eyehelp">
<svg t="1649761460834" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2052" width="16" height="16"><path d="M755.093336 61.436797a511.973304 511.973304 0 1 0 207.495466 693.650688l-99.615377-53.757197a398.827204 398.827204 0 1 1-161.637286-540.351253l53.757197-99.615378z" fill="#ffffff" p-id="2053"></path><path d="M1204.971593 188.84501L534.652259 736.217612l-285.242269-364.086159 86.304071-67.653615 216.199012 275.953611 583.649567-476.574007 69.335813 84.987568z" fill="#ffffff" p-id="2054"></path></svg>
护眼
</span>
<span data-item="haitian">
<svg t="1649761460834" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2052" width="16" height="16"><path d="M755.093336 61.436797a511.973304 511.973304 0 1 0 207.495466 693.650688l-99.615377-53.757197a398.827204 398.827204 0 1 1-161.637286-540.351253l53.757197-99.615378z" fill="#ffffff" p-id="2053"></path><path d="M1204.971593 188.84501L534.652259 736.217612l-285.242269-364.086159 86.304071-67.653615 216.199012 275.953611 583.649567-476.574007 69.335813 84.987568z" fill="#ffffff" p-id="2054"></path></svg>
海天
</span>
<span data-item="deep">
<svg t="1649761460834" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2052" width="16" height="16"><path d="M755.093336 61.436797a511.973304 511.973304 0 1 0 207.495466 693.650688l-99.615377-53.757197a398.827204 398.827204 0 1 1-161.637286-540.351253l53.757197-99.615378z" fill="#ffffff" p-id="2053"></path><path d="M1204.971593 188.84501L534.652259 736.217612l-285.242269-364.086159 86.304071-67.653615 216.199012 275.953611 583.649567-476.574007 69.335813 84.987568z" fill="#ffffff" p-id="2054"></path></svg>
深邃
</span>
<span data-item="dark">
<svg t="1649761460834" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2052" width="16" height="16"><path d="M755.093336 61.436797a511.973304 511.973304 0 1 0 207.495466 693.650688l-99.615377-53.757197a398.827204 398.827204 0 1 1-161.637286-540.351253l53.757197-99.615378z" fill="#ffffff" p-id="2053"></path><path d="M1204.971593 188.84501L534.652259 736.217612l-285.242269-364.086159 86.304071-67.653615 216.199012 275.953611 583.649567-476.574007 69.335813 84.987568z" fill="#ffffff" p-id="2054"></path></svg>
暗黑
</span>
<span class="active">
<svg t="1649761460834" class="icon" viewBox="0 0 1243 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2052" width="16" height="16"><path d="M755.093336 61.436797a511.973304 511.973304 0 1 0 207.495466 693.650688l-99.615377-53.757197a398.827204 398.827204 0 1 1-161.637286-540.351253l53.757197-99.615378z" fill="#ffffff" p-id="2053"></path><path d="M1204.971593 188.84501L534.652259 736.217612l-285.242269-364.086159 86.304071-67.653615 216.199012 275.953611 583.649567-476.574007 69.335813 84.987568z" fill="#ffffff" p-id="2054"></path></svg>
默认
</span>
</div>
</div>
<header>
<div class="wrap">
<a href="https://shardingsphere.apache.org/"><img src="https://shardingsphere.apache.org/document/current/img/logo_v3.png" /></a>
<section id="prefooter">
<ul>
<li>
<a class="padding">
<i class="fa fa-fw fa-language"></i>
<div class="select-style">
<select id="select-language" onchange="location = this.value;">
<option id="en" value="/community/en/contribute/release/">English</option>
<option id="cn" value="/community/cn/contribute/release/" selected>简体中文</option>
</select>
<svg t="1645437162166" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="2449" width="32" height="32"><path d="M483.072 714.496l30.165333 30.208 415.957334-415.829333a42.837333 42.837333 0 0 0 0-60.288 42.538667 42.538667 0 0 0-60.330667-0.042667l-355.541333 355.413333-355.242667-355.413333a42.496 42.496 0 0 0-60.288 0 42.837333 42.837333 0 0 0-0.085333 60.330667l383.701333 383.872 1.706667 1.749333z" fill="#3D3D3D" p-id="2450"></path></svg>
</div>
</a>
</li>
</ul>
</section>
</div>
</header>
<div class="wrap">
<nav id="sidebar" class="">
<div id="header-wrapper">
<div class="searchbox">
<label for="search-by"><i class="fa fa-search"></i></label>
<input data-search-input id="search-by" type="text" placeholder="Search...">
<span data-search-clear=""><i class="fa fa-close"></i></span>
</div>
<script type="text/javascript" src="https://shardingsphere.apache.org/community/js/lunr.min.js?1660280484"></script>
<script type="text/javascript" src="https://shardingsphere.apache.org/community/js/auto-complete.js?1660280484"></script>
<script type="text/javascript">
var baseurl = "\/cn";
</script>
<script type="text/javascript" src="https://shardingsphere.apache.org/community/js/search.js?1660280484"></script>
</div>
<div class="highlightable">
<div class="leftMenu">
<ul class="topics">
<li data-nav-id="/cn/contribute/" title="参与和贡献" class="dd-item
parent
">
<a href="https://shardingsphere.apache.org/community/cn/contribute/">
<i class="collapse" style="display:inline; font-family:'courier';">
<svg class="icon icon-down"
style="display: inline-block;"
viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#777">
<path d="M500.8 604.778667L267.306667 371.392l-45.226667 45.269333 278.741333 278.613334 278.485334-278.613334-45.248-45.248z" p-id="5376" ></path>
</svg>
<svg class="icon icon-right"
style="display: none;"
viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" width="20" height="20" fill="#777">
<path d="M593.450667 512.128L360.064 278.613333l45.290667-45.226666 278.613333 278.762666L405.333333 790.613333l-45.226666-45.269333z" p-id="5605" ></path>
</svg>
</i>
<b>1. </b>参与和贡献
</a>
<ul>
<li data-nav-id="/cn/contribute/subscribe/" title="订阅指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/subscribe/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
订阅指南
</a>
</li>
<li data-nav-id="/cn/contribute/establish-project/" title="开发环境指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/establish-project/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
开发环境指南
</a>
</li>
<li data-nav-id="/cn/contribute/contributor/" title="贡献者指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/contributor/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
贡献者指南
</a>
</li>
<li data-nav-id="/cn/contribute/committer/" title="提交者指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/committer/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
提交者指南
</a>
</li>
<li data-nav-id="/cn/contribute/code-conduct/" title="开发规范" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/code-conduct/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
开发规范
</a>
</li>
<li data-nav-id="/cn/contribute/issue-conduct/" title="Issue 提交与处理规范" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/issue-conduct/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
Issue 提交与处理规范
</a>
</li>
<li data-nav-id="/cn/contribute/document-conduct/" title="文档规范" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/document-conduct/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
文档规范
</a>
</li>
<li data-nav-id="/cn/contribute/document-contributor/" title="官方文档贡献指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/document-contributor/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
官方文档贡献指南
</a>
</li>
<li data-nav-id="/cn/contribute/release/" title="ShardingSphere 发布指南" class="dd-item active">
<a href="https://shardingsphere.apache.org/community/cn/contribute/release/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
ShardingSphere 发布指南
</a>
</li>
<li data-nav-id="/cn/contribute/release-elasticjob/" title="ElasticJob 发布指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/release-elasticjob/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
ElasticJob 发布指南
</a>
</li>
<li data-nav-id="/cn/contribute/release-elasticjob-ui/" title="ElasticJob-UI 发布指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/release-elasticjob-ui/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
ElasticJob-UI 发布指南
</a>
</li>
<li data-nav-id="/cn/contribute/2fa/" title="2FA" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/2fa/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
2FA
</a>
</li>
<li data-nav-id="/cn/contribute/icla/" title="签署 iCLA 指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/icla/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
签署 iCLA 指南
</a>
</li>
<li data-nav-id="/cn/contribute/vote/" title="提交者选举流程指南" class="dd-item ">
<a href="https://shardingsphere.apache.org/community/cn/contribute/vote/">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
提交者选举流程指南
</a>
</li>
</ul>
</li>
<li data-nav-id="/cn/powered-by/" title="采用公司" class="dd-item
">
<a href="https://shardingsphere.apache.org/community/cn/powered-by/">
<i class="collapse" style="display:inline; font-family:'courier';">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
</i>
<b>2. </b>采用公司
</a>
</li>
<li data-nav-id="/cn/team/" title="团队" class="dd-item
">
<a href="https://shardingsphere.apache.org/community/cn/team/">
<i class="collapse" style="display:inline; font-family:'courier';">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
</i>
<b>3. </b>团队
</a>
</li>
<li data-nav-id="/cn/security/" title="安全" class="dd-item
">
<a href="https://shardingsphere.apache.org/community/cn/security/">
<i class="collapse" style="display:inline; font-family:'courier';">
<svg viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5375" width="20" height="20"></svg>
</i>
<b>4. </b>安全
</a>
</li>
</ul>
</div>
<a class="padding" href="https://shardingsphere.apache.org/pdf/shardingsphere_docs_cn.pdf">
下载PDF文档
</a>
<section id="footer">
<p></p>
</section>
</div>
</nav>
<section id="body">
<div id="overlay"></div>
<div class="padding highlightable">
<div>
<div id="top-bar">
<div id="top-github-link">
<a class="github-link" title='Edit this page' href="https://github.com/apache/shardingsphere/tree/master/docs/community/content/contribute/release.cn.md" target="blank">
<i class="fa fa-code-fork"></i>
<span id="top-github-link-text">Edit this page</span>
</a>
</div>
<div id="breadcrumbs" itemscope="" itemtype="http://data-vocabulary.org/Breadcrumb">
<span id="sidebar-toggle-span">
<a href="#" id="sidebar-toggle" data-sidebar-toggle="">
<i class="fa fa-bars"></i>
</a>
</span>
<span class="links">
<a href='https://shardingsphere.apache.org/community/cn/'>ShardingSphere</a> > <a href='https://shardingsphere.apache.org/community/cn/contribute/'>参与和贡献</a> > ShardingSphere 发布指南
</span>
</div>
</div>
</div>
<div id="chapter">
<div id="body-inner">
<nav id="TableOfContents">
<ul>
<li><a href="#发布前准备工作">发布前准备工作</a>
<ul>
<li><a href="#1-确认-release-note">1. 确认 Release Note</a></li>
<li><a href="#2-确认-issue-列表">2. 确认 Issue 列表</a></li>
<li><a href="#3-确认-pull-request-列表">3. 确认 Pull request 列表</a></li>
<li><a href="#4-关闭-milestone">4. 关闭 Milestone</a></li>
<li><a href="#5-发送讨论邮件">5. 发送讨论邮件</a></li>
</ul>
</li>
<li><a href="#gpg-设置">GPG 设置</a>
<ul>
<li><a href="#1-安装-gpg">1. 安装 GPG</a></li>
<li><a href="#2-创建-key">2. 创建 key</a></li>
<li><a href="#3-查看生成的-key">3. 查看生成的 key</a></li>
<li><a href="#4-将公钥同步到服务器">4. 将公钥同步到服务器</a></li>
</ul>
</li>
<li><a href="#准备发布分支">准备发布分支</a>
<ul>
<li><a href="#1-创建发布分支">1. 创建发布分支</a></li>
<li><a href="#2-更新版本说明和示例版本">2. 更新版本说明和示例版本</a></li>
<li><a href="#3-更新下载页面">3. 更新下载页面</a></li>
<li><a href="#4-更新-shardingsphere-jdbc-spring-文档中-xsd-文件链接">4. 更新 ShardingSphere-JDBC Spring 文档中 xsd 文件链接</a></li>
<li><a href="#5-修改-readme-文件">5. 修改 README 文件</a></li>
<li><a href="#6-更新-helm-chart-版本">6. 更新 Helm Chart 版本</a></li>
</ul>
</li>
<li><a href="#发布-apache-maven-中央仓库">发布 Apache Maven 中央仓库</a>
<ul>
<li><a href="#1-设置-settingsxml-文件">1. 设置 settings.xml 文件</a></li>
<li><a href="#2-发布预校验">2. 发布预校验</a></li>
<li><a href="#3-准备发布">3. 准备发布</a></li>
<li><a href="#4-部署发布">4. 部署发布</a></li>
</ul>
</li>
<li><a href="#构建-helm-chart">构建 Helm Chart</a></li>
<li><a href="#发布-apache-svn-仓库">发布 Apache SVN 仓库</a>
<ul>
<li><a href="#1-检出-shardingsphere-发布目录">1. 检出 ShardingSphere 发布目录</a></li>
<li><a href="#2-添加-gpg-公钥">2. 添加 gpg 公钥</a></li>
<li><a href="#3-将待发布的内容添加至-svn-目录">3. 将待发布的内容添加至 SVN 目录</a></li>
<li><a href="#4-提交-apache-svn">4. 提交 Apache SVN</a></li>
</ul>
</li>
<li><a href="#检查发布结果">检查发布结果</a>
<ul>
<li><a href="#1-检查-sha512-哈希">1. 检查 sha512 哈希</a></li>
<li><a href="#2-检查-gpg-签名">2. 检查 gpg 签名</a></li>
<li><a href="#3-检查发布文件内容">3. 检查发布文件内容</a></li>
</ul>
</li>
<li><a href="#发起投票">发起投票</a></li>
<li><a href="#完成发布">完成发布</a>
<ul>
<li><a href="#1-将源码二进制包以及-keys-从-svn-的-dev-目录移动到-release-目录">1. 将源码、二进制包以及 KEYS 从 svn 的 dev 目录移动到 release 目录</a></li>
<li><a href="#2-在-apache-staging-仓库找到-shardingsphere-并点击-release">2. 在 Apache Staging 仓库找到 ShardingSphere 并点击 <code>Release</code></a></li>
<li><a href="#3-发布-docker">3. 发布 Docker</a></li>
<li><a href="#4-github版本发布">4. GitHub版本发布</a></li>
<li><a href="#5-从发布区移除上一版本内容">5. 从发布区移除上一版本内容</a></li>
<li><a href="#6-上传-spring-namespace-xsd-文件至官方网站">6. 上传 Spring namespace xsd 文件至官方网站</a></li>
<li><a href="#7-官网首页增加发布版本文档入口">7. 官网首页增加发布版本文档入口</a></li>
<li><a href="#8-合并-github-的-release-分支到-master合并完成后删除-release-分支">8. 合并 GitHub 的 release 分支到 <code>master</code>,合并完成后删除 release 分支</a></li>
<li><a href="#9-生成-helm-chart-索引文件并上传">9. 生成 Helm Chart 索引文件并上传</a></li>
<li><a href="#10-邮件通知版本发布完成">10. 邮件通知版本发布完成</a></li>
</ul>
</li>
<li><a href="#附录如何中止发布流程">附录:如何中止发布流程</a>
<ul>
<li><a href="#在投票邮件回复--1-并说明中止原因">在投票邮件回复 -1 并说明中止原因</a></li>
<li><a href="#从-dev-区域移除-release-candidates">从 dev 区域移除 release candidates</a></li>
<li><a href="#drop-maven-staging-repository">Drop Maven Staging Repository</a></li>
<li><a href="#reset-发布分支并删除-tag">Reset 发布分支并删除 tag</a></li>
</ul>
</li>
</ul>
</nav>
<h2 id="发布前准备工作">发布前准备工作</h2>
<h3 id="1-确认-release-note">1. 确认 Release Note</h3>
<p>Release Note 需提供中文/英文两种版本,确认中文描述是否明确,英文翻译是否准确,并按以下标签进行分类:</p>
<ol>
<li>新功能。</li>
<li>API 变更。</li>
<li>功能增强。</li>
<li>重构。</li>
<li>漏洞修复。</li>
</ol>
<h3 id="2-确认-issue-列表">2. 确认 Issue 列表</h3>
<p>打开 <a href="https://github.com/apache/shardingsphere/issues">Github Issues</a> ,过滤 Milestone 为 <code>${RELEASE.VERSION}</code> 且状态为打开的 Issue:</p>
<ol>
<li>关闭已完成的 Issue;</li>
<li>未完成的 Issue 与负责人进行沟通,如果不影响本次发版,修改 Milestone 为下一个版本;</li>
<li>确认发布版本的 Milestone 下没有打开状态的 Issue。</li>
</ol>
<h3 id="3-确认-pull-request-列表">3. 确认 Pull request 列表</h3>
<p>打开 <a href="https://github.com/apache/shardingsphere/pulls">Github Pull requests</a> ,过滤 Milestone 为 <code>${RELEASE.VERSION}</code> 且状态为打开的 Pull request:</p>
<ol>
<li>对打开的 Pull request 进行 Review 并且 Merge;</li>
<li>无法 Merge 且不影响本次发版的 Pull request,修改 Milestone 为下一个版本;</li>
<li>确认发布版本的 Milestone 下没有打开状态的 Pull request。</li>
</ol>
<h3 id="4-关闭-milestone">4. 关闭 Milestone</h3>
<p>打开 <a href="https://github.com/apache/shardingsphere/milestones">Github Milestone</a></p>
<ol>
<li>确认 <code>${RELEASE.VERSION}</code> 的 Milestone 完成状态为 100%;</li>
<li>点击 <code>Close</code> 关闭 Milestone。</li>
</ol>
<h3 id="5-发送讨论邮件">5. 发送讨论邮件</h3>
<ol>
<li>创建 <a href="https://github.com/apache/shardingsphere/discussions">GitHub Discussion</a> 并在讨论内容中列出 Release Note;</li>
<li>发送邮件至 <a href="mailto:dev@shardingsphere.apache.org">dev@shardingsphere.apache.org</a>,在邮件正文中链接 GitHub Discussion;</li>
<li>关注邮件列表,确认社区开发者对 Release Note 没有任何疑问。</li>
</ol>
<h2 id="gpg-设置">GPG 设置</h2>
<h3 id="1-安装-gpg">1. 安装 GPG</h3>
<p><a href="https://www.gnupg.org/download/index.html">GnuPG 官网</a>下载安装包。
GnuPG 的 1.x 版本和 2.x 版本的命令有细微差别,下列说明以 <code>GnuPG-2.1.23</code> 版本为例。</p>
<p>安装完成后,执行以下命令查看版本号。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg --version
</code></pre></div><h3 id="2-创建-key">2. 创建 key</h3>
<p>安装完成后,执行以下命令创建 key。</p>
<p><code>GnuPG-2.x</code> 可使用:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg --full-gen-key
</code></pre></div><p><code>GnuPG-1.x</code> 可使用:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg --gen-key
</code></pre></div><p>根据提示完成 key:</p>
<blockquote>
<p>注意:请使用 Apache mail 生成 GPG 的 Key。</p>
</blockquote>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg <span style="color:#f92672">(</span>GnuPG<span style="color:#f92672">)</span> 2.0.12; Copyright <span style="color:#f92672">(</span>C<span style="color:#f92672">)</span> <span style="color:#ae81ff">2009</span> Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please <span style="color:#66d9ef">select</span> what kind of key you want:
<span style="color:#f92672">(</span>1<span style="color:#f92672">)</span> RSA and RSA <span style="color:#f92672">(</span>default<span style="color:#f92672">)</span>
<span style="color:#f92672">(</span>2<span style="color:#f92672">)</span> DSA and Elgamal
<span style="color:#f92672">(</span>3<span style="color:#f92672">)</span> DSA <span style="color:#f92672">(</span>sign only<span style="color:#f92672">)</span>
<span style="color:#f92672">(</span>4<span style="color:#f92672">)</span> RSA <span style="color:#f92672">(</span>sign only<span style="color:#f92672">)</span>
Your selection? <span style="color:#ae81ff">1</span>
RSA keys may be between <span style="color:#ae81ff">1024</span> and <span style="color:#ae81ff">4096</span> bits long.
What keysize <span style="color:#66d9ef">do</span> you want? <span style="color:#f92672">(</span>2048<span style="color:#f92672">)</span> <span style="color:#ae81ff">4096</span>
Requested keysize is <span style="color:#ae81ff">4096</span> bits
Please specify how long the key should be valid.
0 <span style="color:#f92672">=</span> key does not expire
&lt;n&gt; <span style="color:#f92672">=</span> key expires in n days
&lt;n&gt;w <span style="color:#f92672">=</span> key expires in n weeks
&lt;n&gt;m <span style="color:#f92672">=</span> key expires in n months
&lt;n&gt;y <span style="color:#f92672">=</span> key expires in n years
Key is valid <span style="color:#66d9ef">for</span>? <span style="color:#f92672">(</span>0<span style="color:#f92672">)</span>
Key does not expire at all
Is this correct? <span style="color:#f92672">(</span>y/N<span style="color:#f92672">)</span> y
GnuPG needs to construct a user ID to identify your key.
Real name: <span style="color:#e6db74">${</span>输入用户名<span style="color:#e6db74">}</span>
Email address: <span style="color:#e6db74">${</span>输入邮件地址<span style="color:#e6db74">}</span>
Comment: <span style="color:#e6db74">${</span>输入注释<span style="color:#e6db74">}</span>
You selected this USER-ID:
<span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>输入的用户名<span style="color:#e6db74">}</span><span style="color:#e6db74"> (</span><span style="color:#e6db74">${</span>输入的注释<span style="color:#e6db74">}</span><span style="color:#e6db74">) &lt;</span><span style="color:#e6db74">${</span>输入的邮件地址<span style="color:#e6db74">}</span><span style="color:#e6db74">&gt;&#34;</span>
Change <span style="color:#f92672">(</span>N<span style="color:#f92672">)</span>ame, <span style="color:#f92672">(</span>C<span style="color:#f92672">)</span>omment, <span style="color:#f92672">(</span>E<span style="color:#f92672">)</span>mail or <span style="color:#f92672">(</span>O<span style="color:#f92672">)</span>kay/<span style="color:#f92672">(</span>Q<span style="color:#f92672">)</span>uit? O
You need a Passphrase to protect your secret key. <span style="color:#75715e"># 输入密码</span>
</code></pre></div><h3 id="3-查看生成的-key">3. 查看生成的 key</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg --list-keys
</code></pre></div><p>执行结果:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">pub 4096R/700E6065 2019-03-20
uid <span style="color:#e6db74">${</span>用户名<span style="color:#e6db74">}</span> <span style="color:#f92672">(</span><span style="color:#e6db74">${</span>注释<span style="color:#e6db74">}</span><span style="color:#f92672">)</span> &lt;<span style="color:#f92672">{</span>邮件地址<span style="color:#f92672">}</span>&gt;
sub 4096R/0B7EF5B2 2019-03-20
</code></pre></div><p>其中 700E6065 为公钥 ID。</p>
<h3 id="4-将公钥同步到服务器">4. 将公钥同步到服务器</h3>
<p>命令如下:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg --keyserver hkp://keyserver.ubuntu.com --send-key 700E6065
</code></pre></div><p><code>keyserver.ubuntu.com</code> 为随意挑选的公钥服务器,每个服务器之间是自动同步的,选任意一个即可。</p>
<h2 id="准备发布分支">准备发布分支</h2>
<h3 id="1-创建发布分支">1. 创建发布分支</h3>
<p>假设从 Github 下载的 ShardingSphere 源代码在 <code>~/shardingsphere/</code> 目录;假设即将发布的版本为 <code>${RELEASE.VERSION}</code>
创建 <code>${RELEASE.VERSION}-release</code> 分支,接下来的操作都在该分支进行。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell"><span style="color:#75715e">## ${name} 为源码所在分支,如:master,dev-4.x</span>
git clone --branch <span style="color:#e6db74">${</span>name<span style="color:#e6db74">}</span> https://github.com/apache/shardingsphere.git ~/shardingsphere
cd ~/shardingsphere/
git pull
git checkout -b <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-release
git push origin <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-release
</code></pre></div><h3 id="2-更新版本说明和示例版本">2. 更新版本说明和示例版本</h3>
<p>在发布分支上更新如下文件,并提交 PR 到发布分支:</p>
<pre><code>https://github.com/apache/shardingsphere/blob/${RELEASE.VERSION}-release/RELEASE-NOTES.md
</code></pre><p>更新 <code>examples</code> 模块的 pom,将版本由 <code>${CURRENT.VERSION}</code> 替换为 <code>${RELEASE.VERSION}</code>,并提交 PR 到发布分支。</p>
<h3 id="3-更新下载页面">3. 更新下载页面</h3>
<p>更新如下页面:</p>
<ul>
<li><a href="https://shardingsphere.apache.org/document/current/en/downloads/">https://shardingsphere.apache.org/document/current/en/downloads/</a></li>
<li><a href="https://shardingsphere.apache.org/document/current/cn/downloads/">https://shardingsphere.apache.org/document/current/cn/downloads/</a></li>
</ul>
<p>GPG 签名文件和哈希校验文件的下载连接应该使用这个前缀:<code>https://downloads.apache.org/shardingsphere/</code></p>
<h3 id="4-更新-shardingsphere-jdbc-spring-文档中-xsd-文件链接">4. 更新 ShardingSphere-JDBC Spring 文档中 xsd 文件链接</h3>
<p>更新目录 <code>docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace</code> 下文档内的所有 xsd 链接。</p>
<p>将:</p>
<pre><code>http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding-${PREVIOUS.RELEASE.VERSION}.xsd
</code></pre><p>更新为:</p>
<pre><code>http://shardingsphere.apache.org/schema/shardingsphere/sharding/sharding-${RELEASE.VERSION}.xsd
</code></pre><p>参考命令:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">cd docs/document/content/user-manual/shardingsphere-jdbc/spring-namespace
grep -l -r <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>PREVIOUS.RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> . | xargs sed -i -e <span style="color:#e6db74">&#34;s/</span><span style="color:#e6db74">${</span>PREVIOUS.RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">/</span><span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">/g&#34;</span>
</code></pre></div><p>在文档中指定 xsd 版本,而不是直接使用 <code>sharding.xsd</code>,是为了让历史版本的文档能够对应到正确版本的 xsd 文件。</p>
<h3 id="5-修改-readme-文件">5. 修改 README 文件</h3>
<p><code>README.md</code><code>README_ZH.md</code> 里的 <code>${PREVIOUS.RELEASE.VERSION}</code> 修改为 <code>${RELEASE.VERSION}</code></p>
<h3 id="6-更新-helm-chart-版本">6. 更新 Helm Chart 版本</h3>
<p>Helm Chart 可以部署不同版本的 ShardingSphere-Proxy,版本号独立于 ShardingSphere 版本。
修改文件 <code>shardingsphere-charts/apache-shardingsphere-proxy/Chart.yaml</code> 中的 <code>version</code></p>
<h2 id="发布-apache-maven-中央仓库">发布 Apache Maven 中央仓库</h2>
<h3 id="1-设置-settingsxml-文件">1. 设置 settings.xml 文件</h3>
<p>将以下模板添加到 <code>~/.m2/settings.xml</code> 中,所有密码需要加密后再填入。
加密设置可参考<a href="http://maven.apache.org/guides/mini/guide-encryption.html">这里</a></p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-xml" data-lang="xml"><span style="color:#f92672">&lt;settings&gt;</span>
<span style="color:#f92672">&lt;servers&gt;</span>
<span style="color:#f92672">&lt;server&gt;</span>
<span style="color:#f92672">&lt;id&gt;</span>apache.snapshots.https<span style="color:#f92672">&lt;/id&gt;</span>
<span style="color:#f92672">&lt;username&gt;</span> <span style="color:#75715e">&lt;!-- APACHE LDAP 用户名 --&gt;</span> <span style="color:#f92672">&lt;/username&gt;</span>
<span style="color:#f92672">&lt;password&gt;</span> <span style="color:#75715e">&lt;!-- APACHE LDAP 加密后的密码 --&gt;</span> <span style="color:#f92672">&lt;/password&gt;</span>
<span style="color:#f92672">&lt;/server&gt;</span>
<span style="color:#f92672">&lt;server&gt;</span>
<span style="color:#f92672">&lt;id&gt;</span>apache.releases.https<span style="color:#f92672">&lt;/id&gt;</span>
<span style="color:#f92672">&lt;username&gt;</span> <span style="color:#75715e">&lt;!-- APACHE LDAP 用户名 --&gt;</span> <span style="color:#f92672">&lt;/username&gt;</span>
<span style="color:#f92672">&lt;password&gt;</span> <span style="color:#75715e">&lt;!-- APACHE LDAP 加密后的密码 --&gt;</span> <span style="color:#f92672">&lt;/password&gt;</span>
<span style="color:#f92672">&lt;/server&gt;</span>
<span style="color:#f92672">&lt;/servers&gt;</span>
<span style="color:#f92672">&lt;/settings&gt;</span>
</code></pre></div><h3 id="2-发布预校验">2. 发布预校验</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mvn release:prepare -Prelease -Darguments<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-DskipTests -Dspotless.apply.skip=true&#34;</span> -DautoVersionSubmodules<span style="color:#f92672">=</span>true -DdryRun<span style="color:#f92672">=</span>true -Dusername<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>Github用户名<span style="color:#e6db74">}</span>
</code></pre></div><p>-Prelease:选择 release 的 profile,这个 profile 会打包所有源码、jar 文件以及 ShardingSphere-Proxy 的可执行二进制包。</p>
<p>-DautoVersionSubmodules=true:作用是发布过程中版本号只需要输入一次,不必为每个子模块都输入一次。</p>
<p>-DdryRun=true:演练,即不产生版本号提交,不生成新的 tag。</p>
<h3 id="3-准备发布">3. 准备发布</h3>
<p>首先清理发布预校验本地信息。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mvn release:clean
</code></pre></div><div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mvn release:prepare -Prelease -Darguments<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-DskipTests -Dspotless.apply.skip=true&#34;</span> -DautoVersionSubmodules<span style="color:#f92672">=</span>true -DpushChanges<span style="color:#f92672">=</span>false -Dusername<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>Github 用户名<span style="color:#e6db74">}</span>
</code></pre></div><p>和上一步演练的命令基本相同,去掉了 -DdryRun=true 参数。</p>
<p>-DpushChanges=false:不要将修改后的版本号和 tag 自动提交至 Github。</p>
<p><strong>按照 <a href="#%E6%A3%80%E6%9F%A5%E5%8F%91%E5%B8%83%E7%BB%93%E6%9E%9C">检查发布结果</a> 步骤,将本地文件检查无误后</strong>,提交至 Github。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">git push origin <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-release
git push origin --tags
</code></pre></div><h3 id="4-部署发布">4. 部署发布</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mvn release:perform -Prelease -Darguments<span style="color:#f92672">=</span><span style="color:#e6db74">&#34;-DskipTests -Dspotless.apply.skip=true&#34;</span> -DautoVersionSubmodules<span style="color:#f92672">=</span>true -Dusername<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>Github 用户名<span style="color:#e6db74">}</span>
</code></pre></div><p>执行完该命令后,待发布版本会自动上传到 Apache 的临时筹备仓库 (staging repository)。
访问 <a href="https://repository.apache.org/#stagingRepositories">https://repository.apache.org/#stagingRepositories</a>,使用 Apache 的 LDAP 账户登录后,就会看到上传的版本,<code>Repository</code> 列的内容即为 ${STAGING.REPOSITORY}。
点击 <code>Close</code> 来告诉 Nexus 这个构建已经完成,只有这样该版本才是可用的。
如果电子签名等出现问题,<code>Close</code> 会失败,可以通过 <code>Activity</code> 查看失败信息。</p>
<h2 id="构建-helm-chart">构建 Helm Chart</h2>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">cd shardingsphere-charts/apache-shardingsphere-proxy/charts/governance
helm dep build
cd ../..
helm dep build
cd ..
helm package apache-shardingsphere-proxy
mv apache-shardingsphere-proxy-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz
gpg --armor --detach-sign apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz
shasum -b -a <span style="color:#ae81ff">512</span> apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz &gt; apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz.sha512
</code></pre></div><h2 id="发布-apache-svn-仓库">发布 Apache SVN 仓库</h2>
<h3 id="1-检出-shardingsphere-发布目录">1. 检出 ShardingSphere 发布目录</h3>
<p>如无本地工作目录,则先创建本地工作目录。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mkdir -p ~/ss_svn/dev/
cd ~/ss_svn/dev/
</code></pre></div><p>创建完毕后,从 Apache SVN 检出 ShardingSphere 发布目录。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">svn --username<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>APACHE LDAP 用户名<span style="color:#e6db74">}</span> co https://dist.apache.org/repos/dist/dev/shardingsphere
cd ~/ss_svn/dev/shardingsphere
</code></pre></div><h3 id="2-添加-gpg-公钥">2. 添加 gpg 公钥</h3>
<p>仅第一次部署的账号需要添加,只要 <code>KEYS</code> 中包含已经部署过的账户的公钥即可。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg -a --export <span style="color:#e6db74">${</span>GPG用户名<span style="color:#e6db74">}</span> &gt;&gt; KEYS
</code></pre></div><h3 id="3-将待发布的内容添加至-svn-目录">3. 将待发布的内容添加至 SVN 目录</h3>
<p>创建版本号目录。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mkdir -p ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
cd ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
</code></pre></div><p>将源码包、二进制包和 ShardingSphere-Proxy 可执行二进制包添加至 SVN 工作目录。</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">cp -f ~/shardingsphere/shardingsphere-distribution/shardingsphere-src-distribution/target/*.zip* ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
cp -f ~/shardingsphere/shardingsphere-distribution/shardingsphere-jdbc-distribution/target/*.tar.gz* ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
cp -f ~/shardingsphere/shardingsphere-distribution/shardingsphere-proxy-distribution/target/*.tar.gz* ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
cp -f ~/shardingsphere/shardingsphere-agent/shardingsphere-agent-distribution/target/*.tar.gz* ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
cp -f ~/shardingsphere/shardingsphere-charts/*.tgz* ~/ss_svn/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
</code></pre></div><h3 id="4-提交-apache-svn">4. 提交 Apache SVN</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">svn add *
svn --username<span style="color:#f92672">=</span><span style="color:#e6db74">${</span>APACHE LDAP 用户名<span style="color:#e6db74">}</span> commit -m <span style="color:#e6db74">&#34;release </span><span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</code></pre></div><h2 id="检查发布结果">检查发布结果</h2>
<h3 id="1-检查-sha512-哈希">1. 检查 sha512 哈希</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">shasum -c *.sha512
</code></pre></div><h3 id="2-检查-gpg-签名">2. 检查 gpg 签名</h3>
<p>首先导入发布人公钥。从 svn 仓库导入 KEYS 到本地环境。(发布版本的人不需要再导入,帮助做验证的人需要导入,用户名填发版人的即可)</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">curl https://dist.apache.org/repos/dist/dev/shardingsphere/KEYS &gt;&gt; KEYS
gpg --import KEYS
gpg --edit-key <span style="color:#e6db74">&#34;</span><span style="color:#e6db74">${</span>发布人的 gpg 用户名<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
&gt; trust
Please decide how far you trust this user to correctly verify other users<span style="color:#e6db74">&#39; keys
</span><span style="color:#e6db74">(by looking at passports, checking fingerprints from different sources, etc.)
</span><span style="color:#e6db74">
</span><span style="color:#e6db74"> 1 = I don&#39;</span>t know or won<span style="color:#960050;background-color:#1e0010">&#39;</span>t say
2 <span style="color:#f92672">=</span> I <span style="color:#66d9ef">do</span> NOT trust
3 <span style="color:#f92672">=</span> I trust marginally
4 <span style="color:#f92672">=</span> I trust fully
5 <span style="color:#f92672">=</span> I trust ultimately
m <span style="color:#f92672">=</span> back to the main menu
Your decision? <span style="color:#ae81ff">5</span>
&gt; save
</code></pre></div><p>然后进行 gpg 签名检查。</p>
<p>Bash 可以使用以下命令检查签名:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-bash" data-lang="bash"><span style="color:#66d9ef">for</span> each in <span style="color:#66d9ef">$(</span>ls *.asc<span style="color:#66d9ef">)</span>; <span style="color:#66d9ef">do</span> gpg --verify $each <span style="color:#e6db74">${</span>each%.asc<span style="color:#e6db74">}</span>; <span style="color:#66d9ef">done</span>
</code></pre></div><p>或逐个文件检查:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">gpg --verify apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-src.zip.asc apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-src.zip
gpg --verify apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-shardingsphere-jdbc-bin.tar.gz.asc apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-shardingsphere-jdbc-bin.tar.gz
gpg --verify apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-shardingsphere-proxy-bin.tar.gz.asc apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-shardingsphere-proxy-bin.tar.gz
gpg --verify apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-shardingsphere-agent-bin.tar.gz.asc apache-shardingsphere-<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-shardingsphere-agent-bin.tar.gz
gpg --verify apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz.asc apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz
</code></pre></div><h3 id="3-检查发布文件内容">3. 检查发布文件内容</h3>
<p><strong>3.1 对比源码包与 Github 上 tag 的内容差异</strong></p>
<pre><code>curl -Lo tag-${RELEASE.VERSION}.zip https://github.com/apache/shardingsphere/archive/${RELEASE.VERSION}.zip
unzip tag-${RELEASE.VERSION}.zip
unzip apache-shardingsphere-${RELEASE.VERSION}-src.zip
diff -r apache-shardingsphere-${RELEASE.VERSION}-src-release shardingsphere-${RELEASE.VERSION}
</code></pre><p><strong>3.2 检查源码包的文件内容</strong></p>
<ul>
<li>检查源码包是否包含由于包含不必要文件,致使 tarball 过于庞大;</li>
<li>存在 <code>LICENSE</code><code>NOTICE</code> 文件;</li>
<li><code>NOTICE</code> 文件中的年份正确;</li>
<li>只存在文本文件,不存在二进制文件;</li>
<li>所有文件的开头都有 ASF 许可证;</li>
<li>能够正确编译,单元测试可以通过(./mvnw -T 1C install);</li>
<li>检查是否有多余文件或文件夹,例如空文件夹等。</li>
</ul>
<p><strong>3.3 检查二进制包的文件内容</strong></p>
<p>解压缩</p>
<ul>
<li><code>apache-shardingsphere-${RELEASE.VERSION}-shardingsphere-jdbc-bin.tar.gz</code></li>
<li><code>apache-shardingsphere-${RELEASE.VERSION}-shardingsphere-proxy-bin.tar.gz</code></li>
<li><code>apache-shardingsphere-${RELEASE.VERSION}-shardingsphere-agent-bin.tar.gz</code></li>
</ul>
<p>进行如下检查:</p>
<ul>
<li>存在 <code>LICENSE</code><code>NOTICE</code> 文件;</li>
<li><code>NOTICE</code> 文件中的年份正确;</li>
<li>所有文本文件开头都有 ASF 许可证;</li>
<li>检查第三方依赖许可证:
<ul>
<li>第三方依赖的许可证兼容;</li>
<li>所有第三方依赖的许可证都在 <code>LICENSE</code> 文件中声明;</li>
<li>依赖许可证的完整版全部在 <code>license</code> 目录;</li>
<li>如果依赖的是 Apache 许可证并且存在 <code>NOTICE</code> 文件,那么这些 <code>NOTICE</code> 文件也需要加入到版本的 <code>NOTICE</code> 文件中。</li>
</ul>
</li>
</ul>
<p><strong>3.4 检查 Helm Chart 制品包内容</strong></p>
<p>解压缩 <code>apache-shardingsphere-proxy-chart-${CHART.RELEASE.VERSION}.tgz</code></p>
<p>进行如下检查:</p>
<ul>
<li>存在 <code>LICENSE</code><code>NOTICE</code> 文件;</li>
<li><code>NOTICE</code> 文件中的年份正确;</li>
<li>文本文件开头都有 ASF 许可证,以下文件或目录除外:
<ul>
<li>所有 Chart.yaml</li>
<li>所有 Chart.lock</li>
<li>charts/governance/charts 目录</li>
<li>charts/common 目录</li>
</ul>
</li>
</ul>
<h2 id="发起投票">发起投票</h2>
<p><strong>投票阶段</strong></p>
<ol>
<li>
<p>ShardingSphere 社区投票,发起投票邮件到 <code>dev@shardingsphere.apache.org</code>。PMC 需要先按照文档检查版本的正确性,然后再进行投票。
经过至少 <strong>72 小时</strong> 并统计到 <strong>3 个 <code>+1 PMC member</code></strong> 票后,即可进入下一阶段的投票。</p>
</li>
<li>
<p>宣布投票结果,发起投票结果邮件到 <a href="mailto:dev@shardingsphere.apache.org">dev@shardingsphere.apache.org</a></p>
</li>
</ol>
<p><strong>投票模板</strong></p>
<ol>
<li>ShardingSphere 社区投票模板</li>
</ol>
<p>标题:</p>
<pre><code>[VOTE] Release Apache ShardingSphere ${RELEASE.VERSION}
</code></pre><p>正文:</p>
<pre><code>Hello ShardingSphere Community,
This is a call for vote to release Apache ShardingSphere version ${RELEASE.VERSION}
Release notes:
https://github.com/apache/shardingsphere/blob/master/RELEASE-NOTES.md
The release candidates:
https://dist.apache.org/repos/dist/dev/shardingsphere/${RELEASE.VERSION}/
Maven 2 staging repository:
https://repository.apache.org/content/repositories/${STAGING.REPOSITORY}/org/apache/shardingsphere/
Git tag for the release:
https://github.com/apache/shardingsphere/tree/${RELEASE.VERSION}/
Release Commit ID:
https://github.com/apache/shardingsphere/commit/xxxxxxxxxxxxxxxxxxxxxxx
Keys to verify the Release Candidate:
https://dist.apache.org/repos/dist/dev/shardingsphere/KEYS
Look at here for how to verify this release candidate:
https://shardingsphere.apache.org/community/en/contribute/release/
GPG user ID:
${YOUR.GPG.USER.ID}
The vote will be open for at least 72 hours or until necessary number of votes are reached.
Please vote accordingly:
[ ] +1 approve
[ ] +0 no opinion
[ ] -1 disapprove with the reason
PMC vote is +1 binding, all others is +1 non-binding.
Checklist for reference:
[ ] Download links are valid.
[ ] Checksums and PGP signatures are valid.
[ ] Source code distributions have correct names matching the current release.
[ ] LICENSE and NOTICE files are correct for each ShardingSphere repo.
[ ] All files have license headers if necessary.
[ ] No compiled archives bundled in source archive.
</code></pre><ol start="2">
<li>宣布投票结果模板:</li>
</ol>
<p>标题:</p>
<pre><code>[RESULT][VOTE] Release Apache ShardingSphere ${RELEASE.VERSION}
</code></pre><p>正文:</p>
<pre><code>We’ve received 3 +1 binding votes and one +1 non-binding vote:
+1 binding, xxx
+1 binding, xxx
+1 binding, xxx
+1 non-binding, xxx
Thank you everyone for taking the time to review the release and help us.
I will process to publish the release and send ANNOUNCE.
</code></pre><h2 id="完成发布">完成发布</h2>
<h3 id="1-将源码二进制包以及-keys-从-svn-的-dev-目录移动到-release-目录">1. 将源码、二进制包以及 KEYS 从 svn 的 dev 目录移动到 release 目录</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">svn mv https://dist.apache.org/repos/dist/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span> https://dist.apache.org/repos/dist/release/shardingsphere/ -m <span style="color:#e6db74">&#34;transfer packages for </span><span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
svn delete https://dist.apache.org/repos/dist/release/shardingsphere/KEYS -m <span style="color:#e6db74">&#34;delete KEYS&#34;</span>
svn cp https://dist.apache.org/repos/dist/dev/shardingsphere/KEYS https://dist.apache.org/repos/dist/release/shardingsphere/ -m <span style="color:#e6db74">&#34;transfer KEYS for </span><span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span>
</code></pre></div><h3 id="2-在-apache-staging-仓库找到-shardingsphere-并点击-release">2. 在 Apache Staging 仓库找到 ShardingSphere 并点击 <code>Release</code></h3>
<h3 id="3-发布-docker">3. 发布 Docker</h3>
<p>3.1 准备工作</p>
<p>本地安装 Docker,并启动服务。</p>
<p>(如果使用 Docker Desktop,可以跳过该步骤)配置 QEMU:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">docker run --privileged --rm tonistiigi/binfmt --install all
</code></pre></div><p>参考文档:<a href="https://docs.docker.com/buildx/working-with-buildx/#build-multi-platform-images">Docker Buildx: Build multi-platform images</a></p>
<p>3.2 登录 Docker Registry</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">docker login
</code></pre></div><p>3.3 构建并推送 ShardingSphere-Proxy Docker image</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">git checkout <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
./mvnw -pl shardingsphere-distribution/shardingsphere-proxy-distribution -B -Prelease,docker.buildx.push clean package
</code></pre></div><p>3.4 确认发布成功</p>
<p>查看 <a href="https://hub.docker.com/r/apache/shardingsphere-proxy/">Docker Hub</a> 是否有发布的镜像,确保镜像同时支持 <code>linux/amd64</code><code>linux/arm64</code></p>
<h3 id="4-github版本发布">4. GitHub版本发布</h3>
<p><a href="https://github.com/apache/shardingsphere/releases">GitHub Releases</a> 页面的 <code>${RELEASE.VERSION}</code> 版本上点击 <code>Edit</code></p>
<p>编辑版本号及版本说明,并点击 <code>Publish release</code></p>
<h3 id="5-从发布区移除上一版本内容">5. 从发布区移除上一版本内容</h3>
<p><a href="https://dist.apache.org/repos/dist/release/shardingsphere/"><strong>发布区</strong></a> 中仅保留一个最新的版本。
确认 <a href="https://archive.apache.org/dist/shardingsphere/">Archive repository</a> 中存在上一版本后,从 <a href="https://dist.apache.org/repos/dist/release/shardingsphere/"><strong>发布区</strong></a> 删除上一版本:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">svn del -m <span style="color:#e6db74">&#34;Archiving release </span><span style="color:#e6db74">${</span>PREVIOUS.RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74">&#34;</span> https://dist.apache.org/repos/dist/release/shardingsphere/<span style="color:#e6db74">${</span>PREVIOUS.RELEASE.VERSION<span style="color:#e6db74">}</span>
</code></pre></div><p>历史版本会自动归档到 <a href="https://archive.apache.org/dist/shardingsphere/">Archive repository</a></p>
<p>孵化阶段历史版本会自动归档到 <a href="https://archive.apache.org/dist/incubator/shardingsphere/">Incubator Archive repository</a></p>
<p>参考:<a href="https://infra.apache.org/release-download-pages.html">Release Download Pages for Projects</a></p>
<h3 id="6-上传-spring-namespace-xsd-文件至官方网站">6. 上传 Spring namespace xsd 文件至官方网站</h3>
<p>提交 pull request 将源码中的 xsd 文件以及发布版本的 xsd 文件上传至 <a href="https://github.com/apache/shardingsphere-doc/tree/asf-site/schema/shardingsphere">https://github.com/apache/shardingsphere-doc/tree/asf-site/schema/shardingsphere</a></p>
<p>应上传的文件列表如下:</p>
<ul>
<li>datasource.xsd</li>
<li>datasource-${RELEASE.VERSION}.xsd</li>
<li>mode/standalone/repository.xsd</li>
<li>mode/standalone/repository-${RELEASE.VERSION}.xsd</li>
<li>mode/cluster/repository.xsd</li>
<li>mode/cluster/repository-${RELEASE.VERSION}.xsd</li>
<li>sharding.xsd</li>
<li>sharding-${RELEASE.VERSION}.xsd</li>
<li>encrypt.xsd</li>
<li>encrypt-${RELEASE.VERSION}.xsd</li>
<li>readwrite-splitting.xsd</li>
<li>readwrite-splitting-${RELEASE.VERSION}.xsd</li>
<li>shadow.xsd</li>
<li>shadow-${RELEASE.VERSION}.xsd</li>
<li>database-discovery.xsd</li>
<li>database-discovery-${RELEASE.VERSION}.xsd</li>
</ul>
<h3 id="7-官网首页增加发布版本文档入口">7. 官网首页增加发布版本文档入口</h3>
<p>参考以下代码:</p>
<ul>
<li><a href="https://github.com/apache/shardingsphere-doc/blob/10fb1b5f610fe2cac00c66abe2df7a8cc30c2a18/index.html#L88-L126">英文首页</a></li>
<li><a href="https://github.com/apache/shardingsphere-doc/blob/10fb1b5f610fe2cac00c66abe2df7a8cc30c2a18/index_zh.html#L88-L125">中文首页</a></li>
</ul>
<h3 id="8-合并-github-的-release-分支到-master合并完成后删除-release-分支">8. 合并 GitHub 的 release 分支到 <code>master</code>,合并完成后删除 release 分支</h3>
<p>确认下载页面中的新发布版本的链接可用后,在 GitHub 页面创建 Pull Request 将分支 <code>${RELEASE.VERSION}-release</code> 合并到 <code>master</code>
如果代码存在冲突,可以先把 master 分支合并到 <code>${RELEASE.VERSION}-release</code></p>
<h3 id="9-生成-helm-chart-索引文件并上传">9. 生成 Helm Chart 索引文件并上传</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">mkdir -p /tmp/charts
cd /tmp/charts
wget https://archive.apache.org/dist/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>/apache-shardingsphere-proxy-chart-<span style="color:#e6db74">${</span>CHART.RELEASE.VERSION<span style="color:#e6db74">}</span>.tgz
curl https://shardingsphere.apache.org/charts/index.yaml &gt; previous_index.yaml
helm repo index --url https://archive.apache.org/dist/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span> --merge previous_index.yaml .
</code></pre></div><p>检查生成的 <code>index.yaml</code> 文件,确认无误后更新 <a href="https://github.com/apache/shardingsphere-doc/blob/asf-site/charts/index.yaml">https://github.com/apache/shardingsphere-doc/blob/asf-site/charts/index.yaml</a></p>
<h3 id="10-邮件通知版本发布完成">10. 邮件通知版本发布完成</h3>
<p>发送邮件到 <code>dev@shardingsphere.apache.org</code><code>announce@apache.org</code> 通知完成版本发布。</p>
<p>通知邮件模板(使用纯文本模式):</p>
<p>标题:</p>
<pre><code>[ANNOUNCE] Apache ShardingSphere ${RELEASE.VERSION} available
</code></pre><p>正文:</p>
<pre><code>Hi all,
Apache ShardingSphere Team is glad to announce the new release of Apache ShardingSphere ${RELEASE.VERSION}.
Apache ShardingSphere is an open-source ecosystem consisted of a set of distributed database solutions, including 3 independent products, JDBC, Proxy &amp; Sidecar (Planning).
They all provide functions of data scale out, distributed transaction and distributed governance, applicable in a variety of situations such as Java isomorphism, heterogeneous language and cloud native.
Apache ShardingSphere aiming at reasonably making full use of the computation and storage capacity of existed database in distributed system, rather than a totally new database.
As the cornerstone of enterprises, relational database still takes a huge market share. Therefore, we prefer to focus on its increment instead of a total overturn.
Download Links: https://shardingsphere.apache.org/document/current/en/downloads/
Release Notes: https://github.com/apache/shardingsphere/blob/master/RELEASE-NOTES.md
Website: https://shardingsphere.apache.org/
ShardingSphere Resources:
- Issue: https://github.com/apache/shardingsphere/issues/
- Mailing list: dev@shardingsphere.apache.org
- Documents: https://shardingsphere.apache.org/document/current/
- Apache ShardingSphere Team
</code></pre><h2 id="附录如何中止发布流程">附录:如何中止发布流程</h2>
<p>当发布过程中发现问题,需要中止发布流程并待问题修复后重新发布,可以参考以下流程进行。</p>
<h3 id="在投票邮件回复--1-并说明中止原因">在投票邮件回复 -1 并说明中止原因</h3>
<p><code>[VOTE]</code> 邮件回复 -1,并说明中止投票的原因。</p>
<h3 id="从-dev-区域移除-release-candidates">从 dev 区域移除 release candidates</h3>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">svn del https://dist.apache.org/repos/dist/dev/shardingsphere/<span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span> -m <span style="color:#e6db74">&#34;Drop </span><span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span><span style="color:#e6db74"> release candidates&#34;</span>
</code></pre></div><h3 id="drop-maven-staging-repository">Drop Maven Staging Repository</h3>
<p><a href="https://repository.apache.org/#stagingRepositories">https://repository.apache.org/#stagingRepositories</a> 勾选本次发布的 Staging Repository,点击 <strong>Drop</strong> 按钮。</p>
<h3 id="reset-发布分支并删除-tag">Reset 发布分支并删除 tag</h3>
<p>Reset <code>${RELEASE.VERSION}-release</code> 分支到 <code>maven-release-plugin</code> 自动提交之前的 commit:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">git checkout <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>-release
git reset --hard <span style="color:#e6db74">${</span>COMMIT_ID_BEFORE_RELEASE<span style="color:#e6db74">}</span>
git push origin --force
</code></pre></div><p>删除 tag:</p>
<div class="highlight"><pre style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4"><code class="language-shell" data-lang="shell">git tag -d <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
git push origin -d <span style="color:#e6db74">${</span>RELEASE.VERSION<span style="color:#e6db74">}</span>
</code></pre></div>
<footer class=" footline" >
</footer>
</div>
</div>
</div>
<div id="navigation" >
<a class="nav nav-prev" href="https://shardingsphere.apache.org/community/cn/contribute/document-contributor/" title="官方文档贡献指南"> <i class="fa fa-long-arrow-left fa-lg"></i> 上一篇</a>
<a class="nav nav-next" href="https://shardingsphere.apache.org/community/cn/contribute/release-elasticjob/" title="ElasticJob 发布指南" style="margin-right: 0px;">下一篇 <i class="fa fa-long-arrow-right fa-lg"></i></a>
</div>
</section>
</div>
<div style="left: -1000px; overflow: scroll; position: absolute; top: -1000px; border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;">
<div style="border: none; box-sizing: content-box; height: 200px; margin: 0px; padding: 0px; width: 200px;"></div>
</div>
<script src="https://shardingsphere.apache.org/community/js/clipboard.min.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/perfect-scrollbar.min.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/perfect-scrollbar.jquery.min.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/jquery.sticky.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/featherlight.min.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/html5shiv-printshiv.min.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/highlight.pack.js?1660280484"></script>
<script>hljs.initHighlightingOnLoad();</script>
<script src="https://shardingsphere.apache.org/community/js/modernizr.custom.71422.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/learn.js?1660280484"></script>
<script src="https://shardingsphere.apache.org/community/js/hugo-learn.js?1660280484"></script>
<script>
try{
function log(fileName, category, locale){
window._hmt.push(['_trackEvent', 'document', 'download', locale ? 'PDF_'+locale : fileName]);
gtag('event', 'Downloads', {
'event_category' : locale ? 'PDF' : category,
'event_label' : locale ? locale+'.pdf' : fileName
});
}
$('.padding[href*=shardingsphere]').on('click', function(){
var locale = /cn/.test(location.pathname) ?'cn':'en';
log('','', locale)
})
function getFileName(str){
var strs = str.split('/');
return strs[strs.length - 1]
}
$('a[href$="src.zip"]').on('click', function(){
log(getFileName($(this).attr('href')), "SRC")
})
$('a[href$="zip.asc"]').on('click', function(){
log(getFileName($(this).attr('href')), "ASC")
})
$('a[href$="zip.sha512"]').on('click', function(){
log(getFileName($(this).attr('href')), "SHA512")
})
$('a[href$="tar.gz.asc"]').on('click', function(){
log(getFileName($(this).attr('href')), "ASC")
})
$('a[href$="tar.gz.sha512"]').on('click', function(){
log(getFileName($(this).attr('href')), "SHA512")
})
$('a[href$="tar.gz"]').on('click', function(){
log(getFileName($(this).attr('href')), "TAR")
})
}catch(ex){}
</script>
</body>
</html>