You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 2 Next »

作为一个RM (release manager,发布经理),需要完成如下事项:

(注意:本文是如何作为一个新RM的实践指导,因此并未对所有步骤进行“为什么需要这个步骤”的解释)


1. 创建一个 gpg KEY

对于第一次当RM的人来说,需要将进行这个步骤。


创建gpg key的要求是:使用RSA key,并且长度要大于4096 bits。

如何实现:


a. 安装gpg2软件 

MacOS: brew install gpg2

运行下述命令查看版本

$ gpg2 --version


注意:有些人电脑上安装的是gpg,他和gpg2是一致的。所以对于后续的所有命令,如果gpg2不存在,则改用gpg;如果gpg不存在,则可用gpg2;如果都不存在,请确认你至少安装了一个。。


b. 创建key

注意,在这个过程中,(1)输入名字时应该输入真实姓名;(2)使用邮箱时应该使用apache邮箱。

生成 gpg key
$ gpg2 --full-gen-key
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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 select what kind of key you want:
   (1) RSA and RSA (default)
   (2) DSA and Elgamal
   (3) DSA (sign only)
   (4) RSA (sign only)
Your selection? 1
注意:这里输入1
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 4096
注意:这里输入4096
Requested keysize is 4096 bits
Please specify how long the key should be valid.
         0 = key does not expire
      <n>  = key expires in n days
      <n>w = key expires in n weeks
      <n>m = key expires in n months
      <n>y = key expires in n years
Key is valid for? (0) 0
注意:这里输入0
Key does not expire at all
Is this correct? (y/N) y
注意:这里输入y
GnuPG needs to construct a user ID to identify your key.

Real name: your name
注意:这里输入你的名字
Email address: someone@apache.org
注意:这里输入你的邮箱
Comment: Apache IoTDB release signing key
注意:这里输入一些注释
You selected this USER-ID:
    "your name (Apache IoTDB release signing key) <someone@apache.org>"

Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
注意:这里输入O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.

然后会弹出对话框,要求你为这个gpg输入密钥。输入完毕后就创建好了。默认文件位于 ~/.gnupg目录下。

我的实践位于:~/.gnupg/openpgp-revocs.d/下的一个.rev文件

同时,终端上会输出:gpg: key 一串字符 marked as ultimately trusted

然后检查这个key是否是避免了SHA-1:

检查key
$ gpg2 --edit-key 刚才的一串数字
gpg (GnuPG) 2.2.4; Copyright (C) 2017 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.

Secret key is available.

gpg: checking the trustdb
gpg: marginals needed: 3  completes needed: 1  trust model: pgp
gpg: depth: 0  valid:   2  signed:   0  trust: 0-, 0q, 0n, 0m, 0f, 2u
gpg: next trustdb check due at 2020-01-30
sec  rsa4096/2206EF8F64C35889
     created: 2019-09-25  expires: never       usage: SC
     trust: ultimate      validity: ultimate
ssb  rsa4096/2C8DBF57147E3901
     created: 2019-09-25  expires: never       usage: E
[ultimate] (1). your name (Apache IoTDB release signing key) <someone@apache.org>

gpg> showpref
这里输入showpref
[ultimate] (1). your name (Apache IoTDB release signing key) <someone@apache.org>
     Cipher: AES256, AES192, AES, 3DES
     Digest: SHA512, SHA384, SHA256, SHA224, SHA1
     Compression: ZLIB, BZIP2, ZIP, Uncompressed
     Features: MDC, Keyserver no-modify

注意,只要在倒数第三行,看到Digest中是SHA512在最前面,SHA1在最后面即可。

务必牢记你的私钥密码,将来release时要用!


c. 上传你的key到公共服务器


$ gpg2 --keyserver pgp.mit.edu --send-keys <key id>


注意:这一步骤在国内如果没有VPN( SS之类的不算),是上传不成功的。。。

我的一个成功经验是,在以下三个网页中点击submit key按钮来手动上传:

[1] ipv4.pool.sks-keyservers.net[2] p80.pool.sks-keyservers.net
[3] http://keys.gnupg.net

手动上传的KEY内容形如:

-----BEGIN PGP PUBLIC KEY BLOCK-----

mQINBF2LLTABEACRM0lzt9BMSsIg9cCfcEBRH6Fc2etS7vrOt8NPq2VTuHYHUMzA
...
-----END PGP PUBLIC KEY BLOCK-----

