注意

本文档适用于 Ceph 开发版本。

Ceph发布流程

前提条件

签名机器

签名机器是Sepia实验室中的一个虚拟机Sepia实验室. SSH访问签名机器仅限于通常的基础设施管理员以及一些其他组件负责人(例如,nfs-ganesha、ceph-iscsi)。

The ubuntu机器上的用户有一些构建脚本这些脚本有助于拉取、推送和签名软件包。

GPG签名密钥永久存储在Nitrokey Pro上,并通过RHV传递到虚拟机。这有助于确保密钥不会被导出或以任何方式离开数据中心。

新的主要版本

对于每个新的主要(字母顺序)版本,您必须创建一个ceph-release每个RPM仓库的RPM(例如,一个用于el8和一个用于el9)。chacra是我们用来存储DEB和RPM仓库的python服务。chacra仓库配置为包含此ceph-release RPM,但它必须单独构建。您必须确保chacra正确配置为包含每个特定版本的RPM。

  1. 更新chacra,使其了解新的Ceph发布。参见此PR的示例。

  2. 重新部署chacra(例如,ansible-playbook chacra.ceph.com.yml)

  3. 在你克隆仓库的目录中运行https://jenkins.ceph.com/view/all/job/ceph-release-rpm/

概要构建过程

  1. QE完成测试并找到一个停止点。该提交被推送到$release-releaseceph.git中的分支(例如,squid-release)。这允许在开发分支中继续工作,而无需在发布过程中冻结它。$release branch without having to freeze it during the release process.

  2. Ceph委员会批准并通知“构建负责人”。

  3. “构建负责人”开始启动Jenkins多任务,这会触发所有构建。

  4. 软件包被推送到chacra.ceph.com。

  5. 软件包从chacra.ceph.com被拉取到签名虚拟机。

  6. 软件包被签名。

  7. 软件包被推送到download.ceph.com上的预发布区域。

  8. 预发布容器被构建并推送到quay.ceph.io。

  9. 在预发布软件包和容器上进行最终测试和验证。

  10. 预发布软件包和容器被提升到download.ceph.com和quay.io上的正式发布。

热修复发布流程偏差

热修复发布有一些不同之处。

  1. 检出最新的标签。例如,如果我们正在基于19.2.1发布热修复,git checkout -f -B squid-release tags/v19.2.1.

  2. git cherry-pick -x所需的热修复提交(注意:只能使用“cherry-pick”)。

  3. git push -f origin squid-release.

  4. 验证$release-release分支变基:

    1. 中的提交。为了与先前的点发布(如果我们正在制作19.2.2,这将 是19.2.1)进行对比,运行git log --pretty=oneline --no-merges tags/v19.2.1..origin/squid-release。验证生成的提交是否与我们希望在下一个点发布中包含的完全一致。

    2. 为了与“ceph-ci”仓库中的RC(在本例中)进行对比,运行ceph-ci in this example), run git log --pretty=oneline --no-merges origin/squid-release...ceph-ci/squid-release。如果$release-releaseceph仓库中的分支与ceph-ci中的RC相同,则不应产生任何输出。注意git三重点符号的使用,它显示了两个引用之间的任何提交差异。

  5. 通知“构建负责人”开始构建。

  6. “构建负责人”应该设置RELEASE_TYPE=HOTFIX instead of STABLE.

安全发布流程偏差

一个安全/CVE发布与热修复发布类似,但有两个不同之处:

  1. 修复程序应该被推送到ceph-private仓库而不是ceph.git(需要GitHub管理员角色)。

  2. 标签(例如,v19.2.3)必须由“构建负责人”手动推送到ceph.git。

  1. 检出最新的标签。例如,如果我们正在基于19.2.2发布安全修复,git checkout -f -B squid-release origin/v19.2.2

  2. git cherry-pick -x所需的安全修复提交

  3. git remote add security git@github.com:ceph/ceph-private.git

  4. git push -f security squid-release

  5. 通知“构建负责人”开始构建。

  6. “构建负责人”应该设置RELEASE_TYPE=SECURITY instead of STABLE.

  7. 最后,ceph-tag步骤需要由“构建负责人”尽可能接近公告时间手动运行:

    # Example using squid pretending 19.2.3 is the security release version
    # Add the ceph-releases repo (also requires GitHub Admin Role). The `ceph-setup <https://jenkins.ceph.com/job/ceph-setup>`_ job will have already created and pushed the tag to ceph-releases.git.
    git remote add releases git@github.com:ceph/ceph-releases.git
    git fetch --all
    # Check out the version commit
    git checkout -f -B squid-release releases/squid-release
    git push -f origin squid-release
    git push origin v19.2.3
    # Now create a Pull Request of squid-release targeting squid to merge the version commit and security fixes back into the squid branch
    

