【问题标题】:Jenkins downstream job fails to find upstream artifactsJenkins 下游作业找不到上游工件
【发布时间】:2014-12-18 22:34:41
【问题描述】:

该设置用于构建和部署到 Adob​​e AEM。

主构建作业从 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

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

有什么想法吗?

【问题讨论】:

  • 在尝试使用工件之前您没有存档它们
  • 另外,当绝对路径应该相对于$WORKSPACE 或“存档位置”时,您会尝试使用绝对路径

标签: jenkins continuous-integration jenkins-plugins


【解决方案1】:

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

此解决方法源自长期存在的错误报告:"Copy Artifacts Plugin" should support ArtifactManager

【讨论】:

    【解决方案2】:

    解决方案是关于builder的配置。

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

    此外,在父作业配置中,需要允许下游作业复制工件,并且允许复制工件的项目字段应指定下游作业。

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

    关于选项 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 
    

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

    【讨论】:

    • 根据您的日志,您正在从构建步骤触发下游构建,而归档是构建后操作。构建后操作总是在所有构建步骤完成之后发生,并且以某种预先确定的顺序发生。要解决这个问题,您需要 Any Build StepFlexible Publish 插件。使用后者,您可以将构建后操作配置为首先存档,然后触发下游构建。
    • @Slav Any Build Step 方法对您有用吗?我没有为我工作:条件构建步骤 #1 归档工件,条​​件构建步骤 #2 触发另一个构建,等待它完成。但是,当上游构建正在运行时,工件可用于下游构建。所以,这两个工作都失败了。
    • @JuusoOhtonen 抱歉,已经有一段时间了,我现在没有任何类似的设置可以尝试。祝你好运
    【解决方案3】:

    TL;DR

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

    完整答案

    您误解了与 Jenkins 相关的“工件”的概念。

    什么是 Jenkins 工件

    Artifacts 是在Archive the 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 包含与当前或最后相关的信息(问题是:您永远无法确定它是“当前”还是“最后”)建立;
    builds 文件夹包含所有过去(保留)构建执行的记录(这构成了您左侧的 构建历史 列表),每个构建

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

    要保留构建的工件(以避免它们被下一个构建覆盖、消除工作空间或只是为了访问旧构建),您需要归档工件(使用相同的 post-构建具有相同标题的操作)。当您归档工件时,您指明要保留 $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 文件夹之一的符号链接。

    最后,您可以通过作业配置上的"Discard old builds"复选标记来控制构建运行的数量和保留的工件数量(可以单独配置)。默认情况下,都会保留所有内容,但如果您开始保留工件,则需要考虑硬盘空间容量。

    您的问题的解决方案

    因此,根据上述信息并查看您的错误消息,您现在应该看到 Copy Artifacts 插件正在正确地查找构建的 /archive/ 部分下的工件。

    您还应该注意到,Copy Artifacts 插件让您在选择要从哪个构建复制时选择“当前构建”。它具有永久链接(如“最后一次成功”或“最后一次构建”)和特定的内部版本号,所有这些都转换为 $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/ 下的保留版本

    即使是“触发此作业的上游构建”也会链接到特定的$BUILD_ID

    在以下任一选项中

    归档工件的配置与$WORKSPACE相关。
    Copy Artifacts 的配置与“存档位置”相关,即$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/
    由于“复制工件”是相对于“存档位置”的,而“存档位置”是相对于$WORKSPACE 的,那么出于所有密集目的,两种配置的相对路径可以相同并且相对于$WORKSPACE

    选项 1

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

    选项 2

    如果你不想归档,你可以直接使用$WORKSPACE,和Copy from workspace of latest completed build但是你必须确保在下游构建执行时没有第二个上游构建可以运行,否则你冒着从部分构建中获取部分文件的风险,因为如前所述,$WORKSPACE 是不稳定的。

    • 同样,对于 Copy Artifacts 步骤,在 Artifacts to copy 字段下,使用相对于$WORKSPACE 的路径,即:
      PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip 李>

    选项 3

    如果您真的想在不同作业之间复制整个 WORKSPACE,请使用任一

    【讨论】:

    • 我一个人(我相信还有很多其他人)感谢您的详细斯拉夫语(和总结)!
    猜你喜欢
    • 2014-07-14
    • 2019-04-06
    • 2018-02-02
    • 2020-08-11
    • 2020-09-08
    • 1970-01-01
    • 2015-07-31
    • 1970-01-01
    • 2011-09-02
    相关资源
    最近更新 更多