Jenkins下游作业无法找到上游工件

时间:2014-10-23 09:25:21

标签: jenkins continuous-integration jenkins-plugins

该设置用于构建和部署到Adobe AEM。

Master Build作业来自git存储库,构建和打包,运行测试,然后触发应该使用上游作业中构建的包的下游作业。

问题是下游作业失败并显示以下消息:

Unable to access upstream artifacts area /var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/builds/2014-10-22_11-33-46/archive. Does source project archive artifacts?

在我看来,由下游作业触发的某种CopyArtifacts插件正在寻找错误位置的工件。正确的位置是

/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.jar,/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.zip

然而,它抱怨

java.io.IOException: Expecting Ant GLOB pattern, but saw '/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.jar,/var/lib/jenkins/jobs/PROJECTNAME-Master-Branch/workspace/PROJECTNAME-*/**/*.zip'. See http://ant.apache.org/manual/Types/fileset.html for syntax

下游作业从另一个项目中复制工件,然后构建是"触发此作业的上游构建"或者"从最新完成的构建工作区复制"。没有人工作。

有什么想法吗?

3 个答案:

答案 0 :(得分:51)

TL; DR

您正在尝试使用工件而不首先存档它们 您正在尝试使用绝对路径,但它们应该相对于$WORKSPACE和/或"归档位置"。

完整答案

你误解了" Artifacts"因为它与詹金斯有关。

什么是Jenkins Artifacts

工件是在归档工件构建后操作的帮助下,在构建后专门保留的文件。

构建运行时,它在以下内容中运行:
$WORKSPACE,文件系统通常驻留在 $JENKINS_HOME/jobs/$JOB_NAME/workspace
在那里,您可以拥有SCM结账文件夹,临时构建文件,最终构建文件,二进制文件等。

$WORKSPACE的内容易变,您不应该依赖它,在构建时间范围之外(并且下游作业 在构建时间范围之外) )。 $WORKSPACE的内容在不同的主/从节点之间可能不同,可以随时由管理员删除,也可以通过SCM更新/清理/结账删除。

了解整个作业只有一个 $WORKSPACE也很重要。

但是现在注意你的构建历史,该列表中有几个条目,由构建号(#)和日期时间戳引用。 这些存储在:
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID
$BUILD_ID是构建的日期时间戳,如2014-10-22_11-33-46

$WORKSPACE包含与 当前或最后 相关的信息(问题是:您永远无法确定它是否'&# 34;当前"或"最后")构建;
builds文件夹包含所有过去(保留)构建执行的记录(这是构成左侧构建历史记录列表的内容), 每个构建

默认情况下,它仅包含Jenkins自身所需的内容:build.xml副本,更改日志信息,控制台日志。当您转到http://$JENKINS_URL/job/$JOB_NAME/[nn]/其中[nn]是数字作业构建/运行编号(#)的URL时,它会从文件系统上的builds文件夹中读取此信息。

为了保留构建的工件(为了避免它们被下一个构建覆盖,消灭了恶劣空间,或者只是访问旧版本),您需要归档工件(使用相同的帖子)构建具有相同标题的动作)。归档工件时,您可以指明要保留的$WORKSPACE中的哪些文件。当Jenkins进行归档时,它会放置这些文件(保持路径[相对于$WORKSPACE]保存):
$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/
这样,您可以为以前的构建保留多组工件,而不仅仅是"最新/最后一个"来自$WORKSPACE

为了完整起见,我会提到Jenkins"永久链接",例如http://$JENKINS_URL/job/$JOB_NAME/lastSuccessfulBuild/lastFailedBuild等,实际上是文件系统上的符号链接其中一个保留的builds/$BUILD_ID文件夹。

最后,您可以通过"丢弃旧版本" 对作业配置进行复选标记来控制保留多少构建运行以及保留多少工件(可以单独配置)。默认情况下,所有都保留,但如果您开始保留工件,则需要考虑硬盘空间容量。

您的问题的解决方案

因此,通过上述信息并查看错误消息,您现在应该看到复制工件插件正在查找构建的/archive/部分下的工件。< / p>

您还应该注意复制工件插件让您选择&#34;当前版本&#34;选择要复制的构建时。它有永久链接(例如&#34;最后成功&#34;或者&#34;最后一次构建&#34;),以及特定的构建号,所有这些都转换为$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/下的保留构建

Even&#34; Upstream Build触发了这项工作&#34;将链接到特定的$BUILD_ID

以下任一选项

归档工件的配置与$WORKSPACE相关 复制工件的配置与&#34;存档位置&#34;相关,即$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/
自从&#34;复制文物&#34;相对于&#34;存档位置&#34;和&#34;存档位置&#34;相对于$WORKSPACE,然后出于所有密集目的,两个配置的相对路径可以相同并且相对于$WORKSPACE

选项1

  • 首先使用构建后操作归档工件,否则您无需复制。
    1. 如果您的文件位于$WORKSPACE的根目录中,则应为:
      PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip
      (注意,这里不是完整路径)
  • 然后使用Upstream Build that triggered this job进行复制工件选项。
    1. 对于要复制的工件字段,请使用:
      • **或空白以复制所有已归档的工件,或
      • PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip(与归档部分相同)

选项2

如果您不想归档,可以直接使用$WORKSPACECopy from workspace of latest completed build ,但是您必须确保在下游时无法运行第二个上游构建构建正在执行,否则您可能会从部分构建中获取部分文件,因为如前所述,$WORKSPACE是不稳定的。

  • 同样,对于复制工件步骤,在要复制的工件字段下,使用相对于$WORKSPACE的路径,即:
    PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip

选项3

如果您确实要在不同作业之间复制整个WORKSPACE,请使用

答案 1 :(得分:1)

修复可能很简单:禁用或删除 Compress Artifacts plugin重启 Jenkins。

此解决方法是从长期错误报告中推断出来的:"Copy Artifacts Plugin" should support ArtifactManager

答案 2 :(得分:0)

解决方案是关于构建器的配置。

根本原因在于下游作业的配置。一旦&#34;从最新完成的构建工作区复制&#34;选择要复制的构建,并将要复制的工件的路径设置为相对路径,例如projectname- / / .jar,projectname- / / .zip然后构建成功。

此外,在父作业配置中,需要允许下游作业到CopyArtifact,而允许复制工件字段应该指定下游作业。

编辑:现在我看到你在此期间做出了回应。很好的答案,基本上解决了我的一些问题。

关于选项1的一个不明确的事情是,在父作业完成后,文件的归档发生

Waiting for the completion of projectname-Deploy
projectname-Deploy #19 completed. Result was SUCCESS
Waiting for the completion of projectname-Deploy
projectname-Deploy #20 completed. Result was SUCCESS
Build step 'Trigger/call builds on other projects' changed build result to SUCCESS
Strings match run condition: string 1=[lab2b], string 2=[both]
Run condition [Strings match] preventing perform for step [BuilderChain]
Archiving artifacts 

一旦我将方法改为第二选项,它对我有用,但我也想了解第一个选项。