[英]Jenkins with Copy Artifact plugin: copy directory contents with subdirectories
[英]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 <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
這是可能的,還是應該添加另一個構建步驟來首先刪除現有文件?
不,您不需要顯式刪除它然后復制,如果您的配置正確,它將覆蓋現有文件。 @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.