diff --git a/builder/build/prebuild.go b/builder/build/prebuild.go index b6ff998..748491a 100644 --- a/builder/build/prebuild.go +++ b/builder/build/prebuild.go @@ -29,6 +29,13 @@ var buildkitdConfig = map[string]map[string]map[string][]string{ }, } +const ( + ClosedPRStatus = "closed" + MergedPRStatus = "merged" + OpenPRStatus = "open" + CreatedPRStatus = "created" +) + // define a struct named Build type Build struct { Appname string @@ -255,18 +262,21 @@ func (b *Build) ImageName() (string, error) { func (b *Build) NewPRStatus() string { if b.CreateReviewApp { - return "created" + return CreatedPRStatus } if b.CodebuildWebhookEvent == "PULL_REQUEST_CREATED" || b.CodebuildWebhookEvent == "PULL_REQUEST_REOPENED" { - return "open" + return OpenPRStatus } if b.CodebuildWebhookEvent == "PULL_REQUEST_MERGED" { - return "merged" + return MergedPRStatus + } + if b.CodebuildWebhookEvent == "PULL_REQUEST_CLOSED" { + return ClosedPRStatus } _, err := b.GetPRStatus() if err != nil { b.Log().Debug().Err(err).Msg("failed to get PR status") - return "open" + return OpenPRStatus } return "" } @@ -280,7 +290,7 @@ func (b *Build) HandlePR() (bool, error) { } newStatus := b.NewPRStatus() b.Log().Debug().Str("status", newStatus).Msg("PR status") - if newStatus == "merged" { + if newStatus == MergedPRStatus || newStatus == ClosedPRStatus { hasReviewApp, err := b.ReviewAppStackExists() // TODO err is ignored because it usually means the stack doesn't exist if err != nil { @@ -310,7 +320,7 @@ func (b *Build) HandlePR() (bool, error) { return false, err } } - if status.Status != "created" { + if status.Status != CreatedPRStatus { err = b.SkipBuild() return true, err } diff --git a/builder/build/prebuild_test.go b/builder/build/prebuild_test.go index 3418745..dd31efa 100644 --- a/builder/build/prebuild_test.go +++ b/builder/build/prebuild_test.go @@ -527,6 +527,40 @@ func TestHandlePRMergedAndDestroy(t *testing.T) { mockedState.AssertExpectations(t) } +func TestHandlePRClosedAndDestroy(t *testing.T) { + pr := "pr/123" + appName := "test-app" + mockedAWS := new(MockAWS) + mockedAWS.On( + "DescribeStack", + fmt.Sprintf("apppack-reviewapp-%s%s", appName, strings.Split(pr, "/")[1]), + ).Return(&types.Stack{}, nil) + mockedAWS.On( + "DestroyStack", + fmt.Sprintf("apppack-reviewapp-%s%s", appName, strings.Split(pr, "/")[1]), + ).Return(nil) + mockedState := emptyState() + b := Build{ + Appname: appName, + Pipeline: true, + CodebuildSourceVersion: pr, + CodebuildWebhookEvent: "PULL_REQUEST_CLOSED", + CodebuildBuildId: CodebuildBuildId, + aws: mockedAWS, + state: mockedState, + Ctx: testContext, + } + skip, err := b.HandlePR() + if err != nil { + t.Error("HandlePR should return nil") + } + if !skip { + t.Error("HandlePR should skip the build when the PR is closed") + } + mockedAWS.AssertExpectations(t) + mockedState.AssertExpectations(t) +} + func TestRemoveDuplicateStr(t *testing.T) { slice := []string{"a", "b", "c", "a", "b"} expected := []string{"a", "b", "c"}