發佈流程
本文档旨在概述发布 cert-manager 新版本的流程。如果您想了解更多关于当前版本和未来版本的时间表,请查看支持的版本页面。
先决条件
⛔️ 如果您不满足以下所有条件,请勿继续进行发布流程
-
您尝试执行发布的相关的 testgrid 仪表板 不应失败。
-
cert-manager 的
govulncheck
GitHub Action 必须在您尝试发布的 branch 上通过。如有必要,请在本地运行make verify-govulncheck
。 -
发布过程大约需要 40 分钟。您必须有时间完成所有步骤。
-
您需要在 cert-manager 项目上拥有 GitHub
admin
权限。要检查您是否拥有admin
角色,请运行brew install ghgh auth logingh api /repos/cert-manager/cert-manager/collaborators/$(gh api /user | jq -r .login)/permission | jq .permission如果您的权限是
admin
,那么您就可以继续了。要在 cert-manager 项目上请求admin
权限,请开启一个 PR,并附上此处的链接。 -
您需要被添加到 GCP 项目 cert-manager-release 作为“编辑者”。要检查您是否拥有访问权限,请尝试打开Cloud Build 页面。要在 GCP 项目上获得“编辑者”权限,您需要成为维护者。如果您是维护者,请在
variables.tf
中的发布管理器列表中添加您的电子邮件地址,并开启一个 PR。您可以使用以下 PR 描述
Title: Access to the cert-manager-release GCP projectHi. As stated in "Prerequisites" on the [release-process][1] page,I need access to the [cert-manager-release][2] project on GCP inorder to perform the release process. Thanks![1]: https://cert-manager.dev.org.tw/docs/contributing/release-process/#prerequisites[2]: https://console.cloud.google.com/?project=cert-manager-release
本指南适用于使用 make
发布的 cert-manager 版本,即 cert-manager 1.8 及更新的每个版本。
如果您需要发布 cert-manager 1.7 或更早的版本,请参阅较旧的版本。
工具设置
首先,请确保您拥有执行 cert-manager 发布所需的所有工具
-
安装
release-notes
CLIgo install k8s.io/release/cmd/release-notes@v0.13.0 -
安装我们的
cmrel
CLIgo install github.com/cert-manager/release/cmd/cmrel@latest -
克隆
cert-manager/release
仓库# Don't clone it from inside the cert-manager repo folder.git clone https://github.com/cert-manager/releasecd release -
安装
gcloud
CLI。 -
登入
gcloud
gcloud auth application-default login -
确保
gcloud
指向 cert-manager-release 项目gcloud config set project cert-manager-releaseexport CLOUDSDK_CORE_PROJECT=cert-manager-release # this is used by cmrel -
在此处获取一个未勾选任何 scope 的 GitHub 访问令牌。它仅由
release-notes
CLI 使用,以避免 API 速率限制,因为它会逐个遍历所有 PR。
小版本发布
小版本发布是一个向后兼容的“功能”发布。它可以包含新功能和错误修复。
发布版本的流程
🔰 如果某个步骤缺失或已过时,请点击此页面右上角的 编辑此页面 按钮。
-
通过查看下表来回顾我们的发布术语。这将使您能够通过查看步骤的标题来了解要跳过哪些步骤,例如, (仅限最终版本) 表示此步骤仅在执行最终版本时才必须执行。
发布类型 git tag 示例 初始 alpha 版本 v1.3.0-alpha.0
后续 alpha 版本 v1.3.0-alpha.1
初始 beta 版本 v1.3.0-beta.0
后续 beta 版本 v1.3.0-beta.1
最终版本 v1.3.0
(可选)补丁预发布1 v1.3.1-beta.0
补丁版本(或“点版本”) v1.3.1
-
通过将以下代码段复制到 shell 表中来设置 4 个环境变量
export RELEASE_VERSION="v1.3.0-alpha.0"export START_TAG="v1.2.0"export END_REV="release-1.3"export BRANCH="release-1.3"注意:为了帮助您填写正确的值,请使用以下示例
变量 示例 1 示例 2 示例 2 示例 3 示例 4 初始 alpha 后续 alpha beta 版本 最终版本 补丁版本 RELEASE_VERSION
v1.3.0-alpha.0
v1.3.0-alpha.1
v1.3.0-beta.0
v1.3.0
v1.3.1
START_TAG
v1.2.0
v1.3.0-alpha.0
v1.3.0-alpha.1
v1.2.0
*v1.3.0
END_REV
master
master
release-1.3
release-1.3
release-1.3
BRANCH
master
master
release-1.3
release-1.3
release-1.3
*请勿在此处使用补丁(例如,没有
v1.2.3
)。它必须是v1.2.0
:您必须使用属于您正在发布的发布分支的最新标签;在上面的示例中,发布分支是release-1.3
,并且该分支上的最新标签是v1.2.0
。注意:这 4 个变量在
release-notes
工具的 README 中进行了描述。为了方便起见,下表总结了您需要知道的内容变量 描述 RELEASE_VERSION
git 标签 START_TAG
*“上一个”* 版本的 git 标签 END_REV
您的发布分支的名称(包括) BRANCH
您的发布分支的名称 -
(仅限最终版本)准备网站“升级说明”PR。
确保具有新升级文档的 PR 已准备好在 cert-manager/website 上合并。例如,请参见 upgrading-1.0-1.1。
-
(最终版本 + 补丁版本)准备网站“发布说明”PR。
⚠️ 此步骤可以提前完成。
以下步骤需要在
master
(最终版本)或release-1.x
(补丁版本)上进行。PR 将在发布后合并。使用下面的说明(Ctrl+F 并查找
github-release-description.md
)转到“生成github-release-description.md
”部分。2. 删除“依赖项”部分。3. 对于 Markdown 文件中的每个项目符号,阅读更改日志条目,并检查其是否符合发布说明准则。如果您发现某个更改日志条目不符合准则,则- 转到该 PR 并编辑 PR 描述,以更改
release-note
代码块的内容。 - 返回到发布说明页面,并将相同的更改复制到
release-notes.md
中(或重新生成该文件)。
并将相同的更改复制到
release-notes.md
中(或重新生成该文件)。4. 通过参考之前的发布说明页面,添加“主要主题”和“社区”部分。5. 使用以下命令将 GitHub 问题编号和 GitHub 句柄(例如,#1234
或@maelvls
)替换为实际链接sed -E \-e 's$#([0-9]+)$[#\1](https://github.com/cert-manager/cert-manager/pull/\1)$g' \-e 's$@(\w+)$[@\1](https://github.com/\1)$g' \github-release-description.md >release-notes.md-
将
release-notes.md
移动到网站仓库# From the cert-manager repo.mv release-notes.md ../website/content/docs/release-notes-1.X.md -
向
content/docs/manifest.json
添加一个条目{"title": "Release Notes","routes": [+ {+ "title": "v1.12",+ "path": "/docs/release-notes/release-notes-1.12.md"+ }, -
向文件
content/docs/release-notes/README.md
添加一行。
- 转到该 PR 并编辑 PR 描述,以更改
-
(最终版本 + 补丁版本)准备网站“Bump Versions”PR。
⚠️ 此步骤可以提前完成。
在该 PR 中
-
(最终版本)更新supported-releases页面中的“支持的版本”部分。
-
(最终版本)更新supported-releases页面上的“我们如何确定支持的 Kubernetes 版本”部分。
-
(最终版本)更新
scripts/gendocs/generate-new-import-path-docs
中显示的 version。例如-LATEST_VERSION="v1.11-docs"+LATEST_VERSION="v1.12-docs"-genversionwithcli "release-1.11" "$LATEST_VERSION"+genversionwithcli "release-1.12" "$LATEST_VERSION" -
(最新次要版本的最終版 + 修補程式發布)在
variables.json
檔案中更新最新的 cert-manager 版本變數。-"cert_manager_latest_version": "v1.14.2",+"cert_manager_latest_version": "v1.14.3", -
(僅限最終版本)建立一份副本以凍結
docs/
資料夾,從該副本中移除不適合版本化的頁面,並更新manifest.json
檔案export RELEASE=1.15cp -r content/docs content/v${RELEASE}-docsrm -rf content/v${RELEASE}-docs/{release-notes,contributing}sed -i.bak "s|/docs/|/v${RELEASE}-docs/|g" content/v${RELEASE}-docs/manifest.jsonjq < content/v${RELEASE}-docs/manifest.json >/tmp/manifest \'del(.routes[0].routes[] | select(.title | test("Releases|Contributing")))'mv /tmp/manifest content/v${RELEASE}-docs/manifest.json -
# From the website repository, on the master branch../scripts/gendocs/generate
-
-
檢查
origin
遠端是否正確。為此,請執行以下命令,並確保它傳回上游的https://github.com/cert-manager/cert-manager.git
# Must be run from the cert-manager repo folder.git remote -v | grep origin應該會顯示
origin https://github.com/cert-manager/cert-manager (fetch)origin https://github.com/cert-manager/cert-manager (push) -
將自己置於正確的分支上
-
(初始 alpha 和後續 alpha):將自己置於
master
分支上git checkout mastergit pull origin master -
(僅限初始 beta)發布分支尚不存在,因此讓我們建立並推送它
# Must be run from the cert-manager repo folder.git checkout mastergit pull origin mastergit checkout -b release-1.12 mastergit push origin release-1.12GitHub 權限:只有當您在 cert-manager 儲存庫上擁有
admin
GitHub 權限來建立或推送分支時,git push
才會生效,請參閱先決條件。如果您沒有此權限,則必須開啟 PR 以將 master 合併到發布分支中,並等待 PR 檢查通過。 -
(後續 beta、修補程式發布和最終版本):將自己置於發布分支上
git checkout release-1.12git pull origin release-1.12您不需要快轉分支,因為已使用
/cherry-pick release-1.0
合併了內容。關於程式碼凍結的注意事項
第一個 beta 版本會開始新的「程式碼凍結」期間,該期間會持續到最終版本。在程式碼凍結之前,我們會將所有內容從 master 快轉到發布分支中。
在程式碼凍結期間,我們會像平常一樣繼續將 PR 合併到 master 中。
我們不會為第二個(和後續)beta 版本將 master 快轉到發布分支中,而只會
/cherry-pick release-1.0
應該是後續 beta 版本一部分的修正。我們不會為修補程式發布和最終版本進行快轉;相反地,我們會使用
/cherry-pick release-1.0
命令準備這些版本。
關於分支保護的注意事項:發布分支受到GitHub 分支保護的保護,該保護由 Prow 自動設定。這會防止任何人不小心直接將變更推送至這些分支,即使是儲存庫管理員也一樣。如果您因為某些原因需要快轉發布分支,則應使用GitHub 分支保護 Web UI刪除該發布分支的分支保護。這只是為了讓您更新分支的臨時變更。Prow 將在 24 小時內重新套用分支保護。
-
-
在本機建立新版本所需的標籤,並將其推送到上游(開始 cert-manager 建置)
echo $RELEASE_VERSIONgit tag -m"$RELEASE_VERSION" $RELEASE_VERSION# be sure to push the named tag explicitly; you don't want to push any other local tags!git push origin $RELEASE_VERSION注意:只有當您在 cert-manager 儲存庫上擁有
admin
GitHub 權限來建立或推送分支時,git push
才會生效,請參閱先決條件。如果您沒有此權限,則必須開啟 PR 以將 master 合併到發布分支中,並等待 PR 檢查通過。注意 2:對於 cert-manager 的最新版本,正在推送的標籤會觸發 Google Cloud Build 作業開始,並使用
gcb/build_cert_manager.yaml
中的步驟開始建置。具有 GCP 上 cert-manager-release 專案存取權的使用者應該能夠在 GCB 建置歷史記錄中檢視記錄。 -
僅限 (1.12、1.13 和 1.14)
在此步驟中,我們確保第三方可以匯入 Go 模組
github.com/cert-manager/cert-manager/cmd/ctl
。首先,建立一個臨時分支。
# Must be run from the cert-manager repo folder.git checkout -b "update-cmd/ctl/$RELEASE_VERSION"其次,使用我們剛剛建立的標籤更新
cmd/ctl
的go.mod
# Must be run from the cert-manager repo folder.cd cmd/ctlgo get github.com/cert-manager/cert-manager@$RELEASE_VERSIONcd ../..make tidygit add "**/go.mod" "**/go.sum"git commit --signoff -m"Update cmd/ctl's go.mod to $RELEASE_VERSION"然後,將分支推送到您的 cert-manager 分支。例如
# Must be run from the cert-manager repo folder.gh repo fork --remote-name forkgit push -u fork "update-cmd/ctl/$RELEASE_VERSION"然後,開啟 PR 以合併該變更,並使用以下命令返回發布分支
gh pr create \--title "[Release $RELEASE_VERSION] Update cmd/cmctl's go.mod to $RELEASE_VERSION" \--body-file - --base $BRANCH <<EOFThis PR cmd/cmctl's go.mod to $RELEASE_VERSION as part of the release process.**To the reviewer:** the version changes in \`go.mod\` must be reviewed.\`\`\`release-noteNONE\`\`\`EOF等待 PR 被合併。
最後,為
cmd/ctl
模組建立標籤# Must be run from the cert-manager repo folder.git fetch origin $BRANCHgit checkout $BRANCHgit pull --ff-only origin $BRANCHgit tag -m"cmd/ctl/$RELEASE_VERSION" "cmd/ctl/$RELEASE_VERSION" origin/$BRANCHgit push origin "cmd/ctl/$RELEASE_VERSION"注意:我們需要這樣做的原因在 Stack Overflow 上說明:如何管理子模組的版本
-
在本節中,我們將建立 GitHub 發布的描述。
注意:此步驟是關於建立將會複製貼上到 GitHub 發布頁面中的描述。網站上「發行說明」頁面的建立會在之前的步驟中完成。
-
檢查所有 4 個環境變數是否已準備就緒
echo $RELEASE_VERSIONecho $START_TAGecho $END_REVecho $BRANCH -
使用以下命令產生
github-release-description.md
# Must be run from the cert-manager folder.export GITHUB_TOKEN=$(gh auth token)git fetch origin $BRANCHexport START_SHA="$(git rev-list --reverse --ancestry-path $(git merge-base $START_TAG $BRANCH)..$BRANCH | head -1)"release-notes --debug --repo-path cert-manager \--org cert-manager --repo cert-manager \--required-author "cert-manager-prow[bot]" \--markdown-links=false \--output github-release-description.mdGitHub 權杖不需要任何範圍。僅需要權杖以避免匿名 API 使用者受到的速率限制。
-
在頂端新增一句摘要。
-
(僅限最終版本)撰寫「社群」章節,遵循過去發布版本的範例,例如 v1.12.0。如果任何使用者沒有做出程式碼貢獻,但在其他方面(測試、PR 討論等)提供了幫助,請務必在這裡感謝他們!
-
-
檢查在您推送標籤時自動觸發的建置是否已完成,並傳送有關發布的 Slack 訊息
-
將第一則 Slack 訊息傳送至
#cert-manager-dev
發布
1.2.0-alpha.2
🧵 -
檢查建置是否在 GCB 建置歷史記錄中完成。
🔰 請快速查看建置記錄,因為它可能包含我們忘記隱藏的一些未編輯資料。我們會盡力確保敏感資料已正確編輯,但有時我們會忘記更新此內容。
-
複製建置記錄 URL,並回覆第一則訊息,傳送第二則包含 Cloud Build 作業連結的 Slack 訊息。例如,訊息可能如下所示
-
-
執行
cmrel publish
-
執行
cmrel publish
試執行,以確保所有已暫存的資源都有效。執行以下命令# Must be run from the "cert-manager/release" repo folder.cmrel publish --release-name "$RELEASE_VERSION"您可以透過按一下此命令輸出中的 Google Cloud Build URL 來檢視進度。
-
在建置執行時,回覆第一則訊息,傳送第三則 Slack 訊息
-
現在實際發布發布成品。以下命令會將成品發布到 GitHub、
Quay.io
以及我們的helm 圖表儲存庫# Must be run from the "cert-manager/release" repo folder.cmrel publish --nomock --release-name "$RELEASE_VERSION" -
在建置執行時,回覆第一則訊息,傳送第四則 Slack 訊息
-
-
發布 GitHub 發布
-
造訪 GitHub 草稿發布,並貼上您先前產生的發行說明。您將需要手動編輯內容以符合先前發布版本的樣式。尤其,記得移除與套件相關的變更。
-
(僅限初始 alpha、後續 alpha 和 beta)勾選「這是一個預先發布版本」方塊。
-
(最終版本和修補程式發布)勾選「設定為最新版本」方塊。
-
按一下「發布」以讓 GitHub 發布生效。
-
-
合併包含 Helm 圖表的提取請求
重要事項:此 PR 目前只能由 Venafi 員工合併,但我們正努力盡快修復此問題。變更此內容需要我們提出遷移 Helm 圖表儲存位置的計劃,並確保我們不會中斷任何人的作業。
cert-manager 的 Helm 圖表是使用 Cloudflare 頁面提供的,Helm 圖表檔案和中繼資料儲存在Jetstack 圖表儲存庫中。
cmrel publish --nomock
步驟(以上)將會在該儲存庫中建立 PR,您現在必須依以下步驟檢閱並合併:- 造訪提取請求
- 檢閱變更
- 修正任何失敗的檢查
- 測試圖表
- 從提取請求下載圖表 tarball
- 啟動新的本機 Kind 叢集
kind create cluster --name release
- 將 helm 圖表安裝到 kind 叢集
helm install cert-manager ./cert-manager-v0.15.0.tgz --set crds.enabled=true -n cert-manager
- 確保安裝成功且所有元件都在執行
- 關閉 kind 叢集
kind delete cluster --name release
- 合併 PR
- 檢查 cert-manager Helm 圖表是否在 ArtifactHUB 上可見。
-
(最終版 + 修補程式發布)合併 4 個網站 PR
-
合併您先前建立的「發行說明」、「升級說明」和「凍結和更新版本」的 PR。
-
透過按一下這裡建立 PR「將 release-next 合併到 master」。
如果您看到標籤
dco-signoff: no
,請在 PR 上新增帶有以下內容的註解/override dco此命令是必要的,因為某些合併提交是由機器人撰寫的,且沒有 DCO 簽署。
-
-
僅限 (1.14 和更低版本)
為
cmctl
開啟一個Homebrew 公式更新的 PR。ℹ️ 如果您發佈的是 cert-manager 的
latest
版本,PR 會自動建立,在這種情況下,可以跳過此步驟。但如果您發佈的是先前版本的修補程式,則不能跳過。假設您已安裝
brew
,您可以使用brew bump-formula-pr
命令來執行此操作。您需要新的標籤名稱和該標籤的 commit hash。請參閱brew bump-formula-pr --help
以獲取最新的詳細資訊,但命令格式將如下所示:brew bump-formula-pr --dry-run --tag v0.10.0 --revision da3265115bfd8be5780801cc6105fa857ef71965 cmctl將標籤和修訂版本替換為新的版本。
Homebrew 團隊需要時間審核。一旦針對 https://github.com/homebrew/homebrew-core 開啟 pull request 後,請繼續執行後續的發佈步驟。
-
在 Slack 上回覆第一則訊息。切換「同時發送至
#cert-manager-dev
」的核取方塊,以便訊息清晰可見。也將訊息轉貼到#cert-manager
。 -
(僅限最終版本)向世界展示發佈版本
-
傳送電子郵件至
cert-manager-dev@googlegroups.com
,並加上release
標籤(範例)。 -
在 cert-manager Twitter 帳戶上發送推文!登入詳細資訊在 Jetstack 的 1password 中(目前)。(推文範例)。請務必讓 @JetstackHQ 轉發!
-
從 cert-manager Mastodon 帳戶發送 toot!登入詳細資訊在 Jetstack 的 1password 中(目前)。(Toot 範例)
-
-
繼續執行發佈後的「測試和發佈」步驟
-
(僅限初始 beta 版本)在 cert-manager/testing 上建立 PR,以便將新版本新增至我們的定期 ProwJobs 清單。請使用此 PR 作為範例。您需要執行
make prowgen
命令來產生新的設定檔。 -
(僅限最終版本)在 cert-manager/testing 上建立 PR,從 prow 設定中移除任何不支援的版本。
-
(僅限最終版本)在
cert-manager/testing
中,檢查milestone_applier
設定,以便將在 master 上新提出的 PR 套用到下一個新版本的里程碑。同時檢查發佈分支的必要狀態檢查和 testgrid 儀表板設定。
如果下一個版本的 里程碑不存在,請先建立它。如果您認為剛發佈的版本里程碑已完成,請將其關閉。
-
針對 Krew 索引開啟 PR,例如這個 PR,提升我們的 kubectl 外掛程式的版本。只有在 cmctl/kubectl 外掛程式功能發生重大變更或在新主要版本的首次發佈之後,這才可能值得。
-
建立新的 OLM 套件並發佈到 OperatorHub
cert-manager 可以使用 Operator Lifecycle Manager (OLM) 進行安裝,因此我們需要為每個 cert-manager 版本建立 OLM 套件,並將它們發佈到
operatorhub.io
和 RedHat OpenShift 的對應套件索引。遵循cert-manager OLM 發佈流程,並在發佈後,驗證 cert-manager OLM 安裝指示仍然有效。
-
舊版本
以上指南僅適用於 v1.8 及更新版本的 cert-manager。
較舊的版本是使用 Bazel 建置的,而建置流程中的這種差異反映在發佈流程中。
cert-manager 1.6 和 1.7
請遵循 GitHub 上發佈流程的這個舊版本,而不是本網站上的指南。
最顯著的差異是您將呼叫 cmrel stage
而不是 cmrel makestage
。您應該可以使用最新版本的 cmrel
來執行發佈。
cert-manager 1.5 和更早版本
如果您發佈的是 1.5 或更早版本,您也必須確保安裝不同版本的 cmrel
。
在您安裝 cmrel
的步驟中,您需要改為執行以下命令
go install github.com/cert-manager/release/cmd/cmrel@cert-manager-pre-1.6
這將確保您使用的 cmrel
版本與您要發佈的 cert-manager 版本相容。
此外,當您檢出 cert-manager/release
儲存庫時,您應該務必檢出該儲存庫中的 cert-manager-pre-1.6
標籤
git checkout cert-manager-pre-1.6
除了不同的 cert-manager/release
標籤和 cmrel
版本之外,您可以遵循與 1.6 和 1.7 相同的相同較舊版本發佈文件,只需記住變更您安裝的 cmrel
版本!
附註
-
可能會建立一個或多個「修補程式預發行版」,以允許社群在一般提供修正程式之前,自願測試錯誤修正或安全性修正。修補程式預發行版必須使用
-beta
後綴。↩