Thanks Guys for helping. I am able to crack it now. After creating below
two files it works.
*First Java File*
import org.kohsuke.stapler.DataBoundConstructor;
import org.kohsuke.stapler.DataBoundSetter;
import
com.oracle.siebel.jenkins.BuildStepCommandInterpreter.OptionalTextBlock1;
import hudson.Extension;
import hudson.FilePath;
import hudson.Launcher;
import hudson.tasks.Messages;
import hudson.Proc;
import hudson.Util;
import hudson.EnvVars;
import hudson.model.AbstractBuild;
import hudson.model.AbstractDescribableImpl;
import hudson.model.BuildListener;
import hudson.model.Node;
import hudson.model.Result;
import hudson.model.TaskListener;
import hudson.remoting.ChannelClosedException;
import hudson.model.AbstractProject;
import hudson.tasks.BuildStepDescriptor;
import hudson.tasks.Builder;
import hudson.tasks.CommandInterpreter;
import java.io.IOException;
import java.io.ObjectStreamException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
public class BuildStepCreator extends BuildStepCommandInterpreter {
@DataBoundConstructor
public BuildStepCreator(OptionalTextBlock1 enableText1) {
super(enableText1);
}
private Integer unstableReturn;
public String[] buildCommandLine(FilePath script) {
return new String[] {"cmd","/c","call",script.getRemote()};
}
protected String getContents() {
return text1;
}
protected String getFileExtension() {
return ".bat";
}
@CheckForNull
public final Integer getUnstableReturn() {
return new Integer(0).equals(unstableReturn) ? null :
unstableReturn;
}
@DataBoundSetter
public void setUnstableReturn(Integer unstableReturn) {
this.unstableReturn = unstableReturn;
}
@Override
protected boolean isErrorlevelForUnstableBuild(int exitCode) {
return this.unstableReturn != null && exitCode != 0 &&
this.unstableReturn.equals(exitCode);
}
private Object readResolve() throws ObjectStreamException {
return new BuildStepCreator(enableText1);
}
@Extension
public static final class DescriptorImpl extends
BuildStepDescriptor<Builder>{
/*public FormValidation doCheckTask(@QueryParameter String value){
try{
if(value.equalsIgnoreCase(null) ||
value.equalsIgnoreCase("")){
return FormValidation.error("Invalid Details.");
}
}catch(Exception e){
return FormValidation.error("Error validating the form
details.");
}
return FormValidation.ok();
}
public FormValidation doCheckGoal(@QueryParameter String value){
try{
Integer.parseInt(value);
}catch(Exception e){
return FormValidation.error("Please provide integer in the
Goal.");
}
return FormValidation.ok();
}*/
@Override
public boolean isApplicable(Class<? extends AbstractProject>
jobType) {
// TODO Auto-generated method stub
return true;
}
@Override
public String getDisplayName() {
// TODO Auto-generated method stub
return "Job Orchestration";
}
}
}
*Second Java File*
import java.io.IOException;
import java.util.Map;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.annotation.Nonnull;
import org.kohsuke.stapler.DataBoundConstructor;
import hudson.EnvVars;
import hudson.FilePath;
import hudson.Launcher;
import hudson.Messages;
import hudson.Proc;
import hudson.Util;
import hudson.model.AbstractBuild;
import hudson.model.BuildListener;
import hudson.model.Node;
import hudson.model.Result;
import hudson.model.TaskListener;
import hudson.remoting.ChannelClosedException;
import hudson.tasks.Builder;
import hudson.tasks.CommandInterpreter;
public abstract class BuildStepCommandInterpreter extends Builder {
protected final String text1;
//protected final String text2;
//protected final String text3;
public String getText1(){
return text1;
}
/*public String getText2(){
return text2;
}
public String getText3(){
return text3;
}*/
protected OptionalTextBlock1 enableText1;
//protected OptionalTextBlock2 enableText2;
//protected OptionalTextBlock3 enableText3;
/*public BuildStepCommandInterpreter(OptionalTextBlock1 enableText1,
OptionalTextBlock2 enableText2, OptionalTextBlock3 enableText3) {
this.text1 = (enableText1 != null) ? enableText1.text1 : null;
this.text2 = (enableText2 != null) ? enableText2.text2 : null;
this.text3 = (enableText3 != null) ? enableText3.text3 : null;
}*/
public BuildStepCommandInterpreter(OptionalTextBlock1 enableText1) {
this.text1 = (enableText1 != null) ? enableText1.text1 : null;
}
public static class OptionalTextBlock1 {
protected String text1;
@DataBoundConstructor
public OptionalTextBlock1(String text1) {
this.text1 = text1;
}
}
/*public static class OptionalTextBlock2 {
private String text2;
@DataBoundConstructor
public OptionalTextBlock2(String text2) {
this.text2 = text2;
}
}
public static class OptionalTextBlock3 {
private String text3;
@DataBoundConstructor
public OptionalTextBlock3(String text3) {
this.text3 = text3;
}
}*/
@Override
public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
BuildListener listener) throws InterruptedException {
return perform(build,launcher,(TaskListener)listener);
}
/**
* Determines whether a non-zero exit code from the process should
change the build
* status to {@link Result#UNSTABLE} instead of default {@link
Result#FAILURE}.
*
* Changing to {@link Result#UNSTABLE} does not abort the build, next
steps are continued.
*
* @since 2.26
*/
protected boolean isErrorlevelForUnstableBuild(int exitCode) {
return false;
}
public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
TaskListener listener) throws InterruptedException {
FilePath ws = build.getWorkspace();
if (ws == null) {
Node node = build.getBuiltOn();
if (node == null) {
throw new NullPointerException("no such build node: " +
build.getBuiltOnStr());
}
throw new NullPointerException("no workspace from node " + node
+ " which is computer " + node.toComputer() + " and has channel " +
node.getChannel());
}
FilePath script=null;
int r = -1;
try {
try {
script = createScriptFile(ws);
} catch (IOException e) {
Util.displayIOException(e,listener);
e.printStackTrace(listener.fatalError("Error in
createScriptFile step."));
return false;
}
try {
EnvVars envVars = build.getEnvironment(listener);
// on Windows environment variables are converted to all
upper case,
// but no such conversions are done on Unix, so to make
this cross-platform,
// convert variables to all upper cases.
for(Map.Entry<String,String> e :
build.getBuildVariables().entrySet())
envVars.put(e.getKey(),e.getValue());
r =
join(launcher.launch().cmds(buildCommandLine(script)).envs(envVars).stdout(listener).pwd(ws).start());
if(isErrorlevelForUnstableBuild(r)) {
build.setResult(Result.FAILURE);
r = 0;
}
} catch (IOException e) {
Util.displayIOException(e, listener);
e.printStackTrace(listener.fatalError(""));
}
return r==0;
} finally {
try {
if(script!=null)
script.delete();
} catch (IOException e) {
if (r==-1 && e.getCause() instanceof
ChannelClosedException) {
// JENKINS-5073
// r==-1 only when the execution of the command
resulted in IOException,
// and we've already reported that error. A common
error there is channel
// losing a connection, and in that case we don't want
to confuse users
// by reporting the 2nd problem. Technically the 1st
exception may not be
// a channel closed error, but that's rare enough, and
JENKINS-5073 is common enough
// that this suppressing of the error would be justified
LOGGER.log(Level.FINE, "Script deletion failed or
Channel Closed Exception.", e);
} else {
Util.displayIOException(e,listener);
e.printStackTrace( listener.fatalError("") );
}
} catch (Exception e) {
e.printStackTrace( listener.fatalError("Unable to Delete")
);
}
}
}
/**
* Reports the exit code from the process.
*
* This allows subtypes to treat the exit code differently (for example
by treating non-zero exit code
* as if it's zero, or to set the status to {@link Result#UNSTABLE}).
Any non-zero exit code will cause
* the build step to fail. Use {@link #isErrorlevelForUnstableBuild(int
exitCode)} to redefine the default
* behaviour.
*
* @since 1.549
*/
protected int join(Proc p) throws IOException, InterruptedException {
return p.join();
}
/**
* Creates a script file in a temporary name in the specified directory.
*/
public FilePath createScriptFile(@Nonnull FilePath dir) throws
IOException, InterruptedException {
return dir.createTextTempFile("jenkins", getFileExtension(),
getContents(), false);
}
public abstract String[] buildCommandLine(FilePath script);
protected abstract String getContents();
protected abstract String getFileExtension();
private static final Logger LOGGER =
Logger.getLogger(CommandInterpreter.class.getName());
}
On Thursday, 17 November 2016 13:54:00 UTC+5:30, Kul Bhushan Srivastava
wrote:
>
> Agree with your point.
>
> I have change the code accordingly. Compiles properly through Maven. But
> now Jenkins at Runtime throwing exception when saving the job
> configuration, saying -
>
> Caused by: java.lang.IllegalArgumentException: Failed to instantiate class
> com.oracle.siebel.jenkins.ABC from
> {"enableText1":{"text1":"hello"},"enableText2":{"text2":"kul"},"enableText3":{"text3":"bhushan"},"stapler-class":"com.oracle.siebel.jenkins.ABC","$class":"com.oracle.siebel.jenkins.ABC"}
> at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:674)
> at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:476)
> at org.kohsuke.stapler.RequestImpl.bindJSON(RequestImpl.java:472)
> at hudson.model.Descriptor.newInstance(Descriptor.java:588)
> ... 81 more
> Caused by: org.kohsuke.stapler.NoStaplerConstructorException: There's no
> @DataBoundConstructor on any constructor of class
> com.oracle.siebel.jenkins.ABC
> at
> org.kohsuke.stapler.ClassDescriptor.loadConstructorParamNames(ClassDescriptor.java:177)
> at org.kohsuke.stapler.RequestImpl.instantiate(RequestImpl.java:756)
> at org.kohsuke.stapler.RequestImpl.access$200(RequestImpl.java:81)
> at
> org.kohsuke.stapler.RequestImpl$TypePair.convertJSON(RequestImpl.java:672)
> ... 84 more
>
> *New Java File*
>
> import org.kohsuke.stapler.DataBoundConstructor;
> import hudson.Extension;
> import hudson.FilePath;
> import hudson.Launcher;
> import hudson.tasks.Messages;
> import hudson.Proc;
> import hudson.Util;
> import hudson.EnvVars;
> import hudson.model.AbstractBuild;
> import hudson.model.AbstractDescribableImpl;
> import hudson.model.BuildListener;
> import hudson.model.Node;
> import hudson.model.Result;
> import hudson.model.TaskListener;
> import hudson.remoting.ChannelClosedException;
> import hudson.model.AbstractProject;
> import hudson.tasks.BuildStepDescriptor;
> import hudson.tasks.Builder;
> import hudson.tasks.CommandInterpreter;
> import java.io.IOException;
> import java.util.Map;
> import java.util.logging.Level;
> import java.util.logging.Logger;
> import javax.annotation.Nonnull;
>
> public class BuildStepCreator extends Builder{
>
> private String text1, text2, text3;
>
> public String getText1(){
> return text1;
> }
> public String getText2(){
> return text2;
> }
> public String getText3(){
> return text3;
> }
>
> @DataBoundConstructor
> public BuildStepCreator(OptionalTextBlock1 enableText1,
> OptionalTextBlock2 enableText2, OptionalTextBlock3 enableText3) {
> this.text1 = (enableText1 != null) ? enableText1.text1 : null;
> this.text2 = (enableText2 != null) ? enableText2.text2 : null;
> this.text3 = (enableText3 != null) ? enableText3.text3 : null;
> }
>
> public static class OptionalTextBlock1 {
> private String text1;
> @DataBoundConstructor
> public OptionalTextBlock1(String text1) {
> this.text1 = text1;
> }
> }
> public static class OptionalTextBlock2 {
> private String text2;
> @DataBoundConstructor
> public OptionalTextBlock2(String text2) {
> this.text2 = text2;
> }
> }
> public static class OptionalTextBlock3 {
> private String text3;
> @DataBoundConstructor
> public OptionalTextBlock3(String text3) {
> this.text3 = text3;
> }
> }
> }
>
> abstract class ABC extends BuildStepCreator{
>
> public ABC(OptionalTextBlock1 enableText1, OptionalTextBlock2
> enableText2, OptionalTextBlock3 enableText3) {
> super(enableText1, enableText2, enableText3);
> // TODO Auto-generated constructor stub
> }
>
> public abstract String[] buildCommandLine(FilePath script);
>
> protected abstract String getContents();
>
> protected abstract String getFileExtension();
>
> @Extension
> public static final class DescriptorImpl extends
> BuildStepDescriptor<Builder>{
>
> @Override
> public boolean isApplicable(Class<? extends AbstractProject>
> jobType) {
> // TODO Auto-generated method stub
> return true;
> }
>
> @Override
> public String getDisplayName() {
> // TODO Auto-generated method stub
> return "Job Orchestration";
> }
> }
>
>
>
> @Override
> public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
> BuildListener listener) throws InterruptedException {
> return perform(build,launcher,(TaskListener)listener);
> }
>
> /**
> * Determines whether a non-zero exit code from the process should
> change the build
> * status to {@link Result#UNSTABLE} instead of default {@link
> Result#FAILURE}.
> *
> * Changing to {@link Result#UNSTABLE} does not abort the build, next
> steps are continued.
> *
> */
> protected boolean isErrorlevelForUnstableBuild(int exitCode) {
> return false;
> }
>
> public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
> TaskListener listener) throws InterruptedException{
> FilePath ws = build.getWorkspace();
> if (ws == null) {
> Node node = build.getBuiltOn();
> if (node == null) {
> throw new NullPointerException("no such build node: " +
> build.getBuiltOnStr());
> }
> throw new NullPointerException("no workspace from node " +
> node + " which is computer " + node.toComputer() + " and has channel " +
> node.getChannel());
> }
> FilePath script=null;
> int r = -1;
> try {
> try {
> script = createScriptFile(ws);
> } catch (IOException e) {
> Util.displayIOException(e,listener);
>
> e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript()));
> return false;
> }
>
> try {
> EnvVars envVars = build.getEnvironment(listener);
> // on Windows environment variables are converted to all
> upper case,
> // but no such conversions are done on Unix, so to make
> this cross-platform,
> // convert variables to all upper cases.
> for(Map.Entry<String,String> e :
> build.getBuildVariables().entrySet())
> envVars.put(e.getKey(),e.getValue());
>
> r =
> join(launcher.launch().cmds(buildCommandLine(script)).envs(envVars).stdout(listener).pwd(ws).start());
>
> if(isErrorlevelForUnstableBuild(r)) {
> build.setResult(Result.FAILURE);
> r = 0;
> }
> } catch (IOException e) {
> Util.displayIOException(e, listener);
>
> e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_CommandFailed()));
> }
> return r==0;
> } finally {
> try {
> if(script!=null)
> script.delete();
> } catch (IOException e) {
> if (r==-1 && e.getCause() instanceof
> ChannelClosedException) {
> // JENKINS-5073
> // r==-1 only when the execution of the command
> resulted in IOException,
> // and we've already reported that error. A common
> error there is channel
> // losing a connection, and in that case we don't want
> to confuse users
> // by reporting the 2nd problem. Technically the 1st
> exception may not be
> // a channel closed error, but that's rare enough, and
> JENKINS-5073 is common enough
> // that this suppressing of the error would be
> justified
> LOGGER.log(Level.FINE, "Script deletion failed", e);
> } else {
> Util.displayIOException(e,listener);
> e.printStackTrace(
> listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) );
> }
> } catch (Exception e) {
> e.printStackTrace(
> listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) );
> }
> }
> }
>
> /**
> * Reports the exit code from the process.
> *
> * This allows subtypes to treat the exit code differently (for
> example by treating non-zero exit code
> * as if it's zero, or to set the status to {@link Result#UNSTABLE}).
> Any non-zero exit code will cause
> * the build step to fail. Use {@link
> #isErrorlevelForUnstableBuild(int exitCode)} to redefine the default
> * behaviour.
> *
> * @since 1.549
> */
> protected int join(Proc p) throws IOException, InterruptedException {
> return p.join();
> }
>
> /**
> * Creates a script file in a temporary name in the specified
> directory.
> */
> public FilePath createScriptFile(@Nonnull FilePath dir) throws
> IOException, InterruptedException {
> return dir.createTextTempFile("hudson", getFileExtension(),
> getContents(), false);
> }
>
> private static final Logger LOGGER =
> Logger.getLogger(CommandInterpreter.class.getName());
>
> }
>
> On Wednesday, 16 November 2016 23:00:36 UTC+5:30, Robert Sandell wrote:
>>
>> Abstract classes cannot be instanciated, so you can't annotate the
>> constructor with DataBoundConstructor since the class can't be directly
>> instanciated but will need to be subclassed.
>>
>> /B
>>
>> On Wed, Nov 16, 2016 at 3:59 PM, Kul Bhushan Srivastava <
>> [email protected]> wrote:
>>
>>> Thanks Robert.
>>>
>>> I am facing maven compilation issue. Saying @DataBoundConstructor cannot
>>> be used inside abstract class.
>>>
>>> Please suggest.
>>>
>>> My Java File:
>>>
>>> import org.kohsuke.stapler.DataBoundConstructor;
>>> import hudson.Extension;
>>> import hudson.FilePath;
>>> import hudson.Launcher;
>>> import hudson.tasks.Messages;
>>> import hudson.Proc;
>>> import hudson.Util;
>>> import hudson.EnvVars;
>>> import hudson.model.AbstractBuild;
>>> import hudson.model.BuildListener;
>>> import hudson.model.Node;
>>> import hudson.model.Result;
>>> import hudson.model.TaskListener;
>>> import hudson.remoting.ChannelClosedException;
>>> import hudson.model.AbstractProject;
>>> import hudson.tasks.BuildStepDescriptor;
>>> import hudson.tasks.Builder;
>>> import hudson.tasks.CommandInterpreter;
>>> import java.io.IOException;
>>> import java.util.Map;
>>> import java.util.logging.Level;
>>> import java.util.logging.Logger;
>>> import javax.annotation.Nonnull;
>>>
>>> public abstract class BuildStepCreator extends Builder {
>>>
>>> private String text1, text2, text3;
>>>
>>> public String getText1(){
>>> return text1;
>>> }
>>> public String getText2(){
>>> return text2;
>>> }
>>> public String getText3(){
>>> return text3;
>>> }
>>>
>>>
>>> @DataBoundConstructor
>>> public BuildStepCreator(OptionalTextBlock1 enableText1,
>>> OptionalTextBlock2 enableText2, OptionalTextBlock3 enableText3) {
>>> this.text1 = (enableText1 != null) ? enableText1.text1 : null;
>>> this.text2 = (enableText2 != null) ? enableText2.text2 : null;
>>> this.text3 = (enableText3 != null) ? enableText3.text3 : null;
>>> }
>>>
>>> public static class OptionalTextBlock1 {
>>> private String text1;
>>> @DataBoundConstructor
>>> public OptionalTextBlock1(String text1) {
>>> this.text1 = text1;
>>> }
>>> }
>>> public static class OptionalTextBlock2 {
>>> private String text2;
>>> @DataBoundConstructor
>>> public OptionalTextBlock2(String text2) {
>>> this.text2 = text2;
>>> }
>>> }
>>> public static class OptionalTextBlock3 {
>>> private String text3;
>>> @DataBoundConstructor
>>> public OptionalTextBlock3(String text3) {
>>> this.text3 = text3;
>>> }
>>> }
>>>
>>> @Extension
>>> public static final class DescriptorImpl extends
>>> BuildStepDescriptor<Builder>{
>>>
>>> /*public FormValidation doCheckTask(@QueryParameter String
>>> value){
>>> try{
>>> if(value.equalsIgnoreCase(null) ||
>>> value.equalsIgnoreCase("")){
>>> return FormValidation.error("Invalid Details.");
>>> }
>>> }catch(Exception e){
>>> return FormValidation.error("Error validating the form
>>> details.");
>>> }
>>> return FormValidation.ok();
>>> }
>>>
>>> public FormValidation doCheckGoal(@QueryParameter String value){
>>> try{
>>> Integer.parseInt(value);
>>> }catch(Exception e){
>>> return FormValidation.error("Please provide integer in
>>> the Goal.");
>>> }
>>> return FormValidation.ok();
>>> }*/
>>>
>>> @Override
>>> public boolean isApplicable(Class<? extends AbstractProject>
>>> jobType) {
>>> // TODO Auto-generated method stub
>>> return true;
>>> }
>>>
>>> @Override
>>> public String getDisplayName() {
>>> // TODO Auto-generated method stub
>>> return "Job Orchestration";
>>> }
>>> }
>>>
>>> /*@Override
>>> public boolean perform(hudson.model.AbstractBuild build,
>>> hudson.Launcher launcher, hudson.model.BuildListener listener) {
>>> listener.getLogger().println("OptionalBlockSampleBuilder " +
>>> text1);
>>> return true;
>>> }*/
>>>
>>> @Override
>>> public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
>>> BuildListener listener) throws InterruptedException {
>>> return perform(build,launcher,(TaskListener)listener);
>>> }
>>>
>>> /**
>>> * Determines whether a non-zero exit code from the process should
>>> change the build
>>> * status to {@link Result#UNSTABLE} instead of default {@link
>>> Result#FAILURE}.
>>> *
>>> * Changing to {@link Result#UNSTABLE} does not abort the build,
>>> next steps are continued.
>>> *
>>> */
>>> protected boolean isErrorlevelForUnstableBuild(int exitCode) {
>>> return false;
>>> }
>>>
>>> public boolean perform(AbstractBuild<?,?> build, Launcher launcher,
>>> TaskListener listener) throws InterruptedException{
>>> FilePath ws = build.getWorkspace();
>>> if (ws == null) {
>>> Node node = build.getBuiltOn();
>>> if (node == null) {
>>> throw new NullPointerException("no such build node: " +
>>> build.getBuiltOnStr());
>>> }
>>> throw new NullPointerException("no workspace from node " +
>>> node + " which is computer " + node.toComputer() + " and has channel " +
>>> node.getChannel());
>>> }
>>> FilePath script=null;
>>> int r = -1;
>>> try {
>>> try {
>>> script = createScriptFile(ws);
>>> } catch (IOException e) {
>>> Util.displayIOException(e,listener);
>>>
>>> e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_UnableToProduceScript()));
>>> return false;
>>> }
>>>
>>> try {
>>> EnvVars envVars = build.getEnvironment(listener);
>>> // on Windows environment variables are converted to all
>>> upper case,
>>> // but no such conversions are done on Unix, so to make
>>> this cross-platform,
>>> // convert variables to all upper cases.
>>> for(Map.Entry<String,String> e :
>>> build.getBuildVariables().entrySet())
>>> envVars.put(e.getKey(),e.getValue());
>>>
>>> r =
>>> join(launcher.launch().cmds(buildCommandLine(script)).envs(envVars).stdout(listener).pwd(ws).start());
>>>
>>> if(isErrorlevelForUnstableBuild(r)) {
>>> build.setResult(Result.UNSTABLE);
>>> r = 0;
>>> }
>>> } catch (IOException e) {
>>> Util.displayIOException(e, listener);
>>>
>>> e.printStackTrace(listener.fatalError(Messages.CommandInterpreter_CommandFailed()));
>>> }
>>> return r==0;
>>> } finally {
>>> try {
>>> if(script!=null)
>>> script.delete();
>>> } catch (IOException e) {
>>> if (r==-1 && e.getCause() instanceof
>>> ChannelClosedException) {
>>> // JENKINS-5073
>>> // r==-1 only when the execution of the command
>>> resulted in IOException,
>>> // and we've already reported that error. A common
>>> error there is channel
>>> // losing a connection, and in that case we don't
>>> want to confuse users
>>> // by reporting the 2nd problem. Technically the 1st
>>> exception may not be
>>> // a channel closed error, but that's rare enough,
>>> and JENKINS-5073 is common enough
>>> // that this suppressing of the error would be
>>> justified
>>> LOGGER.log(Level.FINE, "Script deletion failed", e);
>>> } else {
>>> Util.displayIOException(e,listener);
>>> e.printStackTrace(
>>> listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) );
>>> }
>>> } catch (Exception e) {
>>> e.printStackTrace(
>>> listener.fatalError(Messages.CommandInterpreter_UnableToDelete(script)) );
>>> }
>>> }
>>> }
>>>
>>> /**
>>> * Reports the exit code from the process.
>>> *
>>> * This allows subtypes to treat the exit code differently (for
>>> example by treating non-zero exit code
>>> * as if it's zero, or to set the status to {@link
>>> Result#UNSTABLE}). Any non-zero exit code will cause
>>> * the build step to fail. Use {@link
>>> #isErrorlevelForUnstableBuild(int exitCode)} to redefine the default
>>> * behaviour.
>>> *
>>> * @since 1.549
>>> */
>>> protected int join(Proc p) throws IOException, InterruptedException {
>>> return p.join();
>>> }
>>>
>>> /**
>>> * Creates a script file in a temporary name in the specified
>>> directory.
>>> */
>>> public FilePath createScriptFile(@Nonnull FilePath dir) throws
>>> IOException, InterruptedException {
>>> return dir.createTextTempFile("hudson", getFileExtension(),
>>> getContents(), false);
>>> }
>>>
>>> public abstract String[] buildCommandLine(FilePath script);
>>>
>>> protected abstract String getContents();
>>>
>>> protected abstract String getFileExtension();
>>>
>>> private static final Logger LOGGER =
>>> Logger.getLogger(CommandInterpreter.class.getName());
>>>
>>> }
>>>
>>> On Wednesday, 16 November 2016 17:15:12 UTC+5:30, Robert Sandell wrote:
>>>>
>>>> Here are the classes involved in "execute script" step.
>>>>
>>>>
>>>> https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/tasks/BatchFile.java
>>>>
>>>> https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/tasks/Shell.java
>>>>
>>>> https://github.com/jenkinsci/jenkins/blob/master/core/src/main/java/hudson/tasks/CommandInterpreter.java
>>>>
>>>> /B
>>>>
>>>>
>>>> On Wed, Nov 16, 2016 at 8:41 AM, Kul Bhushan Srivastava <
>>>> [email protected]> wrote:
>>>>
>>>>> If anyone can guide how the windows bactch command execution are
>>>>> handled from backend JAVA API. Then I may create one of my own.
>>>>>
>>>>> On Monday, 14 November 2016 13:37:49 UTC+5:30, Kul Bhushan Srivastava
>>>>> wrote:
>>>>>>
>>>>>>
>>>>>
>>>>> --
>>>>> You received this message because you are subscribed to the Google
>>>>> Groups "Jenkins Developers" group.
>>>>> To unsubscribe from this group and stop receiving emails from it, send
>>>>> an email to [email protected].
>>>>> To view this discussion on the web visit
>>>>> https://groups.google.com/d/msgid/jenkinsci-dev/76d6ddbf-14a2-405d-8197-f2dd549e8248%40googlegroups.com
>>>>>
>>>>> <https://groups.google.com/d/msgid/jenkinsci-dev/76d6ddbf-14a2-405d-8197-f2dd549e8248%40googlegroups.com?utm_medium=email&utm_source=footer>
>>>>> .
>>>>>
>>>>> For more options, visit https://groups.google.com/d/optout.
>>>>>
>>>>
>>>>
>>>>
>>>> --
>>>> Robert Sandell
>>>> *Software Engineer*
>>>> *CloudBees Inc.*
>>>>
>>> --
>>> You received this message because you are subscribed to the Google
>>> Groups "Jenkins Developers" group.
>>> To unsubscribe from this group and stop receiving emails from it, send
>>> an email to [email protected].
>>> To view this discussion on the web visit
>>> https://groups.google.com/d/msgid/jenkinsci-dev/39ff5e49-dcf3-4098-a505-de706522682e%40googlegroups.com
>>>
>>> <https://groups.google.com/d/msgid/jenkinsci-dev/39ff5e49-dcf3-4098-a505-de706522682e%40googlegroups.com?utm_medium=email&utm_source=footer>
>>> .
>>>
>>> For more options, visit https://groups.google.com/d/optout.
>>>
>>
>>
>>
>> --
>> Robert Sandell
>> *Software Engineer*
>> *CloudBees Inc.*
>>
>
--
You received this message because you are subscribed to the Google Groups
"Jenkins Developers" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/jenkinsci-dev/73658dfb-83c6-4839-867b-dd43791b2e21%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.