This plugin provides users the ability to:
issues and issue_commits two tables are supported)NOTE: The names of columns added via this plugin must start with the prefix x_
For now, only the following five types were supported:
To extract data, switch to Advanced Mode on the first step of creating a Blueprint and paste a JSON config as the following:
The example below demonstrates how to extract status name from the table _raw_jira_api_issues:
_raw_jira_api_issues table and assign it to the x_test column in the issues table._raw_jira_api_issues table, and create a new issue_custom_array_fields table containing issue_id, field_id, and value columns. This table has a one-to-many relationship with the issues table. issue_id is the id corresponding to the issue, x_test corresponds to the field_id column, and the value of x_test corresponds to the value column.We leverage the package https://github.com/tidwall/gjson to extract value from the JSON. For the extraction syntax, please refer to this docs
table: domain layer table namerawDataTable: raw layer table, from which we extract values by json pathrawDataParams: the filter to select records from the raw layer table (The value should be a string not an object)mapping: the extraction rule; the key is the extension field name; the value is json path[ [ { "plugin":"customize", "options":{ "transformationRules":[ { "table":"issues", "rawDataTable":"_raw_jira_api_issues", "rawDataParams":"{\"ConnectionId\":1,\"BoardId\":8}", "mapping":{ "x_test":"fields.status.name" } } ] } } ] ]
You can also trigger data extraction by making a POST request to /pipelines.
curl 'http://localhost:8080/pipelines' \ --header 'Content-Type: application/json' \ --data-raw ' { "name": "extract fields", "plan": [ [ { "plugin": "customize", "options": { "transformationRules": [ { "table": "issues", "rawDataTable": "_raw_jira_api_issues", "rawDataParams": "{\"ConnectionId\":1,\"BoardId\":8}", "mapping": { "x_test": "fields.status.name" } } ] } } ] ] } '
Get all columns of the table issues
GET /plugins/customize/issues/fields
NOTE some fields are omitted in the following example response
[ { "columnName": "id", "displayName": "", "dataType": "varchar(255)", "description": "" }, { "columnName": "created_at", "displayName": "", "dataType": "datetime(3)", "description": "" }, { "columnName": "x_time", "displayName": "time", "dataType": "timestamp", "description": "test for time" }, { "columnName": "x_int", "displayName": "bigint", "dataType": "bigint", "description": "test for int" }, { "columnName": "x_float", "displayName": "float", "dataType": "float", "description": "test for float" }, { "columnName": "x_text", "displayName": "text", "dataType": "text", "description": "test for text" }, { "columnName": "x_varchar", "displayName": "varchar", "dataType": "varchar(255)", "description": "test for varchar" } ]
Create a new column x_abc with datatype varchar(255) for the table issues.
The value of columnName must start with x_ and consist of no more than 50 alphanumerics and underscores. The value of field dataType must be one of the following 5 types:
POST /plugins/customize/issues/fields
{ "columnName": "x_abc", "displayName": "ABC", "dataType": "varchar(255)", "description": "test field" }
Drop the column x_text of the table issues
DELETE /plugins/customize/issues/fields/x_test
issues.csv filePOST /plugins/customize/csvfiles/issues.csv
The HTTP Content-Type must be multipart/form-data, and the form should have three fields:
file: The CSV fileboardId: It will be written to the id field of the boards table, the board_id field of board_issues, and the _raw_data_params field of issuesboardName: It will be written to the name field of the boards tableUpload a CSV file and import it to the issues table via this API. There should be no extra fields in the file except the labels field, and if the field value is NULL, it should be NULL in the CSV instead of the empty string. DevLake will parse the CSV file and store it in the issues table, where the labels are stored in the issue_labels table. If the boardId does not appear, a new record will be created in the boards table. The board_issues table will be updated at the same time as the import. The following is an issues.CSV file sample:
| id | _raw_data_params | url | icon_url | issue_key | title | description | epic_key | type | status | original_status | story_point | resolution_date | created_date | updated_date | parent_issue_id | priority | original_estimate_minutes | time_spent_minutes | time_remaining_minutes | creator_id | creator_name | assignee_id | assignee_name | severity | component | lead_time_minutes | original_project | original_type | x_int | x_time | x_varchar | x_float | labels |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| bitbucket:BitbucketIssue:1:1 | board789 | https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/1 | 1 | issue test | bitbucket issues test for devlake | issue | TODO | new | 0 | NULL | 2022-07-17 07:15:55.959+00:00 | 2022-07-17 09:11:42.656+00:00 | major | 0 | 0 | 0 | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | NULL | NULL | NULL | 10 | 2022-09-15 15:27:56 | world | 8 | NULL | |||||
| bitbucket:BitbucketIssue:1:10 | board789 | https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/10 | 10 | issue test007 | issue test007 | issue | TODO | new | 0 | NULL | 2022-08-12 13:43:00.783+00:00 | 2022-08-12 13:43:00.783+00:00 | trivial | 0 | 0 | 0 | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | NULL | NULL | NULL | 30 | 2022-09-15 15:27:56 | abc | 2456790 | hello worlds | |||||
| bitbucket:BitbucketIssue:1:13 | board789 | https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/13 | 13 | issue test010 | issue test010 | issue | TODO | new | 0 | NULL | 2022-08-12 13:44:46.508+00:00 | 2022-08-12 13:44:46.508+00:00 | critical | 0 | 0 | 0 | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | NULL | NULL | NULL | 1 | 2022-09-15 15:27:56 | NULL | 0.00014 | NULL | |||||||
| bitbucket:BitbucketIssue:1:14 | board789 | https://api.bitbucket.org/2.0/repositories/thenicetgp/lake/issues/14 | 14 | issue test011 | issue test011 | issue | TODO | new | 0 | NULL | 2022-08-12 13:45:12.810+00:00 | 2022-08-12 13:45:12.810+00:00 | blocker | 0 | 0 | 0 | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | bitbucket:BitbucketAccount:1:62abf394192edb006fa0e8cf | tgp | NULL | NULL | NULL | 41534568464351 | 2022-09-15 15:27:56 | NULL | NULL | label1,label2,label3 |
issue_commits.csv filePOST /plugins/customize/csvfiles/issue_commits.csv
The Content-Type should be multipart/form-data, and the form should have two fields:
file: The CSV fileboardId: It will be written to the _raw_data_params field of issue_commitsThe following is an issue_commits.CSV file sample:
| issue_id | commit_sha |
|---|---|
| jira:JiraIssue:1:10063 | 8748a066cbaf67b15e86f2c636f9931347e987cf |
| jira:JiraIssue:1:10064 | e6bde456807818c5c78d7b265964d6d48b653af6 |
| jira:JiraIssue:1:10065 | 8f91020bcf684c6ad07adfafa3d8a2f826686c42 |
| jira:JiraIssue:1:10066 | 0dfe2e9ed88ad4e27f825d9b67d4d56ac983c5ef |
| jira:JiraIssue:1:10145 | 07aa2ebed68e286dc51a7e0082031196a6135f74 |
| jira:JiraIssue:1:10145 | d70d6687e06304d9b6e0cb32b3f8c0f0928400f7 |
| jira:JiraIssue:1:10159 | d28785ff09229ac9e3c6734f0c97466ab00eb4da |
| jira:JiraIssue:1:10202 | 0ab12c4d4064003602edceed900d1456b6209894 |
| jira:JiraIssue:1:10203 | 980e9fe7bc3e22a0409f7241a024eaf9c53680dd |