Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

Expand
titleUpload Logs Jira Listener Script
Code Block
languagegroovy
import flexagon.ff.common.core.exceptions.FlexCheckedException;

//Carry out any custom action you wish for this event. Check out the snippets for reference or ideas.
def listenerName = "Upload Logs To Jira";
LOG.info("Running listener: ${listenerName}");

def//Prior streamsto = FLEXDEPLOY.getPluginLogInputStreams(EVENT.payload.workflowExecutionId);

//upfront validation on streams
if(!streams || streams.size() == 0) {
  LOG.logMessage("Received failure event but couldn't find any plugin log streams");
  return;
}

//We receive a stream for each plugin execution. Since we are filtering for errors, the last stream would be the failed plugin
def errorStream = streams[streams.size()-1];

//create our form data 5.4.0.1 this function only returned a list of input streams. Update accordingly
//The second argument specifies we only want the error streams returned.
def streams = FLEXDEPLOY.getPluginLogInputStreams(EVENT.payload.workflowExecutionId, true);

//upfront validation on streams
if(!streams || streams.size() == 0) {
  LOG.logMessage("Received failure event but couldn't find any plugin log streams");
  return;
}

//We should only ever have one errored plugin execution, so grab first entry.
def failedPlugin = streams.entrySet().iterator().next();

//create our form data body
def body = REST.getClient().createFormDataWithInputStream(['file': errorStreamfailedPlugin.getValue()], 'FailedPlugin"${failedPlugin.getKey()}.txt'");

def properties = getJiraProperties('JIRA');

LOG.info("${EVENT.payload.issueNumbers}");

for(def issue: EVENT.payload.issueNumbers) {
  LOG.info("Upload logs to issue: ${issue}");
  
  //send request
  def client = REST.getClient().url(properties.url).addHeader('X-Atlassian-Token', 'no-check').basicauth(properties.user,properties.password);
  def response = client.path("/rest/api/2/issue/${issue}/attachments").post(body);
  LOG.setMessage("Uploaded logs to ${issue}. Response: ${response.getResponseCode()}");
}

//helper function to get jira properties from integration instance
def getJiraProperties(String code) {
  def instance = FLEXDEPLOY.findIntegrationInstance(code,'ITS');
  def properties = instance.getProperties();
  def url = properties.find { it.getPropertyName() == 'JIRA_URL' }.getPropertyValue();
  def user = properties.find { it.getPropertyName() == 'JIRA_USER_NAME' }.getPropertyValue();
  def password = properties.find { it.getPropertyName() == 'JIRA_PASSWORD' }.getPropertyValue();
  return ['url':url, 'user': user, 'password': password];
}

...

This use case can be helpful when you have a FlexDeploy Project that is dependent on some other Project building first. Generally speaking you would try to handle this on the source control side of things but sometimes that just isnt isn't possible. In the below example we are initiating a build on Project with Id 10241 only after a build has successfully completed for the Project with Id 10002.

...

Expand
titleBuild Dependent Project Filter
Code Block
languagegroovy
//the project that should be built first
def initiator = 10002;

//only run when we have a successful build of project 10002
return EVENT.payload.executionStatus == "SUCCESS" && EVENT.payload.workflow.workflowType == "BUILD" && EVENT.payload.project.projectId == initiator;

Send email with logs on Workflow Failed

The example below makes use of the FLEXDEPLOY.getPluginLogInputStreams method to send workflow logs as attachments in an email. The message body simply consists of the json payload for the event.

This function is listening to the ‘Workflow Completed’ Event.

Expand
titleEmail Failed Logs Script
Code Block
languagegroovy
import flexagon.ff.adfext.common.model.pojos.communication.EmailAttachment;
import groovy.json.JsonOutput;

//Carry out any custom action you wish for this event. Check out the documentation for reference or ideas.
//Optionally filter out events you dont want to execute by returning false on the filter script tab.
def listenerName = "Email Failed Logs";
LOG.info("Running listener: ${listenerName}");

//retrieve plugin log input stream map
def logs = FLEXDEPLOY.getPluginLogInputStreams(EVENT.payload.workflowExecutionId);
def attachments = [];

//for each entry create and add a new attachment
//prior to 5.4.0.1 logs would be a list instead of a map
logs.each { log -> 
  attachments.add(new EmailAttachment(log.value,"${log.key}.txt","text/plain"));
}

LOG.info("Sending email with ${attachments.size()} attachments.");

//send email
def subject = "${EVENT.payload.project.projectName} failed in ${EVENT.payload.environment.environmentName}";
def message = JsonOutput.prettyPrint(JsonOutput.toJson(EVENT.payload));
def recipients = ["my.user@domain.com"];

EMAIL.sendEmail(subject, message, recipients, attachments);

LOG.setMessage("Sent email message to ${recipients}");
Expand
titleEmail Failed Logs Filter
Code Block
languagegroovy
return EVENT.payload.executionStatus == 'FAILURE';