当前位置: 首页 > 面试题库 >

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

訾高明
2023-03-14
问题内容

该设置用于构建和部署到Adobe 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和/或“存档位置”。

完整答案

您误解了与詹金斯有关的“工件”的概念。

什么是詹金斯文物

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

构建运行时,它在以下位置运行:
$WORKSPACE,该文件通常位于文件系统中的
$JENKINS_HOME/jobs/$JOB_NAME/workspace
Inside内部,您可以拥有SCM检出文件夹,临时构建文件,最终构建文件,二进制文件等。

的内容$WORKSPACE挥发性的 ,你不应该依赖它,编译时间范围之外(和下游的工作
构建时间范围之外)。$WORKSPACE不同主/从节点之间的内容可能有所不同,可以随时通过admin或SCM更新/清除/签出将其删除。

同样重要的是要了解整个 工作* 只有 一个$WORKSPACE *

但是现在请注意您的 Build History ,该列表中有几个条目,这些条目由内部版本号(#)和日期时间戳记引用。这些都存储在:
$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文件夹的符号链接。

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

解决问题的方法

因此,使用上述信息,并查看您的错误消息,您现在应该看到 Copy Artifacts 插件正在/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

  • 首先使用构建后操作 对工件 进行 存档 ,否则,您将无法复制任何内容。

    1. 如果您的文件位于的根目录中$WORKSPACE,则应为:(
      PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip
      请注意,此处不是完整路径)
  • 然后Upstream Build that triggered this job用于“ 复制工件” 选择。

    1. 对于 要复制的工件,请 使用以下任一方法:

    2. ** 或空白以复制所有已归档的工件,或者

    3. PROJECTNAME-*/**/*.jar,PROJECTNAME-*/**/*.zip (与归档部分相同)

选项2

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

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

选项3

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

  • 克隆Workspace SCM 插件或
  • 共享工作区插件


 类似资料:
  • Jenkins场景详细信息: ====================== -Jenkins中构建执行器的数量(在主/从上):3 -UpStream作业:USJobs,此作业可以在任何构建执行器上运行 -DownStream作业:DSJobs USJob在构建步骤中有这个:回声“生日快乐詹姆斯”,完成这项工作需要5秒钟 DSJob在构建步骤中有这个:回显“詹姆斯邦德死了”,完成这项工作 需要5秒钟

  • 问题内容: 我要完成的工作是从分支中签出代码,将其合并到分支,构建,运行测试,如果测试成功则推送到分支。 测试应在需要的单独工作中运行。 我当前的设置如下: Job 从中检出,将其合并并构建 作业会在“ 后期制作”步骤中 触发作业(需要预先创建) 如果成功,则在 发布构建操作中推送到分支 __ 我尝试使用 Copy Artifact Plugin, 但是问题在于,在 Post构建步骤中 触发时,我

  • 问题内容: 我正在使用詹金斯。 詹金斯(Jenkins)有上游工作:A 詹金斯(Jenkins)有下游工作:B A的控制台日志输出为: B的控制台日志输出为: 我想要得到的是: 有什么办法,我可以在作业A的控制台日志中获取作业B的控制台输出,然后确定作业“ A”是否成功(使用日志解析/ grep表示故障/错误等关键字)。 问题答案: 不确定您要达到的目标,但是看起来有些人为。查看以下方法是否满足您

  • 我对 jenkins (2.74) 在归档 maven 项目中的工件时究竟在做什么有点困惑。从日志中可以看出,jenkins 正在自动存档项目中的工件,而无需指定生成后操作。工件文件确实在

  • 我有2个自由式詹金斯工作,比如工作A(上游)和工作B(下游)。我想在作业 B 完成后发送可编辑的电子邮件。另外,我想在电子邮件内容和主题中使用作业名称,内部版本号和作业A的状态。任何人都可以帮我吗? 我尝试使用构建后步骤:“在其他项目上触发参数化构建”,并使用预定义参数作为: UPSTREAM_BUILD_NUMBER=$BUILD_ID UPSTREAM_JOB_NAME=$JOB_ NAME

  • 问题内容: 是否可以通过多个上游作业的Join插件复制工件触发Jenkins作业? 我正在尝试使用“钻石”作业来设置Jenkins配置:my-trigger运行并产生两个作业,my-fork1和my- fork2,它们可以同时运行并且花费不同的时间,并且Join一旦两个分支完成,插件就会启动作业my-join。 my-trigger,my-fork1和my-fork2中的每一个都创建并指纹工件(例