From 5a0f378f409b6dfcc19f434e2b9e253f8623cb91 Mon Sep 17 00:00:00 2001 From: Yvonnick Esnault Date: Mon, 7 Feb 2022 17:12:01 +0100 Subject: [PATCH 1/4] fix: get commits list Signed-off-by: Yvonnick Esnault b --- engine/api/repositoriesmanager/repositories_manager.go | 2 +- engine/api/workflow/dao_node_run.go | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/engine/api/repositoriesmanager/repositories_manager.go b/engine/api/repositoriesmanager/repositories_manager.go index a0a0c9edb6..e330138e67 100644 --- a/engine/api/repositoriesmanager/repositories_manager.go +++ b/engine/api/repositoriesmanager/repositories_manager.go @@ -224,7 +224,7 @@ func (c *vcsClient) doJSONRequest(ctx context.Context, method, path string, in i }) if code >= 400 { - log.Warn(ctx, "repositories manager %s HTTP %s %s error %s", c.name, method, path, code) + log.Warn(ctx, "repositories manager %s HTTP %s %s error %d", c.name, method, path, code) switch code { case http.StatusUnauthorized: err = sdk.NewError(sdk.ErrNoReposManagerClientAuth, err) diff --git a/engine/api/workflow/dao_node_run.go b/engine/api/workflow/dao_node_run.go index e39bd6401b..34d7190f8d 100644 --- a/engine/api/workflow/dao_node_run.go +++ b/engine/api/workflow/dao_node_run.go @@ -728,11 +728,11 @@ func PreviousNodeRunVCSInfos(ctx context.Context, db gorp.SqlExecutor, projectKe queryPrevious := ` SELECT workflow_node_run.vcs_branch, workflow_node_run.vcs_tag, workflow_node_run.vcs_hash, workflow_node_run.vcs_repository, workflow_node_run.num FROM workflow_node_run - JOIN w_node ON w_node.name = workflow_node_run.workflow_node_name AND w_node.name = $1 AND w_node.workflow_id = $2 + JOIN w_node ON w_node.id = workflow_node_run.workflow_node_id AND w_node.name = $1 AND w_node.workflow_id = $2 JOIN w_node_context ON w_node_context.node_id = w_node.id WHERE workflow_node_run.vcs_hash IS NOT NULL AND workflow_node_run.num < $3 - AND w_node_context.application_id = $4 + AND w_node_context.application_id = $4 ` argPrevious := []interface{}{nodeName, wf.ID, current.BuildNumber, appID} From a4893154601f45c48a87f19f5a3ac1ea05c12182 Mon Sep 17 00:00:00 2001 From: Yvonnick Esnault Date: Mon, 7 Feb 2022 22:50:54 +0100 Subject: [PATCH 2/4] ut Signed-off-by: Yvonnick Esnault --- engine/api/workflow/dao_run_test.go | 259 ++++++++++++++++++++++++++++ 1 file changed, 259 insertions(+) diff --git a/engine/api/workflow/dao_run_test.go b/engine/api/workflow/dao_run_test.go index 708f56fd59..d772e51dec 100644 --- a/engine/api/workflow/dao_run_test.go +++ b/engine/api/workflow/dao_run_test.go @@ -254,6 +254,265 @@ vcs_ssh_key: proj-blabla test.Equal(t, 2, count, "Number of workflow runs isn't correct") } +func TestCommitListWorkflowRun(t *testing.T) { + db, cache := test.SetupPG(t, bootstrap.InitiliazeDB) + + _ = event.Initialize(context.TODO(), db.DbMap, cache, nil) + + mockVCSSservice, _ := assets.InsertService(t, db, "TestManualRunBuildParameterMultiApplication", sdk.TypeVCS) + defer func() { + services.Delete(db, mockVCSSservice) // nolint + }() + + services.HTTPClient = mock( + func(r *http.Request) (*http.Response, error) { + body := new(bytes.Buffer) + w := new(http.Response) + enc := json.NewEncoder(body) + w.Body = io.NopCloser(body) + + switch r.URL.String() { + // NEED get REPO + case "/vcs/github/repos/sguiheux/demo": + repo := sdk.VCSRepo{ + URL: "https", + Name: "demo", + ID: "123", + Fullname: "sguiheux/demo", + Slug: "sguiheux", + HTTPCloneURL: "https://github.com/sguiheux/demo.git", + SSHCloneURL: "git://github.com/sguiheux/demo.git", + } + if err := enc.Encode(repo); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2": + repo := sdk.VCSRepo{ + URL: "https", + Name: "demo", + ID: "123", + Fullname: "sguiheux/demo2", + Slug: "sguiheux", + HTTPCloneURL: "https://github.com/sguiheux/demo2.git", + SSHCloneURL: "git://github.com/sguiheux/demo2.git", + } + if err := enc.Encode(repo); err != nil { + return writeError(w, err) + } + // Default payload on workflow insert + case "/vcs/github/repos/sguiheux/demo/branches/?branch=&default=true": + b := sdk.VCSBranch{ + Default: true, + DisplayID: "master", + LatestCommit: "mylastcommit", + } + if err := enc.Encode([]sdk.VCSBranch{b}); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2/branches/?branch=&default=true": + b := sdk.VCSBranch{ + Default: true, + DisplayID: "master", + LatestCommit: "mylastcommit2", + } + if err := enc.Encode([]sdk.VCSBranch{b}); err != nil { + return writeError(w, err) + } + // NEED GET BRANCH TO GET LATEST COMMIT + case "/vcs/github/repos/sguiheux/demo/branches/?branch=master&default=false": + b := sdk.VCSBranch{ + Default: false, + DisplayID: "master", + LatestCommit: "mylastcommit", + } + if err := enc.Encode(b); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2/branches/?branch=master&default=false": + b := sdk.VCSBranch{ + Default: false, + DisplayID: "master", + LatestCommit: "mylastcommit2", + } + if err := enc.Encode(b); err != nil { + return writeError(w, err) + } + // NEED GET COMMIT TO GET AUTHOR AND MESSAGE + case "/vcs/github/repos/sguiheux/demo/commits/mylastcommit": + c := sdk.VCSCommit{ + Author: sdk.VCSAuthor{ + Name: "test", + Email: "sg@foo.bar", + }, + Hash: "mylastcommit", + Message: "super commit", + Timestamp: time.Now().Unix(), + } + if err := enc.Encode(c); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2/commits/mylastcommit2": + c := sdk.VCSCommit{ + Author: sdk.VCSAuthor{ + Name: "test", + Email: "sg@foo.bar", + }, + Hash: "mylastcommit2", + Message: "super commit2", + Timestamp: time.Now().Unix(), + } + if err := enc.Encode(c); err != nil { + return writeError(w, err) + } + default: + t.Fatalf("UNKNOWN ROUTE: %s", r.URL.String()) + } + + return w, nil + }, + ) + + u, _ := assets.InsertAdminUser(t, db) + consumer, _ := authentication.LoadConsumerByTypeAndUserID(context.TODO(), db, sdk.ConsumerLocal, u.ID, authentication.LoadConsumerOptions.WithAuthentifiedUser) + + key := sdk.RandomString(10) + proj := assets.InsertTestProject(t, db, cache, key, key) + vcsServer := sdk.ProjectVCSServerLink{ + ProjectID: proj.ID, + Name: "github", + } + vcsServer.Set("token", "foo") + vcsServer.Set("secret", "bar") + assert.NoError(t, repositoriesmanager.InsertProjectVCSServerLink(context.TODO(), db, &vcsServer)) + + //First pipeline + pip := sdk.Pipeline{ + ProjectID: proj.ID, + ProjectKey: proj.Key, + Name: "pip1", + } + test.NoError(t, pipeline.InsertPipeline(db, &pip)) + + s := sdk.NewStage("stage 1") + s.Enabled = true + s.PipelineID = pip.ID + test.NoError(t, pipeline.InsertStage(db, s)) + + // Add application + appS := `version: v1.0 +name: blabla +vcs_server: github +repo: sguiheux/demo +vcs_ssh_key: proj-blabla +` + var eapp = new(exportentities.Application) + assert.NoError(t, yaml.Unmarshal([]byte(appS), eapp)) + app, _, _, globalError := application.ParseAndImport(context.TODO(), db, cache, *proj, eapp, application.ImportOptions{Force: true}, nil, u) + assert.NoError(t, globalError) + + // Add application2 + appS2 := `version: v1.0 +name: blabla2 +vcs_server: github +repo: sguiheux/demo2 +vcs_ssh_key: proj-blabla +` + var eapp2 = new(exportentities.Application) + assert.NoError(t, yaml.Unmarshal([]byte(appS2), eapp2)) + app2, _, _, globalError := application.ParseAndImport(context.TODO(), db, cache, *proj, eapp2, application.ImportOptions{Force: true}, nil, u) + assert.NoError(t, globalError) + + proj, _ = project.LoadByID(db, proj.ID, project.LoadOptions.WithApplications, project.LoadOptions.WithPipelines, project.LoadOptions.WithEnvironments, project.LoadOptions.WithGroups) + + w := sdk.Workflow{ + Name: "test_commits_list", + ProjectID: proj.ID, + ProjectKey: proj.Key, + WorkflowData: sdk.WorkflowData{ + Node: sdk.Node{ + Name: "node1", + Ref: "node1", + Type: sdk.NodeTypePipeline, + Context: &sdk.NodeContext{ + PipelineID: pip.ID, + ApplicationID: app.ID, + }, + }, + }, + HistoryLength: 2, + PurgeTags: []string{"git.branch"}, + } + + w2 := sdk.Workflow{ + Name: "test_commits_list_second", + ProjectID: proj.ID, + ProjectKey: proj.Key, + WorkflowData: sdk.WorkflowData{ + Node: sdk.Node{ + Name: "node1", + Ref: "node1", + Type: sdk.NodeTypePipeline, + Context: &sdk.NodeContext{ + PipelineID: pip.ID, + ApplicationID: app2.ID, + }, + }, + }, + HistoryLength: 2, + PurgeTags: []string{"git.branch"}, + } + + test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w)) + test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w2)) + + w1, err := workflow.Load(context.TODO(), db, cache, *proj, "test_commits_list", workflow.LoadOptions{DeepPipeline: true}) + test.NoError(t, err) + w2t, err := workflow.Load(context.TODO(), db, cache, *proj, "test_commits_list_second", workflow.LoadOptions{DeepPipeline: true}) + test.NoError(t, err) + + wr, errWR := workflow.CreateRun(db.DbMap, w1, sdk.WorkflowRunPostHandlerOption{AuthConsumerID: consumer.ID}) + require.NoError(t, errWR) + wr.Workflow = *w1 + _, errWr := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr, &sdk.WorkflowRunPostHandlerOption{ + Manual: &sdk.WorkflowNodeRunManual{ + Username: u.Username, + Payload: map[string]string{ + "git.branch": "master", + "git.author": "test", + }, + }, + }, *consumer, nil) + test.NoError(t, errWr) + + wr2, errWR := workflow.CreateRun(db.DbMap, w2t, sdk.WorkflowRunPostHandlerOption{AuthConsumerID: consumer.ID}) + require.NoError(t, errWR) + wr2.Workflow = *w2t + _, errWr2 := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr2, &sdk.WorkflowRunPostHandlerOption{ + Manual: &sdk.WorkflowNodeRunManual{ + Username: u.Username, + Payload: map[string]string{ + "git.branch": "master", + "git.author": "test", + }, + }, + }, *consumer, nil) + test.NoError(t, errWr2) + + current2 := sdk.BuildNumberAndHash{BuildNumber: 10000} + r2, err := workflow.PreviousNodeRunVCSInfos(context.Background(), db, proj.Key, *w2t, "node1", current2, app2.ID, 0) + require.NoError(t, err) + require.NotEmpty(t, r2.Branch) + t.Logf("key:%s w2t:%d current:%v app2.ID:%d", proj.Key, w1.ID, current2.Hash, app2.ID) + require.Equal(t, "mylastcommit2", r2.Hash) + + current := sdk.BuildNumberAndHash{BuildNumber: 10000} + r, err := workflow.PreviousNodeRunVCSInfos(context.Background(), db, proj.Key, *w1, "node1", current, app.ID, 0) + require.NoError(t, err) + require.NotEmpty(t, r.Branch) + t.Logf("key:%s w1:%d current:%v app.ID:%d", proj.Key, w1.ID, current.Hash, app.ID) + require.Equal(t, "mylastcommit", r.Hash) +} + func TestPurgeWorkflowRunWithRunningStatus(t *testing.T) { db, cache := test.SetupPG(t, bootstrap.InitiliazeDB) From 2ea424360f1317fb1bf22b2dde8c11d22c4648ef Mon Sep 17 00:00:00 2001 From: Yvonnick Esnault Date: Tue, 8 Feb 2022 09:09:25 +0100 Subject: [PATCH 3/4] ut Signed-off-by: Yvonnick Esnault --- engine/api/workflow/dao_node_run_test.go | 288 +++++++++++++++++++++++ engine/api/workflow/dao_run_test.go | 259 -------------------- 2 files changed, 288 insertions(+), 259 deletions(-) create mode 100644 engine/api/workflow/dao_node_run_test.go diff --git a/engine/api/workflow/dao_node_run_test.go b/engine/api/workflow/dao_node_run_test.go new file mode 100644 index 0000000000..e26669e606 --- /dev/null +++ b/engine/api/workflow/dao_node_run_test.go @@ -0,0 +1,288 @@ +package workflow_test + +import ( + "bytes" + "context" + "encoding/json" + "io" + "net/http" + "testing" + "time" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + "gopkg.in/yaml.v2" + + "github.com/ovh/cds/engine/api/application" + "github.com/ovh/cds/engine/api/authentication" + "github.com/ovh/cds/engine/api/bootstrap" + "github.com/ovh/cds/engine/api/event" + "github.com/ovh/cds/engine/api/pipeline" + "github.com/ovh/cds/engine/api/project" + "github.com/ovh/cds/engine/api/repositoriesmanager" + "github.com/ovh/cds/engine/api/services" + "github.com/ovh/cds/engine/api/test" + "github.com/ovh/cds/engine/api/test/assets" + "github.com/ovh/cds/engine/api/workflow" + "github.com/ovh/cds/sdk" + "github.com/ovh/cds/sdk/exportentities" +) + +func TestCommitListWorkflowRun(t *testing.T) { + db, cache := test.SetupPG(t, bootstrap.InitiliazeDB) + + _ = event.Initialize(context.TODO(), db.DbMap, cache, nil) + + mockVCSSservice, _ := assets.InsertService(t, db, "TestManualRunBuildParameterMultiApplication", sdk.TypeVCS) + defer func() { + services.Delete(db, mockVCSSservice) // nolint + }() + + services.HTTPClient = mock( + func(r *http.Request) (*http.Response, error) { + body := new(bytes.Buffer) + w := new(http.Response) + enc := json.NewEncoder(body) + w.Body = io.NopCloser(body) + + switch r.URL.String() { + // NEED get REPO + case "/vcs/github/repos/sguiheux/demo": + repo := sdk.VCSRepo{ + URL: "https", + Name: "demo", + ID: "123", + Fullname: "sguiheux/demo", + Slug: "sguiheux", + HTTPCloneURL: "https://github.com/sguiheux/demo.git", + SSHCloneURL: "git://github.com/sguiheux/demo.git", + } + if err := enc.Encode(repo); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2": + repo := sdk.VCSRepo{ + URL: "https", + Name: "demo", + ID: "123", + Fullname: "sguiheux/demo2", + Slug: "sguiheux", + HTTPCloneURL: "https://github.com/sguiheux/demo2.git", + SSHCloneURL: "git://github.com/sguiheux/demo2.git", + } + if err := enc.Encode(repo); err != nil { + return writeError(w, err) + } + // Default payload on workflow insert + case "/vcs/github/repos/sguiheux/demo/branches/?branch=&default=true": + b := sdk.VCSBranch{ + Default: true, + DisplayID: "master", + LatestCommit: "mylastcommit", + } + if err := enc.Encode([]sdk.VCSBranch{b}); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2/branches/?branch=&default=true": + b := sdk.VCSBranch{ + Default: true, + DisplayID: "master", + LatestCommit: "mylastcommit2", + } + if err := enc.Encode([]sdk.VCSBranch{b}); err != nil { + return writeError(w, err) + } + // NEED GET BRANCH TO GET LATEST COMMIT + case "/vcs/github/repos/sguiheux/demo/branches/?branch=master&default=false": + b := sdk.VCSBranch{ + Default: false, + DisplayID: "master", + LatestCommit: "mylastcommit", + } + if err := enc.Encode(b); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2/branches/?branch=master&default=false": + b := sdk.VCSBranch{ + Default: false, + DisplayID: "master", + LatestCommit: "mylastcommit2", + } + if err := enc.Encode(b); err != nil { + return writeError(w, err) + } + // NEED GET COMMIT TO GET AUTHOR AND MESSAGE + case "/vcs/github/repos/sguiheux/demo/commits/mylastcommit": + c := sdk.VCSCommit{ + Author: sdk.VCSAuthor{ + Name: "test", + Email: "sg@foo.bar", + }, + Hash: "mylastcommit", + Message: "super commit", + Timestamp: time.Now().Unix(), + } + if err := enc.Encode(c); err != nil { + return writeError(w, err) + } + case "/vcs/github/repos/sguiheux/demo2/commits/mylastcommit2": + c := sdk.VCSCommit{ + Author: sdk.VCSAuthor{ + Name: "test", + Email: "sg@foo.bar", + }, + Hash: "mylastcommit2", + Message: "super commit2", + Timestamp: time.Now().Unix(), + } + if err := enc.Encode(c); err != nil { + return writeError(w, err) + } + default: + t.Fatalf("UNKNOWN ROUTE: %s", r.URL.String()) + } + + return w, nil + }, + ) + + u, _ := assets.InsertAdminUser(t, db) + consumer, _ := authentication.LoadConsumerByTypeAndUserID(context.TODO(), db, sdk.ConsumerLocal, u.ID, authentication.LoadConsumerOptions.WithAuthentifiedUser) + + key := sdk.RandomString(10) + proj := assets.InsertTestProject(t, db, cache, key, key) + vcsServer := sdk.ProjectVCSServerLink{ + ProjectID: proj.ID, + Name: "github", + } + vcsServer.Set("token", "foo") + vcsServer.Set("secret", "bar") + assert.NoError(t, repositoriesmanager.InsertProjectVCSServerLink(context.TODO(), db, &vcsServer)) + + //First pipeline + pip := sdk.Pipeline{ + ProjectID: proj.ID, + ProjectKey: proj.Key, + Name: "pip1", + } + test.NoError(t, pipeline.InsertPipeline(db, &pip)) + + s := sdk.NewStage("stage 1") + s.Enabled = true + s.PipelineID = pip.ID + test.NoError(t, pipeline.InsertStage(db, s)) + + // Add application + appS := `version: v1.0 +name: blabla +vcs_server: github +repo: sguiheux/demo +vcs_ssh_key: proj-blabla +` + var eapp = new(exportentities.Application) + assert.NoError(t, yaml.Unmarshal([]byte(appS), eapp)) + app, _, _, globalError := application.ParseAndImport(context.TODO(), db, cache, *proj, eapp, application.ImportOptions{Force: true}, nil, u) + assert.NoError(t, globalError) + + // Add application2 + appS2 := `version: v1.0 +name: blabla2 +vcs_server: github +repo: sguiheux/demo2 +vcs_ssh_key: proj-blabla +` + var eapp2 = new(exportentities.Application) + assert.NoError(t, yaml.Unmarshal([]byte(appS2), eapp2)) + app2, _, _, globalError := application.ParseAndImport(context.TODO(), db, cache, *proj, eapp2, application.ImportOptions{Force: true}, nil, u) + assert.NoError(t, globalError) + + proj, _ = project.LoadByID(db, proj.ID, project.LoadOptions.WithApplications, project.LoadOptions.WithPipelines, project.LoadOptions.WithEnvironments, project.LoadOptions.WithGroups) + + w := sdk.Workflow{ + Name: "test_commits_list", + ProjectID: proj.ID, + ProjectKey: proj.Key, + WorkflowData: sdk.WorkflowData{ + Node: sdk.Node{ + Name: "node1", + Ref: "node1", + Type: sdk.NodeTypePipeline, + Context: &sdk.NodeContext{ + PipelineID: pip.ID, + ApplicationID: app.ID, + }, + }, + }, + HistoryLength: 2, + PurgeTags: []string{"git.branch"}, + } + + w2 := sdk.Workflow{ + Name: "test_commits_list_second", + ProjectID: proj.ID, + ProjectKey: proj.Key, + WorkflowData: sdk.WorkflowData{ + Node: sdk.Node{ + Name: "node1", + Ref: "node1", + Type: sdk.NodeTypePipeline, + Context: &sdk.NodeContext{ + PipelineID: pip.ID, + ApplicationID: app2.ID, + }, + }, + }, + HistoryLength: 2, + PurgeTags: []string{"git.branch"}, + } + + test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w)) + test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w2)) + + w1, err := workflow.Load(context.TODO(), db, cache, *proj, "test_commits_list", workflow.LoadOptions{DeepPipeline: true}) + test.NoError(t, err) + w2t, err := workflow.Load(context.TODO(), db, cache, *proj, "test_commits_list_second", workflow.LoadOptions{DeepPipeline: true}) + test.NoError(t, err) + + wr, errWR := workflow.CreateRun(db.DbMap, w1, sdk.WorkflowRunPostHandlerOption{AuthConsumerID: consumer.ID}) + require.NoError(t, errWR) + wr.Workflow = *w1 + _, errWr := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr, &sdk.WorkflowRunPostHandlerOption{ + Manual: &sdk.WorkflowNodeRunManual{ + Username: u.Username, + Payload: map[string]string{ + "git.branch": "master", + "git.author": "test", + }, + }, + }, *consumer, nil) + test.NoError(t, errWr) + + wr2, errWR := workflow.CreateRun(db.DbMap, w2t, sdk.WorkflowRunPostHandlerOption{AuthConsumerID: consumer.ID}) + require.NoError(t, errWR) + wr2.Workflow = *w2t + _, errWr2 := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr2, &sdk.WorkflowRunPostHandlerOption{ + Manual: &sdk.WorkflowNodeRunManual{ + Username: u.Username, + Payload: map[string]string{ + "git.branch": "master", + "git.author": "test", + }, + }, + }, *consumer, nil) + test.NoError(t, errWr2) + + current2 := sdk.BuildNumberAndHash{BuildNumber: 10000} + r2, err := workflow.PreviousNodeRunVCSInfos(context.Background(), db, proj.Key, *w2t, "node1", current2, app2.ID, 0) + require.NoError(t, err) + require.NotEmpty(t, r2.Branch) + t.Logf("key:%s w2t:%d current:%v app2.ID:%d", proj.Key, w1.ID, current2.Hash, app2.ID) + require.Equal(t, "mylastcommit2", r2.Hash) + + current := sdk.BuildNumberAndHash{BuildNumber: 10000} + r, err := workflow.PreviousNodeRunVCSInfos(context.Background(), db, proj.Key, *w1, "node1", current, app.ID, 0) + require.NoError(t, err) + require.NotEmpty(t, r.Branch) + t.Logf("key:%s w1:%d current:%v app.ID:%d", proj.Key, w1.ID, current.Hash, app.ID) + require.Equal(t, "mylastcommit", r.Hash) +} diff --git a/engine/api/workflow/dao_run_test.go b/engine/api/workflow/dao_run_test.go index d772e51dec..708f56fd59 100644 --- a/engine/api/workflow/dao_run_test.go +++ b/engine/api/workflow/dao_run_test.go @@ -254,265 +254,6 @@ vcs_ssh_key: proj-blabla test.Equal(t, 2, count, "Number of workflow runs isn't correct") } -func TestCommitListWorkflowRun(t *testing.T) { - db, cache := test.SetupPG(t, bootstrap.InitiliazeDB) - - _ = event.Initialize(context.TODO(), db.DbMap, cache, nil) - - mockVCSSservice, _ := assets.InsertService(t, db, "TestManualRunBuildParameterMultiApplication", sdk.TypeVCS) - defer func() { - services.Delete(db, mockVCSSservice) // nolint - }() - - services.HTTPClient = mock( - func(r *http.Request) (*http.Response, error) { - body := new(bytes.Buffer) - w := new(http.Response) - enc := json.NewEncoder(body) - w.Body = io.NopCloser(body) - - switch r.URL.String() { - // NEED get REPO - case "/vcs/github/repos/sguiheux/demo": - repo := sdk.VCSRepo{ - URL: "https", - Name: "demo", - ID: "123", - Fullname: "sguiheux/demo", - Slug: "sguiheux", - HTTPCloneURL: "https://github.com/sguiheux/demo.git", - SSHCloneURL: "git://github.com/sguiheux/demo.git", - } - if err := enc.Encode(repo); err != nil { - return writeError(w, err) - } - case "/vcs/github/repos/sguiheux/demo2": - repo := sdk.VCSRepo{ - URL: "https", - Name: "demo", - ID: "123", - Fullname: "sguiheux/demo2", - Slug: "sguiheux", - HTTPCloneURL: "https://github.com/sguiheux/demo2.git", - SSHCloneURL: "git://github.com/sguiheux/demo2.git", - } - if err := enc.Encode(repo); err != nil { - return writeError(w, err) - } - // Default payload on workflow insert - case "/vcs/github/repos/sguiheux/demo/branches/?branch=&default=true": - b := sdk.VCSBranch{ - Default: true, - DisplayID: "master", - LatestCommit: "mylastcommit", - } - if err := enc.Encode([]sdk.VCSBranch{b}); err != nil { - return writeError(w, err) - } - case "/vcs/github/repos/sguiheux/demo2/branches/?branch=&default=true": - b := sdk.VCSBranch{ - Default: true, - DisplayID: "master", - LatestCommit: "mylastcommit2", - } - if err := enc.Encode([]sdk.VCSBranch{b}); err != nil { - return writeError(w, err) - } - // NEED GET BRANCH TO GET LATEST COMMIT - case "/vcs/github/repos/sguiheux/demo/branches/?branch=master&default=false": - b := sdk.VCSBranch{ - Default: false, - DisplayID: "master", - LatestCommit: "mylastcommit", - } - if err := enc.Encode(b); err != nil { - return writeError(w, err) - } - case "/vcs/github/repos/sguiheux/demo2/branches/?branch=master&default=false": - b := sdk.VCSBranch{ - Default: false, - DisplayID: "master", - LatestCommit: "mylastcommit2", - } - if err := enc.Encode(b); err != nil { - return writeError(w, err) - } - // NEED GET COMMIT TO GET AUTHOR AND MESSAGE - case "/vcs/github/repos/sguiheux/demo/commits/mylastcommit": - c := sdk.VCSCommit{ - Author: sdk.VCSAuthor{ - Name: "test", - Email: "sg@foo.bar", - }, - Hash: "mylastcommit", - Message: "super commit", - Timestamp: time.Now().Unix(), - } - if err := enc.Encode(c); err != nil { - return writeError(w, err) - } - case "/vcs/github/repos/sguiheux/demo2/commits/mylastcommit2": - c := sdk.VCSCommit{ - Author: sdk.VCSAuthor{ - Name: "test", - Email: "sg@foo.bar", - }, - Hash: "mylastcommit2", - Message: "super commit2", - Timestamp: time.Now().Unix(), - } - if err := enc.Encode(c); err != nil { - return writeError(w, err) - } - default: - t.Fatalf("UNKNOWN ROUTE: %s", r.URL.String()) - } - - return w, nil - }, - ) - - u, _ := assets.InsertAdminUser(t, db) - consumer, _ := authentication.LoadConsumerByTypeAndUserID(context.TODO(), db, sdk.ConsumerLocal, u.ID, authentication.LoadConsumerOptions.WithAuthentifiedUser) - - key := sdk.RandomString(10) - proj := assets.InsertTestProject(t, db, cache, key, key) - vcsServer := sdk.ProjectVCSServerLink{ - ProjectID: proj.ID, - Name: "github", - } - vcsServer.Set("token", "foo") - vcsServer.Set("secret", "bar") - assert.NoError(t, repositoriesmanager.InsertProjectVCSServerLink(context.TODO(), db, &vcsServer)) - - //First pipeline - pip := sdk.Pipeline{ - ProjectID: proj.ID, - ProjectKey: proj.Key, - Name: "pip1", - } - test.NoError(t, pipeline.InsertPipeline(db, &pip)) - - s := sdk.NewStage("stage 1") - s.Enabled = true - s.PipelineID = pip.ID - test.NoError(t, pipeline.InsertStage(db, s)) - - // Add application - appS := `version: v1.0 -name: blabla -vcs_server: github -repo: sguiheux/demo -vcs_ssh_key: proj-blabla -` - var eapp = new(exportentities.Application) - assert.NoError(t, yaml.Unmarshal([]byte(appS), eapp)) - app, _, _, globalError := application.ParseAndImport(context.TODO(), db, cache, *proj, eapp, application.ImportOptions{Force: true}, nil, u) - assert.NoError(t, globalError) - - // Add application2 - appS2 := `version: v1.0 -name: blabla2 -vcs_server: github -repo: sguiheux/demo2 -vcs_ssh_key: proj-blabla -` - var eapp2 = new(exportentities.Application) - assert.NoError(t, yaml.Unmarshal([]byte(appS2), eapp2)) - app2, _, _, globalError := application.ParseAndImport(context.TODO(), db, cache, *proj, eapp2, application.ImportOptions{Force: true}, nil, u) - assert.NoError(t, globalError) - - proj, _ = project.LoadByID(db, proj.ID, project.LoadOptions.WithApplications, project.LoadOptions.WithPipelines, project.LoadOptions.WithEnvironments, project.LoadOptions.WithGroups) - - w := sdk.Workflow{ - Name: "test_commits_list", - ProjectID: proj.ID, - ProjectKey: proj.Key, - WorkflowData: sdk.WorkflowData{ - Node: sdk.Node{ - Name: "node1", - Ref: "node1", - Type: sdk.NodeTypePipeline, - Context: &sdk.NodeContext{ - PipelineID: pip.ID, - ApplicationID: app.ID, - }, - }, - }, - HistoryLength: 2, - PurgeTags: []string{"git.branch"}, - } - - w2 := sdk.Workflow{ - Name: "test_commits_list_second", - ProjectID: proj.ID, - ProjectKey: proj.Key, - WorkflowData: sdk.WorkflowData{ - Node: sdk.Node{ - Name: "node1", - Ref: "node1", - Type: sdk.NodeTypePipeline, - Context: &sdk.NodeContext{ - PipelineID: pip.ID, - ApplicationID: app2.ID, - }, - }, - }, - HistoryLength: 2, - PurgeTags: []string{"git.branch"}, - } - - test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w)) - test.NoError(t, workflow.Insert(context.TODO(), db, cache, *proj, &w2)) - - w1, err := workflow.Load(context.TODO(), db, cache, *proj, "test_commits_list", workflow.LoadOptions{DeepPipeline: true}) - test.NoError(t, err) - w2t, err := workflow.Load(context.TODO(), db, cache, *proj, "test_commits_list_second", workflow.LoadOptions{DeepPipeline: true}) - test.NoError(t, err) - - wr, errWR := workflow.CreateRun(db.DbMap, w1, sdk.WorkflowRunPostHandlerOption{AuthConsumerID: consumer.ID}) - require.NoError(t, errWR) - wr.Workflow = *w1 - _, errWr := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr, &sdk.WorkflowRunPostHandlerOption{ - Manual: &sdk.WorkflowNodeRunManual{ - Username: u.Username, - Payload: map[string]string{ - "git.branch": "master", - "git.author": "test", - }, - }, - }, *consumer, nil) - test.NoError(t, errWr) - - wr2, errWR := workflow.CreateRun(db.DbMap, w2t, sdk.WorkflowRunPostHandlerOption{AuthConsumerID: consumer.ID}) - require.NoError(t, errWR) - wr2.Workflow = *w2t - _, errWr2 := workflow.StartWorkflowRun(context.TODO(), db, cache, *proj, wr2, &sdk.WorkflowRunPostHandlerOption{ - Manual: &sdk.WorkflowNodeRunManual{ - Username: u.Username, - Payload: map[string]string{ - "git.branch": "master", - "git.author": "test", - }, - }, - }, *consumer, nil) - test.NoError(t, errWr2) - - current2 := sdk.BuildNumberAndHash{BuildNumber: 10000} - r2, err := workflow.PreviousNodeRunVCSInfos(context.Background(), db, proj.Key, *w2t, "node1", current2, app2.ID, 0) - require.NoError(t, err) - require.NotEmpty(t, r2.Branch) - t.Logf("key:%s w2t:%d current:%v app2.ID:%d", proj.Key, w1.ID, current2.Hash, app2.ID) - require.Equal(t, "mylastcommit2", r2.Hash) - - current := sdk.BuildNumberAndHash{BuildNumber: 10000} - r, err := workflow.PreviousNodeRunVCSInfos(context.Background(), db, proj.Key, *w1, "node1", current, app.ID, 0) - require.NoError(t, err) - require.NotEmpty(t, r.Branch) - t.Logf("key:%s w1:%d current:%v app.ID:%d", proj.Key, w1.ID, current.Hash, app.ID) - require.Equal(t, "mylastcommit", r.Hash) -} - func TestPurgeWorkflowRunWithRunningStatus(t *testing.T) { db, cache := test.SetupPG(t, bootstrap.InitiliazeDB) From 5a24e1dead2ac0ab9fe47788156cb22430b319f1 Mon Sep 17 00:00:00 2001 From: Yvonnick Esnault Date: Thu, 10 Feb 2022 09:16:36 +0100 Subject: [PATCH 4/4] cr Signed-off-by: Yvonnick Esnault --- engine/api/workflow/dao_node_run.go | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/engine/api/workflow/dao_node_run.go b/engine/api/workflow/dao_node_run.go index 34d7190f8d..b1d944c4b2 100644 --- a/engine/api/workflow/dao_node_run.go +++ b/engine/api/workflow/dao_node_run.go @@ -728,9 +728,10 @@ func PreviousNodeRunVCSInfos(ctx context.Context, db gorp.SqlExecutor, projectKe queryPrevious := ` SELECT workflow_node_run.vcs_branch, workflow_node_run.vcs_tag, workflow_node_run.vcs_hash, workflow_node_run.vcs_repository, workflow_node_run.num FROM workflow_node_run - JOIN w_node ON w_node.id = workflow_node_run.workflow_node_id AND w_node.name = $1 AND w_node.workflow_id = $2 + JOIN w_node ON w_node.name = workflow_node_run.workflow_node_name AND w_node.name = $1 AND w_node.workflow_id = $2 JOIN w_node_context ON w_node_context.node_id = w_node.id WHERE workflow_node_run.vcs_hash IS NOT NULL + AND workflow_node_run.workflow_id = $2 AND workflow_node_run.num < $3 AND w_node_context.application_id = $4 `