2012-11-01 82 views
4

我們公司的詹金斯有主人和兩個奴隸節點。我正在爲它編寫插件。插件做的一件事是從svn檢出一些文件。此操作無法從插件中提取。 爲此,我從我的插件的java代碼執行控制檯命令「svn checkout」。問題是來自svn的文件被檢出爲master,而不是從屬節點。 我怎樣才能讓文件檢出到奴隸?Jenkins插件,如何在遠程節點上執行系統命令?

回答

7

首先你有這些對象,通常收到的參數perform方法:

Launcher launcher; 
AbstractBuild<?, ?> build; 
BuildListener listener; 

那麼你已經創建並添加參數到argumentListBuilder,也許是這樣的:

ArgumentListBuilder command = new ArgumentListBuilder(); 
command.addTokenized("xcopy /?"); 

然後執行例如:

ProcStarter ps = launcher.new ProcStarter(); 
ps = ps.cmds(command).stdout(listener); 
ps = ps.pwd(build.getWorkspace()).envs(build.getEnvironment(listener)); 
Proc proc = launcher.launch(ps); 
int retcode = proc.join(); 

ProcStarter will r在由launcher實例指定的節點上取消命令。但請至少在使用之前瀏覽上述所有類的javadoc,以上是而不是直接從工作代碼複製粘貼。

+0

謝謝,我會試試! –

+0

有一個問題:「CreateProcess error = 2,系統找不到指定的文件。」我試過命令「svn co」和「cmd.exe/C svn co」。你有任何想法來解決它? –

+0

@ V.Artyukhov你是怎麼構造'command'的?只是一個猜測,沒有看到你的代碼,但你應該''ArgumentListBuilder.addTokenized(java.lang.String s)' – hyde

3

這裏是根據海德的答案代碼,適合Groovy腳本控制檯(在/script

def static Run(nodeName, runCommand) 
{ 
    def output = new java.io.ByteArrayOutputStream(); 
    def listener = new hudson.util.StreamTaskListener(output); 
    def node = hudson.model.Hudson.instance.getNode(nodeName); 
    def launcher = node.createLauncher(listener); 

    def command = new hudson.util.ArgumentListBuilder(); 
    command.addTokenized(runCommand); 
    def ps = launcher.launch(); 
    ps = ps.cmds(command).stdout(listener); 
    // ps = ps.pwd(build.getWorkspace()).envs(build.getEnvironment(listener)); 
    def proc = launcher.launch(ps); 
    int retcode = proc.join(); 
    return [retcode, output.toString()] 
} 

// for (aSlave in hudson.model.Hudson.instance.slaves) { 
(recode, output) = Run("build-slave9", "xcopy /?"); 
println output; 

(注意事項:未經測試的讀取標準輸入程序注意ByteArrayOutputStream,所以千萬不要運行程序。非常長的輸出。未經測試的非ASCII輸出。)

+0

我使用腳本控制檯測試了這一點,並調用createLauncher()返回一個NullPointerException。我的目標是遍歷所有的奴隸,並對他們執行維護腳本。有沒有人看過這個作品? –

+0

它在4月份爲我工作,今天在Jenkins 1.580.1上運行。奴隸必須在線才能工作。 (你有一個叫做「build-slave9」的奴隸,還是你改變了它?) –