Jenkins同一构建中的多个构件

89

有没有一种方法可以保存/归档同一构建中的多个工件?

Jenkins只允许单个“归档工件”后构建步骤,使用一次后该选项将变为灰色。

也许ArtifactsArchiver允许多个模式?


2
FYI,这不是 Jenkinsfile/pipeline 构建的限制。 - simon.watts
1
@simon.watts 是的。对于任何通过谷歌找到这篇文章的人,可以放心地多次调用archiveArtifacts,甚至可以在post步骤之前调用它。在这种情况下,当调用archiveArtifacts时,该构件将可用,而不是在构建完成时才可用。 - Starwarswii
6个回答

113
你可以使用Ant风格的模式,例如target/*.jar来归档多个构件。
如果你的文件无法用一个模式匹配,可以使用逗号分隔的模式列表,例如target/*.jar, target/*.war
输入字段旁边的?按钮会显示此信息。

1
如果我没搞错的话,您想要从两个不同的构建中获取构件,对吗? 如果您知道第二个任务的名称,并确保两次运行在同一个节点上,那么您可以给第二个任务路径来归档构件,例如: /*.jar(来自同一任务) /home/jenkins/workspace/<JOB_NAME>//*.jar(不同构建任务) - vishal sahasrabuddhe
3
请使用逗号 , 如之前回答中所述,来分隔不同的文件集。 - Larry Cai
52
注意,问号按钮没有提到逗号分隔列表。谢谢您指出这一点 :) - GreenAsJade
3
实现文件夹的归档 - archiveArtifacts '<folder_name>/** - Mohnish
1
你的答案是正确的。但是,我要说的是,当你点击“?”时,Jenkins 显示的信息并不是很有帮助。它没有指示你可以用逗号分隔多个内容。而关于 ant 样式模式的信息也不是很有帮助,因为 ant 是 XML,而这个输入不是。在研究了与 ant 相关的链接页面后,我看到了它们的相似之处,但 Jenkins 提供的信息还不够好。 - steve
显示剩余2条评论

42

你可以用逗号分隔路径,像这样:

XXX.UnitTests\bin\Release\**.* , XXX.WriteAPI.Service/bin/Release/**.*

然后您将获得两个独立的工件。

有关Ant模式语法的详细信息,请参见http://ant.apache.org/manual/Types/fileset.html


David,我们有没有办法在同一个仓库中为不同路径构建多个JAR文件?就像我在这里描述的方式:https://stackoverflow.com/questions/44185868/jenkins-build-pipeline-to-publish-applications-jar-for-multiple-path - Kevin Ghaboosi
第一个模式后面的空格实际上是必要的/相关的吗? - mmigdol
@mmigdol 可能您可以删除空格。请注意,根据 Ant 文档,您可以使用空格代替逗号。因此,我猜 artifact1,artifact2artifact1 artifact2 都是有效的语法。 - David Lilljegren
@DavidLilljegren,至少根据Jenkins片段生成器中的帮助文本,这是不正确的: “除了逗号(“,”)是唯一支持的分隔符之外”。 - Max Cascone

12

如果您想保存两种不同类型的文件,例如zip文件和html文件,那么可以使用

*.html,*.zip

它将帮助你将该目录中的所有zip文件和html文件归档。


6
不,Jenkins 不提供只保存一个构件的选项。你可以使用通配符模式来保存任意数量的构件,例如: 所有 jar 包 - **/*.jar 所有 war 包 - **/*.war 等等。
**/ 表示任意目录。

OP从未说过那样的话,他/她说的是你只能添加一个“归档工件”步骤。 - Chris Withers

1

以下是 Steven the Easily Amused 在底部排名答案中的评论,为了更好的可见性,您可以运行两次:

请注意步骤名称是复数形式。可以随意多次运行管道步骤 archiveArtifacts,但使用 Ant 样式模式一次性运行效果更佳。当调用 archiveArtifacts 时,它会将所选文件传输回主服务器,并在那里存储。同样,可以多次运行 copyArtifacts 以选择所有或部分存档的工件。


-1

这里的所有答案都展示了如何将多个文件模式组合成一个构件,而这不是OP所要求的。

所要求的示例是具有编译为QA、Staging和Production JavaScript的环境特定设置的单页面Web应用程序构建。

由于您希望将相同的构建部署到多个环境中,因此您需要3个构建,每个构建都有自己的环境设置。在部署存档时,您不希望将所有3个内容部署到每个环境中并仅提取该环境的内容,因为每次复制比所需的多66%是昂贵且容易出错的。

因此,生成2个或更多构件到它们自己的构件中是合理的,并根据目标环境部署其中1个构件。

Jenkins应支持多个构件,而不仅仅是使1个构件变得更大。


不,OP说“也许ArtifactsArchiver允许多个模式?”所以很明显他想在同一个构建中使用多个模式(其他答案已经涵盖了这一点)。此外,认为“artifact”是单数形式是错误的。因此,即使在您编写的情况下,也可以在同一个构建中构建“测试”,“集成”和“生产”工件,并使用单个选择器将它们全部归档 - 在不同的名称或目录下。 - Steven the Easily Amused
所以,您将“测试”、“集成”和“生产”放入一个工件中,使用子文件夹。如何在不首先将整个工件内容推送到代理的情况下部署到“测试”,或者不必从Jenkins生成的一个工件外部创建3个新工件?如果您可以在Jenkins中创建3个单独的工件,那么您就不需要采取其他步骤来将一个大工件分解为实际想要的几个子组件。Jenkins只能创建1个工件是一种限制。 - Antony Booth
一个任务不必从另一个任务复制所有工件。您可以使用ANT样式选择器选择一个或所有工件,就像在归档它们时那样。例如,copyArtifacts filter: 'production/**', projectName: 'UPSTREAMJOB' ...假设生产内容都保存在单个文件夹中。即使是自由风格的作业也具有相同的复制工件运算符选择器。您还可以选择保留目录结构或扁平化它。 - Steven the Easily Amused
如果您只使用Jenkins来构建代码,并且需要更适合发布管理的工具,那么Jenkins只会向该发布管理工具提供1个构件,该工具需要在将内容拆分为1个代理服务器上的目标服务器之前执行其他任务,否则它将向每个代理推送整个内容,以便使用部分构件内容。无法多次运行archiveArtifacts命令并将构件命名为参数是Jenkins的限制。 - Antony Booth
3
请注意,步骤名称是复数形式。可以多次运行 archiveArtifacts 这个流水线步骤,虽然使用 Ant 样式模式一次性运行会更有效率。当调用 archiveArtifacts 时,所选文件将被传输回主节点并存储。同样地,可以多次运行 copyArtifacts,以选择所有或部分已归档的构件。 - Steven the Easily Amused

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接