从源分发构建

要求在路径中有Java(JDK 8或更高版本)和Gradle(版本8.1.1)。

(源分发不包括Gradle包装器;因此,您需要手动安装Gradle。)

解压源分发 .tar.gz 文件,cd 到解压后源文件的根目录,然后使用 Gradle 构建:

$ tar xvfz apache-calcite-avatica-1.24.0-src.tar.gz
$ cd apache-calcite-avatica-1.24.0-src
$ gradle build

运行测试描述了如何运行更多或更少的测试(但应使用 gradle 命令而不是 ./gradlew)。

从 Git 构建

要求是 Git 和 Java(JDK 8或更高版本)在路径中。

创建 GitHub 存储库的本地副本,cd 到其根目录,然后使用 Gradle 构建:

$ git clone git://github.com/apache/calcite-avatica.git avatica
$ cd avatica
$ ./gradlew build

运行测试描述了如何运行更多或更少的测试。

运行测试

除非指定 -x test,否则构建时默认会运行测试套件:

$ ./gradlew assemble # 构建构件
$ ./gradlew build -x test # 构建构件,验证代码样式,跳过测试
$ ./gradlew check # 验证代码样式,执行测试
$ ./gradlew test # 执行测试
$ ./gradlew checkstyleMain checkstyleTest # 验证代码样式

您可以使用 ./gradlew assemble 构建构件并跳过所有测试和验证。

在 Docker 中运行测试

要求是 Docker 和 Docker Compose。

docker-compose run test

贡献

请参阅开发者指南。

入门

请参阅开发者指南。

开发者的高级主题

以下部分可能会引起您的兴趣,如果您正在为代码库的特定部分添加功能,则不需要理解这些主题。

开发者的高级主题

以下部分对 Calcite 提交者特别是发布经理感兴趣。

设置 PGP 签名密钥(对 Calcite 提交者)

按照此处的说明创建密钥对。(在 Mac OS X 上,我执行了 brew install gpg 和 gpg –gen-key。)

按照 KEYS 文件中的说明将您的公钥添加到 KEYS 文件中。(KEYS 文件不存在于 git 存储库或发布 tar 文件中,因为那将是多余的。)

运行 GPG 代理(对 Calcite 提交者)

默认情况下,需要您解锁 GPG 秘密密钥的 Gradle 插件会在终端中提示您。为了避免您多次输入密码,强烈建议安装并运行 gpg-agent。

这可以通过在 Linux 上的 ~/.xsession 或您选择的 shell 配置脚本(例如 ~/.bashrc 或 ~/.zshrc)中进行自动启动来实现。

GPG_AGENT=$(which gpg-agent)
GPG_TTY=`tty`
export GPG_TTY
if [[ -f "$GPG_AGENT" ]]; then
  envfile="${HOME}/.gnupg/gpg-agent.env"

  if test -f "$envfile" && kill -0 $(grep GPG_AGENT_INFO "$envfile" | cut -d: -f 2) 2>/dev/null; then
      source "$envfile"
  else
      eval "$(gpg-agent --daemon --log-file=~/.gpg/gpg.log --write-env-file "$envfile")"
  fi
  export GPG_AGENT_INFO  # 环境文件不包含 export 语句
fi

此外,请确保在 ~/.gnupg/gpg-agent.conf 中设置了 default-cache-ttl 6000,以确保您的凭据将在构建过程中被缓存。

设置 Nexus 仓库凭据(对 Calcite 提交者)

Gradle 提供了多种配置项目属性的方式。例如,您可以更新 $HOME/.gradle/gradle.properties。

注意:构建脚本将打印缺少的属性,因此您可以尝试运行它,并让其在缺少的属性上投诉。

以下选项被使用:

  • asfCommitterId=
  • asfNexusUsername=
  • asfNexusPassword=
  • asfSvnUsername=
  • asfSvnPassword=

当使用 asflike-release-environment 时,凭据将从 asfTest… (例如 asfTestNexusUsername=test) 中获取。

注意:如果要使用 gpg-agent,您需要传递 useGpgCmd 属性,并通过 signing.gnupg.keyName 指定

