From e07fe81f59761c68fe7ff20ddf9243008b9fa975 Mon Sep 17 00:00:00 2001 From: Shirinbek Shirinbekov Date: Tue, 30 Dec 2025 18:16:56 +0300 Subject: [PATCH] fix(server): change git clone to clone with context for potential bug, add global ctx to taskManager Signed-off-by: Shirinbek Shirinbekov --- server/path_publish.go | 11 ++++++----- server/path_release.go | 11 ++++++----- server/pkg/git/repository.go | 5 +++-- server/pkg/git/signatures_loader_test.go | 6 +++++- server/pkg/git/signatures_test.go | 7 +++++-- server/pkg/tasks_manager/actions.go | 2 +- 6 files changed, 26 insertions(+), 16 deletions(-) diff --git a/server/path_publish.go b/server/path_publish.go index 92c3c08b..487381a2 100644 --- a/server/path_publish.go +++ b/server/path_publish.go @@ -2,6 +2,7 @@ package server import ( "context" + "errors" "fmt" "strings" @@ -106,7 +107,7 @@ func (b *Backend) pathPublish(ctx context.Context, req *logical.Request, fields return nil, fmt.Errorf("error getting publisher repository: %w", err) } - taskUUID, err := b.TasksManager.RunTask(context.Background(), req.Storage, func(ctx context.Context, storage logical.Storage) error { + taskUUID, err := b.TasksManager.RunTask(ctx, req.Storage, func(ctx context.Context, storage logical.Storage) error { logboek.Context(ctx).Default().LogF("Started task\n") b.Logger().Debug("Started task") @@ -114,7 +115,7 @@ func (b *Backend) pathPublish(ctx context.Context, req *logical.Request, fields b.Logger().Debug("Cloning git repo") gitBranch := cfg.GitTrdlChannelsBranch - gitRepo, err := cloneGitRepositoryBranch(cfg.GitRepoUrl, gitBranch, gitUsername, gitPassword) + gitRepo, err := cloneGitRepositoryBranch(ctx, cfg.GitRepoUrl, gitBranch, gitUsername, gitPassword) if err != nil { return fmt.Errorf("unable to clone git repository: %w", err) } @@ -203,7 +204,7 @@ func (b *Backend) pathPublish(ctx context.Context, req *logical.Request, fields return nil }) if err != nil { - if err == tasks_manager.ErrBusy { + if errors.Is(err, tasks_manager.ErrBusy) { return logical.ErrorResponse("busy"), nil } @@ -306,7 +307,7 @@ func NewErrIncorrectChannelName(chnl string) error { return fmt.Errorf(`got incorrect channel name %q: expected "dev", "alpha", "beta", "ea", "stable" or "rock-solid"`, chnl) } -func cloneGitRepositoryBranch(url, gitBranch, username, password string) (*git.Repository, error) { +func cloneGitRepositoryBranch(ctx context.Context, url, gitBranch, username, password string) (*git.Repository, error) { cloneGitOptions := trdlGit.CloneOptions{ BranchName: gitBranch, RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, @@ -319,7 +320,7 @@ func cloneGitRepositoryBranch(url, gitBranch, username, password string) (*git.R } } - gitRepo, err := trdlGit.CloneInMemory(url, cloneGitOptions) + gitRepo, err := trdlGit.CloneInMemory(ctx, url, cloneGitOptions) if err != nil { return nil, err } diff --git a/server/path_release.go b/server/path_release.go index b6bc8d4f..ea1f9bfe 100644 --- a/server/path_release.go +++ b/server/path_release.go @@ -3,6 +3,7 @@ package server import ( "archive/tar" "context" + "errors" "fmt" "io" "strings" @@ -113,14 +114,14 @@ func (b *Backend) pathRelease(ctx context.Context, req *logical.Request, fields return nil, fmt.Errorf("error getting publisher repository: %w", err) } - taskUUID, err := b.TasksManager.RunTask(context.Background(), req.Storage, func(ctx context.Context, storage logical.Storage) error { + taskUUID, err := b.TasksManager.RunTask(ctx, req.Storage, func(ctx context.Context, storage logical.Storage) error { logboek.Context(ctx).Default().LogF("Started task\n") b.Logger().Debug("Started task") logboek.Context(ctx).Default().LogF("Cloning git repo\n") b.Logger().Debug("Cloning git repo") - gitRepo, err := cloneGitRepositoryTag(cfg.GitRepoUrl, gitTag, gitUsername, gitPassword) + gitRepo, err := cloneGitRepositoryTag(ctx, cfg.GitRepoUrl, gitTag, gitUsername, gitPassword) if err != nil { return fmt.Errorf("unable to clone git repository: %w", err) } @@ -214,7 +215,7 @@ func (b *Backend) pathRelease(ctx context.Context, req *logical.Request, fields return nil }) if err != nil { - if err == tasks_manager.ErrBusy { + if errors.Is(err, tasks_manager.ErrBusy) { return logical.ErrorResponse("busy"), nil } @@ -228,7 +229,7 @@ func (b *Backend) pathRelease(ctx context.Context, req *logical.Request, fields }, nil } -func cloneGitRepositoryTag(url, gitTag, username, password string) (*git.Repository, error) { +func cloneGitRepositoryTag(ctx context.Context, url, gitTag, username, password string) (*git.Repository, error) { cloneGitOptions := trdlGit.CloneOptions{ TagName: gitTag, RecurseSubmodules: git.DefaultSubmoduleRecursionDepth, @@ -241,7 +242,7 @@ func cloneGitRepositoryTag(url, gitTag, username, password string) (*git.Reposit } } - gitRepo, err := trdlGit.CloneInMemory(url, cloneGitOptions) + gitRepo, err := trdlGit.CloneInMemory(ctx, url, cloneGitOptions) if err != nil { return nil, err } diff --git a/server/pkg/git/repository.go b/server/pkg/git/repository.go index c0c6aef2..5e57681d 100644 --- a/server/pkg/git/repository.go +++ b/server/pkg/git/repository.go @@ -2,6 +2,7 @@ package git import ( "archive/tar" + "context" "fmt" "io" "io/ioutil" @@ -24,7 +25,7 @@ type CloneOptions struct { Auth transport.AuthMethod } -func CloneInMemory(url string, opts CloneOptions) (*git.Repository, error) { +func CloneInMemory(ctx context.Context, url string, opts CloneOptions) (*git.Repository, error) { storage := memory.NewStorage() fs := memfs.New() @@ -50,7 +51,7 @@ func CloneInMemory(url string, opts CloneOptions) (*git.Repository, error) { } } - return git.Clone(storage, fs, cloneOptions) + return git.CloneContext(ctx, storage, fs, cloneOptions) } func AddWorktreeFilesToTar(tw *tar.Writer, gitRepo *git.Repository) error { diff --git a/server/pkg/git/signatures_loader_test.go b/server/pkg/git/signatures_loader_test.go index 50f89c07..4153d3d6 100644 --- a/server/pkg/git/signatures_loader_test.go +++ b/server/pkg/git/signatures_loader_test.go @@ -1,6 +1,8 @@ package git import ( + "context" + . "github.com/onsi/ginkgo/v2" . "github.com/onsi/gomega" ) @@ -10,7 +12,9 @@ var _ = XDescribe("Signatures loader from git NOTES", func() { It("successfully loads werf signatures", func() { tagName := "v1.2.84+fix1" - repo, err := CloneInMemory("https://github.com/werf/werf.git", CloneOptions{TagName: tagName}) + ctx := context.Background() + + repo, err := CloneInMemory(ctx, "https://github.com/werf/werf.git", CloneOptions{TagName: tagName}) Expect(err).To(Succeed()) tref, err := repo.Tag(tagName) diff --git a/server/pkg/git/signatures_test.go b/server/pkg/git/signatures_test.go index 496c88c0..e41e71a5 100644 --- a/server/pkg/git/signatures_test.go +++ b/server/pkg/git/signatures_test.go @@ -1,6 +1,7 @@ package git import ( + "context" _ "embed" . "github.com/onsi/ginkgo/v2" @@ -119,8 +120,10 @@ var _ = Describe("VerifyTagSignatures and VerifyCommitSignatures", func() { expectedErrMsg string } + ctx := context.Background() + tableItBodyTagFunc := func(entry tableEntry) { - repo, err := CloneInMemory(testDir, CloneOptions{}) + repo, err := CloneInMemory(ctx, testDir, CloneOptions{}) Expect(err).ShouldNot(HaveOccurred()) err = VerifyTagSignatures( @@ -140,7 +143,7 @@ var _ = Describe("VerifyTagSignatures and VerifyCommitSignatures", func() { } tableItBodyCommitFunc := func(entry tableEntry) { - repo, err := CloneInMemory(testDir, CloneOptions{}) + repo, err := CloneInMemory(ctx, testDir, CloneOptions{}) Expect(err).ShouldNot(HaveOccurred()) head, err := repo.Head() diff --git a/server/pkg/tasks_manager/actions.go b/server/pkg/tasks_manager/actions.go index a57649f6..c76a4e24 100644 --- a/server/pkg/tasks_manager/actions.go +++ b/server/pkg/tasks_manager/actions.go @@ -40,7 +40,7 @@ func (m *Manager) RunTask(ctx context.Context, reqStorage logical.Storage, taskF func (m *Manager) AddOptionalTask(ctx context.Context, reqStorage logical.Storage, taskFunc func(context.Context, logical.Storage) error) (string, bool, error) { taskUUID, err := m.RunTask(ctx, reqStorage, taskFunc) if err != nil { - if err == ErrBusy { + if errors.Is(err, ErrBusy) { return taskUUID, false, nil }