然后知道你可以在[3] 中查找到你的key,才算成功。(注意,我发现查找的时候只能输入你的邮箱查找才靠谱)


c.2 寻找你认识的Apache社区的Committer来给你的公钥认证

参考链接 https://gist.github.com/F21/b0e8c62c49dfab267ff1d0c6af39ab84 主要都是对方有事情要做,所以就不详细解释了。


d. 将你的gpg 公钥加入KEYS文件中

这个步骤需要使用SVN。MacOS已经默认安装了SVN。



d.1 在dev分支中添加公钥到KEYS,用于发布RC版本

$ svn co https://dist.apache.org/repos/dist/dev/incubator/iotdb iotdb-dist-dev

$ cd iotdb-dist-dev

$ (gpg2 --list-sigs YOUR_NAME@apache.org && gpg2 --export --armor YOUR_NAME@apache.org) >> KEYS

$ svn ci -m "add gpg key for YOUR_NAME"


d.2 在release坟之中添加公钥到KEYS,用于发布正式版本

$ svn co https://dist.apache.org/repos/dist/release/incubator/iotdb iotdb-dist-release

$ cd iotdb-dist-release

$ (gpg2 --list-sigs YOUR_NAME@apache.org && gpg2 --export --armor YOUR_NAME@apache.org) >> KEYS

$ svn ci -m "add gpg key for YOUR_NAME"


e. 修改你的maven 设置

假设你的maven本地仓库地址是 ~/.m2。

如果已有~/.m2/settings.xml文件,则添加下面的<server>项,否则创建一个~/.m2/settings.xml文件:

~/.m2/settings.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<settings xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.1.0 http://maven.apache.org/xsd/settings-1.1.0.xsd" xmlns="http://maven.apache.org/SETTINGS/1.1.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <servers>
    <!-- Apache Repo Settings -->
    <server>
        <id>apache.snapshots.https</id>
        <username>{user-id}</username>
        <password>{user-pass}</password>
    </server>
    <server>
        <id>apache.releases.https</id>
        <username>{user-id}</username>
        <password>{user-pass}</password>
    </server>
  </servers>
</settings>
<profiles>
    <profile>
      <id>apache-release</id>
      <properties>
        <gpg.keyname>你的KEYID</gpg.keyname><!-- Your GPG Keyname here -->
        <!-- Use an agent: Prevents being asked for the password during the build -->
        <gpg.useagent>true</gpg.useagent>
        <gpg.passphrase>你的私钥的密码</gpg.passphrase>
      </properties>
    </profile>
</profiles>


f. 上传GPG公钥到Github账户

!!重要!! 许多教程中都没提及这一步,而如果不坐着一步的话,你在做一些步骤的时候,maven会告诉你没有权限。。

方法:

进入 https://github.com/settings/keys ,添加GPG KEYS。

