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

zhangliang2022 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 f069821b Feat move enrich env to plugin (#3850)
f069821b is described below

commit f069821b3191f38baebf15a9bb54ddd8734a4e8b
Author: Warren Chen <[email protected]>
AuthorDate: Mon Dec 5 13:35:44 2022 +0800

    Feat move enrich env to plugin (#3850)
    
    * feat(plugins): move enrich env to plugins
    
    * feat(jenkins): modify cicd job convertor
    
    * docs(plugins): add comments
    
    * test(plugins): add unit test for RegexEnricher
---
 plugins/dora/tasks/cicd_task_env_enricher.go       |  2 +-
 plugins/github/e2e/cicd_test.go                    | 11 ++--
 .../github/e2e/raw_tables/_raw_github_api_jobs.csv | 24 ++++----
 .../e2e/snapshot_tables/_tool_github_jobs.csv      | 24 ++++----
 plugins/github/e2e/snapshot_tables/cicd_tasks.csv  | 24 ++++----
 ...go => 20221202_add_trasformation_rule_table.go} |  2 +-
 .../archived/transformation_rules.go               |  3 +-
 plugins/github/models/transformation_rule.go       |  1 +
 plugins/github/tasks/cicd_job_convertor.go         | 22 +++-----
 plugins/helper/enrich_with_regex.go                | 66 ++++++++++++++++++++++
 .../enrich_with_regex_test.go}                     | 26 ++++++---
 plugins/jenkins/e2e/builds_test.go                 | 13 +++--
 plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv | 50 ++++++++--------
 .../snapshot_tables/cicd_tasks_after_stages.csv    |  6 +-
 plugins/jenkins/e2e/stages_test.go                 | 13 +++--
 ...go => 20221205_add_trasformation_rule_table.go} |  8 +--
 .../archived/transformation_rules.go               |  1 +
 plugins/jenkins/models/transformation_rule.go      |  1 +
 plugins/jenkins/tasks/build_cicd_convertor.go      | 22 +++-----
 plugins/jenkins/tasks/stage_convertor.go           | 20 +++----
 20 files changed, 204 insertions(+), 135 deletions(-)