1. 准备发布分支

一旦QE在工作(例如,squid)分支中确定了一个停止点,该提交应该被推送到相应的squid-release分支。

通知“构建负责人”发布分支已准备好。

2. 开始构建

我们将使用Squid的稳定/常规19.2.2版本作为本文档中的示例。

  1. 浏览到https://jenkins.ceph.com/view/all/job/ceph/build?delay=0sec

  2. 使用GitHub OAuth登录

  3. 设置必要的参数:

    BRANCH=squid
    TAG=checked
    VERSION=19.2.2
    RELEASE_TYPE=STABLE
    ARCHS=x86_64 arm64
    

注意:如果由于某种原因构建必须重新启动(例如,如果某个发行版失败),则必须取消选中TAG选项。

  1. 使用https://docs.ceph.com/en/latest/start/os-recommendations/?highlight=debian#platforms以确定DISTROS参数。例如,

    发布

    发行版代码映射

    太平洋(16.X.X)

    focal bionic buster bullseye

    密涅瓦(17.X.X)

    jammy focal centos9 bullseye

    珊瑚礁(18.X.X)

    jammy focal centos9 windows bookworm

    鲸鱼(19.X.X)

    jammy centos9 windows bookworm

  2. 点击Build.

3. 发布说明

软件包需要数小时来构建。使用这些时间来创建发布说明和公告:

  1. ceph.git发布说明(例如,v19.2.2的ceph.git(docs.ceph.com)PR)

  2. ceph.io发布说明(例如,v19.2.2的ceph.io.git(www.ceph.io)PR)

  3. 电子邮件公告

请参阅解释如何编写发布说明的Ceph Tracker维基页面.

