You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by li...@apache.org on 2022/11/21 02:11:51 UTC

[incubator-devlake] branch main updated: fix(jenkins): update build stages logic (#3760)

This is an automated email from the ASF dual-hosted git repository.

likyh pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/incubator-devlake.git


The following commit(s) were added to refs/heads/main by this push:
     new ba6c908c9 fix(jenkins): update build stages logic (#3760)
ba6c908c9 is described below

commit ba6c908c940bafffab436a3717de199e50829b8e
Author: Warren Chen <yi...@merico.dev>
AuthorDate: Mon Nov 21 10:11:46 2022 +0800

    fix(jenkins): update build stages logic (#3760)
---
 plugins/jenkins/e2e/builds_test.go                 | 23 +++++++--
 .../e2e/raw_tables/_raw_jenkins_api_jobs.csv       |  4 +-
 .../e2e/raw_tables/_raw_jenkins_api_stages.csv     |  3 ++
 .../raw_tables/_tool_jenkins_builds_for_stages.csv |  2 +
 .../e2e/raw_tables/_tool_jenkins_stages.csv        | 20 ++++++++
 .../e2e/snapshot_tables/_tool_jenkins_builds.csv   | 60 +++++++++++-----------
 .../_tool_jenkins_builds_after_enrich.csv          | 30 +++++++++++
 plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv |  4 --
 plugins/jenkins/tasks/build_stages_enricher.go     | 43 ++++------------
 9 files changed, 116 insertions(+), 73 deletions(-)

diff --git a/plugins/jenkins/e2e/builds_test.go b/plugins/jenkins/e2e/builds_test.go
index 5a925c096..4fee31bef 100644
--- a/plugins/jenkins/e2e/builds_test.go
+++ b/plugins/jenkins/e2e/builds_test.go
@@ -41,15 +41,15 @@ func TestJenkinsBuildsDataFlow(t *testing.T) {
 		Job: &models.JenkinsJob{FullName: "Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake"},
 	}
 
-	// import raw data table
-	// SELECT * FROM _raw_jenkins_api_builds INTO OUTFILE "/tmp/_raw_jenkins_api_builds.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
-	dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jenkins_api_builds.csv", "_raw_jenkins_api_builds")
-
-	// verify extraction
 	dataflowTester.FlushTabler(&models.JenkinsBuild{})
 	dataflowTester.FlushTabler(&models.JenkinsBuildCommit{})
 	dataflowTester.FlushTabler(&models.JenkinsStage{})
 
+	// import raw data table
+	// SELECT * FROM _raw_jenkins_api_builds INTO OUTFILE "/tmp/_raw_jenkins_api_builds.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
+	dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jenkins_api_builds.csv", "_raw_jenkins_api_builds")
+	dataflowTester.ImportCsvIntoTabler("./raw_tables/_tool_jenkins_stages.csv", &models.JenkinsStage{})
+
 	dataflowTester.Subtask(tasks.ExtractApiBuildsMeta, taskData)
 	dataflowTester.VerifyTable(
 		models.JenkinsBuild{},
@@ -65,6 +65,7 @@ func TestJenkinsBuildsDataFlow(t *testing.T) {
 			"result",
 			"timestamp",
 			"start_time",
+			"has_stages",
 		),
 	)
 
@@ -84,6 +85,18 @@ func TestJenkinsBuildsDataFlow(t *testing.T) {
 	dataflowTester.FlushTabler(&devops.CICDPipeline{})
 	dataflowTester.FlushTabler(&devops.CiCDPipelineCommit{})
 	dataflowTester.Subtask(tasks.EnrichApiBuildWithStagesMeta, taskData)
+	dataflowTester.VerifyTable(
+		models.JenkinsBuild{},
+		"./snapshot_tables/_tool_jenkins_builds_after_enrich.csv",
+		[]string{
+			"connection_id",
+			"job_name",
+			"duration",
+			"full_display_name",
+			"has_stages",
+		},
+	)
+
 	dataflowTester.Subtask(tasks.ConvertBuildsToCICDMeta, taskData)
 	dataflowTester.Subtask(tasks.ConvertBuildReposMeta, taskData)
 
diff --git a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_jobs.csv b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_jobs.csv
index 68a632b1b..b995fc323 100644
--- a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_jobs.csv
+++ b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_jobs.csv
@@ -1,2 +1,4 @@
 "id","params","data","url","input","created_at"
-16247,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_class"":""hudson.model.FreeStyleProject"",""actions"":[{},{},{},{},{""_class"":""com.cloudbees.plugins.credentials.ViewCredentialsAction""}],""primaryView"":{""_class"":""hudson.model.AllView"",""name"":""All"",""url"":""https://jenkins-zjk.merico.cn/job/Test-jenkins-dir/job/test-jenkins-sub-dir/""},""description"":""12121"",""displayName"":""test- [...]
\ No newline at end of file
+16247,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_class"":""hudson.model.FreeStyleProject"",""actions"":[{},{},{},{},{""_class"":""com.cloudbees.plugins.credentials.ViewCredentialsAction""}],""primaryView"":{""_class"":""hudson.model.AllView"",""name"":""All"",""url"":""https://jenkins-zjk.merico.cn/job/Test-jenkins-dir/job/test-jenkins-sub-dir/""},""description"":""12121"",""displayName"":""test- [...]
+16248,"{""ConnectionId"":2,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_class"":""hudson.model.FreeStyleProject"",""actions"":[{},{},{},{},{""_class"":""com.cloudbees.plugins.credentials.ViewCredentialsAction""}],""primaryView"":{""_class"":""hudson.model.AllView"",""name"":""All"",""url"":""https://jenkins-zjk.merico.cn/job/Test-jenkins-dir/job/test-jenkins-sub-dir/""},""description"":""12121"",""displayName"":""test- [...]
+16249,"{""ConnectionId"":1,""JobName"":""devlake1"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_class"":""hudson.model.FreeStyleProject"",""actions"":[{},{},{},{},{""_class"":""com.cloudbees.plugins.credentials.ViewCredentialsAction""}],""primaryView"":{""_class"":""hudson.model.AllView"",""name"":""All"",""url"":""https://jenkins-zjk.merico.cn/job/Test-jenkins-dir/job/test-jenkins-sub-dir/""},""description"":""12121"",""displayName"":""test [...]
diff --git a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_stages.csv b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_stages.csv
index ecae6ca92..eb3037a91 100644
--- a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_stages.csv
+++ b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_stages.csv
@@ -15,3 +15,6 @@
 13581,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_links"":{""self"":{""href"":""/job/Test%20Gitlab%20Sync/12/execution/node/6/wfapi/describe""}},""id"":""3"",""name"":""gitlabAutoSync"",""execNode"":"""",""status"":""SUCCESS"",""startTimeMillis"":1583981125465,""durationMillis"":83641,""pauseDurationMillis"":0}",https://jenkins.merico.cn/job/Test%20Gitlab%20Sync/12/wfapi/describe,"{""Number"": ""1 [...]
 13582,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_links"":{""self"":{""href"":""/job/Auto%20Init%20Gitlab/23/execution/node/6/wfapi/describe""}},""id"":""4"",""name"":""gitlabInit"",""execNode"":"""",""status"":null,""error"":{""message"":null,""type"":""org.jenkinsci.plugins.workflow.steps.FlowInterruptedException""},""startTimeMillis"":1605767269680,""durationMillis"":248279,""pauseDurationMilli [...]
 13583,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_links"":{""self"":{""href"":""/job/Test%20Gitlab%20Sync/10/execution/node/6/wfapi/describe""}},""id"":""5"",""name"":""gitlabAutoSync"",""execNode"":"""",""status"":""SUCCESS"",""startTimeMillis"":1583981120136,""durationMillis"":86044,""pauseDurationMillis"":0}",https://jenkins.merico.cn/job/Test%20Gitlab%20Sync/10/wfapi/describe,"{""Number"": ""1 [...]
+13584,"{""ConnectionId"":2,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_links"":{""self"":{""href"":""/job/Test%20Gitlab%20Sync/12/execution/node/6/wfapi/describe""}},""id"":""3"",""name"":""gitlabAutoSync"",""execNode"":"""",""status"":""SUCCESS"",""startTimeMillis"":1583981125465,""durationMillis"":83641,""pauseDurationMillis"":0}",https://jenkins.merico.cn/job/Test%20Gitlab%20Sync/12/wfapi/describe,"{""Number"": ""1 [...]
+13585,"{""ConnectionId"":2,""JobName"":""devlake1"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_links"":{""self"":{""href"":""/job/Auto%20Init%20Gitlab/23/execution/node/6/wfapi/describe""}},""id"":""4"",""name"":""gitlabInit"",""execNode"":"""",""status"":null,""error"":{""message"":null,""type"":""org.jenkinsci.plugins.workflow.steps.FlowInterruptedException""},""startTimeMillis"":1605767269680,""durationMillis"":248279,""pauseDurationMill [...]
+13586,"{""ConnectionId"":3,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}","{""_links"":{""self"":{""href"":""/job/Test%20Gitlab%20Sync/10/execution/node/6/wfapi/describe""}},""id"":""5"",""name"":""gitlabAutoSync"",""execNode"":"""",""status"":""SUCCESS"",""startTimeMillis"":1583981120136,""durationMillis"":86044,""pauseDurationMillis"":0}",https://jenkins.merico.cn/job/Test%20Gitlab%20Sync/10/wfapi/describe,"{""Number"": ""1 [...]
diff --git a/plugins/jenkins/e2e/raw_tables/_tool_jenkins_builds_for_stages.csv b/plugins/jenkins/e2e/raw_tables/_tool_jenkins_builds_for_stages.csv
index 3fbc8469c..8ca916477 100644
--- a/plugins/jenkins/e2e/raw_tables/_tool_jenkins_builds_for_stages.csv
+++ b/plugins/jenkins/e2e/raw_tables/_tool_jenkins_builds_for_stages.csv
@@ -13,3 +13,5 @@ connection_id,full_display_name,job_name,job_path,duration,estimated_duration,nu
 1,Test Gitlab Sync #12,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,9,3,SUCCESS,1658386255052,2022-07-21T06:50:55.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,110,
 1,Auto Init Gitlab #23,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,11,9,4,SUCCESS,1662647217746,2022-09-08T14:26:57.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,109,
 1,Test Gitlab Sync #10,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1429,745,1,SUCCESS,1658385602419,2022-07-21T06:40:02.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,97,
+2,Auto Init Gitlab #23,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,11,9,4,SUCCESS,1662647217746,2022-09-08T14:26:57.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,109,
+2,Test Gitlab Sync #10,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1429,745,1,SUCCESS,1658385602419,2022-07-21T06:40:02.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,97,
diff --git a/plugins/jenkins/e2e/raw_tables/_tool_jenkins_stages.csv b/plugins/jenkins/e2e/raw_tables/_tool_jenkins_stages.csv
new file mode 100644
index 000000000..e7fbd0784
--- /dev/null
+++ b/plugins/jenkins/e2e/raw_tables/_tool_jenkins_stages.csv
@@ -0,0 +1,20 @@
+connection_id,id,build_name,name,exec_node,status,start_time_millis,duration_millis,pause_duration_millis,type,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+1,1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #11,gitlabAutoSync,,SUCCESS,1581076468986,14118,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13579,
+1,10,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #13,Hello,,SUCCESS,1662651617917,258,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,5,
+1,11,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #15,Hello,,SUCCESS,1662651634424,79,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,6,
+1,12,Auto Init Gitlab #1,gitlabInit,,FAILED,1583329644046,588,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13574,
+1,2,Auto Init Gitlab #19,gitlabInit,,ABORTED,1584497957140,5859,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13580,
+1,3,Test Gitlab Sync #12,gitlabAutoSync,,SUCCESS,1583981125465,83641,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13581,
+1,4,Auto Init Gitlab #23,gitlabInit,,,1605767269680,248279,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13582,
+1,5,Test Gitlab Sync #10,gitlabAutoSync,,SUCCESS,1583981120136,86044,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13583,
+1,6,Auto Init Gitlab #18,gitlabInit,,FAILED,1584458835920,215100,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13575,
+1,6,pipeline-test2 #2,Hello,,SUCCESS,1662651634424,79,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,1,
+1,7,Auto Init Gitlab #19,gitlabInit,,ABORTED,1584497957140,5859,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13576,
+1,7,pipeline-test2 #3,Hello,,SUCCESS,1662651649629,122,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,2,
+1,8,Pipeline expirement #5,scp-f/b,,FAILED,1572321694770,297,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13577,
+1,8,pipeline-test2 #3,Hello,,SUCCESS,1662651649629,122,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,3,
+1,9,Auto Init Gitlab #58,gitlabInit,,,1615296910614,1312274,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13578,
+1,9,pipeline-test2 #1,Hello,,SUCCESS,1662651617917,258,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,4,
+2,8,pipeline-test2 #3,Hello,,SUCCESS,1662651649629,122,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,3,
+2,9,Auto Init Gitlab #58,gitlabInit,,,1615296910614,1312274,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,13578,
+2,9,pipeline-test2 #1,Hello,,SUCCESS,1662651617917,258,0,,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_stages,4,
diff --git a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv
index e33e71886..62e819449 100644
--- a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv
@@ -1,30 +1,30 @@
-connection_id,full_display_name,job_name,job_path,duration,estimated_duration,number,result,timestamp,start_time,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-1,pipeline-test2 #1,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4564,1972,1,SUCCESS,1662651613681,2022-09-08T15:40:13.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,100,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #11,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,14820,1457,1,SUCCESS,1650017416514,2022-04-15T10:10:16.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,95,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #13,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1429,745,1,SUCCESS,1658385602419,2022-07-21T06:40:02.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,97,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #15,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,70,27,1,SUCCESS,1658385566471,2022-07-21T06:39:26.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,105,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #17,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,57,6,1,SUCCESS,1650017153775,2022-04-15T10:05:53.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,124,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #170,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,12,6,10,SUCCESS,1662647233074,2022-09-08T14:27:13.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,115,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #171,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,6,11,SUCCESS,1662651656567,2022-09-08T15:40:56.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,114,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #172,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,2,6,12,SUCCESS,1662651657893,2022-09-08T15:40:57.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,113,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #21,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,2121,1457,2,SUCCESS,1650022548450,2022-04-15T11:35:48.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,94,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #215,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,11,8,2,SUCCESS,1662647212436,2022-09-08T14:26:52.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,101,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #23,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,61,745,2,SUCCESS,1662647211512,2022-09-08T14:26:51.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,96,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #24,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,551,1972,2,SUCCESS,1662651633991,2022-09-08T15:40:33.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,99,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #25,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,6,27,2,SUCCESS,1658385576367,2022-07-21T06:39:36.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,104,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #27,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,6,2,SUCCESS,1650017177939,2022-04-15T10:06:17.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,123,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #31,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1587,1457,3,SUCCESS,1650024049161,2022-04-15T12:00:49.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,93,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #34,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,802,1972,3,SUCCESS,1662651648992,2022-09-08T15:40:48.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,98,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #35,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,27,3,SUCCESS,1662647217041,2022-09-08T14:26:57.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,103,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #37,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,3,6,3,SUCCESS,1650017186253,2022-04-15T10:06:26.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,122,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #41,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,13952,1457,4,SUCCESS,1662647203905,2022-09-08T14:26:43.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,92,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #47,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,6,6,4,SUCCESS,1650022556910,2022-04-15T11:35:56.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,121,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #51,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1274,1457,5,SUCCESS,1662647231332,2022-09-08T14:27:11.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,91,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #57,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,6,6,5,SUCCESS,1650022558491,2022-04-15T11:35:58.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,120,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #61,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1202,1457,6,SUCCESS,1662647242809,2022-09-08T14:27:22.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,90,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #67,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,10,6,6,SUCCESS,1650022560954,2022-04-15T11:36:00.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,119,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #71,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1988,1457,7,SUCCESS,1662651625889,2022-09-08T15:40:25.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,89,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #77,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,8,6,7,SUCCESS,1650023883294,2022-04-15T11:58:03.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,118,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #81,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1180,1457,8,SUCCESS,1662651640536,2022-09-08T15:40:40.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,88,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #87,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,11,6,8,SUCCESS,1650023894336,2022-04-15T11:58:14.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,117,
-1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #97,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,78,6,9,SUCCESS,1662647207972,2022-09-08T14:26:47.000+00:00,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,116,
+connection_id,full_display_name,job_name,job_path,duration,estimated_duration,number,result,timestamp,start_time,has_stages,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+1,pipeline-test2 #1,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4564,1972,1,SUCCESS,1662651613681,2022-09-08T15:40:13.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,100,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #11,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,14820,1457,1,SUCCESS,1650017416514,2022-04-15T10:10:16.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,95,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #13,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1429,745,1,SUCCESS,1658385602419,2022-07-21T06:40:02.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,97,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #15,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,70,27,1,SUCCESS,1658385566471,2022-07-21T06:39:26.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,105,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #17,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,57,6,1,SUCCESS,1650017153775,2022-04-15T10:05:53.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,124,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #170,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,12,6,10,SUCCESS,1662647233074,2022-09-08T14:27:13.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,115,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #171,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,6,11,SUCCESS,1662651656567,2022-09-08T15:40:56.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,114,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #172,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,2,6,12,SUCCESS,1662651657893,2022-09-08T15:40:57.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,113,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #21,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,2121,1457,2,SUCCESS,1650022548450,2022-04-15T11:35:48.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,94,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #215,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,11,8,2,SUCCESS,1662647212436,2022-09-08T14:26:52.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,101,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #23,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,61,745,2,SUCCESS,1662647211512,2022-09-08T14:26:51.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,96,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #24,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,551,1972,2,SUCCESS,1662651633991,2022-09-08T15:40:33.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,99,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #25,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,6,27,2,SUCCESS,1658385576367,2022-07-21T06:39:36.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,104,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #27,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,6,2,SUCCESS,1650017177939,2022-04-15T10:06:17.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,123,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #31,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1587,1457,3,SUCCESS,1650024049161,2022-04-15T12:00:49.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,93,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #34,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,802,1972,3,SUCCESS,1662651648992,2022-09-08T15:40:48.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,98,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #35,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,4,27,3,SUCCESS,1662647217041,2022-09-08T14:26:57.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,103,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #37,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,3,6,3,SUCCESS,1650017186253,2022-04-15T10:06:26.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,122,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #41,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,13952,1457,4,SUCCESS,1662647203905,2022-09-08T14:26:43.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,92,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #47,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,6,6,4,SUCCESS,1650022556910,2022-04-15T11:35:56.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,121,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #51,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1274,1457,5,SUCCESS,1662647231332,2022-09-08T14:27:11.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,91,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #57,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,6,6,5,SUCCESS,1650022558491,2022-04-15T11:35:58.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,120,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #61,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1202,1457,6,SUCCESS,1662647242809,2022-09-08T14:27:22.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,90,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #67,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,10,6,6,SUCCESS,1650022560954,2022-04-15T11:36:00.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,119,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #71,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1988,1457,7,SUCCESS,1662651625889,2022-09-08T15:40:25.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,89,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #77,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,8,6,7,SUCCESS,1650023883294,2022-04-15T11:58:03.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,118,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #81,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,1180,1457,8,SUCCESS,1662651640536,2022-09-08T15:40:40.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,88,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #87,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,11,6,8,SUCCESS,1650023894336,2022-04-15T11:58:14.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,117,
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #97,devlake,job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/,78,6,9,SUCCESS,1662647207972,2022-09-08T14:26:47.000+00:00,0,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,116,
diff --git a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds_after_enrich.csv b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds_after_enrich.csv
new file mode 100644
index 000000000..fa929f45e
--- /dev/null
+++ b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds_after_enrich.csv
@@ -0,0 +1,30 @@
+connection_id,full_display_name,job_name,duration,has_stages
+1,pipeline-test2 #1,devlake,4564,1
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #11,devlake,14820,1
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #13,devlake,1429,1
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #15,devlake,70,1
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #17,devlake,57,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #170,devlake,12,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #171,devlake,4,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #172,devlake,2,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #21,devlake,2121,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #215,devlake,11,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #23,devlake,61,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #24,devlake,551,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #25,devlake,6,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #27,devlake,4,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #31,devlake,1587,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #34,devlake,802,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #35,devlake,4,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #37,devlake,3,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #41,devlake,13952,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #47,devlake,6,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #51,devlake,1274,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #57,devlake,6,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #61,devlake,1202,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #67,devlake,10,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #71,devlake,1988,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #77,devlake,8,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #81,devlake,1180,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #87,devlake,11,0
+1,Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #97,devlake,78,0
diff --git a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
index cb798e9a3..ef155677d 100644
--- a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
@@ -1,8 +1,4 @@
 id,name,pipeline_id,result,status,type,environment,duration_sec,started_date,finished_date,cicd_scope_id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-jenkins:JenkinsBuild:1:pipeline-test2 #1,devlake,jenkins:JenkinsBuild:1:pipeline-test2 #1,SUCCESS,DONE,,,4,2022-09-08T15:40:13.000+00:00,2022-09-08T15:40:17.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/""}",_raw_jenkins_api_builds,100,
-jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #11,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #11,SUCCESS,DONE,,,14,2022-04-15T10:10:16.000+00:00,2022-04-15T10:10:30.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-di [...]
-jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #13,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #13,SUCCESS,DONE,,,1,2022-07-21T06:40:02.000+00:00,2022-07-21T06:40:03.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir [...]
-jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #15,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #15,SUCCESS,DONE,,,0,2022-07-21T06:39:26.000+00:00,2022-07-21T06:39:26.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir [...]
 jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #17,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #17,SUCCESS,DONE,,,0,2022-04-15T10:05:53.000+00:00,2022-04-15T10:05:53.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir [...]
 jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #170,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #170,SUCCESS,DONE,,,0,2022-09-08T14:27:13.000+00:00,2022-09-08T14:27:13.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-d [...]
 jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #171,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake #171,SUCCESS,DONE,,,0,2022-09-08T15:40:56.000+00:00,2022-09-08T15:40:56.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir » test-jenkins-sub-dir » test-sub-sub-dir » devlake,"{""ConnectionId"":1,""JobName"":""devlake"",""JobPath"":""job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-d [...]
diff --git a/plugins/jenkins/tasks/build_stages_enricher.go b/plugins/jenkins/tasks/build_stages_enricher.go
index d223e66e3..8ce74eb21 100644
--- a/plugins/jenkins/tasks/build_stages_enricher.go
+++ b/plugins/jenkins/tasks/build_stages_enricher.go
@@ -22,12 +22,8 @@ import (
 	"github.com/apache/incubator-devlake/plugins/core"
 	"github.com/apache/incubator-devlake/plugins/core/dal"
 	"github.com/apache/incubator-devlake/plugins/jenkins/models"
-	"strconv"
-	"strings"
 )
 
-// this struct should be moved to `gitub_api_common.go`
-
 var EnrichApiBuildWithStagesMeta = core.SubTaskMeta{
 	Name:             "enrichApiBuildWithStages",
 	EntryPoint:       EnrichApiBuildWithStages,
@@ -40,15 +36,14 @@ func EnrichApiBuildWithStages(taskCtx core.SubTaskContext) errors.Error {
 	data := taskCtx.GetData().(*JenkinsTaskData)
 	db := taskCtx.GetDal()
 	clauses := []dal.Clause{
-		dal.Select("distinct build_name"),
-		dal.From(&models.JenkinsStage{}),
-		dal.Join(`left join _tool_jenkins_builds tjb 
-						on _tool_jenkins_stages.build_name = tjb.full_display_name 
-						and _tool_jenkins_stages.connection_id = tjb.connection_id`),
-		dal.Where(`_tool_jenkins_stages.connection_id = ? 
+		dal.Select("tjb.*"),
+		dal.From(`_tool_jenkins_builds tjb`),
+		dal.Join(`inner join _tool_jenkins_stages tjs 
+						on tjs.build_name = tjb.full_display_name 
+						and tjs.connection_id = tjb.connection_id`),
+		dal.Where(`tjb.connection_id = ? 
 							and tjb.job_path = ? and tjb.job_name = ?`,
 			data.Options.ConnectionId, data.Options.JobPath, data.Options.JobName),
-		dal.Groupby("_tool_jenkins_stages.build_name"),
 	}
 	cursor, err := db.Cursor(clauses...)
 	if err != nil {
@@ -58,35 +53,17 @@ func EnrichApiBuildWithStages(taskCtx core.SubTaskContext) errors.Error {
 	taskCtx.SetProgress(0, -1)
 
 	for cursor.Next() {
-		var buildName string
-		err = errors.Convert(cursor.Scan(&buildName))
-		if err != nil {
-			return err
-		}
-		if buildName == "" {
-			continue
-		}
 		build := &models.JenkinsBuild{}
-		build.ConnectionId = data.Options.ConnectionId
-		str := strings.Split(buildName, "#")
-		build.JobName = strings.TrimSpace(str[0])
-		var number int
-		number, err = errors.Convert01(strconv.Atoi(strings.TrimSpace(str[1])))
+		err = db.Fetch(cursor, build)
 		if err != nil {
 			return err
 		}
-		build.Number = int64(number)
-		err = db.First(build)
-		if err != nil {
-			return errors.Convert(err)
-		}
 		build.HasStages = true
-
-		err = db.Update(build)
+		err = db.CreateOrUpdate(build)
 		if err != nil {
-			return errors.Convert(err)
+			return err
 		}
-		taskCtx.IncProgress(1)
 	}
+
 	return nil
 }