blob: 7ac79ad065d9f25b3c93ddf11d786c27ebe9a227 [file] [view]
---
title: "Jira"
description: >
Jira Plugin
---
## Summary
This plugin collects Jira data through Jira Cloud REST API. It then computes and visualizes various engineering metrics from the Jira data.
<img width="2035" alt="jira metric display" src="https://user-images.githubusercontent.com/2908155/132926143-7a31d37f-22e1-487d-92a3-cf62e402e5a8.png" />
## Project Metrics This Covers
| Metric Name | Description |
|:------------------------------------|:--------------------------------------------------------------------------------------------------|
| Requirement Count | Number of issues with type "Requirement" |
| Requirement Lead Time | Lead time of issues with type "Requirement" |
| Requirement Delivery Rate | Ratio of delivered requirements to all requirements |
| Requirement Granularity | Number of story points associated with an issue |
| Bug Count | Number of issues with type "Bug"<br/><i>bugs are found during testing</i> |
| Bug Age | Lead time of issues with type "Bug"<br/><i>both new and deleted lines count</i> |
| Bugs Count per 1k Lines of Code | Amount of bugs per 1000 lines of code |
| Incident Count | Number of issues with type "Incident"<br/><i>incidents are found when running in production</i> |
| Incident Age | Lead time of issues with type "Incident" |
| Incident Count per 1k Lines of Code | Amount of incidents per 1000 lines of code |
## Configuration
Configuring Jira via [config-ui](/UserManuals/ConfigUI/Jira.md).
## Collect Data From JIRA
To collect data, select `Advanced Mode` on the `Create Pipeline Run` page and paste a JSON config like the following:
> <font color="#ED6A45">Warning: Data collection only supports single-task execution, and the results of concurrent multi-task execution may not meet expectations.</font>
```
[
[
{
"plugin": "jira",
"options": {
"connectionId": 1,
"boardId": 8,
"since": "2006-01-02T15:04:05Z"
}
}
]
]
```
- `connectionId`: The `ID` field from **JIRA Integration** page.
- `boardId`: JIRA board id, see "Find Board Id" for details.
- `since`: optional, download data since a specified date only.
## API
### Data Connections
1. Get all data connection
```GET /plugins/jira/connections
[
{
"ID": 14,
"CreatedAt": "2021-10-11T11:49:19.029Z",
"UpdatedAt": "2021-10-11T11:49:19.029Z",
"name": "test-jira-connection",
"endpoint": "https://merico.atlassian.net/rest",
"basicAuthEncoded": "basicAuth",
"epicKeyField": "epicKeyField",
"storyPointField": "storyPointField"
}
]
```
2. Create a new data connection
```POST /plugins/jira/connections
{
"name": "jira data connection name",
"endpoint": "jira api endpoint, i.e. https://merico.atlassian.net/rest",
"basicAuthEncoded": "generated by `echo -n {jira login email}:{jira token} | base64`",
"epicKeyField": "name of customfield of epic key",
"storyPointField": "name of customfield of story point",
"typeMappings": { // optional, send empty object to delete all typeMappings of the data connection
"userType": {
"standardType": "devlake standard type"
}
}
}
```
3. Update data connection
```PUT /plugins/jira/connections/:connectionId
{
"name": "jira data connection name",
"endpoint": "jira api endpoint, i.e. https://merico.atlassian.net/rest",
"basicAuthEncoded": "generated by `echo -n {jira login email}:{jira token} | base64`",
"epicKeyField": "name of customfield of epic key",
"storyPointField": "name of customfield of story point",
"typeMappings": { // optional, send empty object to delete all typeMappings of the data connection
"userType": {
"standardType": "devlake standard type",
}
}
}
```
4. Get data connection detail
```GET /plugins/jira/connections/:connectionId
{
"name": "jira data connection name",
"endpoint": "jira api endpoint, i.e. https://merico.atlassian.net/rest",
"basicAuthEncoded": "generated by `echo -n {jira login email}:{jira token} | base64`",
"epicKeyField": "name of customfield of epic key",
"storyPointField": "name of customfield of story point",
"typeMappings": { // optional, send empty object to delete all typeMappings of the data connection
"userType": {
"standardType": "devlake standard type",
}
}
}
```
5. Delete data connection
```DELETE /plugins/jira/connections/:connectionId
```
### Type mappings
1. Get all type mappings
```GET /plugins/jira/connections/:connectionId/type-mappings
[
{
"jiraConnectionId": 16,
"userType": "userType",
"standardType": "standardType"
}
]
```
2. Create a new type mapping
```POST /plugins/jira/connections/:connectionId/type-mappings
{
"userType": "userType",
"standardType": "standardType"
}
```
3. Update type mapping
```PUT /plugins/jira/connections/:connectionId/type-mapping/:userType
{
"standardType": "standardTypeUpdated"
}
```
4. Delete type mapping
```DELETE /plugins/jira/connections/:connectionId/type-mapping/:userType
```
5. API forwarding
For example:
Requests to `http://your_devlake_host/plugins/jira/connections/1/proxy/rest/agile/1.0/board/8/sprint`
would be forwarded to `https://your_jira_host/rest/agile/1.0/board/8/sprint`
```GET /plugins/jira/connections/:connectionId/proxy/rest/*path
{
"maxResults": 1,
"startAt": 0,
"isLast": false,
"values": [
{
"id": 7,
"self": "https://merico.atlassian.net/rest/agile/1.0/sprint/7",
"state": "closed",
"name": "EE Sprint 7",
"startDate": "2020-06-12T00:38:51.882Z",
"endDate": "2020-06-26T00:38:00.000Z",
"completeDate": "2020-06-22T05:59:58.980Z",
"originBoardId": 8,
"goal": ""
}
]
}
```