Skip to content

Commit 45a8846

Browse files
authored
Merge branch 'main' into fix-gitlab-pending-status-mapping
2 parents 80f8dfc + 420f4c0 commit 45a8846

File tree

12 files changed

+185
-161
lines changed

12 files changed

+185
-161
lines changed

.golangci.yml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ linters:
5858
- zerologlint
5959
settings:
6060
misspell:
61-
ignore-words:
61+
ignore-rules:
6262
- cancelled
6363
extra-words:
6464
- typo: "canceled"
@@ -72,6 +72,8 @@ linters:
7272
- fmt.Fprintln
7373
- (io.Closer).Close
7474
- updateConfigMap
75+
exhaustive:
76+
default-signifies-exhaustive: true
7577
gocritic:
7678
disabled-checks:
7779
- unlambda

pkg/pipelineascode/pipelineascode.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -318,9 +318,11 @@ func (p *PacRun) startPR(ctx context.Context, match matcher.Match) (*tektonv1.Pi
318318
if len(patchAnnotations) > 0 || len(patchLabels) > 0 {
319319
pr, err = action.PatchPipelineRun(ctx, p.logger, whatPatching, p.run.Clients.Tekton, pr, getMergePatch(patchAnnotations, patchLabels))
320320
if err != nil {
321-
// we still return the created PR with error, and allow caller to decide what to do with the PR, and avoid
322-
// unneeded SIGSEGV's
323-
return pr, fmt.Errorf("cannot patch pipelinerun %s: %w", pr.GetGenerateName(), err)
321+
// if PipelineRun patch is failed then do not return error, just log the error
322+
// because its a false negative and on startPR return a failed check is being created
323+
// due to this.
324+
p.logger.Errorf("cannot patch pipelinerun %s: %w", pr.GetGenerateName(), err)
325+
return pr, nil
324326
}
325327
currentReason := ""
326328
if len(pr.Status.GetConditions()) > 0 {

pkg/pipelineascode/pipelineascode_startpr_test.go

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -765,31 +765,29 @@ func TestStartPR_PatchBehavior(t *testing.T) {
765765
patchErrorMsg string
766766
expectError bool
767767
expectErrorContains []string
768+
expectedLogSnippet string
768769
verifyAnnotations bool // whether to verify annotations were set correctly
769770
}{
770771
{
771-
name: "successful patch - all annotations set",
772-
simulatePatchError: false,
773-
expectError: false,
774-
verifyAnnotations: true,
772+
name: "successful patch - all annotations set",
773+
verifyAnnotations: true,
775774
},
776775
{
777-
name: "patch failure - PR still returned with error",
778-
simulatePatchError: true,
779-
patchErrorMsg: "etcd unavailable",
780-
expectError: true,
781-
expectErrorContains: []string{"cannot patch pipelinerun", "etcd unavailable"},
782-
verifyAnnotations: false,
776+
name: "patch failure - PR still returned with error",
777+
simulatePatchError: true,
778+
patchErrorMsg: "etcd unavailable",
779+
expectedLogSnippet: "cannot patch pipelinerun",
780+
verifyAnnotations: false,
783781
},
784782
}
785783

786784
for _, tt := range tests {
787785
t.Run(tt.name, func(t *testing.T) {
786+
observer, log := zapobserver.New(zap.InfoLevel)
787+
logger := zap.New(observer).Sugar()
788788
if tt.simulatePatchError {
789789
// Need custom reactor to simulate patch failure
790790
ctx, _ := rtesting.SetupFakeContext(t)
791-
observer, _ := zapobserver.New(zap.InfoLevel)
792-
logger := zap.New(observer).Sugar()
793791

794792
stdata, _ := testclient.SeedTestData(t, ctx, testclient.Data{
795793
Namespaces: []*corev1.Namespace{
@@ -889,6 +887,11 @@ func TestStartPR_PatchBehavior(t *testing.T) {
889887
assert.NilError(t, err)
890888
assert.Assert(t, pr != nil, "PipelineRun should be returned")
891889

890+
if tt.expectedLogSnippet != "" {
891+
logmsg := log.FilterMessageSnippet(tt.expectedLogSnippet).TakeAll()
892+
assert.Assert(t, len(logmsg) > 0, "log messages", logmsg, tt.expectedLogSnippet)
893+
}
894+
892895
if tt.verifyAnnotations {
893896
state, hasState := pr.GetAnnotations()[keys.State]
894897
assert.Assert(t, hasState, "State annotation should be patched")

pkg/provider/bitbucketdatacenter/bitbucketdatacenter.go

Lines changed: 25 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ type Provider struct {
4242
projectKey string
4343
repo *v1alpha1.Repository
4444
triggerEvent string
45+
cachedChangedFiles *changedfiles.ChangedFiles
4546
}
4647

4748
func (v Provider) Client() *scm.Client {
@@ -371,13 +372,28 @@ func (v *Provider) GetConfig() *info.ProviderConfig {
371372
}
372373
}
373374

375+
// GetFiles gets and caches the list of files changed by a given event.
374376
func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedfiles.ChangedFiles, error) {
375-
OrgAndRepo := fmt.Sprintf("%s/%s", runevent.Organization, runevent.Repository)
376-
if runevent.TriggerTarget == triggertype.PullRequest {
377+
if v.cachedChangedFiles == nil {
378+
changes, err := v.fetchChangedFiles(ctx, runevent)
379+
if err != nil {
380+
return changedfiles.ChangedFiles{}, err
381+
}
382+
v.cachedChangedFiles = &changes
383+
}
384+
return *v.cachedChangedFiles, nil
385+
}
386+
387+
func (v *Provider) fetchChangedFiles(ctx context.Context, runevent *info.Event) (changedfiles.ChangedFiles, error) {
388+
changedFiles := changedfiles.ChangedFiles{}
389+
390+
orgAndRepo := fmt.Sprintf("%s/%s", runevent.Organization, runevent.Repository)
391+
392+
switch runevent.TriggerTarget {
393+
case triggertype.PullRequest:
377394
opts := &scm.ListOptions{Page: 1, Size: apiResponseLimit}
378-
changedFiles := changedfiles.ChangedFiles{}
379395
for {
380-
changes, _, err := v.Client().PullRequests.ListChanges(ctx, OrgAndRepo, runevent.PullRequestNumber, opts)
396+
changes, _, err := v.Client().PullRequests.ListChanges(ctx, orgAndRepo, runevent.PullRequestNumber, opts)
381397
if err != nil {
382398
return changedfiles.ChangedFiles{}, fmt.Errorf("failed to list changes for pull request: %w", err)
383399
}
@@ -408,14 +424,10 @@ func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedf
408424

409425
opts.Page++
410426
}
411-
return changedFiles, nil
412-
}
413-
414-
if runevent.TriggerTarget == triggertype.Push {
427+
case triggertype.Push:
415428
opts := &scm.ListOptions{Page: 1, Size: apiResponseLimit}
416-
changedFiles := changedfiles.ChangedFiles{}
417429
for {
418-
changes, _, err := v.Client().Git.ListChanges(ctx, OrgAndRepo, runevent.SHA, opts)
430+
changes, _, err := v.Client().Git.ListChanges(ctx, orgAndRepo, runevent.SHA, opts)
419431
if err != nil {
420432
return changedfiles.ChangedFiles{}, fmt.Errorf("failed to list changes for commit %s: %w", runevent.SHA, err)
421433
}
@@ -442,9 +454,10 @@ func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedf
442454

443455
opts.Page++
444456
}
445-
return changedFiles, nil
457+
default:
458+
// No action necessary
446459
}
447-
return changedfiles.ChangedFiles{}, nil
460+
return changedFiles, nil
448461
}
449462

450463
func (v *Provider) CreateToken(_ context.Context, _ []string, _ *info.Event) (string, error) {

pkg/provider/bitbucketdatacenter/bitbucketdatacenter_test.go

Lines changed: 22 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,14 @@ import (
2222
"github.com/openshift-pipelines/pipelines-as-code/pkg/params/triggertype"
2323
"github.com/openshift-pipelines/pipelines-as-code/pkg/provider"
2424
bbtest "github.com/openshift-pipelines/pipelines-as-code/pkg/provider/bitbucketdatacenter/test"
25+
"github.com/openshift-pipelines/pipelines-as-code/pkg/test/metrics"
2526

2627
"github.com/jenkins-x/go-scm/scm"
2728
"go.uber.org/zap"
2829
zapobserver "go.uber.org/zap/zaptest/observer"
2930
"gotest.tools/v3/assert"
31+
"knative.dev/pkg/metrics/metricstest"
32+
_ "knative.dev/pkg/metrics/testing"
3033
rtesting "knative.dev/pkg/reconciler/testing"
3134
)
3235

@@ -796,6 +799,7 @@ func TestGetFiles(t *testing.T) {
796799
ctx, _ := rtesting.SetupFakeContext(t)
797800
client, mux, tearDown, tURL := bbtest.SetupBBDataCenterClient()
798801
defer tearDown()
802+
metrics.ResetMetrics()
799803

800804
stats := &bbtest.DiffStats{
801805
Values: tt.changeFiles,
@@ -821,13 +825,17 @@ func TestGetFiles(t *testing.T) {
821825
}
822826
})
823827
}
824-
v := &Provider{client: client, baseURL: tURL}
828+
829+
metricsTags := map[string]string{"provider": "bitbucket-datacenter", "event-type": string(tt.event.TriggerTarget)}
830+
metricstest.CheckStatsNotReported(t, "pipelines_as_code_git_provider_api_request_count")
831+
832+
v := &Provider{client: client, baseURL: tURL, triggerEvent: string(tt.event.TriggerTarget)}
825833
changedFiles, err := v.GetFiles(ctx, tt.event)
826834
if tt.wantError {
827835
assert.Equal(t, err.Error(), tt.errMsg)
828-
return
836+
} else {
837+
assert.NilError(t, err, nil)
829838
}
830-
assert.NilError(t, err, nil)
831839
assert.Equal(t, tt.wantAddedFilesCount, len(changedFiles.Added))
832840
assert.Equal(t, tt.wantDeletedFilesCount, len(changedFiles.Deleted))
833841
assert.Equal(t, tt.wantModifiedFilesCount, len(changedFiles.Modified))
@@ -844,6 +852,17 @@ func TestGetFiles(t *testing.T) {
844852
assert.Equal(t, tt.changeFiles[i].Path.ToString, changedFiles.All[i])
845853
}
846854
}
855+
856+
// Check caching
857+
metricstest.CheckCountData(t, "pipelines_as_code_git_provider_api_request_count", metricsTags, 1)
858+
_, _ = v.GetFiles(ctx, tt.event)
859+
if tt.wantError {
860+
// No caching on error
861+
metricstest.CheckCountData(t, "pipelines_as_code_git_provider_api_request_count", metricsTags, 2)
862+
} else {
863+
// Cache API results on success
864+
metricstest.CheckCountData(t, "pipelines_as_code_git_provider_api_request_count", metricsTags, 1)
865+
}
847866
})
848867
}
849868
}

pkg/provider/github/github.go

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,8 @@ type Provider struct {
5555
PaginedNumber int
5656
userType string // The type of user i.e bot or not
5757
skippedRun
58-
triggerEvent string
58+
triggerEvent string
59+
cachedChangedFiles *changedfiles.ChangedFiles
5960
}
6061

6162
type skippedRun struct {
@@ -518,11 +519,24 @@ func (v *Provider) getPullRequest(ctx context.Context, runevent *info.Event) (*i
518519
return runevent, nil
519520
}
520521

521-
// GetFiles get a files from pull request.
522+
// GetFiles gets and caches the list of files changed by a given event.
522523
func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedfiles.ChangedFiles, error) {
523-
if runevent.TriggerTarget == triggertype.PullRequest {
524+
if v.cachedChangedFiles == nil {
525+
changes, err := v.fetchChangedFiles(ctx, runevent)
526+
if err != nil {
527+
return changedfiles.ChangedFiles{}, err
528+
}
529+
v.cachedChangedFiles = &changes
530+
}
531+
return *v.cachedChangedFiles, nil
532+
}
533+
534+
func (v *Provider) fetchChangedFiles(ctx context.Context, runevent *info.Event) (changedfiles.ChangedFiles, error) {
535+
changedFiles := changedfiles.ChangedFiles{}
536+
537+
switch runevent.TriggerTarget {
538+
case triggertype.PullRequest:
524539
opt := &github.ListOptions{PerPage: v.PaginedNumber}
525-
changedFiles := changedfiles.ChangedFiles{}
526540
for {
527541
repoCommit, resp, err := wrapAPI(v, "list_pull_request_files", func() ([]*github.CommitFile, *github.Response, error) {
528542
return v.Client().PullRequests.ListFiles(ctx, runevent.Organization, runevent.Repository, runevent.PullRequestNumber, opt)
@@ -550,11 +564,7 @@ func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedf
550564
}
551565
opt.Page = resp.NextPage
552566
}
553-
return changedFiles, nil
554-
}
555-
556-
if runevent.TriggerTarget == "push" {
557-
changedFiles := changedfiles.ChangedFiles{}
567+
case triggertype.Push:
558568
rC, _, err := wrapAPI(v, "get_commit_files", func() (*github.RepositoryCommit, *github.Response, error) {
559569
return v.Client().Repositories.GetCommit(ctx, runevent.Organization, runevent.Repository, runevent.SHA, &github.ListOptions{})
560570
})
@@ -576,9 +586,10 @@ func (v *Provider) GetFiles(ctx context.Context, runevent *info.Event) (changedf
576586
changedFiles.Renamed = append(changedFiles.Renamed, *rC.Files[i].Filename)
577587
}
578588
}
579-
return changedFiles, nil
589+
default:
590+
// No action necessary
580591
}
581-
return changedfiles.ChangedFiles{}, nil
592+
return changedFiles, nil
582593
}
583594

584595
// getObject Get an object from a repository.

0 commit comments

Comments
 (0)