我知道编辑这个网站吗?
核心 SciJava 软件库本页介绍与 核心 SciJava 软件库 相关的内容。点击徽标查看详情。

开发生命周期

This page describes the core SciJava software release process.

  • For an overview of distribution methods, see Distribution.
  • To download software releases, see Downloads.

SciJava philosophyrelease early, release often。同时,我们始终希望保留scientific reproducibility。为了实现这一点,我们依靠几个project management工具。本指南的目的是引导您完成使用这些工具的过程,以发布软件的新版本,然后将这些版本提供给用户。

发展阶段

ImageJ2Fiji 是根据SciJava philosophy 开发的,因此本教程将使用这些应用程序来说明开发生命周期。

无论是添加新功能、修复错误、提高性能等等……开发是进行更改的过程,其目标是将这些更改公开给用户。为了实现这一目标,积极开发的项目会经历五个一般“阶段”:

  1. 正在开发中。 源代码被修改以添加新功能、修复错误等…这些修改通过 Git 表示为提交,无论是在本地文件系统、主题分支还是存储库分支上。
  2. 在 main 上。 当您有一组或多个您满意的“提交”(即功能已完成,或错误已修复)时,它们将被移至 GitHub 上项目存储库的 main 分支。这确保了main分支始终发布就绪
  3. 已发布。 当需要公开当前的 main 分支时(即,它具有用户请求的关键错误修复或很酷的新功能),Maven 用于剪切版本,然后作为工件部署到SciJava Maven repository。开发人员现在可以在自己的项目中使用新版本。
  4. 托管。 新的发布工件必须经过验证才能在与其他 SciJava 组件的组合运行时环境中工作。一旦经过测试可以工作,SciJava 组件集合Bill of Materials (BOM)中列出的版本就可以进行相应更新。
  5. 已上传。 最后,新的发布工件可以上传到其关联的 ImageJ update site,以供最终用户使用。

以下部分将更深入地讨论这些阶段及其相关工具和工作流程。

与 Maven SNAPSHOT 的关系

考虑开发周期的另一种方法是通过与代码关联的 Maven 版本号。可重复构建背后的想法是,从插件的给定版本,可以明确地确定生成该版本的代码的状态。通常,该状态由唯一的 Git 提交确定。然而,在每次 Git 提交时更改 Maven 版本是不切实际且不现实的。

这就是为什么在“开发中”(阶段 1 和 2 -“快照耦合”)时使用 SNAPSHOT 版本。使用快照版本意味着“不保证此工件的可重复性”。因此,为了最好地促进可重复的科学,不会向用户提供代码的快照版本(除非可能用于测试)。

为了向用户提供工件的更新版本(第 3、4 和 5 阶段),版本将更改为单个 Git 提交的唯一的非快照版本。然后下一次提交将返回到快照版本控制以进行进一步的开发。如此循环重复。

深入的阶段

第一阶段:开发中

GitHub 上的存储库称为 remotes;当您clone签出时,远程您将获得存储库的本地副本。通过对本地副本进行更改并将其推送回远程来进行开发。 GitHub 提供了用于控制每个远程存储库的user permission levels的工具,因此您如何开发项目取决于您是否能够推送(写入)到该项目的远程存储库。

  • 协作开发人员。 如果您有权直接推送到项目的远程存储库,那么您只需使用 GitGitHubclone the repository 并进行更改即可。对于重要的更改,您通常需要create a topic branch来开发和测试更改。这也提供了一个与其他开发人员讨论和审查的论坛。
  • 外部开发人员。 如果您没有推送权限,则需要执行名为 Forking the repository 的额外步骤。这将创建您拥有推送权限的存储库的远程副本。您的远程分叉被称为原始远程存储库的“下游”(即您的分叉的“上游”)。然后,您的开发将在您的分支上进行,稍后还需要执行一个额外步骤来与上游存储库协调。

第 2 阶段:主干

一旦功能或修复完成,它就可以移动到存储库的main分支。如何实现这一目标取决于第一阶段中变更的制定方式。

  • 协作开发人员。 最小的更改可以直接推送回远程存储库上的main。如果您的作品位于 topic branch 上,那么您应该使用 pull request (PR),以便在合并到 main 之前可以对主题分支进行审查。
  • 外部开发人员。 首先将您的更改推送回分叉存储库的分支(不一定是main)。然后,您可以在 GitHub 上提交 pull request (PR),将您的分支合并回官方存储库。这会邀请其他感兴趣的开发人员进行代码审查。审阅者可能会要求更改代码以解决任何问题。进行任何必要的修改后,project maintainer将接受您的更改,然后合并到官方main分支。

