From 0cd440aa013e74aaf653b02fe013bf15f6c7466e Mon Sep 17 00:00:00 2001 From: Charles Guertin Date: Fri, 1 Apr 2022 17:39:16 -0400 Subject: [PATCH] ignore k3s pre-releases (#18) * Bump latest release to v1.0.4 in manifests * Fix pre-release being pushed. * Warning message when a pre-release is available * Fix unit tests. * Add test build flag to unit tests --- Makefile | 2 +- go.mod | 2 +- manifests/kustomization.yaml | 2 +- pkg/updater/operations.go | 13 ++++++ pkg/updater/operations_test.go | 82 +++++++++++++++++++++------------- 5 files changed, 68 insertions(+), 33 deletions(-) diff --git a/Makefile b/Makefile index d974747..35a95c2 100644 --- a/Makefile +++ b/Makefile @@ -9,7 +9,7 @@ build: @go build -o ./${BIN_NAME} . test: - @go test -v ./... -coverprofile coverage.out + @go test --tags unit -v ./... -coverprofile coverage.out go tool cover -html=coverage.out -o coverage.html generate-mock: diff --git a/go.mod b/go.mod index 0d7faf3..fa085f5 100644 --- a/go.mod +++ b/go.mod @@ -1,6 +1,6 @@ module github.com/cguertin14/k3supdater -go 1.17 +go 1.18 require ( github.com/cguertin14/logger v1.0.6 diff --git a/manifests/kustomization.yaml b/manifests/kustomization.yaml index 99b8273..0a35755 100644 --- a/manifests/kustomization.yaml +++ b/manifests/kustomization.yaml @@ -13,4 +13,4 @@ resources: images: # Needs to be updated on each new release - name: quay.io/cguertin14/k3supdater - newTag: v1.0.3 + newTag: v1.0.4 diff --git a/pkg/updater/operations.go b/pkg/updater/operations.go index 70577bb..d07243a 100644 --- a/pkg/updater/operations.go +++ b/pkg/updater/operations.go @@ -108,11 +108,20 @@ func (c *ClientSet) getLatestK3sRelease(ctx context.Context, req getLatestK3sRel // Find latest stable versions among all releases latestStableVersions := make([]*github.RepositoryRelease, 0) for _, r := range releases { + // Exclude pre-releases, since they're + // not fully ready yet + if *r.Prerelease { + logger.Warnf("A new pre-release is available: %q\n", *r.Name) + continue + } + // Exclude release candidates since // they're not stable versions if strings.Contains(*r.Name, "rc") { continue } + + // Keep only three releases. if len(latestStableVersions) < 3 { latestStableVersions = append(latestStableVersions, r) } @@ -132,6 +141,10 @@ func (c *ClientSet) getLatestK3sRelease(ctx context.Context, req getLatestK3sRel // version is more recent than the other ones. latestRelease = v logger.Warnf("A new k3s version is available: %q", *latestRelease.Name) + + // FUTURE TODO: Send a notification via Slack, Email, Discord, whatever, to inform + // user about the new version available. + break } } diff --git a/pkg/updater/operations_test.go b/pkg/updater/operations_test.go index e9ae336..3aec816 100644 --- a/pkg/updater/operations_test.go +++ b/pkg/updater/operations_test.go @@ -1,3 +1,5 @@ +//+build test + package updater import ( @@ -56,13 +58,13 @@ func TestUpdateK3sRelease(t *testing.T) { for name, c := range cases { t.Run(name, func(t *testing.T) { + ctrl := gomock.NewController(t) + defer ctrl.Finish() + if c.currentVersion == "" { c.currentVersion = "v1.23.3" } - ctrl := gomock.NewController(t) - defer ctrl.Finish() - // create new mock client instance githubMockClient := github_mocks.NewMockClient(ctrl) @@ -79,20 +81,24 @@ func TestUpdateK3sRelease(t *testing.T) { MaxTimes(1). Return([]*github.RepositoryRelease{ { - Body: github.String("some release notes"), - Name: github.String("v1.23.5-rc1"), + Body: github.String("some release notes"), + Name: github.String("v1.23.5-rc1"), + Prerelease: github.Bool(false), }, { - Body: github.String("some release notes"), - Name: github.String("v1.23.4"), + Body: github.String("some release notes"), + Name: github.String("v1.23.4"), + Prerelease: github.Bool(false), }, { - Body: github.String("some release notes"), - Name: github.String("v1.22.3"), + Body: github.String("some release notes"), + Name: github.String("v1.22.3"), + Prerelease: github.Bool(false), }, { - Body: github.String("some release notes"), - Name: github.String("v1.21.5"), + Body: github.String("some release notes"), + Name: github.String("v1.21.5"), + Prerelease: github.Bool(false), }, }, nil, c.latestReleaseError) githubMockClient.EXPECT().GetBranch(gomock.Any(), gomock.Any()). @@ -127,6 +133,7 @@ func TestUpdateK3sRelease(t *testing.T) { Name: "k3s", }, }) + fmt.Println(err) if c.expectError && err == nil { t.FailNow() } @@ -195,14 +202,42 @@ func TestGetGroupVarsFileContent(t *testing.T) { } func TestGetLatestK3sRelease(t *testing.T) { + commonReleases := []*github.RepositoryRelease{ + { + Body: github.String("some release notes"), + Name: github.String("v1.23.5-rc1"), + Prerelease: github.Bool(false), + }, + { + Body: github.String("some release notes"), + Name: github.String("v1.23.4"), + Prerelease: github.Bool(false), + }, + { + Body: github.String("some release notes"), + Name: github.String("v1.22.3"), + Prerelease: github.Bool(false), + }, + { + Body: github.String("some release notes"), + Name: github.String("v1.21.5"), + Prerelease: github.Bool(false), + }, + } + cases := map[string]struct { fileContent string + preRelease bool expectedError error expectError bool }{ "success case with no error": { - fileContent: base64.StdEncoding.EncodeToString([]byte(fmt.Sprintf("%s: %s", k3sVersionKey, "v1.23.3"))), + fileContent: fmt.Sprintf("%s: %s", k3sVersionKey, "v1.23.3"), + }, + "success case with a pre-release": { + fileContent: fmt.Sprintf("%s: %s", k3sVersionKey, "v1.23.3"), + preRelease: true, }, "error case with response error": { expectedError: errors.New("some error"), @@ -219,30 +254,17 @@ func TestGetLatestK3sRelease(t *testing.T) { ctrl := gomock.NewController(t) defer ctrl.Finish() + if c.preRelease { + commonReleases[0].Prerelease = github.Bool(true) + } + // create new mock client instance githubMockClient := github_mocks.NewMockClient(ctrl) // define mock behavior githubMockClient.EXPECT().GetRepositoryReleases(gomock.Any(), gomock.Any()). MaxTimes(1). - Return([]*github.RepositoryRelease{ - { - Body: github.String("some release notes"), - Name: github.String("v1.23.5-rc1"), - }, - { - Body: github.String("some release notes"), - Name: github.String("v1.23.4"), - }, - { - Body: github.String("some release notes"), - Name: github.String("v1.22.3"), - }, - { - Body: github.String("some release notes"), - Name: github.String("v1.21.5"), - }, - }, nil, c.expectedError) + Return(commonReleases, nil, c.expectedError) // create mock updater client client := NewClient(context.Background(), Dependencies{