diff --git a/plugins/dora/tasks/cicd_task_env_enricher.go 
b/plugins/dora/tasks/cicd_task_env_enricher.go
index cc2de66e..1fcd5add 100644
--- a/plugins/dora/tasks/cicd_task_env_enricher.go
+++ b/plugins/dora/tasks/cicd_task_env_enricher.go
@@ -31,7 +31,7 @@ import (
 var EnrichTaskEnvMeta = core.SubTaskMeta{
        Name:             "EnrichTaskEnv",
        EntryPoint:       EnrichTasksEnv,
-       EnabledByDefault: true,
+       EnabledByDefault: false,
        Description:      "calculate deployment frequency",
        DomainTypes:      []string{core.DOMAIN_TYPE_CICD},
 }
diff --git a/plugins/github/e2e/cicd_test.go b/plugins/github/e2e/cicd_test.go
index 1fe9db53..e1bb4a21 100644
--- a/plugins/github/e2e/cicd_test.go
+++ b/plugins/github/e2e/cicd_test.go
@@ -34,10 +34,13 @@ func TestGithubCICDDataFlow(t *testing.T) {
 
        taskData := &tasks.GithubTaskData{
                Options: &tasks.GithubOptions{
-                       ConnectionId:             1,
-                       Owner:                    "panjf2000",
-                       Repo:                     "ants",
-                       GithubTransformationRule: 
new(models.GithubTransformationRule),
+                       ConnectionId: 1,
+                       Owner:        "panjf2000",
+                       Repo:         "ants",
+                       GithubTransformationRule: 
&models.GithubTransformationRule{
+                               DeploymentPattern: `deploy.*`,
+                               ProductionPattern: `deploywindows.*`,
+                       },
                },
                Repo: &models.GithubRepo{
                        GithubId: 134018330,
diff --git a/plugins/github/e2e/raw_tables/_raw_github_api_jobs.csv 
b/plugins/github/e2e/raw_tables/_raw_github_api_jobs.csv
index 2947afed..881198ca 100644
--- a/plugins/github/e2e/raw_tables/_raw_github_api_jobs.csv
+++ b/plugins/github/e2e/raw_tables/_raw_github_api_jobs.csv
@@ -1,20 +1,20 @@
 id,params,data,url,input,created_at
-1,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918171,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MTcx"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918171"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918171?check_suite_focus=true"",""status"";
 [...]
-2,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918191,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MTkx"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918191"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918191?check_suite_focus=true"",""status"";
 [...]
-3,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918205,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjA1"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918205"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918205?check_suite_focus=true"",""status"";
 [...]
-4,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918228,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjI4"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918228"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918228?check_suite_focus=true"",""status"";
 [...]
-5,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918243,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjQz"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918243"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918243?check_suite_focus=true"",""status"";
 [...]
-6,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918261,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjYx"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918261"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918261?check_suite_focus=true"",""status"";
 [...]
+1,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918171,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MTcx"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918171"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918171?check_suite_focus=true"",""status"";
 [...]
+2,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918191,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MTkx"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918191"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918191?check_suite_focus=true"",""status"";
 [...]
+3,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918205,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjA1"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918205"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918205?check_suite_focus=true"",""status"";
 [...]
+4,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918228,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjI4"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918228"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918228?check_suite_focus=true"",""status"";
 [...]
+5,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918243,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjQz"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918243"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918243?check_suite_focus=true"",""status"";
 [...]
+6,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918261,""run_id"":577324554,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324554"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MjYx"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918261"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918261?check_suite_focus=true"",""status"";
 [...]
 
7,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":2139659897,""run_id"":664533609,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/664533609"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4yMTM5NjU5ODk3"",""head_sha"":""e45d13c6303d4ec82d16cd4111a49a7de0ad0712"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/2139659897"",""html_url"":""https://github.com/panjf2000/ants/runs/2139659897?check_suite_focus=true"",""status"";
 [...]
 
8,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918168,""run_id"":577324558,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324558"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MTY4"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918168"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918168?check_suite_focus=true"",""status"";
 [...]
 
9,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924918319,""run_id"":577324571,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577324571"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTE4MzE5"",""head_sha"":""cb4adab28f63313592a9a395656b8413184ea336"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918319"",""html_url"":""https://github.com/panjf2000/ants/runs/1924918319?check_suite_focus=true"",""status"";
 [...]
 
10,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932184,""run_id"":577330055,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330055"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMTg0"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932184"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932184?check_suite_focus=true"",""status";
 [...]
-11,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932219,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjE5"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932219"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932219?check_suite_focus=true"",""status";
 [...]
-12,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932237,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjM3"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932237"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932237?check_suite_focus=true"",""status";
 [...]
-13,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932251,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjUx"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932251"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932251?check_suite_focus=true"",""status";
 [...]
-14,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932266,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjY2"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932266"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932266?check_suite_focus=true"",""status";
 [...]
-15,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932293,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjkz"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932293"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932293?check_suite_focus=true"",""status";
 [...]
-16,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932319,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMzE5"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932319"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932319?check_suite_focus=true"",""status";
 [...]
+11,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932219,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjE5"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932219"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932219?check_suite_focus=true"",""status";
 [...]
+12,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932237,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjM3"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932237"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932237?check_suite_focus=true"",""status";
 [...]
+13,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932251,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjUx"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932251"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932251?check_suite_focus=true"",""status";
 [...]
+14,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932266,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjY2"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932266"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932266?check_suite_focus=true"",""status";
 [...]
+15,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932293,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjkz"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932293"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932293?check_suite_focus=true"",""status";
 [...]
+16,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932319,""run_id"":577330056,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330056"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMzE5"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932319"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932319?check_suite_focus=true"",""status";
 [...]
 
17,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1924932263,""run_id"":577330057,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/577330057"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTI0OTMyMjYz"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932263"",""html_url"":""https://github.com/panjf2000/ants/runs/1924932263?check_suite_focus=true"",""status";
 [...]
 
18,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1940449839,""run_id"":583528173,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/583528173"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTQwNDQ5ODM5"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1940449839"",""html_url"":""https://github.com/panjf2000/ants/runs/1940449839?check_suite_focus=true"",""status";
 [...]
 
19,"{""ConnectionId"":1,""Owner"":""panjf2000"",""Repo"":""ants""}","{""id"":1992620044,""run_id"":604839350,""run_url"":""https://api.github.com/repos/panjf2000/ants/actions/runs/604839350"",""run_attempt"":1,""node_id"":""MDg6Q2hlY2tSdW4xOTkyNjIwMDQ0"",""head_sha"":""fd8d670fd09489e6ea7693c0a382ba85d2694f16"",""url"":""https://api.github.com/repos/panjf2000/ants/actions/jobs/1992620044"",""html_url"":""https://github.com/panjf2000/ants/runs/1992620044?check_suite_focus=true"",""status";
 [...]
diff --git a/plugins/github/e2e/snapshot_tables/_tool_github_jobs.csv 
b/plugins/github/e2e/snapshot_tables/_tool_github_jobs.csv
index c8acde5d..d5edfd11 100644
--- a/plugins/github/e2e/snapshot_tables/_tool_github_jobs.csv
+++ b/plugins/github/e2e/snapshot_tables/_tool_github_jobs.csv
@@ -1,20 +1,20 @@
 
connection_id,repo_id,id,run_id,run_url,node_id,head_sha,url,html_url,status,conclusion,started_at,completed_at,name,steps,check_run_url,labels,runner_id,runner_name,runner_group_id,type
 
1,134018330,1924918168,577324558,https://api.github.com/repos/panjf2000/ants/actions/runs/577324558,MDg6Q2hlY2tSdW4xOTI0OTE4MTY4,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918168,https://github.com/panjf2000/ants/runs/1924918168?check_suite_focus=true,completed,success,2021-02-18T06:59:13.000+00:00,2021-02-18T06:59:33.000+00:00,Golangci-Lint,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": "" 
[...]
-1,134018330,1924918171,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MTcx,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918171,https://github.com/panjf2000/ants/runs/1924918171?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,"Go-Test
 (1.14.x, ubuntu-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed [...]
-1,134018330,1924918191,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MTkx,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918191,https://github.com/panjf2000/ants/runs/1924918191?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:21.000+00:00,2021-02-18T07:01:18.000+00:00,"Go-Test
 (1.14.x, macos-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed" [...]
-1,134018330,1924918205,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjA1,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918205,https://github.com/panjf2000/ants/runs/1924918205?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,"Go-Test
 (1.14.x, windows-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""complete [...]
-1,134018330,1924918228,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjI4,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918228,https://github.com/panjf2000/ants/runs/1924918228?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,"Go-Test
 (1.15.x, ubuntu-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed [...]
-1,134018330,1924918243,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjQz,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918243,https://github.com/panjf2000/ants/runs/1924918243?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:19.000+00:00,2021-02-18T07:01:18.000+00:00,"Go-Test
 (1.15.x, macos-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed" [...]
-1,134018330,1924918261,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjYx,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918261,https://github.com/panjf2000/ants/runs/1924918261?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,"Go-Test
 (1.15.x, windows-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""complete [...]
+1,134018330,1924918171,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MTcx,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918171,https://github.com/panjf2000/ants/runs/1924918171?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,deployubuntu,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": " 
[...]
+1,134018330,1924918191,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MTkx,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918191,https://github.com/panjf2000/ants/runs/1924918191?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:21.000+00:00,2021-02-18T07:01:18.000+00:00,deploymacos,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": "" 
[...]
+1,134018330,1924918205,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjA1,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918205,https://github.com/panjf2000/ants/runs/1924918205?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,deploywindows,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"":  
[...]
+1,134018330,1924918228,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjI4,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918228,https://github.com/panjf2000/ants/runs/1924918228?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,deployubuntu,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": " 
[...]
+1,134018330,1924918243,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjQz,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918243,https://github.com/panjf2000/ants/runs/1924918243?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:19.000+00:00,2021-02-18T07:01:18.000+00:00,deploymacos,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": "" 
[...]
+1,134018330,1924918261,577324554,https://api.github.com/repos/panjf2000/ants/actions/runs/577324554,MDg6Q2hlY2tSdW4xOTI0OTE4MjYx,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918261,https://github.com/panjf2000/ants/runs/1924918261?check_suite_focus=true,completed,cancelled,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,deploywindows,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"":  
[...]
 
1,134018330,1924918319,577324571,https://api.github.com/repos/panjf2000/ants/actions/runs/577324571,MDg6Q2hlY2tSdW4xOTI0OTE4MzE5,cb4adab28f63313592a9a395656b8413184ea336,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924918319,https://github.com/panjf2000/ants/runs/1924918319?check_suite_focus=true,completed,success,2021-02-18T06:59:16.000+00:00,2021-02-18T07:00:17.000+00:00,Analyze,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": 
""succes [...]
 
1,134018330,1924932184,577330055,https://api.github.com/repos/panjf2000/ants/actions/runs/577330055,MDg6Q2hlY2tSdW4xOTI0OTMyMTg0,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932184,https://github.com/panjf2000/ants/runs/1924932184?check_suite_focus=true,completed,success,2021-02-18T07:02:02.000+00:00,2021-02-18T07:02:56.000+00:00,Analyze,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": 
""succes [...]
-1,134018330,1924932219,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjE5,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932219,https://github.com/panjf2000/ants/runs/1924932219?check_suite_focus=true,completed,success,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:03.000+00:00,"Go-Test
 (1.14.x, ubuntu-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed"" [...]
-1,134018330,1924932237,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjM3,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932237,https://github.com/panjf2000/ants/runs/1924932237?check_suite_focus=true,in_progress,,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,"Go-Test
 (1.14.x, macos-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed"", ""co [...]
-1,134018330,1924932251,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjUx,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932251,https://github.com/panjf2000/ants/runs/1924932251?check_suite_focus=true,in_progress,,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:57.000+00:00,"Go-Test
 (1.14.x, windows-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed"", "" [...]
+1,134018330,1924932219,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjE5,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932219,https://github.com/panjf2000/ants/runs/1924932219?check_suite_focus=true,completed,success,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:03.000+00:00,deployubuntu,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": ""s 
[...]
+1,134018330,1924932237,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjM3,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932237,https://github.com/panjf2000/ants/runs/1924932237?check_suite_focus=true,in_progress,,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,deploymacos,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": 
""success [...]
+1,134018330,1924932251,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjUx,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932251,https://github.com/panjf2000/ants/runs/1924932251?check_suite_focus=true,in_progress,,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:57.000+00:00,deploywindows,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": 
""succe [...]
 
1,134018330,1924932263,577330057,https://api.github.com/repos/panjf2000/ants/actions/runs/577330057,MDg6Q2hlY2tSdW4xOTI0OTMyMjYz,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932263,https://github.com/panjf2000/ants/runs/1924932263?check_suite_focus=true,completed,failure,2021-02-18T07:02:05.000+00:00,2021-02-18T07:02:19.000+00:00,Golangci-Lint,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": "" 
[...]
-1,134018330,1924932266,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjY2,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932266,https://github.com/panjf2000/ants/runs/1924932266?check_suite_focus=true,completed,success,2021-02-18T07:02:03.000+00:00,2021-02-18T07:04:44.000+00:00,"Go-Test
 (1.15.x, ubuntu-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed"" [...]
-1,134018330,1924932293,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjkz,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932293,https://github.com/panjf2000/ants/runs/1924932293?check_suite_focus=true,completed,success,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,"Go-Test
 (1.15.x, macos-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed"", [...]
-1,134018330,1924932319,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMzE5,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932319,https://github.com/panjf2000/ants/runs/1924932319?check_suite_focus=true,completed,success,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:53.000+00:00,"Go-Test
 (1.15.x, windows-latest)","[{""name"": ""Set up job"", ""number"": 1, 
""status"": ""completed" [...]
+1,134018330,1924932266,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjY2,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932266,https://github.com/panjf2000/ants/runs/1924932266?check_suite_focus=true,completed,success,2021-02-18T07:02:03.000+00:00,2021-02-18T07:04:44.000+00:00,deployubuntu,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": ""s 
[...]
+1,134018330,1924932293,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMjkz,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932293,https://github.com/panjf2000/ants/runs/1924932293?check_suite_focus=true,completed,success,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,deploymacos,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": ""su 
[...]
+1,134018330,1924932319,577330056,https://api.github.com/repos/panjf2000/ants/actions/runs/577330056,MDg6Q2hlY2tSdW4xOTI0OTMyMzE5,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1924932319,https://github.com/panjf2000/ants/runs/1924932319?check_suite_focus=true,completed,success,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:53.000+00:00,deploywindows,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": "" 
[...]
 
1,134018330,1940449839,583528173,https://api.github.com/repos/panjf2000/ants/actions/runs/583528173,MDg6Q2hlY2tSdW4xOTQwNDQ5ODM5,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1940449839,https://github.com/panjf2000/ants/runs/1940449839?check_suite_focus=true,completed,success,2021-02-20T05:10:17.000+00:00,2021-02-20T05:11:12.000+00:00,Analyze,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": 
""succes [...]
 
1,134018330,1992620044,604839350,https://api.github.com/repos/panjf2000/ants/actions/runs/604839350,MDg6Q2hlY2tSdW4xOTkyNjIwMDQ0,fd8d670fd09489e6ea7693c0a382ba85d2694f16,https://api.github.com/repos/panjf2000/ants/actions/jobs/1992620044,https://github.com/panjf2000/ants/runs/1992620044?check_suite_focus=true,completed,failure,2021-02-27T05:10:19.000+00:00,2021-02-27T05:11:20.000+00:00,Analyze,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": 
""succes [...]
 
1,134018330,2011825638,613518923,https://api.github.com/repos/panjf2000/ants/actions/runs/613518923,MDg6Q2hlY2tSdW4yMDExODI1NjM4,5431f73492ade2e5b947a98f6032595c32cf730e,https://api.github.com/repos/panjf2000/ants/actions/jobs/2011825638,https://github.com/panjf2000/ants/runs/2011825638?check_suite_focus=true,completed,success,2021-03-02T09:24:49.000+00:00,2021-03-02T09:25:11.000+00:00,Golangci-Lint,"[{""name"":
 ""Set up job"", ""number"": 1, ""status"": ""completed"", ""conclusion"": "" 
[...]
diff --git a/plugins/github/e2e/snapshot_tables/cicd_tasks.csv 
b/plugins/github/e2e/snapshot_tables/cicd_tasks.csv
index 2e9c382a..3727283e 100644
--- a/plugins/github/e2e/snapshot_tables/cicd_tasks.csv
+++ b/plugins/github/e2e/snapshot_tables/cicd_tasks.csv
@@ -1,19 +1,19 @@
 
id,name,pipeline_id,result,status,type,environment,duration_sec,started_date,finished_date,cicd_scope_id
-github:GithubJob:1:577324554:1924918171,"Go-Test (1.14.x, 
ubuntu-latest)",github:GithubRun:1:134018330:577324554,,DONE,,,125,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577324554:1924918191,"Go-Test (1.14.x, 
macos-latest)",github:GithubRun:1:134018330:577324554,,DONE,,,117,2021-02-18T06:59:21.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577324554:1924918205,"Go-Test (1.14.x, 
windows-latest)",github:GithubRun:1:134018330:577324554,,DONE,,,114,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577324554:1924918228,"Go-Test (1.15.x, 
ubuntu-latest)",github:GithubRun:1:134018330:577324554,,DONE,,,125,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577324554:1924918243,"Go-Test (1.15.x, 
macos-latest)",github:GithubRun:1:134018330:577324554,,DONE,,,119,2021-02-18T06:59:19.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577324554:1924918261,"Go-Test (1.15.x, 
windows-latest)",github:GithubRun:1:134018330:577324554,,DONE,,,114,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577324554:1924918171,deployubuntu,github:GithubRun:1:134018330:577324554,,DONE,DEPLOYMENT,,125,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577324554:1924918191,deploymacos,github:GithubRun:1:134018330:577324554,,DONE,DEPLOYMENT,,117,2021-02-18T06:59:21.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577324554:1924918205,deploywindows,github:GithubRun:1:134018330:577324554,,DONE,DEPLOYMENT,PRODUCTION,114,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577324554:1924918228,deployubuntu,github:GithubRun:1:134018330:577324554,,DONE,DEPLOYMENT,,125,2021-02-18T06:59:13.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577324554:1924918243,deploymacos,github:GithubRun:1:134018330:577324554,,DONE,DEPLOYMENT,,119,2021-02-18T06:59:19.000+00:00,2021-02-18T07:01:18.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577324554:1924918261,deploywindows,github:GithubRun:1:134018330:577324554,,DONE,DEPLOYMENT,PRODUCTION,114,2021-02-18T06:59:15.000+00:00,2021-02-18T07:01:09.000+00:00,github:GithubRepo:1:134018330
 
github:GithubJob:1:577324558:1924918168,Golangci-Lint,github:GithubRun:1:134018330:577324558,SUCCESS,DONE,,,20,2021-02-18T06:59:13.000+00:00,2021-02-18T06:59:33.000+00:00,github:GithubRepo:1:134018330
 
github:GithubJob:1:577324571:1924918319,Analyze,github:GithubRun:1:134018330:577324571,SUCCESS,DONE,,,61,2021-02-18T06:59:16.000+00:00,2021-02-18T07:00:17.000+00:00,github:GithubRepo:1:134018330
 
github:GithubJob:1:577330055:1924932184,Analyze,github:GithubRun:1:134018330:577330055,SUCCESS,DONE,,,54,2021-02-18T07:02:02.000+00:00,2021-02-18T07:02:56.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577330056:1924932219,"Go-Test (1.14.x, 
ubuntu-latest)",github:GithubRun:1:134018330:577330056,SUCCESS,DONE,,,180,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:03.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577330056:1924932237,"Go-Test (1.14.x, 
macos-latest)",github:GithubRun:1:134018330:577330056,,IN_PROGRESS,,,0,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577330056:1924932251,"Go-Test (1.14.x, 
windows-latest)",github:GithubRun:1:134018330:577330056,,IN_PROGRESS,,,0,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:57.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577330056:1924932266,"Go-Test (1.15.x, 
ubuntu-latest)",github:GithubRun:1:134018330:577330056,SUCCESS,DONE,,,161,2021-02-18T07:02:03.000+00:00,2021-02-18T07:04:44.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577330056:1924932293,"Go-Test (1.15.x, 
macos-latest)",github:GithubRun:1:134018330:577330056,SUCCESS,DONE,,,158,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,github:GithubRepo:1:134018330
-github:GithubJob:1:577330056:1924932319,"Go-Test (1.15.x, 
windows-latest)",github:GithubRun:1:134018330:577330056,SUCCESS,DONE,,,230,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:53.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577330056:1924932219,deployubuntu,github:GithubRun:1:134018330:577330056,SUCCESS,DONE,DEPLOYMENT,,180,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:03.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577330056:1924932237,deploymacos,github:GithubRun:1:134018330:577330056,,IN_PROGRESS,DEPLOYMENT,,0,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577330056:1924932251,deploywindows,github:GithubRun:1:134018330:577330056,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:57.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577330056:1924932266,deployubuntu,github:GithubRun:1:134018330:577330056,SUCCESS,DONE,DEPLOYMENT,,161,2021-02-18T07:02:03.000+00:00,2021-02-18T07:04:44.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577330056:1924932293,deploymacos,github:GithubRun:1:134018330:577330056,SUCCESS,DONE,DEPLOYMENT,,158,2021-02-18T07:02:06.000+00:00,2021-02-18T07:04:44.000+00:00,github:GithubRepo:1:134018330
+github:GithubJob:1:577330056:1924932319,deploywindows,github:GithubRun:1:134018330:577330056,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,230,2021-02-18T07:02:03.000+00:00,2021-02-18T07:05:53.000+00:00,github:GithubRepo:1:134018330
 
github:GithubJob:1:577330057:1924932263,Golangci-Lint,github:GithubRun:1:134018330:577330057,FAILURE,DONE,,,14,2021-02-18T07:02:05.000+00:00,2021-02-18T07:02:19.000+00:00,github:GithubRepo:1:134018330
 
github:GithubJob:1:583528173:1940449839,Analyze,github:GithubRun:1:134018330:583528173,SUCCESS,DONE,,,55,2021-02-20T05:10:17.000+00:00,2021-02-20T05:11:12.000+00:00,github:GithubRepo:1:134018330
 
github:GithubJob:1:604839350:1992620044,Analyze,github:GithubRun:1:134018330:604839350,FAILURE,DONE,,,61,2021-02-27T05:10:19.000+00:00,2021-02-27T05:11:20.000+00:00,github:GithubRepo:1:134018330
diff --git 
a/plugins/github/models/migrationscripts/20221124_add_trasformation_rule_table.go
 
b/plugins/github/models/migrationscripts/20221202_add_trasformation_rule_table.go
similarity index 98%
rename from 
plugins/github/models/migrationscripts/20221124_add_trasformation_rule_table.go
rename to 
plugins/github/models/migrationscripts/20221202_add_trasformation_rule_table.go
index 6467ad99..f0bf4c20 100644
--- 
a/plugins/github/models/migrationscripts/20221124_add_trasformation_rule_table.go
+++ 
b/plugins/github/models/migrationscripts/20221202_add_trasformation_rule_table.go
@@ -39,7 +39,7 @@ func (*addTransformationRule20221124) Up(basicRes 
core.BasicRes) errors.Error {
 }
 
 func (*addTransformationRule20221124) Version() uint64 {
-       return 20221124095900
+       return 20221202095900
 }
 
 func (*addTransformationRule20221124) Name() string {
diff --git 
a/plugins/github/models/migrationscripts/archived/transformation_rules.go 
b/plugins/github/models/migrationscripts/archived/transformation_rules.go
index 2d35ab5d..2df2bc00 100644
--- a/plugins/github/models/migrationscripts/archived/transformation_rules.go
+++ b/plugins/github/models/migrationscripts/archived/transformation_rules.go
@@ -35,7 +35,8 @@ type GithubTransformationRule struct {
        IssueTypeBug         string `mapstructure:"issueTypeBug" 
json:"issueTypeBug" gorm:"type:varchar(255)"`
        IssueTypeIncident    string `mapstructure:"issueTypeIncident" 
json:"issueTypeIncident" gorm:"type:varchar(255)"`
        IssueTypeRequirement string `mapstructure:"issueTypeRequirement" 
json:"issueTypeRequirement" gorm:"type:varchar(255)"`
-       DeploymentPattern    string `mapstructure:"deploymentPattern" 
json:"deploymentPattern" gorm:"type:varchar(255)"`
+       DeploymentPattern    string `mapstructure:"deploymentPattern,omitempty" 
json:"deploymentPattern" gorm:"type:varchar(255)"`
+       ProductionPattern    string `mapstructure:"productionPattern,omitempty" 
json:"productionPattern" gorm:"type:varchar(255)"`
        Refdiff              datatypes.JSONMap
 }
 
diff --git a/plugins/github/models/transformation_rule.go 
b/plugins/github/models/transformation_rule.go
index 09751c72..66b4b7fc 100644
--- a/plugins/github/models/transformation_rule.go
+++ b/plugins/github/models/transformation_rule.go
@@ -35,6 +35,7 @@ type GithubTransformationRule struct {
        IssueTypeIncident    string            
`mapstructure:"issueTypeIncident,omitempty" json:"issueTypeIncident" 
gorm:"type:varchar(255)"`
        IssueTypeRequirement string            
`mapstructure:"issueTypeRequirement,omitempty" json:"issueTypeRequirement" 
gorm:"type:varchar(255)"`
        DeploymentPattern    string            
`mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern" 
gorm:"type:varchar(255)"`
+       ProductionPattern    string            
`mapstructure:"productionPattern,omitempty" json:"productionPattern" 
gorm:"type:varchar(255)"`
        Refdiff              datatypes.JSONMap 
`mapstructure:"refdiff,omitempty" json:"refdiff" swaggertype:"object" 
format:"json"`
 }
 
diff --git a/plugins/github/tasks/cicd_job_convertor.go 
b/plugins/github/tasks/cicd_job_convertor.go
index 1f224cab..3e69e010 100644
--- a/plugins/github/tasks/cicd_job_convertor.go
+++ b/plugins/github/tasks/cicd_job_convertor.go
@@ -19,7 +19,6 @@ package tasks
 
 import (
        "reflect"
-       "regexp"
        "strings"
 
        "github.com/apache/incubator-devlake/errors"
@@ -51,16 +50,13 @@ func ConvertJobs(taskCtx core.SubTaskContext) (err 
errors.Error) {
        db := taskCtx.GetDal()
        data := taskCtx.GetData().(*GithubTaskData)
        repoId := data.Repo.GithubId
-
-       var deployTagRegexp *regexp.Regexp
        deploymentPattern := data.Options.DeploymentPattern
-       if len(deploymentPattern) > 0 {
-               deployTagRegexp, err = 
errors.Convert01(regexp.Compile(deploymentPattern))
-               if err != nil {
-                       return errors.Default.Wrap(err, "regexp compile 
deploymentPattern failed")
-               }
+       productionPattern := data.Options.ProductionPattern
+       regexEnricher := helper.NewRegexEnricher()
+       err = regexEnricher.AddRegexp(deploymentPattern, productionPattern)
+       if err != nil {
+               return err
        }
-
        job := &models.GithubJob{}
        cursor, err := db.Cursor(
                dal.From(job),
@@ -97,11 +93,9 @@ func ConvertJobs(taskCtx core.SubTaskContext) (err 
errors.Error) {
                                PipelineId:   
runIdGen.Generate(data.Options.ConnectionId, line.RepoId, line.RunID),
                                CicdScopeId:  
repoIdGen.Generate(data.Options.ConnectionId, line.RepoId),
                        }
-                       if deployTagRegexp != nil {
-                               if deployFlag := 
deployTagRegexp.FindString(line.Name); deployFlag != "" {
-                                       domainJob.Type = devops.DEPLOYMENT
-                               }
-                       }
+                       domainJob.Type = 
regexEnricher.GetEnrichResult(deploymentPattern, line.Name, devops.DEPLOYMENT)
+                       domainJob.Environment = 
regexEnricher.GetEnrichResult(productionPattern, line.Name, devops.PRODUCTION)
+
                        if strings.Contains(line.Conclusion, "success") {
                                domainJob.Result = devops.SUCCESS
                        } else if strings.Contains(line.Conclusion, "failure") {
diff --git a/plugins/helper/enrich_with_regex.go 
b/plugins/helper/enrich_with_regex.go
new file mode 100644
index 00000000..fee9a5eb
--- /dev/null
+++ b/plugins/helper/enrich_with_regex.go
@@ -0,0 +1,66 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one or more
+contributor license agreements.  See the NOTICE file distributed with
+this work for additional information regarding copyright ownership.
+The ASF licenses this file to You under the Apache License, Version 2.0
+(the "License"); you may not use this file except in compliance with
+the License.  You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+*/
+
+package helper
+
+import (
+       "fmt"
+       "github.com/apache/incubator-devlake/errors"
+       "github.com/apache/incubator-devlake/models/domainlayer/devops"
+       "regexp"
+)
+
+// RegexEnricher process value with regex pattern
+type RegexEnricher struct {
+       // This field will store compiled regular expression for every pattern
+       regexpMap map[string]*regexp.Regexp
+}
+
+// NewRegexEnricher initialize a regexEnricher
+func NewRegexEnricher() *RegexEnricher {
+       return &RegexEnricher{regexpMap: make(map[string]*regexp.Regexp)}
+}
+
+// AddRegexp will add compiled regular expression for pattern to regexpMap
+func (r *RegexEnricher) AddRegexp(patterns ...string) errors.Error {
+       for _, pattern := range patterns {
+               if len(pattern) > 0 {
+                       regex, err := errors.Convert01(regexp.Compile(pattern))
+                       if err != nil {
+                               return errors.Default.Wrap(err, 
fmt.Sprintf("Fail to compile pattern for regex pattern: %s", pattern))
+                       }
+                       r.regexpMap[pattern] = regex
+               }
+       }
+       return nil
+}
+
+// GetEnrichResult will get compiled regular expression from map by pattern,
+// and check if v matches compiled regular expression,
+// lastly, will return corresponding value(result or empty)
+func (r *RegexEnricher) GetEnrichResult(pattern string, v string, result 
string) string {
+       if result == devops.PRODUCTION && pattern == "" {
+               return result
+       }
+       regex := r.regexpMap[pattern]
+       if regex != nil {
+               if flag := regex.FindString(v); flag != "" {
+                       return result
+               }
+       }
+       return ""
+}
diff --git 
a/plugins/jenkins/models/migrationscripts/archived/transformation_rules.go 
b/plugins/helper/enrich_with_regex_test.go
similarity index 55%
copy from 
plugins/jenkins/models/migrationscripts/archived/transformation_rules.go
copy to plugins/helper/enrich_with_regex_test.go
index 5937892e..e493a10f 100644
--- a/plugins/jenkins/models/migrationscripts/archived/transformation_rules.go
+++ b/plugins/helper/enrich_with_regex_test.go
@@ -15,18 +15,26 @@ See the License for the specific language governing 
permissions and
 limitations under the License.
 */
 
-package archived
+package helper
 
 import (
-       "github.com/apache/incubator-devlake/models/migrationscripts/archived"
+       "github.com/stretchr/testify/assert"
+       "testing"
 )
 
-type JenkinsTransformationRule struct {
-       archived.Model
-       Name              string `gorm:"type:varchar(255)"`
-       DeploymentPattern string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern" json:"deploymentPattern"`
-}
+func TestRegexEnricher_GetEnrichResult(t *testing.T) {
+       re := NewRegexEnricher()
+       pattern1 := `deploy.*`
+       pattern2 := "production"
+       err := re.AddRegexp(pattern1, pattern2)
+       assert.Nil(t, err)
+       res1 := re.GetEnrichResult(pattern1, `deployToWin`, `deployment`)
+       assert.Equal(t, "deployment", res1)
+       res2 := re.GetEnrichResult(pattern1, `deplo1`, `deployment`)
+       assert.Equal(t, "", res2)
 
-func (t JenkinsTransformationRule) TableName() string {
-       return "_tool_jenkins_transformation_rules"
+       res3 := re.GetEnrichResult(pattern2, `production`, `product`)
+       assert.Equal(t, "product", res3)
+       res4 := re.GetEnrichResult(pattern2, `producti1n`, `product`)
+       assert.Equal(t, "", res4)
 }
diff --git a/plugins/jenkins/e2e/builds_test.go 
b/plugins/jenkins/e2e/builds_test.go
index b6a5b313..a345213c 100644
--- a/plugins/jenkins/e2e/builds_test.go
+++ b/plugins/jenkins/e2e/builds_test.go
@@ -34,11 +34,14 @@ func TestJenkinsBuildsDataFlow(t *testing.T) {
 
        taskData := &tasks.JenkinsTaskData{
                Options: &tasks.JenkinsOptions{
-                       ConnectionId:              1,
-                       JobName:                   `devlake`,
-                       JobFullName:               
`Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake`,
-                       JobPath:                   
`job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/`,
-                       JenkinsTransformationRule: 
new(models.JenkinsTransformationRule),
+                       ConnectionId: 1,
+                       JobName:      `devlake`,
+                       JobFullName:  
`Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake`,
+                       JobPath:      
`job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/`,
+                       JenkinsTransformationRule: 
&models.JenkinsTransformationRule{
+                               DeploymentPattern: 
`test-sub-sub-dir\/devlake.*`,
+                               ProductionPattern: 
`test-sub-sub-dir\/devlake.*`,
+                       },
                },
        }
 
diff --git a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv 
b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
index 83a110ed..4d20786d 100644
--- a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks.csv
@@ -1,26 +1,26 @@
 
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: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,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,124,
-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,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,115,
-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,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,114,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#172,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#172,SUCCESS,DONE,,,0,2022-09-08T15:40:57.000+00:00,2022-09-08T15:40:57.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,113,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#21,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#21,SUCCESS,DONE,,,2,2022-04-15T11:35:48.000+00:00,2022-04-15T11:35:50.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,94,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#215,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#215,SUCCESS,DONE,,,0,2022-09-08T14:26:52.000+00:00,2022-09-08T14:26:52.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,101,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#23,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#23,SUCCESS,DONE,,,0,2022-09-08T14:26:51.000+00:00,2022-09-08T14:26:51.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,96,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#24,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#24,SUCCESS,DONE,,,0,2022-09-08T15:40:33.000+00:00,2022-09-08T15:40:33.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,99,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#25,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#25,SUCCESS,DONE,,,0,2022-07-21T06:39:36.000+00:00,2022-07-21T06:39:36.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,104,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#27,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#27,,IN_PROGRESS,,,0,2022-04-15T10:06:17.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,123,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#31,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#31,SUCCESS,DONE,,,1,2022-04-15T12:00:49.000+00:00,2022-04-15T12:00:50.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,93,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#34,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#34,SUCCESS,DONE,,,0,2022-09-08T15:40:48.000+00:00,2022-09-08T15:40:48.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,98,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#35,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#35,SUCCESS,DONE,,,0,2022-09-08T14:26:57.000+00:00,2022-09-08T14:26:57.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,103,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#37,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#37,SUCCESS,DONE,,,0,2022-04-15T10:06:26.000+00:00,2022-04-15T10:06:26.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,122,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#41,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#41,SUCCESS,DONE,,,13,2022-09-08T14:26:43.000+00:00,2022-09-08T14:26:56.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,92,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#47,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#47,SUCCESS,DONE,,,0,2022-04-15T11:35:56.000+00:00,2022-04-15T11:35:56.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,121,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#51,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#51,SUCCESS,DONE,,,1,2022-09-08T14:27:11.000+00:00,2022-09-08T14:27:12.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,91,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#57,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#57,SUCCESS,DONE,,,0,2022-04-15T11:35:58.000+00:00,2022-04-15T11:35:58.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,120,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#61,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#61,SUCCESS,DONE,,,1,2022-09-08T14:27:22.000+00:00,2022-09-08T14:27:23.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,90,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#67,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#67,SUCCESS,DONE,,,0,2022-04-15T11:36:00.000+00:00,2022-04-15T11:36:00.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,119,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#71,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#71,SUCCESS,DONE,,,1,2022-09-08T15:40:25.000+00:00,2022-09-08T15:40:26.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,89,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#77,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#77,SUCCESS,DONE,,,0,2022-04-15T11:58:03.000+00:00,2022-04-15T11:58:03.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,118,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#81,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#81,SUCCESS,DONE,,,1,2022-09-08T15:40:40.000+00:00,2022-09-08T15:40:41.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,88,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#87,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#87,SUCCESS,DONE,,,0,2022-04-15T11:58:14.000+00:00,2022-04-15T11:58:14.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,117,
-jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#97,devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#97,SUCCESS,DONE,,,0,2022-09-08T14:26:47.000+00:00,2022-09-08T14:26:47.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_builds,116,
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#17,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#17,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,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,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#170,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#170,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,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,""FullName"":""Test-jenkins-dir/test-jenkins-su
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#171,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#171,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,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,""FullName"":""Test-jenkins-dir/test-jenkins-su
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#172,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#172,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T15:40:57.000+00:00,2022-09-08T15:40:57.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-su
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#21,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#21,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,2,2022-04-15T11:35:48.000+00:00,2022-04-15T11:35:50.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#215,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#215,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T14:26:52.000+00:00,2022-09-08T14:26:52.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-su
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#23,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#23,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T14:26:51.000+00:00,2022-09-08T14:26:51.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#24,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#24,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T15:40:33.000+00:00,2022-09-08T15:40:33.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#25,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#25,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-07-21T06:39:36.000+00:00,2022-07-21T06:39:36.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#27,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#27,,IN_PROGRESS,DEPLOYMENT,PRODUCTION,0,2022-04-15T10:06:17.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake"
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#31,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#31,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,1,2022-04-15T12:00:49.000+00:00,2022-04-15T12:00:50.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#34,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#34,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T15:40:48.000+00:00,2022-09-08T15:40:48.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#35,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#35,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T14:26:57.000+00:00,2022-09-08T14:26:57.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#37,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#37,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-04-15T10:06:26.000+00:00,2022-04-15T10:06:26.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#41,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#41,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,13,2022-09-08T14:26:43.000+00:00,2022-09-08T14:26:56.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#47,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#47,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-04-15T11:35:56.000+00:00,2022-04-15T11:35:56.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#51,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#51,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,1,2022-09-08T14:27:11.000+00:00,2022-09-08T14:27:12.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#57,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#57,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-04-15T11:35:58.000+00:00,2022-04-15T11:35:58.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#61,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#61,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,1,2022-09-08T14:27:22.000+00:00,2022-09-08T14:27:23.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#67,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#67,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-04-15T11:36:00.000+00:00,2022-04-15T11:36:00.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#71,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#71,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,1,2022-09-08T15:40:25.000+00:00,2022-09-08T15:40:26.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#77,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#77,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-04-15T11:58:03.000+00:00,2022-04-15T11:58:03.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#81,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#81,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,1,2022-09-08T15:40:40.000+00:00,2022-09-08T15:40:41.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#87,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#87,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-04-15T11:58:14.000+00:00,2022-04-15T11:58:14.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
+jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#97,Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#97,SUCCESS,DONE,DEPLOYMENT,PRODUCTION,0,2022-09-08T14:26:47.000+00:00,2022-09-08T14:26:47.000+00:00,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-
 [...]
diff --git a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks_after_stages.csv 
b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks_after_stages.csv
index e2caa408..31f98e1b 100644
--- a/plugins/jenkins/e2e/snapshot_tables/cicd_tasks_after_stages.csv
+++ b/plugins/jenkins/e2e/snapshot_tables/cicd_tasks_after_stages.csv
@@ -1,10 +1,10 @@
 
id,name,pipeline_id,result,status,type,duration_sec,started_date,finished_date,environment,cicd_scope_id,_raw_data_params,_raw_data_table,_raw_data_id,_raw_data_remark
+jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#1:6,Hello,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#1,SUCCESS,DONE,,0,1970-01-01T00:00:00.000+00:00,2022-09-08T15:40:34.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,1,
 
jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#10:8,scp-f/b,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#10,,IN_PROGRESS,,0,1970-01-01T00:00:00.000+00:00,2019-10-29T04:01:34.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,13577,
 
jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#11:9,gitlabInit,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#11,,IN_PROGRESS,,1312,1970-01-01T00:21:52.000+00:00,2021-03-09T13:57:02.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,13578,
-jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#12:1,gitlabAutoSync,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#12,SUCCESS,DONE,,14,1970-01-01T00:00:14.000+00:00,2020-02-07T11:54:42.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,13579,
+jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#12:1,gitlabAutoSync,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#12,SUCCESS,DONE,DEPLOYMENT,14,1970-01-01T00:00:14.000+00:00,2020-02-07T11:54:42.000+00:00,PRODUCTION,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins
 [...]
 
jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#13:2,gitlabInit,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#13,,IN_PROGRESS,,5,1970-01-01T00:00:05.000+00:00,2020-03-18T02:19:22.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,13580,
-jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#14:3,gitlabAutoSync,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#14,SUCCESS,DONE,,83,1970-01-01T00:01:23.000+00:00,2020-03-12T02:46:48.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,13581,
-jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#1:6,Hello,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#1,SUCCESS,DONE,,0,1970-01-01T00:00:00.000+00:00,2022-09-08T15:40:34.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,1,
+jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#14:3,gitlabAutoSync,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#14,SUCCESS,DONE,DEPLOYMENT,83,1970-01-01T00:01:23.000+00:00,2020-03-12T02:46:48.000+00:00,PRODUCTION,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins
 [...]
 
jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#2:7,Hello,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#2,SUCCESS,DONE,,0,1970-01-01T00:00:00.000+00:00,2022-09-08T15:40:49.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,2,
 
jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#3:8,Hello,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#3,SUCCESS,DONE,,0,1970-01-01T00:00:00.000+00:00,2022-09-08T15:40:49.000+00:00,,jenkins:JenkinsJob:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake,"{""ConnectionId"":1,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,3,
 
jenkins:JenkinsStage:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#4:9,Hello,jenkins:JenkinsBuild:1:Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake#4,SUCCESS,DONE,,0,1970-01-01T00:00:00.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,""FullName"":""Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake""}",_raw_jenkins_api_stages,4,
diff --git a/plugins/jenkins/e2e/stages_test.go 
b/plugins/jenkins/e2e/stages_test.go
index 07bce7c7..fd80e85d 100644
--- a/plugins/jenkins/e2e/stages_test.go
+++ b/plugins/jenkins/e2e/stages_test.go
@@ -33,11 +33,14 @@ func TestJenkinsStagesDataFlow(t *testing.T) {
 
        taskData := &tasks.JenkinsTaskData{
                Options: &tasks.JenkinsOptions{
-                       ConnectionId:              1,
-                       JobName:                   `devlake`,
-                       JobFullName:               
`Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake`,
-                       JobPath:                   
`job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/`,
-                       JenkinsTransformationRule: 
new(models.JenkinsTransformationRule),
+                       ConnectionId: 1,
+                       JobName:      `devlake`,
+                       JobFullName:  
`Test-jenkins-dir/test-jenkins-sub-dir/test-sub-sub-dir/devlake`,
+                       JobPath:      
`job/Test-jenkins-dir/job/test-jenkins-sub-dir/job/test-sub-sub-dir/`,
+                       JenkinsTransformationRule: 
&models.JenkinsTransformationRule{
+                               DeploymentPattern: `gitlabAutoSync`,
+                               ProductionPattern: `gitlabAutoSync`,
+                       },
                },
        }
 
diff --git 
a/plugins/jenkins/models/migrationscripts/20221128_add_trasformation_rule_table.go
 
b/plugins/jenkins/models/migrationscripts/20221205_add_trasformation_rule_table.go
similarity index 90%
rename from 
plugins/jenkins/models/migrationscripts/20221128_add_trasformation_rule_table.go
rename to 
plugins/jenkins/models/migrationscripts/20221205_add_trasformation_rule_table.go
index 24377ca1..d63046e1 100644
--- 
a/plugins/jenkins/models/migrationscripts/20221128_add_trasformation_rule_table.go
+++ 
b/plugins/jenkins/models/migrationscripts/20221205_add_trasformation_rule_table.go
@@ -24,22 +24,22 @@ import (
        
"github.com/apache/incubator-devlake/plugins/jenkins/models/migrationscripts/archived"
 )
 
-type jenkinsJob20221128 struct {
+type jenkinsJob20221205 struct {
        TransformationRuleId uint64
 }
 
-func (jenkinsJob20221128) TableName() string {
+func (jenkinsJob20221205) TableName() string {
        return "_tool_jenkins_jobs"
 }
 
 type addTransformationRule20221128 struct{}
 
 func (*addTransformationRule20221128) Up(basicRes core.BasicRes) errors.Error {
-       return migrationhelper.AutoMigrateTables(basicRes, 
&jenkinsJob20221128{}, &archived.JenkinsTransformationRule{})
+       return migrationhelper.AutoMigrateTables(basicRes, 
&jenkinsJob20221205{}, &archived.JenkinsTransformationRule{})
 }
 
 func (*addTransformationRule20221128) Version() uint64 {
-       return 20221128113500
+       return 20221205113500
 }
 
 func (*addTransformationRule20221128) Name() string {
diff --git 
a/plugins/jenkins/models/migrationscripts/archived/transformation_rules.go 
b/plugins/jenkins/models/migrationscripts/archived/transformation_rules.go
index 5937892e..71aa0e9d 100644
--- a/plugins/jenkins/models/migrationscripts/archived/transformation_rules.go
+++ b/plugins/jenkins/models/migrationscripts/archived/transformation_rules.go
@@ -25,6 +25,7 @@ type JenkinsTransformationRule struct {
        archived.Model
        Name              string `gorm:"type:varchar(255)"`
        DeploymentPattern string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern" json:"deploymentPattern"`
+       ProductionPattern string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"productionPattern"`
 }
 
 func (t JenkinsTransformationRule) TableName() string {
diff --git a/plugins/jenkins/models/transformation_rule.go 
b/plugins/jenkins/models/transformation_rule.go
index 5f18c620..81f735ea 100644
--- a/plugins/jenkins/models/transformation_rule.go
+++ b/plugins/jenkins/models/transformation_rule.go
@@ -23,6 +23,7 @@ type JenkinsTransformationRule struct {
        common.Model      `mapstructure:"-"`
        Name              string `gorm:"type:varchar(255)" mapstructure:"name" 
json:"name"`
        DeploymentPattern string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"deploymentPattern"`
+       ProductionPattern string `gorm:"type:varchar(255)" 
mapstructure:"deploymentPattern,omitempty" json:"productionPattern"`
 }
 
 func (t JenkinsTransformationRule) TableName() string {
diff --git a/plugins/jenkins/tasks/build_cicd_convertor.go 
b/plugins/jenkins/tasks/build_cicd_convertor.go
index 5b6f6c73..9fd4023a 100644
--- a/plugins/jenkins/tasks/build_cicd_convertor.go
+++ b/plugins/jenkins/tasks/build_cicd_convertor.go
@@ -19,7 +19,6 @@ package tasks
 
 import (
        "reflect"
-       "regexp"
        "time"
 
        "github.com/apache/incubator-devlake/errors"
@@ -43,15 +42,13 @@ var ConvertBuildsToCICDMeta = core.SubTaskMeta{
 func ConvertBuildsToCICD(taskCtx core.SubTaskContext) (err errors.Error) {
        db := taskCtx.GetDal()
        data := taskCtx.GetData().(*JenkinsTaskData)
-       var deployTagRegexp *regexp.Regexp
        deploymentPattern := data.Options.DeploymentPattern
-       if len(deploymentPattern) > 0 {
-               deployTagRegexp, err = 
errors.Convert01(regexp.Compile(deploymentPattern))
-               if err != nil {
-                       return errors.Default.Wrap(err, "regexp compile 
deploymentPattern failed")
-               }
+       productionPattern := data.Options.ProductionPattern
+       regexEnricher := helper.NewRegexEnricher()
+       err = regexEnricher.AddRegexp(deploymentPattern, productionPattern)
+       if err != nil {
+               return err
        }
-
        clauses := []dal.Clause{
                dal.From("_tool_jenkins_builds"),
                dal.Where(`_tool_jenkins_builds.connection_id = ?
@@ -121,7 +118,7 @@ func ConvertBuildsToCICD(taskCtx core.SubTaskContext) (err 
errors.Error) {
                                        DomainEntity: domainlayer.DomainEntity{
                                                Id: 
buildIdGen.Generate(jenkinsBuild.ConnectionId, jenkinsBuild.FullName),
                                        },
-                                       Name:         jenkinsBuild.JobName,
+                                       Name:         data.Options.JobFullName,
                                        Result:       jenkinsPipelineResult,
                                        Status:       jenkinsPipelineStatus,
                                        DurationSec:  uint64(durationSec),
@@ -129,11 +126,8 @@ func ConvertBuildsToCICD(taskCtx core.SubTaskContext) (err 
errors.Error) {
                                        FinishedDate: 
jenkinsPipelineFinishedDate,
                                        CicdScopeId:  
jobIdGen.Generate(jenkinsBuild.ConnectionId, data.Options.JobFullName),
                                }
-                               if deployTagRegexp != nil {
-                                       if deployFlag := 
deployTagRegexp.FindString(jenkinsBuild.JobName); deployFlag != "" {
-                                               jenkinsTask.Type = 
devops.DEPLOYMENT
-                                       }
-                               }
+                               jenkinsTask.Type = 
regexEnricher.GetEnrichResult(deploymentPattern, jenkinsTask.Name, 
devops.DEPLOYMENT)
+                               jenkinsTask.Environment = 
regexEnricher.GetEnrichResult(productionPattern, jenkinsTask.Name, 
devops.PRODUCTION)
 
                                jenkinsTask.PipelineId = 
buildIdGen.Generate(jenkinsBuild.ConnectionId, jenkinsBuild.FullName)
                                jenkinsTask.RawDataOrigin = 
jenkinsBuild.RawDataOrigin
diff --git a/plugins/jenkins/tasks/stage_convertor.go 
b/plugins/jenkins/tasks/stage_convertor.go
index 50fb7609..aaf7b760 100644
--- a/plugins/jenkins/tasks/stage_convertor.go
+++ b/plugins/jenkins/tasks/stage_convertor.go
@@ -19,7 +19,6 @@ package tasks
 
 import (
        "reflect"
-       "regexp"
        "time"
 
        "github.com/apache/incubator-devlake/errors"
@@ -64,15 +63,13 @@ var ConvertStagesMeta = core.SubTaskMeta{
 func ConvertStages(taskCtx core.SubTaskContext) (err errors.Error) {
        db := taskCtx.GetDal()
        data := taskCtx.GetData().(*JenkinsTaskData)
-       var deployTagRegexp *regexp.Regexp
        deploymentPattern := data.Options.DeploymentPattern
-       if len(deploymentPattern) > 0 {
-               deployTagRegexp, err = 
errors.Convert01(regexp.Compile(deploymentPattern))
-               if err != nil {
-                       return errors.Default.Wrap(err, "regexp compile 
deploymentPattern failed")
-               }
+       productionPattern := data.Options.ProductionPattern
+       regexEnricher := helper.NewRegexEnricher()
+       err = regexEnricher.AddRegexp(deploymentPattern, productionPattern)
+       if err != nil {
+               return err
        }
-
        clauses := []dal.Clause{
                dal.Select(`tjb.connection_id, tjs.build_name, tjs.id, 
tjs._raw_data_remark, tjs.name,
                        tjs._raw_data_id, tjs._raw_data_table, 
tjs._raw_data_params,
@@ -142,11 +139,8 @@ func ConvertStages(taskCtx core.SubTaskContext) (err 
errors.Error) {
                                FinishedDate: jenkinsTaskFinishedDate,
                                CicdScopeId:  
jobIdGen.Generate(body.ConnectionId, data.Options.JobFullName),
                        }
-                       if deployTagRegexp != nil {
-                               if deployFlag := 
deployTagRegexp.FindString(body.Name); deployFlag != "" {
-                                       jenkinsTask.Type = devops.DEPLOYMENT
-                               }
-                       }
+                       jenkinsTask.Type = 
regexEnricher.GetEnrichResult(deploymentPattern, jenkinsTask.Name, 
devops.DEPLOYMENT)
+                       jenkinsTask.Environment = 
regexEnricher.GetEnrichResult(productionPattern, jenkinsTask.Name, 
devops.PRODUCTION)
                        jenkinsTask.RawDataOrigin = body.RawDataOrigin
 
                        results = append(results, jenkinsTask)


Reply via email to