發布手冊
1. 簡介
1.1 Apache 發布文件
參閱下列連結以了解 ASF 發布流程:
1.2 PGP 簽章
遵循 Apache 發布指南簽署發布版本,使用者也可以使用此方法來確定已下載的版本是否遭到竄改。
建立 pgp
金鑰以進行版本簽署,使用 <您的 Apache ID>@apache.org 作為金鑰的 USER-ID
有關更多詳細資訊,請參閱 Apache 發布簽署文件,OpenPGP 加密
產生金鑰的簡要流程:
- 使用
gpg --gen-key
產生新的gpg
金鑰,將金鑰長度設定為 4096 並設定為永不過期 - 使用
gpg --keyserver keys.openpgp.org --send-key <您的金鑰 ID>
將金鑰上傳至公開金鑰伺服器 - 使用
gpg --armor --export <您的金鑰 ID> >> gpgapachekey.txt
將公開金鑰匯出至文字檔 - 取得其他提交者的金鑰以進行簽署(選用)
- 將產生的金鑰新增至 KEYS 檔案(由發布管理員上傳至 svn 儲存庫)
設定預設公鑰,若有多個公鑰,修改~/.gnupg/gpg.conf
。
參考範例:
[root@localhost ~]# gpg --gen-key
gpg (GnuPG) 2.0.22; Copyright (C) 2013 Free Software Foundation, Inc.
...
# secret key generation directory
gpg: directory `/root/.gnupg' created
gpg: new configuration file `/root/.gnupg/gpg.conf' created
gpg: WARNING: options in `/root/.gnupg/gpg.conf' are not yet active during this run
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
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?
RSA keys may be between 1024 and 4096 bits long.
What keysize do you want? (2048) 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)
Key does not expire at all
Is this correct? (y/N) y
GnuPG needs to construct a user ID to identify your key.
# set USER-ID
Real name: rocketmq
Email address: rocketmq@apache.org
Comment: rocketmq
You selected this USER-ID:
"rocketmq (rocketmq) <rocketmq@apache.org>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
You need a Passphrase to protect your secret key.
...
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key 7DE280AF marked as ultimately trusted
public and secret key created and signed.
gpg: checking the trustdb
gpg: 3 marginal(s) needed, 1 complete(s) needed, PGP trust model
gpg: depth: 0 valid: 1 signed: 0 trust: 0-, 0q, 0n, 0m, 0f, 1u
pub 4096R/7DE280AF 2022-07-05
Key fingerprint = 421D C10E 9CC3 D261 9F89 C777 86BB 17AA 7DE2 80AF
uid rocketmq (rocketmq) <rocketmq@apache.org>
sub 4096R/65B9828A 2022-07-05
產生公鑰與私鑰地址:
gpg: keyring `/root/.gnupg/secring.gpg' created
gpg: keyring `/root/.gnupg/pubring.gpg' created
將產生的公鑰與私鑰轉換成 ASCII 格式:
gpg --armor --output /root/gpgtest/public-key.txt --export 7DE280AF
gpg --armor --output /root/gpgtest/private-key.txt --export-secret-keys 7DE280AF
查看金鑰清單:
[root@localhost ~]# gpg --list-keys
/root/.gnupg/pubring.gpg
------------------------
pub 4096R/7DE280AF 2022-07-05
uid rocketmq (rocketmq) <rocketmq@apache.org>
sub 4096R/65B9828A 2022-07-05
將公鑰上傳至公鑰伺服器
[root@localhost gpgtest]# gpg --keyserver keys.openpgp.org --send-key 7DE280AF
gpg: sending key 7DE280AF to hkp server keys.openpgp.org
1.3 POM 設定
設定 POM 檔,將版本部署至 ASF Nexus 儲存庫。
① 加入 Apache POM 繼承預設設定
<parent>
<groupId>org.apache</groupId>
<artifactId>apache</artifactId>
<version>XX</version>
</parent>
② 於 Maven 設定檔 settings.xml
加入金鑰資訊。
<settings>
<profiles>
<profile>
<id>signed_release</id>
<properties>
<mavenExecutorId>forked-path</mavenExecutorId>
<gpg.keyname>yourKeyName</gpg.keyname>
<deploy.url>https://dist.apache.org/repos/dist/dev/rocketmq/</deploy.url>
</properties>
</profile>
</profiles>
<servers>
<!-- To publish a snapshot of some part of Maven -->
<server>
<id>apache.snapshots.https</id>
<username>yourApacheID</username>
<!-- Use the password encryption by maven -->
<password>yourApachePassword</password>
</server>
<!-- To stage a release of some part of Maven -->
<server>
<id>apache.releases.https</id>
<username>yourApacheID</username>
<password>yourApachePassword</password>
</server>
<server>
<id>gpg.passphrase</id>
<passphrase>yourKeyPassword</passphrase>
</server>
</servers>
</settings>
建議使用 Maven 的密碼加密功能 加密 gpg.passphrase
。
③ 建置產出並簽署
mvn clean install -Papache-release
1.4 處理問題
解決與此版本相關的 JIRA 問題與 GitHub 問題。
檢查 MQVersion 是否與發布版本一致。
1.5 發布說明
透過 RocketMQ JIRA 產生發布說明並推送到 rocketmq-site,並加入版本投票電子郵件連結。
2. 建置原始碼發布
使用 Maven Release 外掛 版本發布外掛,將 Artifact 發布至 ASF Nexus 暫存儲存庫,並於版本驗證與版本投票後,複製至 Apache SVN 版本儲存庫。
2.1 檢查 RocketMQ 版本
確認 MQVersion 版本,若與 release-4.5.0
格式不符或不一致,修改為正確格式並推送到 develop
分支。
public static final int CURRENT_VERSION = Version.V4_5_0.ordinal();
2.2 ASF Nexus 儲存庫的分段
- 切換到
develop
分支,並確認與此版本相關的所有 GitHub PR 已合併。
① 設定 pom.xml
檔案
<scm>
<url>git@github.com:apache/rocketmq.git</url>
<connection>scm:git:git@github.com:apache/rocketmq.git</connection>
<developerConnection>scm:git:git@github.com:apache/rocketmq.git</developerConnection>
<tag>rocketmq-all-x.x.x</tag>
</scm>
② maven 發行外掛程式
mvn release:clean
mvn release:prepare
mvn release:perform
遵循此程序將產生的成品放置在分段儲存庫中:
mvn clean release:clean
:清除失敗的建置和捨棄的版本。mvn release:prepare -Psigned_release -Darguments="-DskipTests"
:根據SCM
屬性更新標籤。mvn -Psigned_release release:perform -Darguments="-DskipTests"
:將產生的成品分段到 Nexus 儲存庫。您可以新增-DdryRun=true
參數來執行乾運行。
完成上述程序後,您可以在本地分支的 target
目錄或 Nexus 分段儲存庫 中找到預發行版本成品。
若要只發行原始碼版本,請只保留原始碼和相關 jar 檔案,並使用 Nexus GUI 中的 delete
選項刪除其他成品。
2.3 rc 版本檔案
在預發行版本投票通過之前,它將分段在 /dev/rocketmq 中並儲存在
x.x.x-rcx/
目錄中。需要下列檔案:rocketmq-all-x1.x2.x3-bin-release.zip
rocketmq-all-x1.x2.x3-bin-release.zip.asc
rocketmq-all-x1.x2.x3-bin-release.zip.sha512
rocketmq-all-x1.x2.x3-source-release.zip
rocketmq-all-x1.x2.x3-source-release.zip.asc
rocketmq-all-x1.x2.x3-source-release.zip.sha512
使用 gpg
指令產生簽章和驗證檔案:
產生
asc
檔案gpg --clearsign rocketmq-all-x1.x2.x3-bin-release.zip
gpg --clearsign rocketmq-all-x1.x2.x3-source-release.zip產生
sha512
檔案gpg --print-md SHA512 rocketmq-all-x1.x2.x3-bin-release.zip > rocketmq-all-x1.x2.x3-bin-release.zip.sha512
gpg --print-md SHA512 rocketmq-all-x1.x2.x3-source-release.zip > rocketmq-all-x1.x2.x3-source-release.zip.sha512
原始碼和二進位版本應以 rocketmq-all
開頭,以利 RocketMQ Docker 建置。
2.4 回復並重試
如果分段過程中出現問題,請根據下列程序回復:
刪除步驟 2.2 中建立的標籤
列出所有標籤,並找出最近建立的一個
git tag -ln
從本機儲存庫中刪除標籤
git tag -d rocketmq-all-x1.x2.x3
將更新推送到 GitHub
git push origin :refs/tags/rocketmq-all-x1.x2.x3
從步驟 2.2 中的開發分支中刪除提交記錄
列出 git 日誌
git log
找出最近的提交記錄,並標記如下:
des1: [maven-release-plugin] 準備發布 rocketmq-all-4.9.2]
des2: [maven-release-plugin] 準備下一次開發迭代]
刪除提交
git reset --hard commit-id
git push origin HEAD --force
在 Nexus 中刪除要回滾的版本
回滾到步驟 2.1 並重做
3. 建立二進制版本
二進制版本和原始碼版本都是從相同的程式碼分支建立,但您應該注意作業系統版本。
某些依賴項,例如 netty tc-native
,對作業系統很敏感。
- 請務必查看預發布版本分支
- 請務必使用
mvn clean install
通過所有單元測試 - 請務必使用
mvn clean install -Pit-test
通過所有整合測試
建立成功後,您還需要產生 .asc 和 .sha512 檔案,並在驗證和投票後,最後將它們複製到 svn 儲存庫。
4. 版本驗證
4.1 二進制版本驗證檢查表
- 檢查建置依賴項的作業系統,netty-tcnative 對作業系統很敏感
- 確保授權是 Apache V2
- 如果引入了第三方依賴項,請更新 NOTICE
- 解壓縮檔案以檢查版本是否正確
- 驗證 ASC 簽章、SHA512 摘要
- 執行快速入門以啟動名稱伺服器和代理
- 執行 clusterList 命令以檢查版本是否正確
- 確保沒有 nohup.out 檔案
4.2 原始碼發行驗證清單
- 確保授權是 Apache V2
- 如果引入了第三方依賴項,請更新 NOTICE
- 解壓縮檔案以檢查版本是否正確
- 驗證 ASC 簽章、SHA512 摘要
- 編譯原始碼並執行快速啟動以啟動名稱伺服器和代理
- 執行 clusterList 指令以檢查版本是否正確
4.3 驗證工具
請按照下列步驟驗證 GPG 簽章和 SHA512 摘要。
下載發行套件、
.asc
檔案和.sha512
檔案。在 Unix 系統上,執行下列指令:
for file in `find . -type f -iname '*.asc'`
do
gpg --verify ${file}
done或
gpg --verify rocketmq-all-%version-number%-source-release.zip.asc rocketmq-all-%version-number%-bin-release.zip
如果您看到
Good signature
,表示簽章正確。gpg: Good signature from ... gpg: Signature made ...
根據 SHA512 驗證版本的相容性。
gpg --print-md SHA512 rocketmq-all-%version-number%-source-release.zip
gpg --print-md SHA512 rocketmq-all-%version-number%-bin-release.zip
5. 關閉暫存存放庫
- 預發行版本完成清單驗證後,關閉 Nexus 暫存存放庫並準備版本選舉。
- 在 Nexus 上選擇
orgapacherocketmq-XXX
待發行版本,然後按一下Close
圖示以關閉暫存存放庫。 - 關閉前,Nexus 會執行一系列簽章驗證和文字檢查。
- 如果驗證成功,Nexus 會關閉存放庫並提供暫存存放庫網址,在選舉電子郵件中標示為「暫存存放庫」。
- 如果驗證失敗,請修正問題、回滾並重新執行發行程序。
- 如果所有上述工作都完成,請使用 SVN 將其複製到 /dev/rocketmq Apache 遠端存放庫。
6. 版本選舉
RocketMQ 社群透過 dev@rocketmq.apache.org 電子郵件清單進行版本選舉。
參閱 投票程序 以了解 Apache 投票程序。
6.1 社群投票
電子郵件清單:開發人員清單
電子郵件主題:[VOTE]: Release Apache RocketMQ \<release-version> RC\<RC Number>
親愛的 RocketMQ 社群,
這是 Apache RocketMQ \<release version> 的投票。
${RocketMQ 的簡要介紹和此版本的特色。}
成品
https://dist.apache.org/repos/dist/dev/rocketmq/${release version}
暫存存放庫
https://repository.apache.org/content/repositories/orgapacherocketmq-XXX/
發行版的 Git 標籤
\<連結至 GitHub 儲存庫的標籤>
發行版標籤的雜湊
\<發行版標籤的雜湊值>
發行說明
\<插入連結至 RocketMQ 發行說明>
人工製品已使用金鑰簽署:\<簽署金鑰 ID>,可以在金鑰檔案中找到
https://dist.apache.org/repos/dist/dev/rocketmq/KEYS
投票將開放至少 72 小時,或直到達到必要的投票數。
請依據實際情況投票
[ ] +1 同意
[ ] +0 沒有意見
[ ] -1 不同意並說明理由
感謝您
Apache RocketMQ 團隊
發行版標籤的雜湊:您可以使用提交 ID。
6.2 公布結果
72 小時後,如果至少有 3 票贊成且沒有反對票,請發送以下電子郵件慶祝版本發行。
電子郵件主題:[RESULT][VOTE]: Release Apache RocketMQ \<release-version> RC\<RC Number>
親愛的 RocketMQ 社群,
Apache RocketMQ
<release version>
投票現已結束,並以 [number] 具約束力 +1 票、[number] 不具約束力 +1 票,且沒有 0 或 -1 票通過具約束力票數 +1
使用者名稱(Apache ID)
使用者名稱(Apache ID)
使用者名稱(Apache ID)
....
不具約束力票數 +1
使用者名稱(Apache ID)
....
發行版將很快發布。
感謝您
Apache RocketMQ 團隊
如果投票未通過,請修正問題、回滾、增加 RC 編號、重新開始發行程序,並重新啟動版本投票程序。
更新電子郵件主題:[RESTART][VOTE][#]: Release Apache RocketMQ \<release-version> RC\<RC Number>
7. 發行版本
Apache RocketMQ PMC 投票通過後,將版本發布至 Maven Nexus 儲存庫和 Apache 版本儲存庫。
- 發布至 Nexus 儲存庫,選取暫存區中的 orgapacherocketmq-XXX,然後按一下
Release
圖示發布。 - 發布至 Apache 版本儲存庫,使用 SVN 將版本複製至 /release/rocketmq
- 將 Apache RocketMQ 的
develop
分支合併至master
分支。 - 將發行說明新增至 Releases · apache/rocketmq。
- 建立新分支並將其命名為
release-x.x.x
。 - 更新 apache/rocketmq-site 官方網站首頁
- 新增發行說明,請參閱 4.9.3 發行說明
- 更新版本說明,請參閱 4.9.3 文件更新
8. 版本公告
電子郵件清單:announce@apache.org, users@rocketmq.apache.org,
private@rocketmq.apache.org, dev@rocketmq.apache.org
電子郵件主題: [公告] 發行 Apache RocketMQ \<release-version>
各位好,
Apache RocketMQ 團隊很榮幸地宣布 Apache RocketMQ \<release version> 發行。
${RocketMQ 的簡要介紹和此版本的特色。}
有關 Apache RocketMQ 的更多詳細資訊,請參閱
發行成品可在此下載
https://dist.apache.org/repos/dist/release/rocketmq/${release-version}
發行說明可在此找到
\<插入連結至 RocketMQ 發行說明>
感謝您
Apache RocketMQ 團隊