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]
> <javascript:>> 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] <javascript:>.
>> 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.
For more options, visit https://groups.google.com/d/optout.