这实际上是两个问题,但来自同一个问题:
- 我们使用 Jenkins 作为持续集成系统。每次有人提交更改时,Jenkins 都会构建它。
- 我们使用公司的 Maven 存储库(Artifactory),我们构建的所有其他项目所需的 jar 都存储在那里。
- 我使用 Jenkins 中的Promotion Plugin来推广Jenkins 构建。当我提升一个构建时,我使用
mvn deploy:deploy-file
命令将该构建中的 jar 及其关联的 POM 部署回我们的公司 Maven 存储库。 - 我们实际上将 Ivy 与 Ant 一起使用,但无论如何都要使用我们的 Maven 存储库。
一个问题出现了。开发人员正在开发 Project B,该项目使用由 Project A构建的 jar 。开发人员更改了 Project A,然后想在他们的 Project B中使用更改后的 jar 。
第一个问题
我认为我可以使用 将该<ivy:publish>
jar 交付到该计算机的本地存储库中。然后,当该开发人员进行构建时,它将使用该版本的 jar,而不是我们公司存储库中的 jar。
但是,我已经设置了 Ivy,使得ivysettings-public.xml
checkmodified设置为true。这意味着如果存储库有不同版本的 jar,即使它已经在本地存储库中,它也会下载它。这对开发人员将 jar 发布到本地存储库的能力有何影响?
当 Ivy 解析依赖时,它是否注意到本地机器上的依赖与公共存储库中的不同,所以它总是会下载公共 jar,还是 Ivy 使用时间戳?也就是说,Ivy 将看到本地 jar 上的时间戳比公司存储库中 jar 上的时间戳更新,因此不会下载公司存储库中的时间戳。
如果需要,我可以将checkmodified重置为false,但我必须让开发人员知道他们需要定期清理 Ivy 缓存以获取最新版本的 jar。
第二个问题
您如何处理可能影响其他项目的基础 jar 更改问题?
在我当前的模型中(我所做的假设),我期望将这些 jar 放入我们公司的 Maven 存储库中的某种工作流程。有人会创建一个问题,它会通过一个工作流,我会将该 jar 部署到我们的 Maven 存储库中。
但是,这可能过于严格。也许基础 jar 的部署(尤其是在进行大量开发工作时)应该稍微宽松一些。
- 我可以坚持这种工作流程模型。我是 CM,我的话就是法律。但是,我要进行设置,以便开发人员可以完成他们的工作,而不是遵循一堆无意义的程序。
- 我可以让项目负责人进行部署,而不是问我。通过这种方式,他们可以确定(并承担责任)他们推广的罐子的质量。
- 我可以进行设置,因此 Jenkins 会在某些条件下自动提升 jars(比如它们通过了所有单元测试)。我什至可以将它与手动部署结合起来:开发人员可以推广 jar,但只能推广通过单元测试的 jar。而且,我什至可以设置它,这样即使单元测试没有通过,项目负责人(或我自己)也可以推广一个 jar。
最后,我在我们公司设置了 Ivy,所以我可以完全控制ivysettings.xml
所有项目(我们svn:externals
习惯将 Ivy 引入所有项目)。
我可以做的一件事是设置第二个快照存储库。Jenkins 构建完成后,jar 可以自动部署到此快照存储库。我可以允许开发人员将 Ant 属性传递给构建(通过命令行或通过build.properties
文件),这将允许开发人员在发布存储库之前使用来自快照存储库的 jar 。
Jenkins 可以设置为始终将新建的 jar 部署到此快照存储库,bur。我仍然会控制将 jars 部署到我们的发布存储库中。官方 (Jenkins) 构建将始终使用发布存储库,但如果需要,开发人员可以使用快照版本。