diff --git a/backend/plugins/circleci/circleci b/backend/plugins/circleci/circleci new file mode 100755 index 00000000000..745e690b9f8 Binary files /dev/null and b/backend/plugins/circleci/circleci differ diff --git a/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows.csv b/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows.csv index 5760d52da61..a599e8aeb4a 100644 --- a/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows.csv +++ b/backend/plugins/circleci/e2e/raw_tables/_raw_circleci_api_workflows.csv @@ -96,7 +96,7 @@ id,params,data,url,input,created_at ""started_by"" : ""1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7"", ""pipeline_number"" : 8, ""created_at"" : ""2023-03-25T18:06:13Z"", - ""stopped_at"" : ""2023-03-25T18:06:28Z"" + ""stopped_at"" : ""2023-03-25T18:05:28Z"" }",https://circleci.com/api/v2/pipeline/afe0cabe-e7ee-4eb7-bf13-bb6170d139f0/workflow,"{""id"": ""afe0cabe-e7ee-4eb7-bf13-bb6170d139f0"", ""vcs"": {""tag"": """", ""branch"": """", ""commit"": {""body"": """", ""subject"": """"}, ""revision"": """", ""review_id"": """", ""review_url"": """", ""provider_name"": """", ""origin_repository_url"": """", ""target_repository_url"": """"}, ""state"": """", ""errors"": null, ""number"": 0, ""trigger"": {""type"": """", ""actor"": {""login"": """", ""avatar_url"": """"}, ""received_at"": """"}, ""createdAt"": ""0001-01-01T00:00:00Z"", ""updatedAt"": ""0001-01-01T00:00:00Z"", ""created_at"": null, ""updated_at"": null, ""ConnectionId"": 0, ""_raw_data_id"": 0, ""project_slug"": """", ""_raw_data_table"": """", ""_raw_data_params"": """", ""_raw_data_remark"": """", ""trigger_parameters"": null}",2023-03-28 15:39:58.245 28,"{""ConnectionId"":1,""ProjectSlug"":""github/coldgust/coldgust.github.io""}","{ ""pipeline_id"" : ""f5a2a6e8-4430-4935-8bec-77ca2b26c61d"", diff --git a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows.csv b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows.csv index bd6af7cc904..eb1e03e8e11 100644 --- a/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows.csv +++ b/backend/plugins/circleci/e2e/snapshot_tables/_tool_circleci_workflows.csv @@ -7,5 +7,5 @@ connection_id,id,project_slug,pipeline_id,canceled_by,name,errored_by,tag,status 1,b3b77371-e27a-4e93-a554-c728f757cd24,github/coldgust/coldgust.github.io,f5a2a6e8-4430-4935-8bec-77ca2b26c61d,,workflow,,,failed,,16,,,0 1,b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,github/coldgust/coldgust.github.io,70f3eb15-3b94-4f80-b65e-f23f4b74c33a,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,6,2023-03-25T17:54:09.000+00:00,2023-03-25T17:54:23.000+00:00,14 1,c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,github/coldgust/coldgust.github.io,2c45280f-7fb3-4025-b703-a547c4a94916,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,4,2023-03-25T17:50:20.000+00:00,2023-03-25T17:50:25.000+00:00,5 -1,fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,github/coldgust/coldgust.github.io,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,8,2023-03-25T18:06:13.000+00:00,2023-03-25T18:06:28.000+00:00,15 +1,fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,github/coldgust/coldgust.github.io,afe0cabe-e7ee-4eb7-bf13-bb6170d139f0,,workflow,,,failed,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,8,2023-03-25T18:06:13.000+00:00,2023-03-25T18:05:28.000+00:00,0 1,fd0bd4f5-264f-4e3c-a151-06153c018f78,github/coldgust/coldgust.github.io,7fcc1623-edcc-4a76-ad20-cd81aa83519f,,workflow,,,success,1c762fc2-b0fb-4fe2-97d2-5e54ddd1eba7,9,2023-03-25T18:13:21.000+00:00,2023-03-25T18:13:38.000+00:00,17 diff --git a/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv b/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv index 54a7ede5d59..40e7b614a9d 100644 --- a/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv +++ b/backend/plugins/circleci/e2e/snapshot_tables/cicd_pipelines.csv @@ -6,5 +6,5 @@ circleci:CircleciWorkflow:1:8971a56b-5547-4824-94dd-07bb467524c5,say-hello-workf circleci:CircleciWorkflow:1:8fe60291-68f7-40e2-acec-d99bff4da713,say-hello-workflow,say-hello-workflow#1,,SUCCESS,DONE,success,,,4,,PRODUCTION,,2023-03-25T17:12:18.000+00:00,2023-03-25T17:12:18.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io circleci:CircleciWorkflow:1:b9ab7bbe-2f30-4c59-b4e2-eb2005bffb14,workflow,workflow#6,,FAILURE,DONE,failed,,,14,,PRODUCTION,,2023-03-25T17:54:09.000+00:00,2023-03-25T17:54:09.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io circleci:CircleciWorkflow:1:c7df82a6-0d2b-4e19-a36a-3f3aa9fd3943,workflow,workflow#4,,FAILURE,DONE,failed,,,5,,PRODUCTION,,2023-03-25T17:50:20.000+00:00,2023-03-25T17:50:20.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io -circleci:CircleciWorkflow:1:fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,workflow,workflow#8,,FAILURE,DONE,failed,,,15,,PRODUCTION,,2023-03-25T18:06:13.000+00:00,2023-03-25T18:06:13.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io +circleci:CircleciWorkflow:1:fc76deef-bcdd-4856-8e96-a8e2d1c5a85f,workflow,workflow#8,,FAILURE,DONE,failed,,,0,,PRODUCTION,,2023-03-25T18:06:13.000+00:00,2023-03-25T18:06:13.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io circleci:CircleciWorkflow:1:fd0bd4f5-264f-4e3c-a151-06153c018f78,workflow,workflow#9,,SUCCESS,DONE,success,,,17,,PRODUCTION,,2023-03-25T18:13:21.000+00:00,2023-03-25T18:13:21.000+00:00,circleci:CircleciProject:1:github/coldgust/coldgust.github.io diff --git a/backend/plugins/circleci/tasks/workflow_extractor.go b/backend/plugins/circleci/tasks/workflow_extractor.go index 165c6d635d0..27ec520a07c 100644 --- a/backend/plugins/circleci/tasks/workflow_extractor.go +++ b/backend/plugins/circleci/tasks/workflow_extractor.go @@ -19,6 +19,7 @@ package tasks import ( "encoding/json" + "github.com/apache/incubator-devlake/core/errors" "github.com/apache/incubator-devlake/core/plugin" "github.com/apache/incubator-devlake/helpers/pluginhelper/api" @@ -51,7 +52,10 @@ func ExtractWorkflows(taskCtx plugin.SubTaskContext) errors.Error { if userRes.CreatedDate != nil && userRes.StoppedAt != nil { startTime := userRes.CreatedDate.ToTime() endTime := userRes.StoppedAt.ToTime() - toolL.DurationSec = float64(endTime.Sub(startTime).Milliseconds() / 1e3) + durationSec := endTime.Sub(startTime).Seconds() + if durationSec >= 0 { + toolL.DurationSec = durationSec + } } return []interface{}{ &toolL,