第三阶段:发布

一旦组件的main分支具有您想要的新功能,下一步就是削减该组件的发布版本。通常,main 上的 Maven 版本(在pom.xml中)是SNAPSHOT version,这意味着它是unstable并且尚未发布。但是,stable release 工件可以部署到适当的远程 Maven 存储库。

release-version.sh脚本自动执行发布的步骤。它依赖Maven Release plugin来完成大部分繁重的工作,但也做了一些额外的工作(例如,确保版本部署到正确的存储库)。

优势

  • 在 GitHub 上创建标签以轻松引用发布提交。
  • “跳到下一个发布周期”提交是自动完成的。
  • Maven POM 引用了正确的标签,而不是 HEAD
  • GitHub Actions 使用存储库本身加密的凭据为您执行实际发布。

先决条件

  • 安装release-version.sh脚本。执行此操作的最佳方法是克隆 SciJava-scripts 存储库。这将使您能够访问其他有用的脚本并帮助它们保持最新状态。 -(可选)如果您想从任何目录轻松使用这些脚本,您可以add the scijava-scripts folder to your PATH
  • 验证您的项目的父项目是否为 pom-scijava 版本 17.1.1 或更高版本。如果父版本太旧,或者不是pom-scijava,则升级它。如果您需要帮助,请通过第 forum 询问。
  • 如果您的组件要发布到 SciJava Maven 存储库,则将以下行添加到 POM 的属性部分: `deploy-to-imagej`
  • 确保项目的存储库与 GitHub Actions 工作流程链接,该工作流程自动构建和部署 Maven 工件以响应 GitHub 上的更改。如果您不确定您的项目是否具有此自动化功能,请在forum上寻求帮助。

发布步骤

从您的项目目录中,只需运行: release-version.sh 该脚本将验证您的主分支是否已准备就绪,然后为发布创建并推送 tag。然后,GitHub Actions 将注意到该标签并为您完成发布。发布完成后,您应该会收到一封来自 GitHub 的电子邮件,指示构建是否成功。

If your project is a multi-module build, first make a commit commenting out any modules that should not be released. Then run the script from the aggregator pom directory.

Phase 4: Managed

For core projects, there is an intermediate layer tying User-facing and Developer-facing components together: the Bill of Materials (BOM). To ensure users and developers see the same functionality, components should only be uploaded to the core update sites when their version is also updated in the pom-scijava BOM. 要更新 pom-scijava BOM 中列出的组件版本,您应遵循 External developerpom-scijava 做出贡献的说明。通过 submitting a pull request,只需修改组件的托管版本,您将向核心 SciJava 开发人员发出信号,表明您的项目已准备好上传。例如,this PRBio-Formats 的托管版本更新为 5.5.0。

第五阶段:上传

部署到 Maven 存储库会创建一个稳定的发布工件 其他开发人员可以使用的软件组件。但是对于ImageJ相关的 组件,仅此一项并不能将其交到用户手中。为此, 然后组件必须“上传”到 ImageJ update site

ImageJ 和 Fiji 更新站点

  • ImageJ 核心更新站点反映了最新 net.imagej:imagej 版本的状态。
  • 斐济核心更新站点反映了最新 sc.fiji:fiji 版本的状态。 ——其实,就目前而言,上述两种说法都是不真实的,但它们代表了我们前进的方向。目前,ImageJ 和 Fiji 的核心组件都是通过 Java-8 更新站点手动分发的。有关详细信息,请参阅第 Java 8 页面。

外部更新站点

尽管sites.imagej.net提供hosted update site服务,但更新站点可以托管在任何地方。

请参阅 distribution 页面,了解在核心站点上分发插件与单独的更新站点上分发插件的优缺点的讨论。

如果您确实管理 your own update site,您可以自行上传您的版本。

有关进一步说明,请参阅第 documentation on update sites

进一步阅读

  • SciJava versioning guidelines 将帮助您在执行 Maven 发布时为您的软件选择合适的版本号。