Jenkins和Copy Artifact插件:覆盖目标项目中的现有文件?

时间:2017-03-17 15:40:01

标签: jenkins build jenkins-plugins

我正在使用Copy Artifact Plugin作为构建步骤,将工件(* .dll)从先前构建的项目复制到我正在构建的项目的lib文件夹中。但是,这些文件通常已经存在于代码存储库中,但我想用Copy Artifact构建步骤覆盖它们。这是可能的,还是应该添加另一个构建步骤来首先删除现有文件?

2 个答案:

答案 0 :(得分:2)

我可以确认Copy Artifact Plugin将文件复制到我的SCM签出区域,但是如果没有设置写入权限,我可以看到无法处理文件。

1。检查jenkins作业控制台日志。您是否看到了复制邮件?     请参阅以下复制工件成功和失败案例中的消息示例。

2。构建步骤顺序:确保在 SCM更新 主构建步骤之后完成“从另一个项目复制工件”构建步骤。 (显然我知道,但以防万一)。

3。调试权限和文件存在通过添加复制的区域的构建步骤(或添加到执行脚本)目录列表。 'ls -alstr< dir>'

您使用的SCM是什么?你是怎么看的? 我猜这个问题是由于结账后对文件或目录的写权限。或者可能构建步骤顺序。

参考:Copy Artifact Plugin

控制台日志中的成功消息:

Copied <num> artifacts from "<jobname>" build number <jobnum>.

控制台日志中的不成功消息(权限chmod 000文件):

FATAL: Failed to copy /var/lib/jenkins/jobs/jobname/builds/178/archive/file to /var/lib/jenkins/jobs/jobname/workspace/dir/file
hudson.util.IOException2: Failed to copy /var/lib/jenkins/jobs/jobname/builds/178/archive/file to         /var/lib/jenkins/jobs/jobname/workspace/dir/file
 at hudson.plugins.copyartifact.FingerprintingCopyMethod.copyOne(FingerprintingCopyMethod.java:118)
 at hudson.plugins.copyartifact.FingerprintingCopyMethod.copyAll(FingerprintingCopyMethod.java:67)
 at hudson.plugins.copyartifact.CopyArtifact.perform(CopyArtifact.java:526)
 at hudson.plugins.copyartifact.CopyArtifact.perform(CopyArtifact.java:460)
 at hudson.tasks.BuildStepCompatibilityLayer.perform(BuildStepCompatibilityLayer.java:78)
 at hudson.tasks.BuildStepMonitor$1.perform(BuildStepMonitor.java:20)
 at hudson.model.AbstractBuild$AbstractBuildExecution.perform(AbstractBuild.java:779)
 at hudson.model.Build$BuildExecution.build(Build.java:205)
 at hudson.model.Build$BuildExecution.doRun(Build.java:162)
 at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:534)
 at hudson.model.Run.execute(Run.java:1741)
 at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:43)
 at hudson.model.ResourceController.execute(ResourceController.java:98)
 at hudson.model.Executor.run(Executor.java:410)
Caused by: java.io.FileNotFoundException: /var/lib/jenkins/jobs/jobname/workspace/dir/file (Permission denied)
 at java.io.FileOutputStream.open(Native Method)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:221)
 at java.io.FileOutputStream.<init>(FileOutputStream.java:171)
 at hudson.FilePath.write(FilePath.java:1907)
 at hudson.plugins.copyartifact.FingerprintingCopyMethod.copyOne(FingerprintingCopyMethod.java:82)
 ... 13 more

答案 1 :(得分:0)

  

这是可能的,还是应该先添加另一个构建步骤来删除现有文件?

不,您不需要显式删除它然后复制,如果配置正确,它将覆盖现有文件。 @gaoithe的回答提供了如何调试它的很好的解释,如果您的所有构建消息看起来都很好但是目标文件没有被替换,我怀疑您在target directory时错误地配置了docker-entrypoint.sh该文物是从子目录中获得的。

以下是一个例子:

  • 我在子目录base-image/redis/ with git shortlog HEAD`下重写文件base-image/redis/的内容,然后将其存档:

config of archiving job

  • 错误的目标目录配置:我将工件复制到另一个作业中,但将目标目录指定为cat base-images/redis/docker-entrypoint.sh

config with wrong target directory

base-image/redis/base-image/redis/docker-entrypoint.sh的输出将保持不变,因为实际上插件尝试执行的操作是将目标工件以其完整路径复制到目标目录,并且它应该是:{{1 }}

  • 更正目标目录配置:目标目录应为当前目录./

Correct target directory config

然后我可以得到我的预期。