簡體   English   中英

Jenkins和Copy Artifact插件:覆蓋目標項目中的現有文件?

[英]Jenkins and Copy Artifact plugin: Overwrite existing file in target project?

我正在使用Copy Artifact Plugin作為構建步驟,將工件(* .dll)從先前構建的項目復制到我正在構建的項目的lib文件夾中。 但是,這些文件通常已經存在於代碼存儲庫中,但我想用Copy Artifact構建步驟覆蓋它們。 這是可能的,還是應該添加另一個構建步驟來首先刪除現有文件?

我可以確認Copy Artifact Plugin將文件復制到我的SCM簽出區域,但是如果沒有設置寫入權限,我可以看到無法處理文件。

1.檢查jenkins作業控制台日志。 你看到復制郵件了嗎? 請參閱以下復制工件成功和失敗案例中的消息示例。

2.構建步驟順序 :確保 SCM更新之后和主構建步驟之前完成“從另一個項目復制工件”構建步驟。 (顯然我知道,但以防萬一)。

3.通過添加復制區域的構建步驟(或添加到執行腳本)目錄列表來調試權限和文件存在 'ls -alstr <dir>'

您使用的SCM是什么? 你是怎么看的? 我猜這個問題是由於結賬后對文件或目錄的寫權限。 或者可能構建步驟順序。

ref: 復制工件插件

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

Copied &lt;num> artifacts from "&lt;jobname>" build number &lt;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

這是可能的,還是應該添加另一個構建步驟來首先刪除現有文件?

不,您不需要顯式刪除它然后復制,如果您的配置正確,它將覆蓋現有文件。 @gaoithe的答案提供了如何調試它的很好的解釋,如果你的所有構建消息看起來都很好但你的目標文件沒有被替換,我懷疑你是否在從子目錄中獲得了這些工件時錯誤地配置了你的target directory

這是一個例子:

  • 我在子目錄base-image/redis/ with git shortlog HEAD`重寫文件docker-entrypoint.sh的內容,然后將其歸檔:

歸檔作業的配置

  • 錯誤的目標目錄配置 :我在另一個作業中復制工件但指定目標目錄base-image/redis/

配置錯誤的目標目錄

cat base-images/redis/docker-entrypoint.sh將保持不變,因為實際上插件嘗試將目標工件的完整路徑復制到目標目錄,它應該是: base-image/redis/base-image/redis/docker-entrypoint.sh

  • 正確的目標目錄配置 :目標目錄應該是當前目錄./

更正目標目錄配置

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM