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

标签 jenkins continuous-integration jenkins-plugins

该设置用于构建和部署到 Adob​​e 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

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

有任何想法吗?

最佳答案

TL; 博士

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

完整答案

您误解了“工件”的概念,因为它与 Jenkins 有关。

什么是 Jenkins 工件

工件是专门保留的文件 构建后 的帮助下存档文物 构建后操作。

当构建运行时,它在以下范围内运行:$WORKSPACE ,在文件系统上通常驻留在$JENKINS_HOME/jobs/$JOB_NAME/workspace在那里,您可以拥有 SCM check out 文件夹、临时构建文件、最终构建文件、二进制文件等。
$WORKSPACE的内容是 volatile ,在构建时间范围之外,您永远不应该依赖它(下游作业 在构建时间范围之外是 )。 $WORKSPACE的内容不同的主/从节点之间可能不同,管理员可以随时删除它,或者由 SCM 更新/清理/ check out 。

同样重要的是要了解只有 $WORKSPACE整体招聘 .

但是现在注意你的构建历史 ,该列表中有几个条目,由内部版本号 (#) 和日期时间戳引用。
这些存储在:$JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID$BUILD_ID是构建的日期时间戳,例如 2014-10-22_11-33-46$WORKSPACE包含与 相关的信息当前或最后一次 (问题是:您永远无法确定它是“当前”还是“最后一个”)构建;builds文件夹包含所有过去(保留)构建执行的记录(这是构成 构建历史 列表在您左侧的内容),每个构建 .

默认情况下,它只包含 Jenkins 本身需要的内容:build.xml 副本、更改日志信息、控制台日志。当您访问 URL http://$JENKINS_URL/job/$JOB_NAME/[nn]/ 时哪里[nn]是一个数字作业构建/运行编号 (#),它从 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 之一的符号链接(symbolic link)文件夹。

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

您的问题的解决方案

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

您还应该注意到 复制文物插件确实不是 让您在选择要复制的构建时选择“当前构建”。它有永久链接(如“上次成功”或“上次构建”)和特定构建号,所有这些都转换为 $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/ 下的保留构建。

甚至“触发此作业的上游构建”也会链接到特定的 $BUILD_ID .

在以下任一选项中

的配置归档文物 相对于 $WORKSPACE .
的配置复制文物相对于“存档位置”,即 $JENKINS_HOME/jobs/$JOB_NAME/builds/$BUILD_ID/archive/ .
由于“复制工件”相对于“存档位置”,而“存档位置”相对于 $WORKSPACE ,那么对于所有密集的目的,两个配置的相对路径可以相同并且相对于 $WORKSPACE
选项1

  • 第一 存档文物 使用后期构建操作,否则您将无法复制任何内容。
  • 如果您的文件位于 $WORKSPACE 的根目录中, 它应该是:PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip(注意,这里不是完整路径)
  • 然后使用 Upstream Build that triggered this job复制文物选择。
  • 对于 文物复制现场使用:
  • **或空白复制所有存档的工件,或
  • PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip (与存档部分相同)

  • 选项 2

    如果不想存档,可以使用$WORKSPACE直接使用 Copy from workspace of latest completed build , 但是,您必须确保在下游构建执行时没有第二个上游构建可以运行,否则您可能会从部分构建中获取部分文件,因为如前所述,$WORKSPACE是易变的。
  • 再次,对于 复制文物步骤,下 文物复制字段,使用相对于 $WORKSPACE 的路径, 那是:PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip

  • 选项 3

    如果您真的想在不同作业之间复制整个 WORKSPACE,请使用
  • Clone Workspace SCM插件或
  • Shared Workspace plugin
  • 关于jenkins - Jenkins 下游作业无法找到上游工件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26525034/

    相关文章:

    build-process - 如何配置 Hudson 为每个构建发送电子邮件,而不仅仅是那些更改项目状态的构建?

    android - 如何从 Jenkins/Hudson 上传 APK 到 Play 商店?

    jenkins - 什么是 Jenkins 的种子工作,它是如何运作的?

    github - Jenkins Github oAuth 404回调错误

    Jenkins 声明式管道,每个分支具有不同的触发器

    amazon-web-services - 错误 : The Compose file './docker-compose.yml' is invalid because: services. jenkins.networks 包含无效类型

    unit-testing - dotnet test 仅测试解决方案上的项目

    command-line - 从 Maven/Jenkins 运行 Quicktest Pro 测试?

    android - 由于AppCompat-v7 9修补程序镜像,Jenkins中的Gradle构建失败,但在本地构建时通过

    jenkins - 在步骤中未找到此类 DSL 方法 'publishHTML'