Skip to content

Commit bae5d4e

Browse files
authored
fix(api,vcs,repositories): improve migrate ascode (#5083)
1 parent a07869f commit bae5d4e

File tree

23 files changed

+243
-219
lines changed

23 files changed

+243
-219
lines changed

cli/cdsctl/template_apply.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,9 @@ func suggestTemplate() (*sdk.WorkflowTemplate, error) {
102102
if err != nil {
103103
return nil, err
104104
}
105+
if len(wts) == 0 {
106+
return nil, fmt.Errorf("no existing template found from CDS")
107+
}
105108
opts := make([]string, len(wts))
106109
for i := range wts {
107110
opts[i] = fmt.Sprintf("%s (%s/%s)", wts[i].Name, wts[i].Group.Name, wts[i].Slug)
@@ -292,7 +295,7 @@ func templateApplyRun(v cli.Values) error {
292295
}
293296
}
294297

295-
if !importAsCode && !importPush && !detached {
298+
if !importAsCode && !importPush {
296299
if localRepoURL != "" {
297300
importAsCode = cli.AskConfirm(fmt.Sprintf("Import the generated workflow as code to the %s project", projectKey))
298301
}

engine/api/ascode/sync/sync.go

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,17 @@ func SyncAsCodeEvent(ctx context.Context, db *gorp.DbMap, store cache.Store, pro
6262
log.Debug("Pull request %s #%d not found", app.RepositoryFullname, int(ascodeEvt.PullRequestID))
6363
}
6464

65+
// If the PR was merged we want to set the repo url on the workflow
66+
if ascodeEvt.Migrate && len(ascodeEvt.Data.Workflows) == 1 {
67+
for id := range ascodeEvt.Data.Workflows {
68+
if pr.Merged {
69+
if err := workflow.UpdateFromRepository(tx, id, fromRepo); err != nil {
70+
return nil, fromRepo, err
71+
}
72+
}
73+
}
74+
}
75+
6576
// If event ended, delete it from db
6677
if prNotFound || pr.Merged || pr.Closed {
6778
eventToDelete = append(eventToDelete, ascodeEvt)
@@ -74,13 +85,6 @@ func SyncAsCodeEvent(ctx context.Context, db *gorp.DbMap, store cache.Store, pro
7485
if err := ascode.DeleteAsCodeEvent(tx, ascodeEvt); err != nil {
7586
return nil, fromRepo, err
7687
}
77-
if ascodeEvt.Migrate && len(ascodeEvt.Data.Workflows) == 1 {
78-
for id := range ascodeEvt.Data.Workflows {
79-
if err := workflow.UpdateFromRepository(tx, id, fromRepo); err != nil {
80-
return nil, fromRepo, err
81-
}
82-
}
83-
}
8488
}
8589

8690
if err := tx.Commit(); err != nil {

engine/api/pipeline.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import (
2222

2323
func (api *API) updateAsCodePipelineHandler() service.Handler {
2424
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
25-
// Get project name in URL
2625
vars := mux.Vars(r)
2726
key := vars[permProjectKey]
2827
name := vars["pipelineKey"]

engine/api/templates.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -506,6 +506,7 @@ func (api *API) postTemplateBulkHandler() service.Handler {
506506

507507
errorDefer := func(err error) error {
508508
if err != nil {
509+
log.Error(ctx, "%v", err)
509510
bulk.Operations[i].Status = sdk.OperationStatusError
510511
bulk.Operations[i].Error = fmt.Sprintf("%s", sdk.Cause(err))
511512
if err := workflowtemplate.UpdateBulk(api.mustDB(), &bulk); err != nil {

engine/api/workflow/dao.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,6 @@ func UpdateFromRepository(db gorp.SqlExecutor, workflowID int64, fromRepository
143143
if _, err := db.Exec("UPDATE workflow SET from_repository = $1, last_modified = current_timestamp WHERE id = $2", fromRepository, workflowID); err != nil {
144144
return sdk.WithStack(err)
145145
}
146-
147146
return nil
148147
}
149148

engine/api/workflow_ascode.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ func (api *API) getWorkflowAsCodeHandler() service.Handler {
3838
}
3939

4040
// postWorkflowAsCodeHandler Update an as code workflow
41-
// @title Make the workflow as code // @title Update an as code workflow
41+
// @title Make the workflow as code
42+
// @title Update an as code workflow
4243
func (api *API) postWorkflowAsCodeHandler() service.Handler {
4344
return func(ctx context.Context, w http.ResponseWriter, r *http.Request) error {
4445
vars := mux.Vars(r)

engine/repositories/fs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ func (s *Service) checkOrCreateFS(r *sdk.OperationRepo) error {
2626
path := filepath.Join(s.Cfg.Basedir, r.ID())
2727
fi, err := os.Stat(path)
2828
if os.IsNotExist(err) {
29-
return sdk.WrapError(os.MkdirAll(path, os.FileMode(0700)), "checkOrCreateFS> unable to create directory %s", path)
29+
return sdk.WrapError(os.MkdirAll(path, os.FileMode(0700)), "unable to create directory %s", path)
3030
}
3131
if fi.IsDir() {
3232
return nil

engine/repositories/processor.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,11 @@ package repositories
22

33
import (
44
"context"
5+
"fmt"
56
"time"
67

8+
"github.com/sirupsen/logrus"
9+
710
"github.com/ovh/cds/sdk"
811
"github.com/ovh/cds/sdk/log"
912
)
@@ -45,6 +48,13 @@ func (s *Service) do(ctx context.Context, op sdk.Operation) error {
4548
// Load workflow as code file
4649
case op.Setup.Checkout.Branch != "" || op.Setup.Checkout.Tag != "":
4750
if err := s.processCheckout(ctx, &op); err != nil {
51+
isErrWithStack := sdk.IsErrorWithStack(err)
52+
fields := logrus.Fields{}
53+
if isErrWithStack {
54+
fields["stack_trace"] = fmt.Sprintf("%+v", err)
55+
}
56+
log.ErrorWithFields(ctx, fields, "%s", err)
57+
4858
op.Error = sdk.Cause(err).Error()
4959
op.Status = sdk.OperationStatusError
5060
} else {
@@ -53,6 +63,13 @@ func (s *Service) do(ctx context.Context, op sdk.Operation) error {
5363
switch {
5464
case op.LoadFiles.Pattern != "":
5565
if err := s.processLoadFiles(ctx, &op); err != nil {
66+
isErrWithStack := sdk.IsErrorWithStack(err)
67+
fields := logrus.Fields{}
68+
if isErrWithStack {
69+
fields["stack_trace"] = fmt.Sprintf("%+v", err)
70+
}
71+
log.ErrorWithFields(ctx, fields, "%s", err)
72+
5673
op.Error = sdk.Cause(err).Error()
5774
op.Status = sdk.OperationStatusError
5875
} else {
@@ -67,6 +84,13 @@ func (s *Service) do(ctx context.Context, op sdk.Operation) error {
6784
// Push workflow as code file
6885
case op.Setup.Push.FromBranch != "":
6986
if err := s.processPush(ctx, &op); err != nil {
87+
isErrWithStack := sdk.IsErrorWithStack(err)
88+
fields := logrus.Fields{}
89+
if isErrWithStack {
90+
fields["stack_trace"] = fmt.Sprintf("%+v", err)
91+
}
92+
log.ErrorWithFields(ctx, fields, "%s", err)
93+
7094
op.Error = sdk.Cause(err).Error()
7195
op.Status = sdk.OperationStatusError
7296
} else {

engine/repositories/processor_checkout.go

Lines changed: 14 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -14,58 +14,49 @@ func (s *Service) processCheckout(ctx context.Context, op *sdk.Operation) error
1414
}
1515

1616
if err := gitRepo.ResetHard("origin/" + currentBranch); err != nil {
17-
log.Error(ctx, "Repositories> processCheckout> ResetHard> [%s] Error: %v", op.UUID, err)
18-
return err
17+
return sdk.WithStack(err)
1918
}
2019

2120
if op.Setup.Checkout.Tag != "" {
22-
log.Debug("Repositories> processCheckout> fetching tag %s from %s", op.Setup.Checkout.Tag, op.URL)
21+
log.Debug("processCheckout> fetching tag %s from %s", op.Setup.Checkout.Tag, op.URL)
2322
if err := gitRepo.FetchRemoteTag("origin", op.Setup.Checkout.Tag); err != nil {
24-
log.Error(ctx, "Repositories> processCheckout> FetchRemoteTag> [%s] error %v", op.UUID, err)
25-
return err
23+
return sdk.WithStack(err)
2624
}
2725
} else {
2826
if op.Setup.Checkout.Branch == "" {
2927
op.Setup.Checkout.Branch = op.RepositoryInfo.DefaultBranch
3028
}
31-
32-
log.Debug("Repositories> processCheckout> fetching branch %s from %s", op.Setup.Checkout.Branch, op.URL)
29+
log.Debug("processCheckout> fetching branch %s from %s", op.Setup.Checkout.Branch, op.URL)
3330
if err := gitRepo.FetchRemoteBranch("origin", op.Setup.Checkout.Branch); err != nil {
34-
log.Error(ctx, "Repositories> processCheckout> FetchRemoteBranch> [%s] error %v", op.UUID, err)
35-
return err
31+
return sdk.WithStack(err)
3632
}
3733
}
3834

39-
//Check commit
35+
// Check commit
4036
if op.Setup.Checkout.Commit == "" {
41-
log.Debug("Repositories> processCheckout> pulling branch %s", op.Setup.Checkout.Branch)
37+
log.Debug("processCheckout> pulling branch %s", op.Setup.Checkout.Branch)
4238
if err := gitRepo.Pull("origin", op.Setup.Checkout.Branch); err != nil {
43-
log.Error(ctx, "Repositories> processCheckout> Pull without commit> [%s] error %v", op.UUID, err)
44-
return err
39+
return sdk.WithStack(err)
4540
}
4641
} else {
4742
currentCommit, err := gitRepo.LatestCommit()
4843
if err != nil {
49-
log.Error(ctx, "Repositories> processCheckout> LatestCommit> [%s] error %v", op.UUID, err)
50-
return err
44+
return sdk.WithStack(err)
5145
}
5246
if currentCommit.LongHash != op.Setup.Checkout.Commit {
53-
//Not the same commit
54-
//Pull and reset HARD the commit
55-
log.Debug("Repositories> processCheckout> resetting the branch %s from remote", op.Setup.Checkout.Branch)
47+
// Not the same commit, pull and reset HARD the commit
48+
log.Debug("processCheckout> resetting the branch %s from remote", op.Setup.Checkout.Branch)
5649
if err := gitRepo.ResetHard("origin/" + op.Setup.Checkout.Branch); err != nil {
57-
log.Error(ctx, "Repositories> processCheckout> ResetHard> [%s] error %v", op.UUID, err)
58-
return err
50+
return sdk.WithStack(err)
5951
}
6052

6153
log.Debug("Repositories> processCheckout> reseting commit %s", op.Setup.Checkout.Commit)
6254
if err := gitRepo.ResetHard(op.Setup.Checkout.Commit); err != nil {
63-
log.Error(ctx, "Repositories> processCheckout> ResetHard> [%s] error %v", op.UUID, err)
64-
return err
55+
return sdk.WithStack(err)
6556
}
6657
}
6758
}
6859

69-
log.Info(ctx, "Repositories> processCheckout> repository %s ready", op.URL)
60+
log.Info(ctx, "processCheckout> repository %s ready", op.URL)
7061
return nil
7162
}

engine/repositories/processor_common.go

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -14,38 +14,36 @@ func (s *Service) processGitClone(ctx context.Context, op *sdk.Operation) (repo.
1414

1515
r := s.Repo(*op)
1616
if err := s.checkOrCreateFS(r); err != nil {
17-
log.Error(ctx, "Repositories> processGitClone> checkOrCreateFS> [%s] Error %v", op.UUID, err)
1817
return gitRepo, "", "", err
1918
}
2019

2120
// Get the git repository
2221
opts := []repo.Option{repo.WithVerbose()}
22+
2323
if op.RepositoryStrategy.ConnectionType == "ssh" {
24-
log.Debug("Repositories> processGitClone> using ssh key %s", op.RepositoryStrategy.SSHKey)
24+
log.Debug("processGitClone> using ssh key %s", op.RepositoryStrategy.SSHKey)
2525
opts = append(opts, repo.WithSSHAuth([]byte(op.RepositoryStrategy.SSHKeyContent)))
2626
} else if op.RepositoryStrategy.User != "" && op.RepositoryStrategy.Password != "" {
27+
log.Debug("processGitClone> using user %s", op.RepositoryStrategy.User)
2728
opts = append(opts, repo.WithHTTPAuth(op.RepositoryStrategy.User, op.RepositoryStrategy.Password))
2829
}
2930

3031
gitRepo, err := repo.New(r.Basedir, opts...)
3132
if err != nil {
32-
log.Info(ctx, "Repositories> processGitClone> cloning %s into %s", r.URL, r.Basedir)
33+
log.Info(ctx, "processGitClone> cloning %s into %s", r.URL, r.Basedir)
3334
gitRepo, err = repo.Clone(r.Basedir, r.URL, opts...)
3435
if err != nil {
35-
log.Error(ctx, "Repositories> processGitClone> Clone> [%s] error %v", op.UUID, err)
3636
return gitRepo, "", "", err
3737
}
3838
}
3939

4040
f, err := gitRepo.FetchURL()
4141
if err != nil {
42-
log.Error(ctx, "Repositories> processGitClone> gitRepo.FetchURL> [%s] Error: %v", op.UUID, err)
4342
return gitRepo, "", "", err
4443
}
4544

4645
d, err := gitRepo.DefaultBranch()
4746
if err != nil {
48-
log.Error(ctx, "Repositories> processGitClone> DefaultBranch> [%s] Error: %v", op.UUID, err)
4947
return gitRepo, "", "", err
5048
}
5149

@@ -58,7 +56,6 @@ func (s *Service) processGitClone(ctx context.Context, op *sdk.Operation) (repo.
5856
//Check branch
5957
currentBranch, err := gitRepo.CurrentBranch()
6058
if err != nil {
61-
log.Error(ctx, "Repositories> processGitClone> CurrentBranch> [%s] error %v", op.UUID, err)
6259
return gitRepo, "", "", err
6360
}
6461
return gitRepo, r.Basedir, currentBranch, nil

0 commit comments

Comments
 (0)