2

我目前有大量具有复杂依赖结构的项目,由 50 多名开发人员使用 Maven 2/3 与 Nexus 和 Jenkins 开发。我们以更快的速度进行开发,而不是我们构建和部署具有 SNAPSHOT 依赖项的版本。大多数情况下,我们不能等待一个团队或另一个团队在必须部署之前构建发布版本。由于这个原因,我们遇到了许多关于错误和在制品进入生产的问题,并且不知道这些 SNAPSHOTS 中有哪些变化。

我要做的是消除 SNAPSHOTS 并使用versions-maven-plugin 转向自动发布,并实施发布暂存策略。

问题就在这里。对于开发人员和 CI 构建,需要将其配置为解决来自“Staging”和“Release”的依赖关系,并仅发布到“Staging”。然后我们希望能够“提升”构建为发布的版本,重新构建它以解决来自“发布”的依赖关系并发布到“发布”(最初这将是手动提升,但我们也可能希望自动化) . 这一切听起来合理吗?

我不想使用 maven-release-plugin,因为我们之前尝试过使用它,而且我们不喜欢它自动修改 pom 并在我们的 scm 中进行更改,从而触发更多构建的事实。

此外,甚至有没有办法告诉 maven 使用一个存储库进行解析,而另一个存储库用于发布?我可以用 gradle 做到这一点吗?

对此的任何评论/想法将不胜感激。

4

3 回答 3

3

这听起来很像我的构建系统。

我使用 gradle 和 2 个单独的 nexus 存储库(“发布”存储库、1 个暂存和 1 个最终存储)来执行此操作。该构建具有目标成熟度的概念,它使用它来计算版本号(使用语义版本控制),因此 RC 构建产生类似 1.0.0-rc1 的版本,最终构建产生类似 1.0.0 的版本。然后,我们以不同的方式(testng 组、黄瓜标签等)标记测试,以便测试的不同部分在不同的时间运行。构建根据目标成熟度决定依赖或发布到哪些存储库,因此可以确保仅使用足够成熟的工件。

这被配置为通过 teamcity 构建链自动运行,因此如果需要,某些核心库中的提交会通过下游构建并继续进行集成测试/部署(通过 rundeck 通过其 java api 通过一组 gradle 任务)。

Gradle 发布和解析存储库是单独配置的,因此可以不同。同样可以在 Maven 中完成。

例如,给定一个依赖图,如

corelib -> mylib -> myapp

每个事物都有一组与它们相关联的测试,这些测试被标记为 beta 或 rc。目的是生成 RC 的构建是通过 beta 测试的构建(即,如果您通过 beta,那么您已经足够成熟,可以成为 RC)并且构建是快速完成的构建(例如,仅进行单元测试)而 rc 测试(生成最终构建)可能会进行一些集成测试或更长时间运行的测试。这个定义是我们自己的,完全是任意的,你可以做任何你喜欢的区分。只有当您对产品有一定的信心水平时,我们才会应用越来越严格和/或持久的测试。

然后我们设置一个构建链,以便 rc 构建依赖于上游 rc 构建,最终构建依赖于上游最终构建和您自己的 rc 构建

IE

             --> mylib final --
           /                   \
mylib rc --                     --> myapp final
           \                   /
             --> myapp rc -----

等等。在这个例子中,流程是

  • 提交对 mylib 的更改
  • mylib rc 构建运行
    • 运行 beta 测试
    • 将结果发布到 rc 存储库
  • mylib final 和 myapp rc 可以并行运行
  • mylib 最终构建运行
    • 运行 rc 测试
    • 将结果发布到最终存储库
  • myapp rc 构建运行
    • 取决于 rc 存储库,因此获取以前 mylib rc 构建的结果
    • 运行 beta 测试
  • myapp 最终运行
    • 取决于最终存储库,因此获取先前 mylib 最终构建的结果
    • 运行 rc 测试

每个点的版本号都是通过询问源代码控制来计算的

依赖,在我们自己的人工制品上,是动态的(例如 ivy 术语中的 1.0.+),major.minor 是静态设置的(在源代码控制中)并且构建留给自己产生补丁和候选编号,即 myapp 1.0 将取决于我的库 1.0.+ 。IMO 将 2 个独立的存储库作为过滤机制要简单得多,而不必深入研究 gradle/ivy 中的解析逻辑来过滤掉我们不想要的存储库。

于 2012-09-19T18:04:05.643 回答
2

查看maven-version-plugin,特别是锁定/解锁快照目标。它们可以帮助确定程序集正在使用哪些依赖项,并且对您来说可能就足够了。

如果不是,是的 - maven 可以使用暂存存储库,但如果您想要暂存的任何内容也被拉到本地开发人员存储库中,它可能会导致混乱。

我们现在用来解决类似问题的是一个“脚本化”,有点相当于 maven-release-plugin(它实际上调用它来进行某些操作),以及一个尴尬的版本控制方案:我们的开发分支保持 1.2-SNAPSHOT,但是我们发布/发布的版本使用不同的版本控制方案(1.2.3、1.2.4)。我们的脚本也标记了 git。

于 2012-09-19T17:46:37.767 回答
1

我建议不要使用 maven 发布插件,也不要使用快照。看这里以快速干净的方式释放。

于 2012-09-24T21:09:42.690 回答