我正在使用Copy Artifact Plugin作为构建步骤,将工件(* .dll)从先前构建的项目复制到我正在构建的项目的lib文件夹中。但是,这些文件通常已经存在于代码存储库中,但我想用Copy Artifact构建步骤覆盖它们。这是可能的,还是应该添加另一个构建步骤来首先删除现有文件?
答案 0 :(得分:2)
我可以确认Copy Artifact Plugin将文件复制到我的SCM签出区域,但是如果没有设置写入权限,我可以看到无法处理文件。
1。检查jenkins作业控制台日志。您是否看到了复制邮件? 请参阅以下复制工件成功和失败案例中的消息示例。
2。构建步骤顺序:确保在 SCM更新 主构建步骤之后完成“从另一个项目复制工件”构建步骤。 (显然我知道,但以防万一)。
3。调试权限和文件存在通过添加复制的区域的构建步骤(或添加到执行脚本)目录列表。 'ls -alstr< dir>'
您使用的SCM是什么?你是怎么看的? 我猜这个问题是由于结账后对文件或目录的写权限。或者可能构建步骤顺序。
控制台日志中的成功消息:
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/
的内容,然后将其存档:cat base-images/redis/docker-entrypoint.sh
: base-image/redis/base-image/redis/docker-entrypoint.sh
的输出将保持不变,因为实际上插件尝试执行的操作是将目标工件以其完整路径复制到目标目录,并且它应该是:{{1 }}
./
:然后我可以得到我的预期。