密钥 ID。

制作快照(对 Calcite 提交者)

开始之前:

  • 如上所述设置签名密钥。
  • 确保您正在使用 JDK 8(而不是 9 或 10)。
# 确保沙箱中没有垃圾文件
git clean -xn

./gradlew -Pasf publish

制作发布候选版(对 Calcite 提交者)

开始之前:

  • 如上所述设置签名密钥。
  • 确保您正在使用 JDK 8(而不是 9 或 10)。
  • 检查 README、site/_docs/howto.md 和 site/_docs/docker_images.md 中的版本号是否正确。
  • 检查 NOTICE 是否有当前年份的版权声明。
  • 检查 /gradle.properties 中的 calcite.avatica.version 是否有正确的值。
  • 向 site/_docs/history.md 添加发布说明。如果针对要发布的版本已经存在发布说明,但被注释掉了,请移除注释()。包括提交历史、为发布做出贡献的人员的姓名,并说明此版本已测试的 Java、Guava 和操作系统的版本。
  • 使用 ./gradlew dependencyCheckUpdate dependencyCheckAggregate 生成依赖项中存在的漏洞报告。
  • 确保每个“已解决”的 JIRA 用例(包括重复项)都分配了修复版本(最有可能是我们即将发布的版本)。

发布候选版流程不会添加提交,因此如果失败也没有关系。它可能会留下 -rc 标签,如果需要可以删除它。

您可以使用 vlsi/asflike-release-environment 进行干预发布的测试。该流程执行相同的步骤,但会将更改推送到模拟的 Nexus、Git 和 SVN 服务器。

如果任何步骤失败,请修复问题,然后从头开始。

在您的环境中直接准备发布候选版

选择发布候选版索引(从 0 开始),并确保它不会与之前版本的候选版冲突。

# 确保沙箱中没有垃圾文件
git clean -xn

# 在 asf-like-environment 中进行发布候选版的干预运行
./gradlew prepareVote -Prc=0

# 将发布候选版推送到 ASF 服务器
./gradlew prepareVote -Prc=0 -Pasf

在 Docker 中准备发布候选版

您需要安装 Docker 和 Docker Compose。

该脚本希望您将您的 ~/.gnupg 目录挂载到容器中的 /.gnupg 目录。一旦挂载到容器中,脚本将复制其内容并移动到另一个位置,以便在构建过程中不会修改您原始的 ~/.gnupg 目录的内容。

启动 asflike-release-environment 以准备干预环境以进行干预测试。

# 在 Linux 上(干预测试):
docker-compose run -v ~/.gnupg:/.gnupg dry-run

# 在 Windows 上(干预测试):
docker-compose run -v /c/Users/username/AppData/Roaming/gnupg:/.gnupg dry-run

# 在 Linux 上(推送到 ASF 服务器):
docker-compose run -v ~/.gnupg:/.gnupg publish-release-for-voting

# 在 Windows 上(推送到 ASF 服务器):
docker-compose run -v /c/Users/username/AppData/Roaming/gnupg:/.gnupg publish-release-for-voting

检查构件

在 release/build/distributions 目录中应该有以下 3 个文件之一:

  • apache-calcite-avatica-X.Y.Z-src.tar.gz
  • apache-calcite-avatica-X.Y.Z-src.tar.gz.asc
  • apache-calcite-avatica-X.Y.Z-src.tar.gz.sha512

请注意,文件名以 apache-calcite-avatica- 开头。

在源分发 .tar.gz 中(当前没有二进制分发),检查所有文件是否属于名为 apache-calcite-avatica-X.Y.Z-src 的目录。

该目录必须包含以下文件:

  • NOTICE
  • LICENSE
  • README
  • README.md

检查 README 中的版本号是否正确。

检查 LICENSE 是否与提交到 git 的文件相同。

确保以下文件不会出现在源分发中:KEYS、gradlew、gradlew.bat、gradle-wrapper.jar、gradle-wrapper.properties。

