2013-10-16 30 views
1

我還在學習插件開發。這是我的第一個。Jenkins插件開發 - 持久性

我想堅持我的插件的配置,但它不會工作。

你能告訴我,我做錯了什麼?

我已經嘗試調試過程,從添加插件到作業直到保存作業配置。

我發現,在描述符的load()方法內部,找不到xml文件!

它正在尋找的路徑是這樣的:C:\用戶\彼得\工作區\ R-腳本\工作\ whatEverDir \ xy.xml

我不認爲\部分導致配置文件不被發現,但因爲它是一個詹金斯類生成這條路徑,我不會賭它。雖然系統可能試圖在這裏創建它,但首先。

提前致謝!

Scriptrunner.jelly

<f:block> 
     <f:entry title="RScript" field="command"> 
      <f:textarea style="width:99%" /> 
     </f:entry> 
     </f:block> 

    <f:entry field="installedPackages" title="Installed packages"> 
     <f:select style="width:40%" /> 
    </f:entry> 

    <f:entry field="mirrors" title="Choose a mirror"> 
     <f:select style="width:40%" /> 
    </f:entry> 

    <f:entry> 
      <f:repeatableProperty field="availablePackages" minimum="1"/> 
    </f:entry>    

AvailablePackage.jelly

<f:entry field="availablePackages"> 
    <f:select style="width:40%" /> 
    <f:repeatableDeleteButton /> 
</f:entry> 

ScriptRunner.java

public class ScriptRunner extends Builder { 
private static final String fileExtension = ".R"; 
private ArrayList<AvailablePackage> availablePackages; 
private String command; 
private String chosenMirror; 
private List<String> mirrorList = new ArrayList<String>(); 

@DataBoundConstructor 
public ScriptRunner(String command, ArrayList<String> installedPackages,  ArrayList<String> mirrors, ArrayList<AvailablePackage> availablePackages) { 
this.chosenMirror = mirrors.get(0); 
this.availablePackages = availablePackages; 
this.command = command; 
    } 

    public final String getCommand() { 
    return command; 
    } 

    @Override 
    public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, 
    BuildListener listener) throws InterruptedException { 
    return perform(build, launcher, (TaskListener) listener); 
    } 

    public boolean perform(AbstractBuild<?, ?> build, Launcher launcher, 
    TaskListener listener) throws InterruptedException { 
FilePath workSpace = build.getWorkspace(); 
FilePath rScript = null; 
if (workSpace == null) { 
    try { 
    throw new NoSuchFileException("Workspace could not be set!"); 
    } catch (NoSuchFileException e) { 
    e.printStackTrace(); 
    } 
} 
try { 
    try { 
    String fullScript; 
    if (command.contains("options(repos=structure(")) { 
      fullScript = PackagesManager.singleton().createFullScript(availablePackages, "", command); 
    } else { 
     fullScript = PackagesManager.singleton().createFullScript(availablePackages, chosenMirror, command); 
    } 
    rScript = workSpace.createTextTempFile("RScriptTemp", 
     getFileExtension(), fullScript, false); 
    } catch (IOException e) { 
    Util.displayIOException(e, listener); 
    e.printStackTrace(listener.fatalError(Messages 
     .CommandInterpreter_UnableToProduceScript())); 
    return false; 
    } 

    boolean successfullyRan = false; 
    try { 
    EnvVars envVars = build.getEnvironment(listener); 
    for (Map.Entry<String, String> e : build.getBuildVariables() 
     .entrySet()) { 
     envVars.put(e.getKey(), e.getValue()); 
    } 

    if (launcher.launch().cmds(buildCommandLine(rScript)) 
     .envs(envVars).stdout(listener).pwd(workSpace).join() == 1) { 
     successfullyRan = true; 
    } 
    } catch (IOException e) { 
    Util.displayIOException(e, listener); 
    e.printStackTrace(listener.fatalError(Messages 
     .CommandInterpreter_CommandFailed())); 

    } 
    return successfullyRan; 
} finally { 
    try { 
    if (rScript != null) { 
     rScript.delete(); 
    } 
    } catch (IOException e) { 
    Util.displayIOException(e, listener); 
    e.printStackTrace(listener.fatalError(Messages 
     .CommandInterpreter_UnableToDelete(rScript))); 
    } catch (Exception e) { 
    e.printStackTrace(listener.fatalError(Messages 
     .CommandInterpreter_UnableToDelete(rScript))); 
    } 
} 
} 

public String[] buildCommandLine(FilePath script) { 
return new String[] { "Rscript", script.getRemote() }; 
} 

protected String getFileExtension() { 
return fileExtension; 
} 

public List<String> getMirrorList() { 
return mirrorList; 
} 

