This is an automated email from the ASF dual-hosted git repository. narro pushed a commit to branch feat-802 in repository https://gitbox.apache.org/repos/asf/incubator-devlake-website.git
commit 2fb4bc2d3d90be7e4381739d98b5b3eb769db3aa Author: narro wizard <cong.w...@merico.dev> AuthorDate: Sun Jul 27 02:27:51 2025 +0000 feat(customize): expand CSV import functionality for issues-related tables - Add support for importing data into `issue_repo_commits`, `sprints`, `issue_worklogs`, and `issue_changelogs` tables - Enhance `issues` table import to include `sprint_ids` field and automatic account record creation - Update documentation to reflect new import capabilities and provide sample CSV formats #802 --- docs/Plugins/customize.md | 96 +++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 89 insertions(+), 7 deletions(-) diff --git a/docs/Plugins/customize.md b/docs/Plugins/customize.md index 19f273b2f18..00adc8c6dca 100644 --- a/docs/Plugins/customize.md +++ b/docs/Plugins/customize.md @@ -11,7 +11,7 @@ description: > This plugin provides users the ability to: - Add/delete columns in domain layer tables - Insert values to certain columns with data extracted from some raw layer tables -- Import data from CSV files(only `issues`, `issue_commits`, `qa_apis`, `qa_test_cases` and `qa_test_case_executions` tables are supported) +- Import data from CSV files(only `issues`, `issue_commits`, `issue_repo_commits`, `sprints`, `issue_worklogs`, `issue_changelogs`, `qa_apis`, `qa_test_cases` and `qa_test_case_executions` tables are supported) **NOTE:** The names of columns added via this plugin must start with the prefix `x_` @@ -175,20 +175,25 @@ Drop the column `x_text` of the table `issues` > POST /plugins/customize/csvfiles/issues.csv -The HTTP `Content-Type` must be `multipart/form-data`, and the form should have three fields: +The HTTP `Content-Type` must be `multipart/form-data`, and the form should have four fields: -- `file`: The CSV file +- `file`: The CSV file to upload - `boardId`: 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 `issues` - `boardName`: It will be written to the `name` field of the `boards` table +- `incremental`: Whether to import incrementally (default: false) + +Upload 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` and `sprint_ids` fields, and if the field value is `NULL`, it should be `NULL` in the CSV instead of the empty string. -Upload 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. +**Note:** +- The `sprint_ids` field should contain comma-separated sprint IDs (e.g. "sprint1,sprint2") +- These values will be automatically written to the `sprint_issues` table during import 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 [...] -|-----------------------------|---------------------|--------------------------------------------------------------------|--------|---------|-------------|---------------------------------|--------|-----|------|---------------|-----------|---------------|-----------------------------|-----------------------------|---------------|--------|-------------------------|------------------|----------------------|-----------------------------------------------------|------------|----------------- [...] -|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:Bitbuck [...] +|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 [...] +|-----------------------------|---------------------|--------------------------------------------------------------------|--------|---------|-------------|---------------------------------|--------|-----|------|---------------|-----------|---------------|-----------------------------|-----------------------------|---------------|--------|-------------------------|------------------|----------------------|-----------------------------------------------------|------------|----------------- [...] +|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:Bitbuck [...] |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:Bitbuck [...] |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 | [...] |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:Bitbuck [...] @@ -302,3 +307,80 @@ Upload a CSV file and import it to the `qa_test_case_executions` table via this |qa:exec:1:301 |qa:case:1:201 |2025-07-03 14:00:00 |2025-07-03 14:05:00 |2025-07-03 14:15:00 |tester1 |SUCCESS |project101 | |qa:exec:1:302 |qa:case:1:202 |2025-07-03 15:30:00 |2025-07-03 15:35:00 |NULL |tester2 |IN_PROGRESS|project101 | |qa:exec:1:303 |qa:case:1:203 |2025-07-04 09:00:00 |NULL |NULL |tester3 |PENDING |project102 | +### Upload `issue_repo_commits.csv` file + +> POST /plugins/customize/csvfiles/issue_repo_commits.csv + +#### API Description +Upload issue_repo_commits.csv file to import issue-repo commit relationships into DevLake. + +#### Request +- **Content-Type**: multipart/form-data +- **Parameters**: + - `boardId` (required): The ID of the board + - `incremental` (optional): Whether to import incrementally (default: false) + - `file` (required): The CSV file to upload + +#### Responses +- **200**: Success +- **400**: Bad Request +- **500**: Internal Server Error + +#### CSV Format +The CSV file should contain the following columns: + +|issue_id |repo_url |commit_sha |host |namespace |repo_name| +|----------------------|------------------------------------------|----------------------------------------|------------|----------|---------| +|jira:JiraIssue:1:10063|https://github.com/apache/devlake.git |8748a066cbaf67b15e86f2c636f9931347e987cf|github.com |apache |devlake | +|jira:JiraIssue:1:10064|https://github.com/apache/devlake.git |e6bde456807818c5c78d7b265964d6d48b653af6|github.com |apache |devlake | + +### Upload `sprints.csv` file + +> POST /plugins/customize/csvfiles/sprints.csv + +The `Content-Type` should be `multipart/form-data`, and the form should have three fields: + +- `file`: The CSV file to upload +- `boardId`: The ID of the board +- `incremental`: Whether to import incrementally (default: false) + +The following is a sprints.CSV file sample: + +|id |url |status |name |start_date |ended_date |completed_date | +|------|-------------------------------------|----------|-----------|--------------------|----------------------|----------------------| +|sprint1|https://jira.example.com/sprint/1 |ACTIVE |Sprint 1 |2022-01-01 00:00:00 |2022-01-14 00:00:00 |NULL | +|sprint2|https://jira.example.com/sprint/2 |CLOSED |Sprint 2 |2022-01-15 00:00:00 |2022-01-28 00:00:00 |2022-01-28 12:00:00 | + +### Upload `issue_worklogs.csv` file + +> POST /plugins/customize/csvfiles/issue_worklogs.csv + +The `Content-Type` should be `multipart/form-data`, and the form should have three fields: + +- `file`: The CSV file to upload +- `boardId`: The ID of the board +- `incremental`: Whether to import incrementally (default: false) + +The following is an issue_worklogs.CSV file sample: + +|id |issue_id |author_name (will create account record)|time_spent_minutes|started_date |logged_date |comment | +|------|----------------------|------------|------------------|---------------------|---------------------|----------------------| +|1 |jira:JiraIssue:1:10063|John Doe |120 |2022-01-01 09:30:00 |2022-01-01 10:00:00 |Initial investigation | +|2 |jira:JiraIssue:1:10064|Jane Smith |60 |2022-01-02 14:00:00 |2022-01-02 14:30:00 |Bug fixing | + +### Upload `issue_changelogs.csv` file + +> POST /plugins/customize/csvfiles/issue_changelogs.csv + +The `Content-Type` should be `multipart/form-data`, and the form should have three fields: + +- `file`: The CSV file to upload +- `boardId`: The ID of the board +- `incremental`: Whether to import incrementally (default: false) + +The following is an issue_changelogs.CSV file sample: + +|id |issue_id |author_name (will create account record)|field_name |original_from_value|original_to_value|created_date | +|------|----------------------|------------|-----------|-------------------|-----------------|----------------------| +|1 |jira:JiraIssue:1:10063|John Doe |status |Open |In Progress |2022-01-01 09:00:00 | +|2 |jira:JiraIssue:1:10063|John Doe |status |In Progress |Done |2022-01-03 17:00:00 |