对于每个 .jar(例如 core/build/libs/avatica-core-X.Y.Z.jar 和 server/build/libs/avatica-server-X.Y.Z-sources.jar),请验证 META-INF 目录是否包含根据源/类正确的许可证和通知的内容。请参考 ASF 许可证文档,了解所需的内容。

检查 PGP,参见此处。

在 Nexus 存储库中验证分段构件:

  • 进入 https://repository.apache.org/ 并登录。
  • 在构建推广下,单击 Staging Repositories。
  • 在 Staging Repositories 标签页中,应该有一行带有配置文件 org.apache.calcite。
  • 导航到 artifact tree 并确保 .jar、.pom 和 .asc 文件存在。

失败的发布尝试后的清理(对 Calcite 提交者)

如果有什么不正确,您可以修复它,提交它,并准备下一个候选版。发布候选版标签可能会保留一段时间。

验证发布

# 检查签名密钥(例如 2AD3FAE3 是否已推送)
gpg --recv-keys key

# 检查密钥
curl -O https://dist.apache.org/repos/dist/release/calcite/KEYS

# 签名/检查 sha512 哈希
# (假设您的操作系统具有 'shasum' 命令。)
function checkHash() {
  cd "$1"
  for i in *.{pom,gz}; do
    if [ ! -f $i ]; then
      continue
    fi
   

 if [ -f $i.sha512 ]; then
      if [ "$(cat $i.sha512)" = "$(shasum -a 512 $i)" ]; then
        echo $i.sha512 present and correct
      else
        echo $i.sha512 does not match
      fi
    else
      shasum -a 512 $i > $i.sha512
      echo $i.sha512 created
    fi
  done
}
checkHash apache-calcite-avatica-X.Y.Z-rcN

通过 Apache 投票流程获得发布批准(对 Calcite 提交者)

在 dev 列表上发布投票。注意:准备投票任务的最后一步会打印草稿邮件,您可以在 /build/prepareVote/mail.txt 中找到草稿。

发送结果邮件:

发布版本

在成功的发布投票之后,我们需要将发布推送到镜像服务器和其他任务。

选择发布日期。这取决于您希望宣布发布的时间。这通常是投票关闭的一天之后。请记住 UTC 日期在太平洋时间下午 4 点更改。

在 JIRA 中,搜索所有在此版本中解决的问题,并进行批量更新,将其状态更改为“关闭”,更改注释为“已在版本 X.Y.Z(YYYY-MM-DD)中解决”(适当填写版本号和日期)。取消选中“发送此更新的邮件”。

提示:只有在确认 staged nexus 构件在仓库中推广之后,才推送 git 标签。这是因为推送标签会触发 Docker Hub 立即开始构建 Docker 映像,构建将拉取推广的构件。如果构件尚不可用,则 Docker Hub 上的构建将失败。最好在确认 nexus 构件正确推广之后继续执行以下步骤。

发布在您的环境中

# 干预发布发布候选版(推送到 asf-like-environment)
./gradlew publishDist -Prc=0

# 将发布推送到 ASF 服务器
./gradlew publishDist -Prc=0 -Pasf

如果 SVN 中有超过 2 个发布版本(参见 https://dist.apache.org/repos/dist/release/calcite),请清除最旧的版本:

svn rm https://dist.apache.org/repos/dist/release/calcite/apache-calcite-avatica-X.Y.Z

旧版本将保留在发布存档中。

使用 Docker 发布

假设已标记并推送了 rc 发布到 git 存储库。

docker-compose run promote-release

添加发布说明并宣布发布

通过复制 site/_posts/2016-11-01-release-1.9.0.md 添加发布说明,并在 gradle.properties 中更新版本号,生成 javadoc 并复制到 site/target/avatica/javadocAggregate,发布网站,并检查它是否出现在新闻内容中。

24 小时后,通过发送电子邮件到 announce@apache.org 宣布发布。您可以使用 1.8.0 公告作为模板。确保包括项目的简要描述。

发布网站(对 Calcite 提交者)

请参阅 site/README.md 中的说明。

参考资料

https://calcite.apache.org/avatica/docs/howto.html