To create a Change Management instance, select the Change Management tab, and click the button. To edit an existing instance, click on an Instance row from the list.
Enter values for the fields as described in the table below.
...
Click the Test button to test the connection and verify that the url, port, username, and password are correct. Click the Save button to save the changes. Optionally click the Apply button to save the changes, but remain on the current screen until the Cancel button is clicked.
ServiceNow Properties
Property | Type | Description |
---|
ServiceNow URL | String | The URL for accessing ServiceNow. |
ServiceNow User Name | String | A local ServiceNow service account user with a non-expiring password. |
ServiceNow Password | String | The password for the ServiceNow User Name above. Note that encrypted properties are stored in Credential Store (Local or External) and can be configured using Edit button next to credential name drop down. Alternatively, you can reuse single credential for multiple properties also, in which case you should name that credential appropriately. |
ServiceNow Request GET URL | String | The URL to get the change request details as json response. @Since 5.4.0.1 - Default URL is /api/now/table/change_request?sysparm_query=number%3D{SN_CHANGE_NUMBER}
- If needed, you can change and use your custom GET url for ServiceNow REST endpoint. The URL should include {SN_CHANGE_NUMBER} string as the execution system will replace it with the actual change number during execution.
- e.g. /api/xyz/mycompanty_servicenow_generic_api/readChangeRequest?number%3{SN_CHANGE_NUMBER}
- The payload for this API must return the ticket identifier (e.g. CHG000001) as a String in an attribute called number.
- If the payload If the response returned from this GET API contains an attribute called description it will be mapped to the description of the linked ticket, otherwise the description on the links tab will appear as empty. Prior to 5.5.0.2, an error would occur if the description field was not present in the payload returned from this GET API.
|
ServiceNow Navigation Request URL | String | The URL to open ServiceNow and navigate to the Change ticket associated to the project workflow execution @Since 5.4.0.3 |
ServiceNow Request POST URL | String | The URL to create a change request. @Since 5.4.0.3 - Default URL is /api/now/table/change_request
- If needed, you can change and use your custom url to create a new change using the POST operation
- if you want to use Service Catalog, then change the url to /api/now/table/sc_request
|
Approved Check Script | String | A Groovy expressions which determines whether a task for the change ticket is approved or not. The expression must return a boolean, and has access to the following variables: - TICKET - an object with fields (JSON) contained in the change ticket, as returned by the ServiceNow REST API. Fields are referenced as TICKET.<field name>.<sub-field name>
- FD_ENVIRONMENT_CODE - The environment for a particular deployment request or associated pipeline stage.
Info |
---|
If the Approved Check Script is left blank, the default implementation is to return true if the "approval" field of the ticket is set to "approved". |
Code Block |
---|
language | groovy |
---|
theme | Eclipse |
---|
title | Simple Example which is used by default |
---|
| TICKET.approval == 'approved'
|
Code Block |
---|
language | groovy |
---|
theme | Eclipse |
---|
title | Example that checks myfield value specific to target environment |
---|
| (TICKET.myfield == 'UATApproved' && FD_ENVIRONMENT_CODE='UAT') || (TICKET.myfield == 'PRODApproved' && FD_ENVIRONMENT_CODE='PROD')
|
Tip |
---|
If you want to see values that can be used, enable FINEST log level for flexagon.fd.model.integration.cms. CMSScript using Admin Operations. |
Following example is to check if current date time is between start_date and end_date defined on Ticket. Let's assume format for the date string returned and TimeZone as GMT. Code Block |
---|
language | groovy |
---|
theme | Eclipse |
---|
title | Check if now is between start_date and end_date defined on ticket |
---|
linenumbers | true |
---|
| import java.util.Date;
import java.util.TimeZone;
import flexagon.ff.common.core.utils.FlexDateTimeUtils;
if(TICKET.approval == 'approved' && TICKET.start_date != null && TICKET.end_date != null)
{
Date start = FlexDateTimeUtils.stringToDate(TICKET.start_date, "yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT"));
Date end = FlexDateTimeUtils.stringToDate(TICKET.end_date, "yyyy-MM-dd HH:mm:ss", TimeZone.getTimeZone("GMT"));
Date now = new Date();
if(now.after(start) && now.before(end))
{
return true;
}
}
return false; |
|
Rejected Check Script | String | A Groovy expressions which determines whether a task for a change ticket is rejected or not. The expression must return a boolean, and as has access to the following variables: - TICKET - an object with fields (JSON) contained in the change ticket, as returned by the ServiceNow REST API. Fields are referenced as TICKET.<field name>.<sub-field name>
- FD_ENVIRONMENT_CODE - The environment for a particular deployment request or associated pipeline stage.
Info |
---|
If the Rejected Check Script is left blank, the default implementation is to return true if the "approval" field of the ticket is set to "rejected". |
Code Block |
---|
language | groovy |
---|
theme | Eclipse |
---|
title | Simple Example which is used by default |
---|
| TICKET.approval == 'rejected'
|
Code Block |
---|
language | groovy |
---|
theme | Eclipse |
---|
title | Example that checks myfield value specific to target environment |
---|
| (TICKET.myfield == 'UATRejected' && FD_ENVIRONMENT_CODE='UAT') || (TICKET.myfield == 'PRODRejected' && FD_ENVIRONMENT_CODE='PROD')
|
|
Additional Info Script | String | @since 5.5.0.2 A Groovy expression which determines additional information to add to an external approval when it is approved or rejected. The expression must return a Map<String, String> and have an entry with the key of "notes" for the value to get added to external approval as a task note. Script has access to the following variables: - TICKET - an object with fields (JSON) contained in the change ticket, as returned by the ServiceNow REST API. Fields are referenced as TICKET.<field name>.<sub-field name>
- FD_ENVIRONMENT_CODE - The environment for a particular deployment request or associated pipeline stage.
Code Block |
---|
language | groovy |
---|
theme | Eclipse |
---|
title | Example where ServiceNow Approver(s) and time of approval are added to task notes |
---|
| import flexagon.ff.common.core.rest.FlexRESTClient;
import flexagon.ff.common.core.rest.FlexRESTClientResponse;
import flexagon.ff.common.core.utils.FlexJsonUtils;
import flexagon.fd.model.integration.util.ApiException;
import org.json.JSONObject;
import org.json.JSONArray;
import java.util.HashMap;
import java.util.Map;
import javax.ws.rs.client.Entity;
import javax.ws.rs.core.Form;
import javax.ws.rs.core.MediaType;
def returnMap = [:]
def snowUrl = '{SN_URL}'
def user = '{SN_USER_NAME}'
def password = '{SN_PASSWORD}'
def resourcePath = '/api/now/table/sysapproval_approver?sysparm_display_value=all&sysparm_query=state%3Dapproved%5Edocument_id%3D' + TICKET.sys_id
try
{
FlexRESTClient restService = new FlexRESTClient();
FlexRESTClientResponse response = restService.url(snowUrl).path(resourcePath).basicauth(user, password).mediatype(MediaType.APPLICATION_JSON).setValidateResponse(true).get();
JSONObject jsonResponse = null;
jsonResponse = FlexJsonUtils.getJSON(response.getResponseString());
def listOfApprovers = jsonResponse.getJSONArray('result');
for (int i = 0; i < listOfApprovers.length(); i++)
{
def approver = listOfApprovers.get(i);
def linkRequestUrl = approver.getJSONObject('approver').getString('link')
restService = new FlexRESTClient();
response = restService.url(linkRequestUrl).basicauth(user, password).mediatype(MediaType.APPLICATION_JSON).setValidateResponse(true).get();
jsonResponse = FlexJsonUtils.getJSON(response.getResponseString());
jsonResponse = jsonResponse.getJSONObject('result')
if (returnMap.isEmpty())
{
returnMap['notes'] = 'Approvers: ' + System.getProperty("line.separator")
}
else
{
returnMap['notes'] = returnMap['notes'] + System.getProperty("line.separator")
}
returnMap['notes'] = returnMap['notes'] + jsonResponse.getString('name') + ' (' + approver.getJSONObject('sys_updated_on').getString('display_value') + ')'
}
}
catch(Exception ex)
{
returnMap['notes'] = ex.getMessage()
}
return returnMap
|
|
Don't Poll | Boolean | Returns whether FlexDeploy should poll ServiceNow to check the change tickets for Approval/Rejection. The default value is false, which means polling will occur. Only check this box if you are using the FlexDeploy REST API to communicate ticket approval/rejection. |
...