【发布时间】:2011-11-26 11:57:28
【问题描述】:
我有一个运行 makefile 并生成一些文件的工作。然后我想要另一份将这些文件发布到常春藤的工作。
我知道克隆工作区插件,但还有其他选择吗?
【问题讨论】:
-
您想将发布作为一项单独的工作来进行,这样……什么?即,通过在单独的作业中发布,您试图获得什么价值?
我有一个运行 makefile 并生成一些文件的工作。然后我想要另一份将这些文件发布到常春藤的工作。
我知道克隆工作区插件,但还有其他选择吗?
【问题讨论】:
您运行了一个 Makefile,然后发布到 Ivy?
Ivy 是 Ant 的一部分,它是一个利用全球 Maven 存储库结构来获取所需 jarfile 和其他依赖项的模块。
不要误会我的意思,我使用本地远程 Maven 存储库来发布其他项目将依赖的 C/C++ 库(您可以使用 wget 获取项目)。但是,我没有使用 Ivy 来做到这一点。
如果您正在考虑使用 Apache Ivy,那么您可以使用 Maven 进行发布。有一个 Maven Release 插件可以将您的工件复制到您的 Maven 存储库,但您可能想要做的是部署。
在我的 Jenkins 构建中,我只是让 Jenkins 从命令行执行 maven 的 deploy-file 步骤。这允许我将文件部署到我的 Maven Ivy 存储库中,而无需先创建 pom.xml 文件。 (好吧,无论如何你都想创建一个 pom.xml,因为你想包含一个依赖层次结构。)
我通常在与创建 jar/war/ear 文件的工作相同的工作中执行此操作。但是,如果您想要一个单独的工作来执行此操作,您可以使用Copy Artifact Plugin。此插件允许 Job B 从 Job A 复制任何或所有已发布的工件。如果您只想要构建的 jar 文件,这比克隆整个工作区要快得多且简单得多。
【讨论】:
我个人的偏好是在不依赖 Jenkins 内部文件结构的情况下做这些事情,尽管有时这意味着了解您的其他构建工具(例如 Maven,或者在您的情况下为 Ivy)的内部结构。
如果我是你,我会在一项工作中完成所有工作 - 即构建,然后让“Ivy Publisher”(如果存在这样的插件)将工件发布到远程 Ivy 存储库。
如果这是不可能的,让第一个工作将工件“安装”到本地存储库/缓存中(我不确定它在 Ivy 上的名称),然后让第二个工作从那里获取它。
我不确定这一定是最好的方法,但它对我来说效果很好。
编辑我应该提一下 - 这在分布式环境中效果不佳,除非像我一样,您的分布式环境由多个节点组成,这些节点可以访问公共 NAS 文件系统。
编辑 2 我也将Copy To Slave Plugin 用于没有通用文件系统的分布式环境。
【讨论】:
您有多种选择,一种是克隆工作区,它运行良好,但所需的磁盘空间增加了一倍(这在我们的例子中非常相关)。大多数其他方式是克隆工作区的变体。
我所做的是使用自定义工作区位置。 IE。我的第一份工作构建了一切,然后触发了第二份工作。在第二个作业中,我将自定义工作区设置为第一个作业的工作区,因此该作业对同一文件执行其他任务。您必须检查该选项以防止在第二个作业运行时构建第一个作业,因为两者都在同一个文件上工作,这是一条很好的路线。
但是,如果您需要并且小心,这可能是一个可行的解决方案。
【讨论】:
使用Copy Artifact plugin 将工件从作业 A(编译)复制到作业 B(发布)。
【讨论】:
我会使用处理两个子任务的主构建文件。 Ant 有一组执行任务,您可以使用它们来运行另一个 Ant 构建文件、执行一些命令行命令等。看这里:
http://ant.apache.org/manual/tasksoverview.html
也许您可以使用 Exec 命令启动 make 并通过使用 Ant 命令运行 Ant 构建来处理 ivy 发布。
【讨论】: