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