public void setMirrorList(List<String> mirrorList) { 
this.mirrorList = mirrorList; 
} 

public String getChosenMirror() { 
return chosenMirror; 
} 

public void setChosenMirror(String chosenMirror) { 
this.chosenMirror = chosenMirror; 
} 

public ArrayList<AvailablePackage> getAvailablePackages() { 
return availablePackages; 
} 

@Override 
public ScriptBuildStepDescriptorImplementation getDescriptor() { 
    return (ScriptBuildStepDescriptorImplementation)super.getDescriptor(); 
} 

@Extension 
public static class ScriptBuildStepDescriptorImplementation extends 
    BuildStepDescriptor<Builder> { 

private boolean showInstalled; 
private String command; 
private String chosenMirror; 
private ArrayList<AvailablePackage> availablePackages; 

public ScriptBuildStepDescriptorImplementation() { 
    load(); 
} 

@Override 
    public boolean configure(StaplerRequest req, JSONObject formData) throws FormException { 
     req.bindJSON(this, formData); 
     save(); 
     return super.configure(req,formData); 
    } 

@Override 
public String getDisplayName() { 
    return "Advanced R script runner"; 
} 

@Override 
public boolean isApplicable(Class<? extends AbstractProject> jobType) { 
    return true; 
} 

public ListBoxModel doFillInstalledPackagesItems() { 
    ListBoxModel mirrors = new ListBoxModel(); 
    Set<String> mirrorsList = PackagesManager.singleton() 
     .getInstalledPackages(); 
    for (String entry : mirrorsList) { 
    mirrors.add(entry); 
    } 
    return mirrors; 
} 

public ListBoxModel doFillAvailablePackagesItems() { 
    ListBoxModel packages = new ListBoxModel(); 
    List<String> packageList = PackagesManager.singleton().getAvailablePackages(); 
    Set<String> alreadyInstalled = PackagesManager.singleton().getInstalledPackages(); 
    for (String entry : packageList) { 
    if (!alreadyInstalled.contains(entry)) { 
    packages.add(entry); 
    } 
    } 
    return packages; 
} 

public ListBoxModel doFillMirrorsItems() { 
    ListBoxModel mirrors = new ListBoxModel(); 
    String[] mirrorsList = MirrorManager.singleton().getMirrors(); 
    int selected = 34; 
    for (int i = 0; i < mirrorsList.length; i++) { 
    String[] splitCurrent = mirrorsList[i].split(" - "); 
    if (chosenMirror != null && chosenMirror.equals(splitCurrent[1])) { 
     selected = i; 
    } 
    mirrors.add(splitCurrent[1], splitCurrent[0]); 
    } 
    mirrors.get(selected).selected = true; 
    return mirrors; 
} 

public boolean getShowInstalled() { 
    return showInstalled; 
} 

public void setShowInstalled(boolean showInstalled) { 
    this.showInstalled = showInstalled; 
} 

public String getCommand() { 
    return command; 
} 

public void setCommand(String command) { 
    this.command = command; 
} 

public String getChosenMirror() { 
    return chosenMirror; 
} 

    public void setChosenMirror(String chosenMirror) { 
    this.chosenMirror = chosenMirror; 
    } 
    } 
} 

AvailablePackage.java

public class AvailablePackage extends AbstractDescribableImpl<AvailablePackage> { 
private String name; 

@DataBoundConstructor 
public AvailablePackage(String availablePackages) { 
this.name = availablePackages; 
} 

public String getName() { 
return name; 
} 

@Override 
public DescriptorImpl getDescriptor() { 
    return (DescriptorImpl)super.getDescriptor(); 
} 

@Extension 
public static class DescriptorImpl extends Descriptor<AvailablePackage> { 
private String name; 

public DescriptorImpl() { 
    load(); 
} 

@Override 
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException { 
    req.bindJSON(this, formData); 
    save(); 
    return super.configure(req,formData); 
    } 

    public ListBoxModel doFillAvailablePackagesItems() { 
     return PackagesManager.singleton().getAvailablePackagesAsListBoxModel(name); 
    } 

    @Override 
    public String getDisplayName() { 
     return ""; 
    } 

    public String getName() { 
     return name; 
    } 
} 

} 

很抱歉的代碼格式化!在stackoverflow代碼發佈第一次計時器。

回答

0

我想你可能需要註釋此行出

@Override 
public boolean configure(StaplerRequest req, JSONObject formData) throws FormException { 
    req.bindJSON(this, formData); 
    save(); 
    //return super.configure(req,formData); 
    return true; 
} 

,因爲它會再保存再次但是沒有字段。

一個好地方,找到詹金斯插件的例子是在https://github.com/jenkinsci

+0

沒有幫助。我會檢查該鏈接。謝謝! – inferno88