Pre-Condition: Job

This page lists job-precondition scripts that are taken straight from the public JIRA site. Please note that some scripts may be snippets and probably WILL need modification to work properly for your situation. Treat these as templates that you can modify from.

Run if Any Ancestor Job Failed and the Originating Request Was a Trigger

import com.urbancode.anthill3.domain.buildlife.BuildLife;
import com.urbancode.anthill3.domain.buildrequest.BuildRequest;
import com.urbancode.logic.Criteria;
import com.urbancode.anthill3.domain.buildrequest.RequestSourceEnum;

public class TriggeredJobStatus extends Criteria {

  public TriggeredJobStatus() {
    super();
  }

  public boolean matches(Object obj) {
    BuildLife bl = BuildLifeLookup.getCurrent();
    BuildRequest request = bl.getOriginatingRequest();
    if (request.getRequestSource().equals(RequestSourceEnum.EVENT) || request.getRequestSource().equals(RequestSourceEnum.SCHEDULED) || request.getRequestSource().equals(RequestSourceEnum.REPOSITORY)) {
      return true;
    }
    else {
      return false;
    }
  }
}

return Logic.and(new TriggeredJobStatus(), JobStatus.anyAre(JobStatusEnum.FAILED));

Always

AHPSCRIPTS-26

return new Criteria() {
    public boolean matches(Object obj) {
        return true;
    }
}

Status Based

AHPSCRIPTS-28

return new Criteria() {
    public boolean matches(Object obj) throws Exception {
        return BuildLifeLookup.getCurrent().hasStatus(StatusLookup.getStatusByName("....."));
    }
} 

Property Based

AHPSCRIPTS-29

return new Criteria() {
    public boolean matches(Object obj) {
        String value = PropertyLookup.get("property");
        boolean propertyExists = value != null;
        return propertyExists;
    }
} 

Environment Based

Job Pre-condition script that only runs in a specified Environment

AHPSCRIPTS-42

return new Criteria() {
  public boolean matches(Object obj) throws Exception {
    return EnvironmentLookup.getCurrent().getName().equals("Build-Farm");
  }
}

Run if Previous Job Was Not Needed

AHPSCRIPTS-70

import com.urbancode.anthill3.services.jobs.JobStatusEnum;
Logic.not(JobStatus.parentsIn(new JobStatusEnum[] {
    JobStatusEnum.ABORTED,
    JobStatusEnum.FAILED,
    JobStatusEnum.SUCCESS,
    JobStatusEnum.SUCCESS_WARN
}));

Run Job Only if Requests Were Certain Type (Manual)

AHPSCRIPTS-69

import com.urbancode.anthill3.domain.buildrequest.RequestSourceEnum;
return new Criteria() {
 public boolean matches(Object obj) throws Exception {
   return RequestSourceEnum.MANUAL.equals(BuildRequestLookup.getCurrent().getRequestSource());
 }
} 

Run if Project Has Particular Artifact Set

AHPSCRIPTS-85

  • General case:
    • return new Criteria() { 
           public boolean matches(Object obj) { 
            return ProjectLookup.getCurrent().getLifeCycleModel().getArtifactSetGroup().getArtifactSet("artifacts") != null; 
           } 
       }
      
  • If configured to publish artifact set:
    • import com.urbancode.anthill3.domain.profile.*; 
       return new Criteria() { 
           public boolean matches(Object obj) { 
               ArtifactDeliverPatterns[] patterns = BuildLifeLookup.getCurrent().getProfile().getArtifactConfigArray(); 
               for (int i=0; i<patterns.length; i++) { 
                   if ("artifacts".equals(patterns[i].getArtifactSet().getName())) { 
                       return true; 
                   } 
               } 
               return false; 
           } 
       }
      
  • If already has artifact set published
    • import com.urbancode.codestation2.server.*; 
       return new Criteria() { 
           public boolean matches(Object obj) { 
               return CodestationRepositoryFileHelper.getInstance().hasBuildLifeArtifactSet(BuildLifeLookup.getCurrent(), 
                   ProjectLookup.getCurrent().getLifeCycleModel().getArtifactSetGroup().getArtifactSet("artifacts")); 
           } 
       }
      

Short Circuit Job Iteration if Previous Iterations Fail

AHPSCRIPTS-91