4. 签名和发布构建

  1. 从构建作业或build jobsha1文件中获取版本提交的sha1。ceph-setup作业创建的

  2. 从chacra.ceph.com下载软件包到签名虚拟机。这些软件包被下载到/opt/reposSepia实验室长期运行(Ceph)集群挂载的位置。注意:此步骤还将运行一个命令,将源tarball从chacra.ceph.com直接传输到download.ceph.com,通过ssh到download.ceph.com并运行/home/signer/bin/get-tarballs.sh。Sepia Lab Long Running (Ceph) Cluster is mounted. Note: this step will also run a command to transfer the source tarballs from chacra.ceph.com to download.ceph.com directly, by ssh’ing to download.ceph.com and running /home/signer/bin/get-tarballs.sh.

    ssh ubuntu@signer.front.sepia.ceph.com
    sync-pull ceph [pacific|quincy|etc] <sha1>
    

    Example:

    $ sync-pull ceph squid 0eceb0defba60152a8182f7bd87d164b639885b8
    sync for: ceph squid
    ********************************************
    + : 0eceb0defba60152a8182f7bd87d164b639885b8
    + project=ceph
    + release=squid
    + sha1=0eceb0defba60152a8182f7bd87d164b639885b8
    + echo 'sync for: ceph squid'
    sync for: ceph squid
    + echo '********************************************'
    ********************************************
    + [[ ceph == \c\e\p\h ]]
    + current_highest_count=0
    + for combo in debian/bookworm debian/bullseye ubuntu/bionic ubuntu/focal ubuntu/jammy
    ++ wc -l
    ++ curl -fs https://chacra.ceph.com/r/ceph/squid/0eceb0defba60152a8182f7bd87d164b639885b8/debian/bookworm/flavors/default/pool/main/c/ceph/
    + combo_count=161
    + [[ 0 -eq 22 ]]
    + '[' 161 -gt 0 ']'
    + current_highest_count=161
    + highest_combo=debian/bookworm
    
    etc...
    
  3. 签名DEBs:

    merfi gpg /opt/repos/ceph/squid-19.2.2/debian/
    

    Example:

    --> Starting path collection, looking for files to sign
    --> 1 repos found
    --> signing: /opt/repos/ceph/squid-19.2.2/debian/jessie/dists/bookworm/Release
    --> Running command: gpg --batch --yes --armor --detach-sig --output Release.gpg Release
    --> Running command: gpg --batch --yes --clearsign --output InRelease Release
    --> signing: /opt/repos/ceph/squid-19.2.2/debian/jessie/dists/jammy/Release
    --> Running command: gpg --batch --yes --armor --detach-sig --output Release.gpg Release
    --> Running command: gpg --batch --yes --clearsign --output InRelease Release
    
    etc...
    
  4. 签名RPMs:

    sign-rpms ceph squid
    

    Example:

    $ sign-rpms ceph squid
    
    + [[ 2 -lt 1 ]]
    + project=ceph
    + shift
    + '[' 1 -eq 0 ']'
    + releases=("$@")
    + distros=(centos rhel)
    + distro_versions=(7 8 9)
    + read -s -p 'Key Passphrase: ' GPG_PASSPHRASE
    Key Passphrase: + echo
    
    + for release in "${releases[@]}"
    + for distro in "${distros[@]}"
    + for distro_version in "${distro_versions[@]}"
    + for path in /opt/repos/$project/$release*
    + '[' -d /opt/repos/ceph/squid-19.1.0/centos/7 ']'
    ...
    + echo 'Checking packages in: /opt/repos/ceph/squid-19.1.0/centos/9'
    Checking packages in: /opt/repos/ceph/squid-19.1.0/centos/9
    + update_repo=0
    + cd /opt/repos/ceph/squid-19.1.0/centos/9
    ++ find -name '*.rpm'
    + for rpm in `find -name "*.rpm"`
    ++ grep '^Signature'
    
    etc...
    
  5. 将软件包发布到download.ceph.com:

    sync-push ceph squid-19.2.2 2
    

这将留下软件包和tarball在一个密码保护的预发布区域https://download.ceph.com/prerelease/ceph。从那里验证它们。完成并准备好发布时,登录到download.ceph.com并将预发布家目录

5. 构建容器

的Jenkins作业存在,以便我们在发布之前测试图像。该作业既存在是为了方便,也因为它需要访问x86_64和arm64构建器。在Jenkins服务器上以“带参数构建”启动该作业,设置4. 签名和发布构建.

之后完成ceph-release-containers一个名为BRANCH, SHA1VERSION字段并保留其他字段为默认值。

  • 构建特定于架构的容器图像并将它们推送到quay.ceph.io/ceph/prerelease-amd64quay.ceph.io/ceph/prerelease-arm64

  • 将特定于架构的图像融合成一个“manifest-list”或“fat”容器图像并推送到quay.ceph.io/ceph/prerelease

最后,当在容器图像上完成所有适当的测试和验证后,从Cephmake-manifest-list.py --promote来将它们提升到container/make-manifest-list.py)运行quay.io/ceph/ceph上的最终发布位置(您必须确保quay.io/cephquay.ceph.io/ceph使用适当的权限登录):

cd <ceph-checkout>/src/container
./make-manifest-list.py --promote

The --promote步骤应仅在发布容器作为最终步骤执行,在测试并确认容器图像良好之后。

6. 宣布发布

版本提交PR

The ceph-tag Jenkins作业在ceph.git中创建一个指向发布分支的Pull Request。

如果这是一个常规发布(不是热修复发布或安全发布),则该Pull Request中只有一个提交,即版本提交。例如,参见v15.2.17的版本提交PR.

请求审查然后合并Pull Request。

公布

在通过电子邮件宣布发布之前,在ceph.io上发布发布说明,因为电子邮件公告引用了ceph.io博客文章。

由 Ceph 基金会带给您

Ceph 文档是一个社区资源,由非盈利的 Ceph 基金会资助和托管Ceph Foundation. 如果您想支持这一点和我们的其他工作,请考虑加入现在加入.