You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@devlake.apache.org by kl...@apache.org on 2022/09/09 03:12:36 UTC

[incubator-devlake] branch main updated: feat: add jenkins e2e test for cicd (#3030)

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

klesh 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 7d0dfb88 feat: add jenkins e2e test for cicd (#3030)
7d0dfb88 is described below

commit 7d0dfb888e2fb5b79cd4654186214e9210e72e98
Author: mappjzc <zh...@merico.dev>
AuthorDate: Fri Sep 9 11:12:33 2022 +0800

    feat: add jenkins e2e test for cicd (#3030)
    
    Add JenkinsBuildRepo
    Add CICDTask
    Add CICDPipeline
    Add CICDPipelineRelationship
    
    Nddtfjiang <zh...@merico.dev>
    
    Co-authored-by: Klesh Wong <zh...@merico.dev>
---
 plugins/jenkins/e2e/builds_test.go                 | 79 ++++++++++++++++++++--
 plugins/jenkins/e2e/jobs_test.go                   |  1 +
 .../e2e/raw_tables/_raw_jenkins_api_builds.csv     | 45 +++++++++---
 .../e2e/raw_tables/_raw_jenkins_api_jobs.csv       | 18 ++---
 .../snapshot_tables/_tool_jenkins_build_repos.csv  |  9 +++
 .../e2e/snapshot_tables/_tool_jenkins_builds.csv   | 47 ++++++++++---
 .../e2e/snapshot_tables/_tool_jenkins_jobs.csv     | 18 ++---
 .../cicd_pipeline_relationships.csv                |  1 +
 .../jenkins/e2e/snapshot_tables/cicd_pipelines.csv | 38 +++++++++++
 plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv | 38 +++++++++++
 plugins/jenkins/e2e/snapshot_tables/jobs.csv       | 18 ++---
 11 files changed, 264 insertions(+), 48 deletions(-)

diff --git a/plugins/jenkins/e2e/builds_test.go b/plugins/jenkins/e2e/builds_test.go
index e84f0b59..40c51b75 100644
--- a/plugins/jenkins/e2e/builds_test.go
+++ b/plugins/jenkins/e2e/builds_test.go
@@ -21,6 +21,7 @@ import (
 	"testing"
 
 	"github.com/apache/incubator-devlake/helpers/e2ehelper"
+	"github.com/apache/incubator-devlake/models/domainlayer/devops"
 	"github.com/apache/incubator-devlake/plugins/jenkins/impl"
 	"github.com/apache/incubator-devlake/plugins/jenkins/models"
 	"github.com/apache/incubator-devlake/plugins/jenkins/tasks"
@@ -38,22 +39,18 @@ func TestJenkinsBuildsDataFlow(t *testing.T) {
 	}
 
 	// 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.JenkinsBuildRepo{})
+
 	dataflowTester.Subtask(tasks.ExtractApiBuildsMeta, taskData)
 	dataflowTester.VerifyTable(
 		models.JenkinsBuild{},
 		"./snapshot_tables/_tool_jenkins_builds.csv",
 		[]string{
-			"connection_id",
-			"job_name",
-			"number",
-			"_raw_data_params",
-			"_raw_data_table",
-			"_raw_data_id",
-			"_raw_data_remark",
 			"connection_id",
 			"job_name",
 			"duration",
@@ -64,6 +61,74 @@ func TestJenkinsBuildsDataFlow(t *testing.T) {
 			"timestamp",
 			"start_time",
 			"commit_sha",
+
+			"_raw_data_params",
+			"_raw_data_table",
+			"_raw_data_id",
+			"_raw_data_remark",
+		},
+	)
+
+	dataflowTester.VerifyTable(
+		models.JenkinsBuildRepo{},
+		"./snapshot_tables/_tool_jenkins_build_repos.csv",
+		[]string{
+			"connection_id",
+			"build_name",
+			"commit_sha",
+			"branch",
+			"repo_url",
+
+			"_raw_data_params",
+			"_raw_data_table",
+			"_raw_data_id",
+			"_raw_data_remark",
+		},
+	)
+
+	dataflowTester.FlushTabler(&devops.CICDTask{})
+	dataflowTester.FlushTabler(&devops.CICDPipeline{})
+	dataflowTester.FlushTabler(&devops.CICDPipelineRelationship{})
+
+	dataflowTester.Subtask(tasks.ConvertBuildsToCICDMeta, taskData)
+
+	dataflowTester.VerifyTable(
+		devops.CICDTask{},
+		"./snapshot_tables/cicd_tasks.csv",
+		[]string{
+			"name",
+			"pipeline_id",
+			"result",
+			"status",
+			"type",
+			"environment",
+			"duration_sec",
+			"started_date",
+			"finished_date",
+		},
+	)
+
+	dataflowTester.VerifyTable(
+		devops.CICDPipeline{},
+		"./snapshot_tables/cicd_pipelines.csv",
+		[]string{
+			"name",
+			"result",
+			"status",
+			"type",
+			"duration_sec",
+			"environment",
+			"created_date",
+			"finished_date",
+		},
+	)
+
+	dataflowTester.VerifyTable(
+		devops.CICDPipelineRelationship{},
+		"./snapshot_tables/cicd_pipeline_relationships.csv",
+		[]string{
+			"parent_pipeline_id",
+			"child_pipeline_id",
 		},
 	)
 }
diff --git a/plugins/jenkins/e2e/jobs_test.go b/plugins/jenkins/e2e/jobs_test.go
index 11b50c14..f0f5ab12 100644
--- a/plugins/jenkins/e2e/jobs_test.go
+++ b/plugins/jenkins/e2e/jobs_test.go
@@ -40,6 +40,7 @@ func TestJenkinsJobsDataFlow(t *testing.T) {
 	}
 
 	// import raw data table
+	// SELECT * FROM _raw_jenkins_api_jobs INTO OUTFILE "/tmp/_raw_jenkins_api_jobs.csv" FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' LINES TERMINATED BY '\r\n';
 	dataflowTester.ImportCsvIntoRawTable("./raw_tables/_raw_jenkins_api_jobs.csv", "_raw_jenkins_api_jobs")
 
 	// verify extraction
diff --git a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_builds.csv b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_builds.csv
index 250c8ce3..8802295a 100644
--- a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_builds.csv
+++ b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_builds.csv
@@ -1,9 +1,38 @@
 "id","params","data","url","input","created_at"
-75,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#8"",""duration"":11,""estimatedDuration"":10,""number"":8,""result"":""SUCCESS"",""timestamp"":1650023894336,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA% [...]
-76,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#7"",""duration"":8,""estimatedDuration"":10,""number"":7,""result"":""SUCCESS"",""timestamp"":1650023883294,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%8 [...]
-77,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#6"",""duration"":10,""estimatedDuration"":10,""number"":6,""result"":""SUCCESS"",""timestamp"":1650022560954,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA% [...]
-78,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#5"",""duration"":6,""estimatedDuration"":10,""number"":5,""result"":""SUCCESS"",""timestamp"":1650022558491,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%8 [...]
-79,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#4"",""duration"":6,""estimatedDuration"":10,""number"":4,""result"":""SUCCESS"",""timestamp"":1650022556910,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%8 [...]
-80,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#3"",""duration"":3,""estimatedDuration"":10,""number"":3,""result"":""SUCCESS"",""timestamp"":1650017186253,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%8 [...]
-81,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#2"",""duration"":4,""estimatedDuration"":10,""number"":2,""result"":""SUCCESS"",""timestamp"":1650017177939,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%8 [...]
-82,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction""},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""displayName"":""#1"",""duration"":57,""estimatedDuration"":10,""number"":1,""result"":""SUCCESS"",""timestamp"":1650017153775,""changeSet"":{""_class"":""hudson.scm.EmptyChangeLogSet"",""kind"":null}}","https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA% [...]
+88,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""0006e8105d70318aff5eeee38d405fa181a32aa0"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+89,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""0006e8105d70318aff5eeee38d405fa181a32aa0"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+90,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""20139afef3c6ec9f3ebffcb06e243b145cbef8c6"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+91,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""20139afef3c6ec9f3ebffcb06e243b145cbef8c6"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+92,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""20139afef3c6ec9f3ebffcb06e243b145cbef8c6"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+93,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""0f886c74949c3ee7e489188911c7dc0c1d547418"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+94,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""0f886c74949c3ee7e489188911c7dc0c1d547418"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+95,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""hudson.plugins.git.util.BuildData"",""lastBuiltRevision"":{""SHA1"":""ceeffdfdd06bce232f9adb3a656265bad13a8473"",""branch"":[{""name"":""refs/remotes/origin/main""}]},""remoteUrls"":[""https://github.com [...]
+96,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""},{""_class"":""org.jenkinsci.plugins.pipeline. [...]
+97,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""},{""_class"":""org.jenkinsci.plugins.pipeline. [...]
+98,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UpstreamCause"",""shortDescription"":""Started by upstream project \""devlake\"" build number 8"",""upstreamBuild"":8,""upstreamProject"":""devlake"",""upstreamUrl"":""job/devlake/""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{},{""_class"":""org.jenkinsci.plugins.dis [...]
+99,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UpstreamCause"",""shortDescription"":""Started by upstream project \""devlake\"" build number 7"",""upstreamBuild"":7,""upstreamProject"":""devlake"",""upstreamUrl"":""job/devlake/""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{},{""_class"":""org.jenkinsci.plugins.dis [...]
+100,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""},{""_class"":""org.jenkinsci.plugins.pipel [...]
+101,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":11,""estimatedDuration"":8,""fullDisplayName"":""dir-test » testfile #2"",""number"":2,""result"":""SUCCESS"",""timestamp [...]
+102,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":4,""estimatedDuration"":8,""fullDisplayName"":""dir-test » testfile #1"",""number"":1,""result"":""SUCCESS"",""timestamp" [...]
+103,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":4,""estimatedDuration"":27,""fullDisplayName"":""dir-test » dir-test-2 » free #3"",""number"":3,""result"":""SUCCESS"","" [...]
+104,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":6,""estimatedDuration"":27,""fullDisplayName"":""dir-test » dir-test-2 » free #2"",""number"":2,""result"":""SUCCESS"","" [...]
+105,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":70,""estimatedDuration"":27,""fullDisplayName"":""dir-test » dir-test-2 » free #1"",""number"":1,""result"":""SUCCESS""," [...]
+106,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""},{""_class"":""org.jenkinsci.plugins.pipeline [...]
+107,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""},{""_class"":""org.jenkinsci.plugins.pipeline [...]
+108,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowRun"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{""_class"":""org.jenkinsci.plugins.workflow.libs.LibrariesAction""},{},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""},{""_class"":""org.jenkinsci.plugins.pipeline [...]
+109,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":11,""estimatedDuration"":9,""fullDisplayName"":""dir-test » dir-test-2 » free1 #4"",""number"":4,""result"":""SUCCESS""," [...]
+110,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":4,""estimatedDuration"":9,""fullDisplayName"":""dir-test » dir-test-2 » free1 #3"",""number"":3,""result"":""SUCCESS"","" [...]
+111,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":11,""estimatedDuration"":9,""fullDisplayName"":""dir-test » dir-test-2 » free1 #2"",""number"":2,""result"":""SUCCESS""," [...]
+112,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":4,""estimatedDuration"":9,""fullDisplayName"":""dir-test » dir-test-2 » free1 #1"",""number"":1,""result"":""SUCCESS"","" [...]
+113,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":2,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #12"",""number"":12,""result"":""SUCCESS"",""timestamp"":16 [...]
+114,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":4,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #11"",""number"":11,""result"":""SUCCESS"",""timestamp"":16 [...]
+115,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":12,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #10"",""number"":10,""result"":""SUCCESS"",""timestamp"":1 [...]
+116,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":78,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #9"",""number"":9,""result"":""SUCCESS"",""timestamp"":166 [...]
+117,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":11,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #8"",""number"":8,""result"":""SUCCESS"",""timestamp"":165 [...]
+118,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":8,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #7"",""number"":7,""result"":""SUCCESS"",""timestamp"":1650 [...]
+119,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":10,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #6"",""number"":6,""result"":""SUCCESS"",""timestamp"":165 [...]
+120,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":6,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #5"",""number"":5,""result"":""SUCCESS"",""timestamp"":1650 [...]
+121,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":6,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #4"",""number"":4,""result"":""SUCCESS"",""timestamp"":1650 [...]
+122,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":3,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #3"",""number"":3,""result"":""SUCCESS"",""timestamp"":1650 [...]
+123,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":4,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #2"",""number"":2,""result"":""SUCCESS"",""timestamp"":1650 [...]
+124,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleBuild"",""actions"":[{""_class"":""hudson.model.CauseAction"",""causes"":[{""_class"":""hudson.model.Cause$UserIdCause"",""shortDescription"":""Started by user 思码逸"",""userId"":""merico"",""userName"":""思码逸""}]},{},{""_class"":""org.jenkinsci.plugins.displayurlapi.actions.RunDisplayAction""}],""duration"":57,""estimatedDuration"":6,""fullDisplayName"":""这是一个改了名字的测试任务 #1"",""number"":1,""result"":""SUCCESS"",""timestamp"":165 [...]
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 a8178b2b..bdd7ef05 100644
--- a/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_jobs.csv
+++ b/plugins/jenkins/e2e/raw_tables/_raw_jenkins_api_jobs.csv
@@ -1,9 +1,11 @@
 "id","params","data","url","input","created_at"
-12,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""devlake"",""url"":""https://test.nddtf.com/job/devlake/"",""color"":""blue""}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": """"}","2022-07-13 02:22:34.044"
-13,"{""ConnectionId"":1}","{""_class"":""com.cloudbees.hudson.plugins.folder.Folder"",""name"":""dir-test"",""url"":""https://test.nddtf.com/job/dir-test/"",""jobs"":[{""_class"":""com.cloudbees.hudson.plugins.folder.Folder""},{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob""},{""_class"":""hudson.model.FreeStyleProject""}]}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": """"}","2022-07-13 02:22:34.044"
-14,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob"",""name"":""测试流水线"",""url"":""https://test.nddtf.com/job/%E6%B5%8B%E8%AF%95%E6%B5%81%E6%B0%B4%E7%BA%BF/"",""color"":""notbuilt""}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": """"}","2022-07-13 02:22:34.044"
-15,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""这是一个改了名字的测试任务"",""url"":""https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%86%E5%90%8D%E5%AD%97%E7%9A%84%E6%B5%8B%E8%AF%95%E4%BB%BB%E5%8A%A1/"",""color"":""blue""}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": """"}","2022-07-13 02:22:34.044"
-16,"{""ConnectionId"":1}","{""_class"":""com.cloudbees.hudson.plugins.folder.Folder"",""name"":""dir-test-2"",""url"":""https://test.nddtf.com/job/dir-test/job/dir-test-2/"",""jobs"":[{""_class"":""hudson.model.FreeStyleProject""}]}","https://test.nddtf.com/job/dir-test/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/""}","2022-07-13 02:22:34.178"
-17,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob"",""name"":""pipeline-test"",""url"":""https://test.nddtf.com/job/dir-test/job/pipeline-test/"",""color"":""notbuilt""}","https://test.nddtf.com/job/dir-test/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/""}","2022-07-13 02:22:34.178"
-18,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""testfile"",""url"":""https://test.nddtf.com/job/dir-test/job/testfile/"",""color"":""notbuilt""}","https://test.nddtf.com/job/dir-test/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/""}","2022-07-13 02:22:34.178"
-19,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""free"",""url"":""https://test.nddtf.com/job/dir-test/job/dir-test-2/job/free/"",""color"":""notbuilt""}","https://test.nddtf.com/job/dir-test/job/dir-test-2/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/job/dir-test-2/""}","2022-07-13 02:22:34.500"
+28,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""devlake"",""url"":""https://test.nddtf.com/job/devlake/"",""color"":""blue"",""upstreamProjects"":[]}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": """"}","2022-09-08 15:41:06.669"
+29,"{""ConnectionId"":1}","{""_class"":""com.cloudbees.hudson.plugins.folder.Folder"",""name"":""dir-test"",""url"":""https://test.nddtf.com/job/dir-test/"",""jobs"":[{""_class"":""com.cloudbees.hudson.plugins.folder.Folder""},{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob""},{""_class"":""hudson.model.FreeStyleProject""}]}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": """"}", [...]
+30,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob"",""name"":""pipeline-test2"",""url"":""https://test.nddtf.com/job/pipeline-test2/"",""color"":""blue""}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": """"}","2022-09-08 15:41:06.669"
+31,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob"",""name"":""测试流水线"",""url"":""https://test.nddtf.com/job/%E6%B5%8B%E8%AF%95%E6%B5%81%E6%B0%B4%E7%BA%BF/"",""color"":""blue""}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": """"}","2022-09-08 15:41:06.669"
+32,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""这是一个改了名字的测试任务"",""url"":""https://test.nddtf.com/job/%E8%BF%99%E6%98%AF%E4%B8%80%E4%B8%AA%E6%94%B9%E4%BA%86%E5%90%8D%E5%AD%97%E7%9A%84%E6%B5%8B%E8%AF%95%E4%BB%BB%E5%8A%A1/"",""color"":""blue"",""upstreamProjects"":[]}","https://test.nddtf.com/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": """"}","2022-09-08 15:41:06.669"
+33,"{""ConnectionId"":1}","{""_class"":""com.cloudbees.hudson.plugins.folder.Folder"",""name"":""dir-test-2"",""url"":""https://test.nddtf.com/job/dir-test/job/dir-test-2/"",""jobs"":[{""_class"":""hudson.model.FreeStyleProject""},{""_class"":""hudson.model.FreeStyleProject""}]}","https://test.nddtf.com/job/dir-test/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/""}","2022-09-08 15:41:07.052"
+34,"{""ConnectionId"":1}","{""_class"":""org.jenkinsci.plugins.workflow.job.WorkflowJob"",""name"":""pipeline-test"",""url"":""https://test.nddtf.com/job/dir-test/job/pipeline-test/"",""color"":""blue""}","https://test.nddtf.com/job/dir-test/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/""}","2022-09-08 15:41:07.052"
+35,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""testfile"",""url"":""https://test.nddtf.com/job/dir-test/job/testfile/"",""color"":""blue"",""upstreamProjects"":[]}","https://test.nddtf.com/job/dir-test/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/""}","2022-09-08 15:41:07.052"
+36,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""free"",""url"":""https://test.nddtf.com/job/dir-test/job/dir-test-2/job/free/"",""color"":""blue"",""upstreamProjects"":[]}","https://test.nddtf.com/job/dir-test/job/dir-test-2/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/job/dir-test-2/""}","2022-09-08 15:41:07.368"
+37,"{""ConnectionId"":1}","{""_class"":""hudson.model.FreeStyleProject"",""name"":""free1"",""url"":""https://test.nddtf.com/job/dir-test/job/dir-test-2/job/free1/"",""color"":""blue"",""upstreamProjects"":[]}","https://test.nddtf.com/job/dir-test/job/dir-test-2/api/json?tree=jobs%5Bname%2Cclass%2Curl%2Ccolor%2Cbase%2Cjobs%2CupstreamProjects%5Bname%5D%5D%7B0%2C100%7D","{""Path"": ""job/dir-test/job/dir-test-2/""}","2022-09-08 15:41:07.368"
diff --git a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_build_repos.csv b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_build_repos.csv
new file mode 100644
index 00000000..0d7c7b3e
--- /dev/null
+++ b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_build_repos.csv
@@ -0,0 +1,9 @@
+connection_id,build_name,commit_sha,branch,repo_url,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+1,devlake #1,ceeffdfdd06bce232f9adb3a656265bad13a8473,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,95,
+1,devlake #2,0f886c74949c3ee7e489188911c7dc0c1d547418,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,94,
+1,devlake #3,0f886c74949c3ee7e489188911c7dc0c1d547418,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,93,
+1,devlake #4,20139afef3c6ec9f3ebffcb06e243b145cbef8c6,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,92,
+1,devlake #5,20139afef3c6ec9f3ebffcb06e243b145cbef8c6,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,91,
+1,devlake #6,20139afef3c6ec9f3ebffcb06e243b145cbef8c6,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,90,
+1,devlake #7,0006e8105d70318aff5eeee38d405fa181a32aa0,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,89,
+1,devlake #8,0006e8105d70318aff5eeee38d405fa181a32aa0,refs/remotes/origin/main,https://github.com/merico-dev/lake.git,"{""ConnectionId"":1}",_raw_jenkins_api_builds,88,
diff --git a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv
index e6133952..5b2dd31a 100644
--- a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_builds.csv
@@ -1,9 +1,38 @@
-connection_id,job_name,number,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,duration,display_name,estimated_duration,result,timestamp,start_time,commit_sha
-1,这是一个改了名字的测试任务,1,"{""ConnectionId"":1}",_raw_jenkins_api_builds,82,,57,,10,SUCCESS,1650017153775,2022-04-15T10:05:53.000+00:00,
-1,这是一个改了名字的测试任务,2,"{""ConnectionId"":1}",_raw_jenkins_api_builds,81,,4,,10,SUCCESS,1650017177939,2022-04-15T10:06:17.000+00:00,
-1,这是一个改了名字的测试任务,3,"{""ConnectionId"":1}",_raw_jenkins_api_builds,80,,3,,10,SUCCESS,1650017186253,2022-04-15T10:06:26.000+00:00,
-1,这是一个改了名字的测试任务,4,"{""ConnectionId"":1}",_raw_jenkins_api_builds,79,,6,,10,SUCCESS,1650022556910,2022-04-15T11:35:56.000+00:00,
-1,这是一个改了名字的测试任务,5,"{""ConnectionId"":1}",_raw_jenkins_api_builds,78,,6,,10,SUCCESS,1650022558491,2022-04-15T11:35:58.000+00:00,
-1,这是一个改了名字的测试任务,6,"{""ConnectionId"":1}",_raw_jenkins_api_builds,77,,10,,10,SUCCESS,1650022560954,2022-04-15T11:36:00.000+00:00,
-1,这是一个改了名字的测试任务,7,"{""ConnectionId"":1}",_raw_jenkins_api_builds,76,,8,,10,SUCCESS,1650023883294,2022-04-15T11:58:03.000+00:00,
-1,这是一个改了名字的测试任务,8,"{""ConnectionId"":1}",_raw_jenkins_api_builds,75,,11,,10,SUCCESS,1650023894336,2022-04-15T11:58:14.000+00:00,
+connection_id,job_name,number,duration,display_name,estimated_duration,result,timestamp,start_time,commit_sha,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+1,devlake,1,14820,devlake #1,1457,SUCCESS,1650017416514,2022-04-15T10:10:16.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,95,
+1,devlake,2,2121,devlake #2,1457,SUCCESS,1650022548450,2022-04-15T11:35:48.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,94,
+1,devlake,3,1587,devlake #3,1457,SUCCESS,1650024049161,2022-04-15T12:00:49.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,93,
+1,devlake,4,13952,devlake #4,1457,SUCCESS,1662647203905,2022-09-08T14:26:43.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,92,
+1,devlake,5,1274,devlake #5,1457,SUCCESS,1662647231332,2022-09-08T14:27:11.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,91,
+1,devlake,6,1202,devlake #6,1457,SUCCESS,1662647242809,2022-09-08T14:27:22.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,90,
+1,devlake,7,1988,devlake #7,1457,SUCCESS,1662651625889,2022-09-08T15:40:25.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,89,
+1,devlake,8,1180,devlake #8,1457,SUCCESS,1662651640536,2022-09-08T15:40:40.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,88,
+1,free,1,70,dir-test » dir-test-2 » free #1,27,SUCCESS,1658385566471,2022-07-21T06:39:26.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,105,
+1,free,2,6,dir-test » dir-test-2 » free #2,27,SUCCESS,1658385576367,2022-07-21T06:39:36.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,104,
+1,free,3,4,dir-test » dir-test-2 » free #3,27,SUCCESS,1662647217041,2022-09-08T14:26:57.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,103,
+1,free1,1,4,dir-test » dir-test-2 » free1 #1,9,SUCCESS,1658386240842,2022-07-21T06:50:40.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,112,
+1,free1,2,11,dir-test » dir-test-2 » free1 #2,9,SUCCESS,1658386250446,2022-07-21T06:50:50.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,111,
+1,free1,3,4,dir-test » dir-test-2 » free1 #3,9,SUCCESS,1658386255052,2022-07-21T06:50:55.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,110,
+1,free1,4,11,dir-test » dir-test-2 » free1 #4,9,SUCCESS,1662647217746,2022-09-08T14:26:57.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,109,
+1,pipeline-test,1,1429,dir-test » pipeline-test #1,745,SUCCESS,1658385602419,2022-07-21T06:40:02.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,97,
+1,pipeline-test,2,61,dir-test » pipeline-test #2,745,SUCCESS,1662647211512,2022-09-08T14:26:51.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,96,
+1,pipeline-test2,1,4564,pipeline-test2 #1,1972,SUCCESS,1662651613681,2022-09-08T15:40:13.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,100,
+1,pipeline-test2,2,551,pipeline-test2 #2,1972,SUCCESS,1662651633991,2022-09-08T15:40:33.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,99,
+1,pipeline-test2,3,802,pipeline-test2 #3,1972,SUCCESS,1662651648992,2022-09-08T15:40:48.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,98,
+1,testfile,1,4,dir-test » testfile #1,8,SUCCESS,1658385600801,2022-07-21T06:40:00.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,102,
+1,testfile,2,11,dir-test » testfile #2,8,SUCCESS,1662647212436,2022-09-08T14:26:52.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,101,
+1,测试流水线,1,1539,测试流水线 #1,568,SUCCESS,1662647205888,2022-09-08T14:26:45.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,108,
+1,测试流水线,2,74,测试流水线 #2,568,SUCCESS,1662647232072,2022-09-08T14:27:12.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,107,
+1,测试流水线,3,90,测试流水线 #3,568,SUCCESS,1662651649571,2022-09-08T15:40:49.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,106,
+1,这是一个改了名字的测试任务,1,57,这是一个改了名字的测试任务 #1,6,SUCCESS,1650017153775,2022-04-15T10:05:53.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,124,
+1,这是一个改了名字的测试任务,2,4,这是一个改了名字的测试任务 #2,6,SUCCESS,1650017177939,2022-04-15T10:06:17.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,123,
+1,这是一个改了名字的测试任务,3,3,这是一个改了名字的测试任务 #3,6,SUCCESS,1650017186253,2022-04-15T10:06:26.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,122,
+1,这是一个改了名字的测试任务,4,6,这是一个改了名字的测试任务 #4,6,SUCCESS,1650022556910,2022-04-15T11:35:56.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,121,
+1,这是一个改了名字的测试任务,5,6,这是一个改了名字的测试任务 #5,6,SUCCESS,1650022558491,2022-04-15T11:35:58.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,120,
+1,这是一个改了名字的测试任务,6,10,这是一个改了名字的测试任务 #6,6,SUCCESS,1650022560954,2022-04-15T11:36:00.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,119,
+1,这是一个改了名字的测试任务,7,8,这是一个改了名字的测试任务 #7,6,SUCCESS,1650023883294,2022-04-15T11:58:03.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,118,
+1,这是一个改了名字的测试任务,8,11,这是一个改了名字的测试任务 #8,6,SUCCESS,1650023894336,2022-04-15T11:58:14.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,117,
+1,这是一个改了名字的测试任务,9,78,这是一个改了名字的测试任务 #9,6,SUCCESS,1662647207972,2022-09-08T14:26:47.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,116,
+1,这是一个改了名字的测试任务,10,12,这是一个改了名字的测试任务 #10,6,SUCCESS,1662647233074,2022-09-08T14:27:13.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,115,
+1,这是一个改了名字的测试任务,11,4,这是一个改了名字的测试任务 #11,6,SUCCESS,1662651656567,2022-09-08T15:40:56.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,114,
+1,这是一个改了名字的测试任务,12,2,这是一个改了名字的测试任务 #12,6,SUCCESS,1662651657893,2022-09-08T15:40:57.000+00:00,,"{""ConnectionId"":1}",_raw_jenkins_api_builds,113,
diff --git a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_jobs.csv b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_jobs.csv
index 4b3db8a0..2b01ef9b 100644
--- a/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_jobs.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/_tool_jenkins_jobs.csv
@@ -1,9 +1,11 @@
 connection_id,name,path,class,color,base,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
-1,devlake,,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,12,
-1,dir-test,,com.cloudbees.hudson.plugins.folder.Folder,,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,13,
-1,dir-test-2,job/dir-test/,com.cloudbees.hudson.plugins.folder.Folder,,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,16,
-1,free,job/dir-test/job/dir-test-2/,hudson.model.FreeStyleProject,notbuilt,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,19,
-1,pipeline-test,job/dir-test/,org.jenkinsci.plugins.workflow.job.WorkflowJob,notbuilt,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,17,
-1,testfile,job/dir-test/,hudson.model.FreeStyleProject,notbuilt,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,18,
-1,测试流水线,,org.jenkinsci.plugins.workflow.job.WorkflowJob,notbuilt,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,14,
-1,这是一个改了名字的测试任务,,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,15,
+1,devlake,,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,28,
+1,dir-test,,com.cloudbees.hudson.plugins.folder.Folder,,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,29,
+1,dir-test-2,job/dir-test/,com.cloudbees.hudson.plugins.folder.Folder,,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,33,
+1,free,job/dir-test/job/dir-test-2/,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,36,
+1,free1,job/dir-test/job/dir-test-2/,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,37,
+1,pipeline-test,job/dir-test/,org.jenkinsci.plugins.workflow.job.WorkflowJob,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,34,
+1,pipeline-test2,,org.jenkinsci.plugins.workflow.job.WorkflowJob,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,30,
+1,testfile,job/dir-test/,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,35,
+1,测试流水线,,org.jenkinsci.plugins.workflow.job.WorkflowJob,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,31,
+1,这是一个改了名字的测试任务,,hudson.model.FreeStyleProject,blue,,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,32,
diff --git a/plugins/jenkins/e2e/snapshot_tables/cicd_pipeline_relationships.csv b/plugins/jenkins/e2e/snapshot_tables/cicd_pipeline_relationships.csv
new file mode 100644
index 00000000..91f497f3
--- /dev/null
+++ b/plugins/jenkins/e2e/snapshot_tables/cicd_pipeline_relationships.csv
@@ -0,0 +1 @@
+parent_pipeline_id,child_pipeline_id
diff --git a/plugins/jenkins/e2e/snapshot_tables/cicd_pipelines.csv b/plugins/jenkins/e2e/snapshot_tables/cicd_pipelines.csv
new file mode 100644
index 00000000..fa0e6af3
--- /dev/null
+++ b/plugins/jenkins/e2e/snapshot_tables/cicd_pipelines.csv
@@ -0,0 +1,38 @@
+id,name,result,status,type,duration_sec,environment,created_date,finished_date
+jenkins:JenkinsPipeline:1:devlake #1,devlake,SUCCESS,DONE,CI/CD,14,,2022-04-15T10:10:16.000+00:00,2022-04-15T10:10:30.000+00:00
+jenkins:JenkinsPipeline:1:devlake #2,devlake,SUCCESS,DONE,CI/CD,2,,2022-04-15T11:35:48.000+00:00,2022-04-15T11:35:50.000+00:00
+jenkins:JenkinsPipeline:1:devlake #3,devlake,SUCCESS,DONE,CI/CD,1,,2022-04-15T12:00:49.000+00:00,2022-04-15T12:00:50.000+00:00
+jenkins:JenkinsPipeline:1:devlake #4,devlake,SUCCESS,DONE,CI/CD,13,,2022-09-08T14:26:43.000+00:00,2022-09-08T14:26:56.000+00:00
+jenkins:JenkinsPipeline:1:devlake #5,devlake,SUCCESS,DONE,CI/CD,1,,2022-09-08T14:27:11.000+00:00,2022-09-08T14:27:12.000+00:00
+jenkins:JenkinsPipeline:1:devlake #6,devlake,SUCCESS,DONE,CI/CD,1,,2022-09-08T14:27:22.000+00:00,2022-09-08T14:27:23.000+00:00
+jenkins:JenkinsPipeline:1:devlake #7,devlake,SUCCESS,DONE,CI/CD,1,,2022-09-08T15:40:25.000+00:00,2022-09-08T15:40:26.000+00:00
+jenkins:JenkinsPipeline:1:devlake #8,devlake,SUCCESS,DONE,CI/CD,1,,2022-09-08T15:40:40.000+00:00,2022-09-08T15:40:41.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free #1,free,SUCCESS,DONE,CI/CD,0,,2022-07-21T06:39:26.000+00:00,2022-07-21T06:39:26.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free #2,free,SUCCESS,DONE,CI/CD,0,,2022-07-21T06:39:36.000+00:00,2022-07-21T06:39:36.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free #3,free,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:26:57.000+00:00,2022-09-08T14:26:57.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #1,free1,SUCCESS,DONE,CI/CD,0,,2022-07-21T06:50:40.000+00:00,2022-07-21T06:50:40.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #2,free1,SUCCESS,DONE,CI/CD,0,,2022-07-21T06:50:50.000+00:00,2022-07-21T06:50:50.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #3,free1,SUCCESS,DONE,CI/CD,0,,2022-07-21T06:50:55.000+00:00,2022-07-21T06:50:55.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #4,free1,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:26:57.000+00:00,2022-09-08T14:26:57.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » pipeline-test #1,pipeline-test,SUCCESS,DONE,CI/CD,1,,2022-07-21T06:40:02.000+00:00,2022-07-21T06:40:03.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » pipeline-test #2,pipeline-test,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:26:51.000+00:00,2022-09-08T14:26:51.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » testfile #1,testfile,SUCCESS,DONE,CI/CD,0,,2022-07-21T06:40:00.000+00:00,2022-07-21T06:40:00.000+00:00
+jenkins:JenkinsPipeline:1:dir-test » testfile #2,testfile,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:26:52.000+00:00,2022-09-08T14:26:52.000+00:00
+jenkins:JenkinsPipeline:1:pipeline-test2 #1,pipeline-test2,SUCCESS,DONE,CI/CD,4,,2022-09-08T15:40:13.000+00:00,2022-09-08T15:40:17.000+00:00
+jenkins:JenkinsPipeline:1:pipeline-test2 #2,pipeline-test2,SUCCESS,DONE,CI/CD,0,,2022-09-08T15:40:33.000+00:00,2022-09-08T15:40:33.000+00:00
+jenkins:JenkinsPipeline:1:pipeline-test2 #3,pipeline-test2,SUCCESS,DONE,CI/CD,0,,2022-09-08T15:40:48.000+00:00,2022-09-08T15:40:48.000+00:00
+jenkins:JenkinsPipeline:1:测试流水线 #1,测试流水线,SUCCESS,DONE,CI/CD,1,,2022-09-08T14:26:45.000+00:00,2022-09-08T14:26:46.000+00:00
+jenkins:JenkinsPipeline:1:测试流水线 #2,测试流水线,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:27:12.000+00:00,2022-09-08T14:27:12.000+00:00
+jenkins:JenkinsPipeline:1:测试流水线 #3,测试流水线,SUCCESS,DONE,CI/CD,0,,2022-09-08T15:40:49.000+00:00,2022-09-08T15:40:49.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #1,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T10:05:53.000+00:00,2022-04-15T10:05:53.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #10,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:27:13.000+00:00,2022-09-08T14:27:13.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #11,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-09-08T15:40:56.000+00:00,2022-09-08T15:40:56.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #12,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-09-08T15:40:57.000+00:00,2022-09-08T15:40:57.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #2,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T10:06:17.000+00:00,2022-04-15T10:06:17.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #3,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T10:06:26.000+00:00,2022-04-15T10:06:26.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #4,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T11:35:56.000+00:00,2022-04-15T11:35:56.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #5,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T11:35:58.000+00:00,2022-04-15T11:35:58.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #6,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T11:36:00.000+00:00,2022-04-15T11:36:00.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #7,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T11:58:03.000+00:00,2022-04-15T11:58:03.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #8,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-04-15T11:58:14.000+00:00,2022-04-15T11:58:14.000+00:00
+jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #9,这是一个改了名字的测试任务,SUCCESS,DONE,CI/CD,0,,2022-09-08T14:26:47.000+00:00,2022-09-08T14:26:47.000+00:00
diff --git a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
new file mode 100644
index 00000000..a9353102
--- /dev/null
+++ b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
@@ -0,0 +1,38 @@
+id,name,pipeline_id,result,status,type,environment,duration_sec,started_date,finished_date
+jenkins:JenkinsTask:1:devlake #1,devlake,jenkins:JenkinsPipeline:1:devlake #1,SUCCESS,DONE,CI/CD,,14,2022-04-15T10:10:16.000+00:00,2022-04-15T10:10:30.000+00:00
+jenkins:JenkinsTask:1:devlake #2,devlake,jenkins:JenkinsPipeline:1:devlake #2,SUCCESS,DONE,CI/CD,,2,2022-04-15T11:35:48.000+00:00,2022-04-15T11:35:50.000+00:00
+jenkins:JenkinsTask:1:devlake #3,devlake,jenkins:JenkinsPipeline:1:devlake #3,SUCCESS,DONE,CI/CD,,1,2022-04-15T12:00:49.000+00:00,2022-04-15T12:00:50.000+00:00
+jenkins:JenkinsTask:1:devlake #4,devlake,jenkins:JenkinsPipeline:1:devlake #4,SUCCESS,DONE,CI/CD,,13,2022-09-08T14:26:43.000+00:00,2022-09-08T14:26:56.000+00:00
+jenkins:JenkinsTask:1:devlake #5,devlake,jenkins:JenkinsPipeline:1:devlake #5,SUCCESS,DONE,CI/CD,,1,2022-09-08T14:27:11.000+00:00,2022-09-08T14:27:12.000+00:00
+jenkins:JenkinsTask:1:devlake #6,devlake,jenkins:JenkinsPipeline:1:devlake #6,SUCCESS,DONE,CI/CD,,1,2022-09-08T14:27:22.000+00:00,2022-09-08T14:27:23.000+00:00
+jenkins:JenkinsTask:1:devlake #7,devlake,jenkins:JenkinsPipeline:1:devlake #7,SUCCESS,DONE,CI/CD,,1,2022-09-08T15:40:25.000+00:00,2022-09-08T15:40:26.000+00:00
+jenkins:JenkinsTask:1:devlake #8,devlake,jenkins:JenkinsPipeline:1:devlake #8,SUCCESS,DONE,CI/CD,,1,2022-09-08T15:40:40.000+00:00,2022-09-08T15:40:41.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free #1,free,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free #1,SUCCESS,DONE,CI/CD,,0,2022-07-21T06:39:26.000+00:00,2022-07-21T06:39:26.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free #2,free,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free #2,SUCCESS,DONE,CI/CD,,0,2022-07-21T06:39:36.000+00:00,2022-07-21T06:39:36.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free #3,free,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free #3,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:26:57.000+00:00,2022-09-08T14:26:57.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free1 #1,free1,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #1,SUCCESS,DONE,CI/CD,,0,2022-07-21T06:50:40.000+00:00,2022-07-21T06:50:40.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free1 #2,free1,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #2,SUCCESS,DONE,CI/CD,,0,2022-07-21T06:50:50.000+00:00,2022-07-21T06:50:50.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free1 #3,free1,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #3,SUCCESS,DONE,CI/CD,,0,2022-07-21T06:50:55.000+00:00,2022-07-21T06:50:55.000+00:00
+jenkins:JenkinsTask:1:dir-test » dir-test-2 » free1 #4,free1,jenkins:JenkinsPipeline:1:dir-test » dir-test-2 » free1 #4,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:26:57.000+00:00,2022-09-08T14:26:57.000+00:00
+jenkins:JenkinsTask:1:dir-test » pipeline-test #1,pipeline-test,jenkins:JenkinsPipeline:1:dir-test » pipeline-test #1,SUCCESS,DONE,CI/CD,,1,2022-07-21T06:40:02.000+00:00,2022-07-21T06:40:03.000+00:00
+jenkins:JenkinsTask:1:dir-test » pipeline-test #2,pipeline-test,jenkins:JenkinsPipeline:1:dir-test » pipeline-test #2,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:26:51.000+00:00,2022-09-08T14:26:51.000+00:00
+jenkins:JenkinsTask:1:dir-test » testfile #1,testfile,jenkins:JenkinsPipeline:1:dir-test » testfile #1,SUCCESS,DONE,CI/CD,,0,2022-07-21T06:40:00.000+00:00,2022-07-21T06:40:00.000+00:00
+jenkins:JenkinsTask:1:dir-test » testfile #2,testfile,jenkins:JenkinsPipeline:1:dir-test » testfile #2,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:26:52.000+00:00,2022-09-08T14:26:52.000+00:00
+jenkins:JenkinsTask:1:pipeline-test2 #1,pipeline-test2,jenkins:JenkinsPipeline:1:pipeline-test2 #1,SUCCESS,DONE,CI/CD,,4,2022-09-08T15:40:13.000+00:00,2022-09-08T15:40:17.000+00:00
+jenkins:JenkinsTask:1:pipeline-test2 #2,pipeline-test2,jenkins:JenkinsPipeline:1:pipeline-test2 #2,SUCCESS,DONE,CI/CD,,0,2022-09-08T15:40:33.000+00:00,2022-09-08T15:40:33.000+00:00
+jenkins:JenkinsTask:1:pipeline-test2 #3,pipeline-test2,jenkins:JenkinsPipeline:1:pipeline-test2 #3,SUCCESS,DONE,CI/CD,,0,2022-09-08T15:40:48.000+00:00,2022-09-08T15:40:48.000+00:00
+jenkins:JenkinsTask:1:测试流水线 #1,测试流水线,jenkins:JenkinsPipeline:1:测试流水线 #1,SUCCESS,DONE,CI/CD,,1,2022-09-08T14:26:45.000+00:00,2022-09-08T14:26:46.000+00:00
+jenkins:JenkinsTask:1:测试流水线 #2,测试流水线,jenkins:JenkinsPipeline:1:测试流水线 #2,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:27:12.000+00:00,2022-09-08T14:27:12.000+00:00
+jenkins:JenkinsTask:1:测试流水线 #3,测试流水线,jenkins:JenkinsPipeline:1:测试流水线 #3,SUCCESS,DONE,CI/CD,,0,2022-09-08T15:40:49.000+00:00,2022-09-08T15:40:49.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #1,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #1,SUCCESS,DONE,CI/CD,,0,2022-04-15T10:05:53.000+00:00,2022-04-15T10:05:53.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #10,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #10,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:27:13.000+00:00,2022-09-08T14:27:13.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #11,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #11,SUCCESS,DONE,CI/CD,,0,2022-09-08T15:40:56.000+00:00,2022-09-08T15:40:56.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #12,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #12,SUCCESS,DONE,CI/CD,,0,2022-09-08T15:40:57.000+00:00,2022-09-08T15:40:57.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #2,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #2,SUCCESS,DONE,CI/CD,,0,2022-04-15T10:06:17.000+00:00,2022-04-15T10:06:17.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #3,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #3,SUCCESS,DONE,CI/CD,,0,2022-04-15T10:06:26.000+00:00,2022-04-15T10:06:26.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #4,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #4,SUCCESS,DONE,CI/CD,,0,2022-04-15T11:35:56.000+00:00,2022-04-15T11:35:56.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #5,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #5,SUCCESS,DONE,CI/CD,,0,2022-04-15T11:35:58.000+00:00,2022-04-15T11:35:58.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #6,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #6,SUCCESS,DONE,CI/CD,,0,2022-04-15T11:36:00.000+00:00,2022-04-15T11:36:00.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #7,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #7,SUCCESS,DONE,CI/CD,,0,2022-04-15T11:58:03.000+00:00,2022-04-15T11:58:03.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #8,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #8,SUCCESS,DONE,CI/CD,,0,2022-04-15T11:58:14.000+00:00,2022-04-15T11:58:14.000+00:00
+jenkins:JenkinsTask:1:这是一个改了名字的测试任务 #9,这是一个改了名字的测试任务,jenkins:JenkinsPipeline:1:这是一个改了名字的测试任务 #9,SUCCESS,DONE,CI/CD,,0,2022-09-08T14:26:47.000+00:00,2022-09-08T14:26:47.000+00:00
diff --git a/plugins/jenkins/e2e/snapshot_tables/jobs.csv b/plugins/jenkins/e2e/snapshot_tables/jobs.csv
index 2d511d14..a9414d62 100644
--- a/plugins/jenkins/e2e/snapshot_tables/jobs.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/jobs.csv
@@ -1,9 +1,11 @@
 id,name,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark,type
-jenkins:JenkinsJob:1:devlake,devlake,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,12,,hudson.model.FreeStyleProject
-jenkins:JenkinsJob:1:dir-test,dir-test,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,13,,com.cloudbees.hudson.plugins.folder.Folder
-jenkins:JenkinsJob:1:dir-test-2,dir-test-2,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,16,,com.cloudbees.hudson.plugins.folder.Folder
-jenkins:JenkinsJob:1:free,free,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,19,,hudson.model.FreeStyleProject
-jenkins:JenkinsJob:1:pipeline-test,pipeline-test,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,17,,org.jenkinsci.plugins.workflow.job.WorkflowJob
-jenkins:JenkinsJob:1:testfile,testfile,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,18,,hudson.model.FreeStyleProject
-jenkins:JenkinsJob:1:测试流水线,测试流水线,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,14,,org.jenkinsci.plugins.workflow.job.WorkflowJob
-jenkins:JenkinsJob:1:这是一个改了名字的测试任务,这是一个改了名字的测试任务,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,15,,hudson.model.FreeStyleProject
+jenkins:JenkinsJob:1:devlake,devlake,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,28,,hudson.model.FreeStyleProject
+jenkins:JenkinsJob:1:dir-test,dir-test,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,29,,com.cloudbees.hudson.plugins.folder.Folder
+jenkins:JenkinsJob:1:dir-test-2,dir-test-2,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,33,,com.cloudbees.hudson.plugins.folder.Folder
+jenkins:JenkinsJob:1:free,free,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,36,,hudson.model.FreeStyleProject
+jenkins:JenkinsJob:1:free1,free1,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,37,,hudson.model.FreeStyleProject
+jenkins:JenkinsJob:1:pipeline-test,pipeline-test,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,34,,org.jenkinsci.plugins.workflow.job.WorkflowJob
+jenkins:JenkinsJob:1:pipeline-test2,pipeline-test2,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,30,,org.jenkinsci.plugins.workflow.job.WorkflowJob
+jenkins:JenkinsJob:1:testfile,testfile,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,35,,hudson.model.FreeStyleProject
+jenkins:JenkinsJob:1:测试流水线,测试流水线,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,31,,org.jenkinsci.plugins.workflow.job.WorkflowJob
+jenkins:JenkinsJob:1:这是一个改了名字的测试任务,这是一个改了名字的测试任务,"{""ConnectionId"":1}",_raw_jenkins_api_jobs,32,,hudson.model.FreeStyleProject