import com.urbancode.anthill3.domain.jobconfig.JobConfig; 
 import com.urbancode.anthill3.domain.jobtrace.JobTrace; 
 import com.urbancode.anthill3.domain.jobtrace.buildlife.BuildLifeJobTrace; 
 import com.urbancode.anthill3.domain.jobtrace.buildlife.BuildLifeJobTraceFactory; 
 import com.urbancode.anthill3.domain.jobtrace.operations.OperationsJobTrace; 
 import com.urbancode.anthill3.domain.jobtrace.operations.OperationsJobTraceFactory; 
 import com.urbancode.anthill3.domain.persistent.PersistenceException; 
 import com.urbancode.anthill3.domain.persistent.PersistenceRuntimeException; 
 import com.urbancode.anthill3.domain.workflow.Workflow; 
 import com.urbancode.anthill3.domain.workflow.WorkflowCase; 
 import com.urbancode.anthill3.domain.workflow.WorkflowDefinition; 
 import com.urbancode.anthill3.runtime.scripting.helpers.WorkflowLookup; 
 import com.urbancode.anthill3.services.jobs.JobStatusEnum; 
 import com.urbancode.commons.dag.Vertex; 
 import com.urbancode.logic.Criteria; 

 return new Criteria() { 
     final JobStatusEnum[] statuses = new JobStatusEnum[] { 
         JobStatusEnum.SUCCESS, JobStatusEnum.NOT_NEEDED, JobStatusEnum.QUEUED, JobStatusEnum.RUNNING, JobStatusEnum.WAITING_ON_AGENTS 
     }; 
     final boolean checkAncestors = true; 
      
     public boolean matches(Object obj) { 
         JobStatus jobStatus = JobStatus.allAncestorsIn(statuses); 
         boolean match = jobStatus.matches(obj); 
          
         if (match) { 
             // check the previous iteration jobs 
             JobConfig jobConfig = (JobConfig) obj; 
             JobTrace[] jobTraces = getJobTracesForJobConfig(WorkflowLookup.getCurrentCase(), jobConfig); 
             for (int j=0; j<jobTraces.length; j++) { 
                 if (!jobStatus.matches(jobTraces[j])) { 
                     match = false; 
                     setResultMessage(jobStatus.getResultMessage()); 
                     break; 
                 } 
             } 
         } 
         else { 
             setResultMessage(jobStatus.getResultMessage()); 
         } 
         return match; 
     } 
      
     JobTrace[] getJobTracesForJobConfig(WorkflowCase wcase, JobConfig jobConfig) { 
         try { 
             HashSet jobTraceSet = new HashSet(); 
             if (wcase.getProject().isLifeCycleBased()) { 
                 // do not use the method on workflow case, you may get locally cached jobs that are not up to date 
                 BuildLifeJobTrace[] jobTraces = BuildLifeJobTraceFactory.getInstance().restoreAllForWorkflowCase(wcase); 
                 for (int i = 0; i < jobTraces.length; i++) { 
                     if (jobConfig.equals(jobTraces[i].getJobConfig())) { 
                         jobTraceSet.add(jobTraces[i]); 
                     } 
                 } 
             } 
             else { 
                 OperationsJobTrace[] jobTraces = OperationsJobTraceFactory.getInstance().restoreAllForWorkflowCase(wcase); 
                 for (int i = 0; i < jobTraces.length; i++) { 
                     if (jobConfig.equals(jobTraces[i].getJobConfig())) { 
                         jobTraceSet.add(jobTraces[i]); 
                     } 
                 } 
             } 
             JobTrace[] result = new JobTrace[jobTraceSet.size()]; 
             jobTraceSet.toArray(result); 
             return result; 
         } 
         catch (PersistenceException e) { 
             throw new PersistenceRuntimeException(e.getMessage(), e); 
         } 
     } 
 }


Run if Parent Success or Not Needed

AHPSCRIPTS-59

return JobStatus.allAncestorsIn(new JobStatusEnum[] {JobStatusEnum.SUCCESS, JobStatusEnum.NOT_NEEDED})

Run an Iterated Job if it is the First Job of Iteration or if Any of the Jobs in Workflow Failed

  • This script was used to satisfy a case where a customer wanted to run a job again if the initial run of the job failed. They accomplished this by iterating the job twice and using this pre-condition script which would run the job the first time and then only run the job on the second iteration if the first iteration failed.

AHPSCRIPTS-97

import com.urbancode.anthill3.domain.workflow.WorkflowCase; 
 import org.apache.log4j.Logger; 
 Logger log = Logger.getLogger("script"); 

 return new Criteria() { 
   public boolean matches(Object obj) throws Exception { 
       boolean match = false; 
       WorkflowCase workflowCase = WorkflowLookup.getCurrentCase(); 
       JobTrace[] jobTraceArray = workflowCase.getJobTraceArray(); 

       if ("1".equals(PropertyLookup.get("anthill.job.iteration"))) { 
           log.warn("Running job because it is the first iteration."); 
           match = true; 
       } 
       else { 
           boolean anyJobsFailed = false; 
           for (int i = 0; i < jobTraceArray.length; ++i) { 
               if (JobStatusEnum.FAILED.equals(jobTraceArray[i].getStatus())) { 
                   anyJobsFailed = true; 
                   break; 
               } 
           } 

           if (anyJobsFailed){ 
               log.warn("Running job because the first job failed."); 
               match = true; 
           } else { 
               log.warn("Not running job. job count = " + 
 jobTraceArray.length + "."); 
           } 
       } 

       return match; 
   } 
 }