...
...
...
...
...
...
...
...
...
...
...
...
...
This guide will help you configure your Salesforce using the Connector Create REST API so that it has the ability to automatically create a
...
Jira Issue on your
...
Jira instance and also an alternative to the standard way of . configuring a Create
...
Jira Issue button in Salesforce.
The benefits of using this method include not requiring
...
Jira credentials to log in every time a
...
Jira Issue is created as well as providing a one-click experience for the user (allowing the user to bypass selecting Issue Types or Projects).
This method will require writing several Apex Classes, the codes of which will be provided below. Also provided are Unit Test Codes for the Create REST API.
This setup can only be used if your Jira instance is NOT behind a firewall.
Writing the Apex Class
This example will guide you on how to call the Create REST API.
Before you write the Apex code that calls the remote URL, you have to allow Salesforce to make a call to the external server.
Log in to Salesforce.
...
Go to Your Name > Setup > Administration Setup > Security Controls > Remote Site Settings.
Add new remote site.
Enter the name of remote site.
Enter your
...
Jira URL in Remote Site URL, e.g.:
http://yourjiraurl.com/
Click Save.
Once you are done, you can start writing the code. Here are the steps to write a Salesforce Apex Class.
Log in to Salesforce
...
.
Go to Setup > App Setup > Develop > Apex Classes > New
...
. (If you have already created this Apex Class, you do not need to do this step).
...
Paste the Apex Class
...
parent code into the field.
Now, create another Apex Class (follow the same steps in Step 2) and paste the following code into the field:
Code Block language java global class JIRAConnectorWebserviceCalloutCreate { @future (callout=true) WebService static void createIssue(String baseUrl, String systemId, String objectType, String objectId, String projectKey, String issueType) { try { HttpRequest req = buildRequest(baseUrl, JIRA.username, JIRA.password, systemId, objectType, objectId, projectKey, issueType); JIRA.sendRequest(req); } catch(System.CalloutException e) { System.debug(e); } } // Constructs request needed to create a JIRA issue from provided parameters. @testVisible private static HttpRequest buildRequest(String baseUrl, String username, String password, String systemId, String objectType, String objectId, String projectKey, String issueType) { HttpRequest req = new HttpRequest(); String basicAuthHeader = JIRA.authHeader(username, password); String endpoint = getEndpoint(baseUrl, systemId, objectType, objectId); req.setHeader('Authorization', basicAuthHeader); req.setHeader('Content-Type','application/json'); req.setMethod('POST'); req.setEndpoint(endpoint); req.setBody('{"project":"' + projectKey + '", "issueType":"' + issueType + '"}'); return req; } // Creates the endpoint to create the issue from provided parameters. private static String getEndpoint(String baseUrl, String systemId, String objectType, String objectId) { return baseUrl + '/rest/customware/connector/1.0/' + systemId + '/' + objectType + '/' + objectId + '/issue/create.json'; } }
Warning Copying the above code and pasting it directly into the field may result in additional, unwanted characters being included. To avoid this from happening, we recommend pasting the code into a text editor that accepts plain text (e.g. Notepad.exe) and then recopying it again before pasting it into the field.
Click Save.
Warning |
---|
...
WARNINGPlease use this class with care. It can cause an infinite loop of Issue and Case creation if it conflicts with the JIRA Push to Remote System workflow. |
...
Usage of
...
the written class
Now that the class is ready to be used, it can be called in various ways including:
From within a Trigger.
From Create
...
Jira Issue button, as a replacement of Configuring a
...
...
Trigger
Salesforce Trigger can be used to automate the creation of
...
Jira issue. It is an event-based process similar to
...
Jira workflow, yet more flexible.
In this example, we want to automate
...
Jira Issue creation when a Case is created:
Warning |
---|
...
VERY IMPORTANT NOTE:You will NEED to create a custom profile called "JIRA Agent" in Salesforce |
...
to avoid causing an infinite loop. Then assign a user to that profile and block it to execute the trigger. This way, any cases created from JIRA will not trigger creation of more issues back to JIRA. |
First, create a custom profile called "
...
Jira Agent":
Log in to Salesforce
...
.
Go to Setup > Administration Setup > Manage Users > Profiles > New Profile.
Choose 'Existing Profile' to be: Custom: Support Profile.
Fill in "Profile Name" with : JIRA Agent.
Click Save.
Note title "CUSTOM: SUPPORT PROFILE" NOT AVAILABLE? Your version of Salesforce may not have the Custom: Support Profile option.
If so, you can create a new profile or clone from any existing profile. But please make sure that the profile has Read, Edit and Create permissions for the relevant object.
Second, assign the created profile to specific user that will be used in
...
the Connector:
Go to Setup > Administration Setup > Manage Users > Users.
Create/Edit the user that is used as JIRA agent.
Use the created profile as profile of the user.
Click Save.
Warning title WARNING Make sure that this user is used in the Application Links authentication in
...
Jira.
Third, add Trigger code to Case Trigger.
Write Apex Class as described above
Go to Setup > Application Setup > Customize > Cases > Triggers.
Create a New Trigger and replace the code with:
Code Block trigger CreateIssue on Case (after insert) { // Check whether current user is not JIRA agent so that we don't create an infinite loop. if (JIRA.currentUserIsNotJiraAgent()) { for (Case c : Trigger.new) { // Define parameters to be used in calling Apex Class String objectType ='
...
Case'; // Please change this according to the object type String objectId = c.id; String projectKey = 'SFDC'; //Please change this according to the JIRA project key String issueType = '1'; //Please change this according to the JIRA issue type ID // Calls the actual callout to create the JIRA issue. JIRAConnectorWebserviceCalloutCreate.createIssue(JIRA.baseUrl, JIRA.systemId, objectType, objectId, projectKey, issueType); } } }
Warning Copying the above code and pasting it directly into the field may result in additional, unwanted characters being included. To avoid this from happening, we recommend pasting the code into a text editor that accepts plain text (e.g. Notepad.exe) and then recopying it again before pasting it into the field.
Change the variables accordingly:
Variables
Details
objectType
Salesforce object that is used in Connection. In our example, it is Case.
objectId
The id of the object. It varies in every operation. Therefore, it should be object.id
projectKey
Under which JIRA Project you want to create the issue.
issueType
standard JIRA issue type values range from '1' to '4' . '1' is for Bug and so on
Click Save.
Now you are ready to use the trigger. Try creating a Case in Salesforce as a normal user and check if the
...
Jira Issue is created.
Button
Other than using it as a trigger, you can use the written APEX class for a
...
Jira Issue Creation button. Using this method, you can eliminate some processes, including:
The required log-in page
The prompt page of choosing Project and Issue type.
Step-By Step Guide:
Write the Apex Class as above.
Then, you can follow the steps in Configuring
...
...
button to create a button. Note the minor changes in Step 8:
Label
Create
...
Jira Issue
Name
Create_JIRA_Issue
(this is auto-populated when you add a new label)Display Type
Detail Page Button
Behaviour
Execute Javascript
Content Source
On Click Javascript
Content
Code Block {!REQUIRESCRIPT("/soap/ajax/29.0/connection.js")} {!REQUIRESCRIPT("/soap/ajax/29.0/apex.js")} sforce.apex.execute("JIRAConnectorWebserviceCalloutCreate","createIssue", {baseUrl:"http://jira.example.com", systemId: "1", objectType: "Case", objectId:"{!Case.Id}", projectKey:"SFDC", issueType:"1"}); window.alert("JIRA Issue should be created.");
Change the variables accordingly:
Variables
Details
baseUrl
Your
...
Jira URL
systemId
Your system Id in Connection. You should check this in
...
Jira under Connection
objectType
Salesforce object that is used in Connection. In our example, it is Case
objectId
The id of the object. It varies in every operation. Therefore, it should be object.id
projectKey
Under which
...
Jira Project you want to create the issue.
issueType
...
Standard Jira issue type values range from '1' to '4' . '1' is for Bug and so on.
Now you are ready to test:
Create a new Case in
...
Jira.
Click on Create
...
Jira Issue button.
You should see a pop up window:
...
Jira Issue should be created.
Check your
...
Jira if the issue has been created.
Panel | ||||
---|---|---|---|---|
| ||||
|
Warning |
---|
This setup can only be used if your JIRA instance is NOT behind a firewall. |
Info | ||
---|---|---|
| ||
All Apex Class codes provided are also provided on our Bitbucket Repository for your reference. |
...
Unit test code for Create Endpoint
Provided below is the Unit Test code for this class.
Do remember to also include the Fixtures and Mock Objects found on the Apex Class Parent Code page before using the following code:
Code Block |
---|
@isTest private class JIRAConnectorWebserviceCalloutCreateTest {
// Tests createIssue method in JIRAConnectorWebserviceCalloutCreate.
static testMethod void createIssueTest() {
Test.startTest();
Test.setMock(HttpCalloutMock.class, new MockHttpResponseJIRAConnector());
JIRAConnectorWebserviceCalloutCreate.createIssue(TestFixture.baseUrl, TestFixture.systemId,
TestFixture.objectType, TestFixture.objectId, TestFixture.projectKey, TestFixture.issueType);
Test.stopTest();
}
// Tests buildRequest method in JIRAConnectorWebserviceCalloutCreate.
static testMethod void buildRequestTest() {
HttpRequest req = JIRAConnectorWebserviceCalloutCreate.buildRequest(TestFixture.baseUrl, TestFixture.username,
TestFixture.password, TestFixture.systemId, TestFixture.objectType, TestFixture.objectId,
TestFixture.projectKey, TestFixture.issueType);
System.assertEquals(req.getMethod(), 'POST');
System.assertEquals(req.getEndpoint(), 'http://jira.com/rest/customware/connector/1.0/1/Case/1/issue/create.json');
}
} |
Unit test code for trigger on CreateIssue
Provided below is the Unit Test code for this class trigger.
Do remember to also include the Fixtures and Mock Objects found on
...
...
page before using the following code:
Code Block | ||
---|---|---|
| ||
@isTest |
...
public class |
...
CreateIssueTest |
...
implements HttpCalloutMock { |
...
private static HttpRequest request; private static HttpResponse |
...
response; |
...
|
...
|
...
public HTTPResponse respond(HTTPRequest req) { |
...
|
...
request = req; |
...
response = new HttpResponse(); |
...
response. |
...
setStatusCode(200); |
...
return response; |
...
...
|
...
|
...
} |
...
|
...
@isTest static |
...
void |
...
createIssueTriggerTest() { |
...
Test.setMock(HttpCalloutMock.class, new CreateIssueTest()); Case case1 = new Case(); |
...
|
...
|
...
|
...
Test.startTest(); |
...
insert case1; |
...
Test.stopTest() |
...
; |
...
System.assertEquals( |
...
JIRA.baseUrl + ' |
...
/ |
...
rest/customware/connector/1.0/ |
...
' + JIRA.systemId + '/Case/ |
...
' + case1.id + '/issue/create.json', request.getEndpoint()); } |
...
} |
...