From 1a0d43d50495bd8b48de6930d4d0352e3f62d720 Mon Sep 17 00:00:00 2001 From: Abdhesh Nayak Date: Fri, 15 Mar 2024 17:24:35 +0530 Subject: [PATCH] :sparkles: Added build trigger option --- .../internal/app/adapter-github.go | 13 ++-- .../internal/app/git-webhook-consumer.go | 2 +- .../internal/domain/build.go | 78 ++++++++++++++++++- 3 files changed, 82 insertions(+), 11 deletions(-) diff --git a/apps/container-registry/internal/app/adapter-github.go b/apps/container-registry/internal/app/adapter-github.go index dd5596c39..8752d9238 100644 --- a/apps/container-registry/internal/app/adapter-github.go +++ b/apps/container-registry/internal/app/adapter-github.go @@ -22,6 +22,7 @@ import ( "github.com/kloudlite/api/pkg/errors" "github.com/kloudlite/api/pkg/logging" + // fn "kloudlite.io/pkg/functions" "github.com/kloudlite/api/pkg/types" ) @@ -175,16 +176,12 @@ func (gh *githubI) GetLatestCommit(ctx context.Context, accToken *entities.Acces return "", errors.NewE(err) } - inst, _, err := gh.ghCli.Apps.FindRepositoryInstallation(ctx, owner, repo) - if err != nil { - return "", errors.NewEf(err, "could not fetch repository installation") - } - installationId := *inst.ID - it, _, err := gh.ghCli.Apps.CreateInstallationToken(ctx, installationId, &github.InstallationTokenOptions{}) + rc, _, err := gh.ghCliForUser(ctx, accToken.Token).Repositories.GetCommit(ctx, owner, repo, branchName, &github.ListOptions{}) if err != nil { - return "", errors.NewEf(err, "failed to get installation token") + return "", errors.NewEf(err, "could not get latest commit") } - return it.GetToken(), errors.NewE(err) + + return rc.GetSHA(), nil } // GetToken implements domain.Github. diff --git a/apps/container-registry/internal/app/git-webhook-consumer.go b/apps/container-registry/internal/app/git-webhook-consumer.go index cf93c7d10..0043d82c1 100644 --- a/apps/container-registry/internal/app/git-webhook-consumer.go +++ b/apps/container-registry/internal/app/git-webhook-consumer.go @@ -69,7 +69,7 @@ func processGitWebhooks(ctx context.Context, d domain.Domain, consumer GitWebhoo case constants.ProviderGithub: pullToken, err = d.GithubInstallationToken(ctx, hook.RepoUrl) if err != nil { - fmt.Println(err) + logger.Warnf("could not get pull token for build, Error: %s", err.Error()) return errors.NewE(err) } diff --git a/apps/container-registry/internal/domain/build.go b/apps/container-registry/internal/domain/build.go index 87382b2cf..ee87cfcae 100644 --- a/apps/container-registry/internal/domain/build.go +++ b/apps/container-registry/internal/domain/build.go @@ -2,6 +2,7 @@ package domain import ( "context" + "slices" "github.com/kloudlite/api/apps/container-registry/internal/domain/entities" fc "github.com/kloudlite/api/apps/container-registry/internal/domain/entities/field-constants" @@ -197,7 +198,7 @@ func (d *Impl) DeleteBuild(ctx RegistryContext, buildId repos.ID) error { ResourceRefs: []string{ iamT.NewResourceRef(ctx.AccountName, iamT.ResourceAccount, ctx.AccountName), }, - Action: string(iamT.UpdateAccount), + Action: string(iamT.GetAccount), }) if err != nil { @@ -235,5 +236,78 @@ func (d *Impl) DeleteBuild(ctx RegistryContext, buildId repos.ID) error { } func (d *Impl) TriggerBuild(ctx RegistryContext, buildId repos.ID) error { - panic("implement me") + + co, err := d.iamClient.Can(ctx, &iam.CanIn{ + UserId: string(ctx.UserId), + ResourceRefs: []string{ + iamT.NewResourceRef(ctx.AccountName, iamT.ResourceAccount, ctx.AccountName), + }, + Action: string(iamT.GetAccount), + }) + + if err != nil { + return errors.NewE(err) + } + + if !co.Status { + return errors.Newf("unauthorized to trigger build") + } + + b, err := d.buildRepo.FindById(ctx, buildId) + if err != nil { + return errors.NewE(err) + } + if b == nil { + return errors.Newf("build not found") + } + + var pullToken string + var commitHash string + + if !slices.Contains([]string{"github", "gitlab"}, string(b.Source.Provider)) { + return errors.Newf("provider %s not supported", b.Source.Provider) + } + + at, err := d.getAccessTokenByUserId(ctx, string(b.Source.Provider), ctx.UserId) + if err != nil { + return errors.NewE(err) + } + + switch b.Source.Provider { + case "gitlab": + pullToken, err = d.GitlabPullToken(ctx, ctx.UserId) + if err != nil { + return errors.NewE(err) + } + + commitHash, err = d.gitlab.GetLatestCommit(ctx, at, b.Source.Repository, b.Source.Branch) + if err != nil { + return errors.NewE(err) + } + + case "github": + + pullToken, err = d.GithubInstallationToken(ctx, b.Source.Repository) + if err != nil { + return errors.NewE(err) + } + + commitHash, err = d.github.GetLatestCommit(ctx, at, b.Source.Repository, b.Source.Branch) + if err != nil { + return errors.NewE(err) + } + default: + return errors.Newf("provider %s not supported", b.Source.Provider) + } + + if err := d.CreateBuildRun(ctx, b, &GitWebhookPayload{ + GitProvider: string(b.Source.Provider), + RepoUrl: b.Source.Repository, + GitBranch: b.Source.Branch, + CommitHash: commitHash, + }, pullToken); err != nil { + return errors.NewE(err) + } + + return nil }