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

Compare with Current View Page History

Version 1 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,才算成功。(注意,我发现查找的时候只能输入你的邮箱查找才靠谱)


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中。。。。)

然后开始正式的发版。

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


如果成功了,根据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


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三个文件)拷贝进来;









  • No labels