2014-03-26 76 views
4

我已經建立了詹金斯CI溶液(在Windows上)組成的,其檢出git倉庫(使用GIT中-插件)到它們各自的工作空間3個並行作業(使用多椎插件)。時代 95%,作業完美運行,但有的時候我在工作中的任何一個或多個以下錯誤信息:無效的ID:處理泄漏的文件描述符。詹金斯

Building on master in workspace C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace 
Checkout:workspace/C:\Program Files (x86)\Jenkins\jobs\PatchsetCPPCheck\workspace - [email protected] 
Using strategy: Gerrit Trigger 
Last Built Revision: Revision 2ff5e3449041916e21fe7a4833a2babcfef45225 (master) 
Fetching changes from 1 remote Git repository 
Fetching upstream changes from origin 
Commencing build of Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master) 
Checking out Revision 1eec024d8a125a42b563011468bb19a87e1da2ea (master) 
Cleaning workspace 
Resetting working tree 
FATAL: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information 
java.lang.IllegalArgumentException: Invalid id: Process leaked file descriptors. See http://wiki.jenkins-ci.org/display/JENKINS/Spawning+processes+from+build for more information 
    at org.eclipse.jgit.lib.ObjectId.fromString(ObjectId.java:232) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.doRevList(CliGitAPIImpl.java:1278) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.revList(CliGitAPIImpl.java:1264) 
    at org.jenkinsci.plugins.gitclient.CliGitAPIImpl.isCommitInRepo(CliGitAPIImpl.java:1289) 
    at hudson.plugins.git.GitAPI.isCommitInRepo(GitAPI.java:189) 
    at hudson.plugins.git.GitSCM.computeChangeLog(GitSCM.java:1286) 
    at hudson.plugins.git.GitSCM.access$1300(GitSCM.java:57) 
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1251) 
    at hudson.plugins.git.GitSCM$4.invoke(GitSCM.java:1205) 
    at hudson.FilePath.act(FilePath.java:905) 
    at hudson.FilePath.act(FilePath.java:878) 
    at hudson.plugins.git.GitSCM.checkout(GitSCM.java:1205) 
    at hudson.model.AbstractProject.checkout(AbstractProject.java:1369) 
    at hudson.model.AbstractBuild$AbstractBuildExecution.defaultCheckout(AbstractBuild.java:676) 
    at jenkins.scm.SCMCheckoutStrategy.checkout(SCMCheckoutStrategy.java:88) 
    at hudson.model.AbstractBuild$AbstractBuildExecution.run(AbstractBuild.java:581) 
    at hudson.model.Run.execute(Run.java:1593) 
    at hudson.model.FreeStyleBuild.run(FreeStyleBuild.java:46) 
    at hudson.model.ResourceController.execute(ResourceController.java:88) 
    at hudson.model.Executor.run(Executor.java:242) 

誰能幫助我在這?

回答

1

如果您將檢查link given in your error message你會發現三種解決方法有詳細的例子來解決這個問題,

  1. 'at' command可以用來在後臺啓動一個進程。
  2. 使用包裝腳本並通過它啓動程序。
  3. 對於Windows XP及更高版本是安排永久任務和部隊 在Ant腳本運行它。

編輯:

這個問題的原因進行了說明,

詹金斯和由三個管 連接子進程(標準輸入/輸出/標準錯誤)這允許詹金斯捕捉輸出從 子進程。由於子進程可以寫入大量數據來 管和後立即退出,詹金斯需要確保 它倒掉它認爲構建將超過之前的管道。 詹金斯通過等待EOF來做到這一點。

當這些文件描述符被繼承到 其他進程時,會發生併發症。假設子進程會將另一個進程分配給 的背景。後臺進程(AKA守護進程)繼承了所有家長的 文件描述符,其中包括連接子進程和詹金斯 標準輸出/標準錯誤管道的寫入一側。如果 守護忘記關閉它們,詹金斯不會得到EOF管道甚至 當子進程退出,因爲守護還有那些 描述符打開。這就是這個問題的發生。

一個很好的守護程序關閉所有文件描述符,以避免類似問題(這樣詹金斯可以閱讀EOF)

爲了防止其打開的文件描述符一個守護進程,一個進程(這是你的解決方法,可以是在後臺運行的shell/windows腳本)將在後臺運行,以確保守護進程存在時,它將關閉所有文件描述符。

+0

的問題是之前構建步驟觸發 – 2014-07-11 09:09:46

+0

@ruslo這種解決方法並不詹金斯的一部分生成步驟,它的失敗!看看它... –

+0

可能我錯過了一些東西,但是從文檔引用:'你可以調用你的命令'。我沒有任何命令,即使當我有一個剛剛退出SUCCESS消息的裸露項目(至少它必須) – 2014-07-11 10:44:17

相關問題