如果添加后你发现这个密钥后面写了“未经过验证” (unverified),记得去将GPG key中用到的邮箱绑定到你的github账户上 (https://github.com/settings/emails )。

2. 准备发布版本

这里有两个情况:

  • 我只是发一个小版本的改动,例如已经有了0.8.0版本,我需要发布0.8.1。特点是:代码仓库中已经有了rel/0.8这个分支。
  • 我要发一个大的版本,特点是:代码仓库中有rel/0.8,但是没有rel/0.9

对于第一种情况,只需要将本地分支切换到远程的这个分支上:

$git checkout -b rel/0.8 origin/rel/0.8 

对于第二种情况,需要创建一个新分支rel/0.9,并推送到github上:

$git checkout -b rel/0.9

$git push -u origin rel/0.9

2.1 准备发布的代码

我们以要发布0.8.1为例,假设当前本地工作分支已经切换到了rel/0.8下。

这是当前的分支图,rel/0.8创建后最后一次更新位置如图黄色所示,master则还在不断地前进中。

首先我们要确定哪些内容需要进入新的release中,例如我们要将1、2放入0.8.1中,那么就通过 `git cherry-pick`的方法逐一地将这两个PR的提交加入到rel/0.8分支中(你可能要解决大量冲突。。)。

然后,修改RELEASE_NOTES.md文件,写上本次发布都有什么更新。

  • 对于bug修复,如果有issue编号的话,一定写上编号。
  • 对于新feature,一句话/关键词简述,还可以考虑加上用法介绍链接。

然后目前为止,准备工作就做好了。

注意,目前为止,pom中的版本号为:0.8.1-SNAPSHOT

然后把本地的所有修改都提交到远端。

当你频繁切换分支时,会遗留一些垃圾文件在本地。例如,master分支中增加了一个文件夹session,而0.8中并没有,当你从master切换到rel/0.8时,session这个文件夹并不能被mvn clean清理掉。

建议先将这些文件夹都删除(根据PLC4X的文档介绍,不删除的话,这些文件都会被打包到source.zip中。。。。)


!然后!务必检查所有的版本是否正确。比如如果你是从0.8.0升级成0.8.1,那就:

  • 搜索 /0.8.0/ (包含左右两边的”/“),这样可以把所有文档中的链接替换成/0.8.1/
  • 搜索0.8.0,检查所有文档中出现的和0.8.0版本相关的功能描述是否正确,并修改为0.8.1
  • 搜索0.8.0,注意Java代码中的控制台输出是否需要修改(例如CLI会打印版本号)
  • 注意TsFile的magic number不一定要修改。这个需要讨论着来。

然后开始正式的发版。

3.发布版本

3.1 自动在github上打tag,并生成各种签名文件

执行:

$ mvn release:prepare -P apache-release  -DautoVersionSubmodules=true

执行时,会让你输入三个内容:

a. 希望发布的版本号,默认值为pom中的版本号去掉“-SNAPSHOT”,一般可以不修改

b. 希望在github打的tag名字是什么,默认值为rel/0.8.1,注意我们目前使用的命名风格是: release/0.8.1

c. 下一个版本号是什么,默认值一般也是对的。


这个过程会自动地把pom中版本的“-SNAPSHOT”删除,然后在云端创建tag。

并且本地的所有pom文件都会出现一个同名的以releaseBackup为结尾的文件。

如果一切成功,恭喜!

如果不成功,要看一看原因。我遇到的问题是对于github仓库没有权限。

如果发生了失败,先执行:

$ mvn release:rollback

如果执行也失败,就再执行一次。。一般就成功了。

然而这个rollback并不会删除你本地刚才自动创建的tag,所以要手动删除,例如:$git tag -d release/0.8.1

删除远端tag:git push origin :refs/tags/release/0.8.1


如果成功了,根据PLC4X的文档,还应该去apache的仓库看一看是否有最新的记录。地址是 https://gitbox.apache.org/repos/asf?p=incubator-iotdb.git;a=shortlog;h=refs/heads/rel/0.8 注意分支名。

应该能看到刚才mvn release:prepare自动做的git操作,commit日志是:[maven-release-plugin] prepare release release/0.8.1 和 [maven-release-plugin] prepare for next development iteration


另外,如果成功,在本地的目录下,有如下文件生成:

target目录下:

apache-iotdb-0.8.1-incubating-source-release.zip
apache-iotdb-0.8.1-incubating-source-release.zip.asc
apache-iotdb-0.8.1-incubating-source-release.zip.sha512

distribution/target/目录下:

apache-iotdb-0.8.1-incubating-bin.zip
apache-iotdb-0.8.1-incubating-bin.zip.asc 
apache-iotdb-0.8.1-incubating-bin.zip.sha512

进行下验证吧(不是必须操作):

gpg2 --verify apache-iotdb-0.8.1-incubating-source-release.zip.asc apache-iotdb-0.8.1-incubating-source-release.zip

gpg2 --verify apache-iotdb-0.8.1-incubating-bin.zip.asc apache-iotdb-0.8.1-incubating-bin.zip

shasum -a512 apache-iotdb-0.8.1-incubating-source-release.zip

shasum -a512 apache-iotdb-0.8.1-incubating-bin.zip

然后和.sha512文件对比下,确认一致。


3.2 从github上下载下来源码,并重新编译后上传到Apache Nexus仓库

执行:

$ mvn release:perform -DreleaseProfiles=apache-release 

就开始真正的发布并上传到apache的服务器了。

。。。

。。。

漫长的等待

。。。

。。。

我使用教育网花费了46分钟。。


3.3 进行签名认证

首先网页打开网站 https://repository.apache.org

然后点右上角的登录!用apache账号登录。

登录成功后,你的左边栏的Repositories就会出现 Staging Repositories,点击他,能看到如下图的列表,找到项目名字为 “orgapacheiotdb-数字” 这样的一行,选中后点击上方的close按钮。

然后就开始等待完成close,期间可以点击refresh更新页面。也可以选中iotdb后,点击下方的activity,来查看具体的close进度和问题。

都没问题后就开始下一步。


3.3 上传编译好的文件到dist网站

现在可以把需要的内容都上传到dist了。

对于每次发布,可以先发布RC1版本,有问题要修改的话再发布RC2版,以此类推。在投票通过前,都发布到dev下,通过后再移动到release下。

3.3.1 发布到dev下

地址是https://dist.apache.org/repos/dist/dev/incubator/iotdb

这其实是一个SVN仓库,我们在1.d1操作步骤的时候已经将这个SVN仓库下载到本地了,本地文件夹名字叫做 iotdb-dist-dev。

下面暂时以iotdb-dist-dev为根目录,你会看到当前的目录如下图所示(应该没有0.8.1这个文件夹)

然后就按照上图所示,创建0.8.1文件夹,再创建0.8.1/rc1文件夹。

然后从iotdb源码的根目录下将README.md和RELEASE_NOTES.md拷贝进来。

再从iotdb源码/target/apache-iotdb-0.8.1-incubating-source-release.zip* (zip, zip.asc, zip.sha512三个文件)拷贝进来;

再从Iotdb源码/distribution/target/apache-iotdb-0.8.1-incubating-bin.zip* (zip, zip.asc, zip.sha512三个文件)拷贝进来;

然后用svn命令提交:

$ svn add 0.8.1

$ svn commit -m "perparing RC1 of 0.8.1 of IoTDB release"


3.4 标记github上的release为pre-release

https://github.com/apache/incubator-iotdb/releases,找到刚打的release,点击edit,选中这是个pre-release,然后保存。

3.5 写邮件

邮件标题:[VOTE] Apache IoTDB 0.8.1 (incubating) RC2 release

邮件模板:

Hi all,

(这一句是可选的) Apache IoTDB (incubating) 0.8.1 is a bug-fix version from 0.8.0. You can get its mainly changes from [5]. 

Apache IoTDB (Incubating) 0.8.1 has been staged under [2] and it’s time to vote
on accepting it for release.  All Maven artifacts are available under [1].
If approved we will seek final release approval from the IPMC.
Voting will be open for 72hr.
A minimum of 3 binding +1 votes and more binding +1 than binding -1
are required to pass.

Release tag: release/0.8.1
Hash for the release tag: 37b213b6ab6fc8ca13ab60f21dff099042a0e295

Per [3] "Before voting +1 PMC/PPMC members are required to download
the signed source code package, compile it as provided, and test
the resulting executable on their own platform, along with also
verifying that the package meets the requirements of the ASF policy
on releases."

You can achieve the above by following [4].

[ ]  +1 accept (indicate what you validated - e.g. performed the non-RM items in [4])
[ ]  -1 reject (explanation required)


(这也是可选的)Difference with RC1:

[1] https://repository.apache.org/content/repositories/orgapacheiotdb-1005
[2] https://dist.apache.org/repos/dist/dev/incubator/iotdb/0.8.1/rc2
[3] https://www.apache.org/dev/release.html#approving-a-release
[4] https://cwiki.apache.org/confluence/display/IOTDB/Validating+a+staged+Release

[5] https://dist.apache.org/repos/dist/dev/incubator/iotdb/0.8.1/rc2/RELEASE_NOTES.md


上面红色的字都是需要改的。

其中tag的hash值可以通过如下命令拿到:

$ git show release/0.8.1 --name-only

4 投票失败了怎么办

投票失败时,需要先清理战场,然后重新发布。

首先把Nexus上的发布关闭掉,方法是登录到repository.apache.org后,然后选中刚才的行,点击close按钮。

然后手动删除github上的release和tag,以及本地的tag。

删除远端tag:git push origin :refs/tags/release/0.8.1

本地的tag删除方法:

$git tag -d release/0.8.1

然后把github上rel/0.8上的最新代码中的pom中的版本号降低回0.8.1-SNAPSHOT (之前mvn release:perform的时候,被自动改成了0.8.2-SNAPSHOT了)

当然这一步你也可以用git revert 来实现。

然后开始修改各种投票中大家发现的问题。并提交到rel/0.8.

之后跳转到步骤3重新开始。

5. 投票通过后怎么办















  • No labels