From a0cbdd19e871a99b0c40a280d21d0a76cbdb5933 Mon Sep 17 00:00:00 2001 From: nicholasSSUSE Date: Thu, 16 Jan 2025 17:13:51 -0300 Subject: [PATCH 1/3] adding SKIP environment variable for compatibility with Makefiles --- main.go | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/main.go b/main.go index 060da7d..f7d5865 100644 --- a/main.go +++ b/main.go @@ -52,6 +52,8 @@ const ( defaultGHTokenEnvironmentVariable = "GH_TOKEN" // defaultPRNumberEnvironmentVariable is the default environment variable that indicates the PR number defaultPRNumberEnvironmentVariable = "PR_NUMBER" + // defaultSkipEnvironmentVariable is the default environment variable that indicates whether to skip execution + defaultSkipEnvironmentVariable = "SKIP" ) var ( @@ -85,6 +87,8 @@ var ( PullRequest = "" // GithubToken represents the Github Auth token GithubToken string + // Skip indicates whether to skip execution + Skip bool ) func main() { @@ -230,8 +234,10 @@ func main() { Destination: &PullRequest, } skipFlag := cli.BoolFlag{ - Name: "skip", - Usage: "Skip the execution and return success", + Name: "skip", + Usage: "Skip the execution and return success", + EnvVar: defaultSkipEnvironmentVariable, + Destination: &Skip, } // Commands @@ -804,7 +810,7 @@ func release(c *cli.Context) { } func validateRelease(c *cli.Context) { - if c.Bool("skip") { + if Skip { fmt.Println("skipping execution...") return } From 974a402f98962c1863207b915fa00e9ee42fc2ea Mon Sep 17 00:00:00 2001 From: nicholasSSUSE Date: Thu, 16 Jan 2025 17:14:34 -0300 Subject: [PATCH 2/3] improving error handling and edge cases for old chart patch updates --- pkg/auto/validate.go | 43 +++++++++++++++++++++++++++++++++++++++---- 1 file changed, 39 insertions(+), 4 deletions(-) diff --git a/pkg/auto/validate.go b/pkg/auto/validate.go index 111f57f..0d10adf 100644 --- a/pkg/auto/validate.go +++ b/pkg/auto/validate.go @@ -113,8 +113,8 @@ func (v *validation) validateReleaseYaml(releaseOpts options.ReleaseOptions) err if len(releasedVersions) <= 1 { continue // net-new chart } - latestReleasedVersion := releasedVersions[1].Version - if err := v.checkMinorPatchVersion(version, latestReleasedVersion); err != nil { + + if err := v.checkMinorPatchVersion(version, releasedVersions); err != nil { return err } } @@ -124,7 +124,14 @@ func (v *validation) validateReleaseYaml(releaseOpts options.ReleaseOptions) err } // checkMinorPatchVersion will check if the chart version is exactly 1 more patch/minor version than the previous chart version or if the chart is being released. If the chart is being forward-ported, this validation is skipped. -func (v *validation) checkMinorPatchVersion(version string, latestReleasedVersion string) error { +func (v *validation) checkMinorPatchVersion(version string, releasedVersions []lifecycle.Asset) error { + var latestReleasedVersion string + if len(releasedVersions) > 1 { + latestReleasedVersion = releasedVersions[len(releasedVersions)-1].Version + } else { + latestReleasedVersion = releasedVersions[0].Version + } + // check if the chart version is being released or forward-ported release, err := v.dep.VR.CheckChartVersionToRelease(version) if err != nil { @@ -140,18 +147,46 @@ func (v *validation) checkMinorPatchVersion(version string, latestReleasedVersio if err != nil { return err } + newVer, err := semver.NewVersion(version) if err != nil { return err } + if newVer.Minor() < latestVer.Minor() { + fmt.Println() + // get the latest version that will be the 1 minor version below the new version + // var maxPatch int64 = 0 + for _, releasedVersion := range releasedVersions { + releasedSemver, err := semver.NewVersion(releasedVersion.Version) + if err != nil { + continue + } + if newVer.Minor() > releasedSemver.Minor() { + continue + } + if releasedSemver.Patch() == newVer.Patch() && + releasedSemver.Minor() == newVer.Minor() && + releasedSemver.Major() == newVer.Major() { + continue + } + if newVer.Minor() == releasedSemver.Minor() { + if newVer.Patch() == releasedSemver.Patch()+1 { + latestVer = releasedSemver + break + } + } + + } + } + // calculate the version bumps minorDiff := newVer.Minor() - latestVer.Minor() patchDiff := newVer.Patch() - latestVer.Patch() // the version bump must be exactly 1 more patch or minor version than the previous chart version if minorDiff > 1 || patchDiff > 1 || minorDiff > 0 && patchDiff > 0 { - return fmt.Errorf("%w; version: %s; latest version: %s", errMinorPatchVersion, version, latestReleasedVersion) + return fmt.Errorf("%w: version: %s", errMinorPatchVersion, version) } return nil From ba02e12fa7e462a63ea5db224686cd0b3e517cee Mon Sep 17 00:00:00 2001 From: nicholasSSUSE Date: Thu, 16 Jan 2025 17:14:44 -0300 Subject: [PATCH 3/3] improving unit-tests --- pkg/auto/validate_test.go | 162 +++++++++++++++++++++++++++++++++----- 1 file changed, 141 insertions(+), 21 deletions(-) diff --git a/pkg/auto/validate_test.go b/pkg/auto/validate_test.go index d5a96f9..372b578 100644 --- a/pkg/auto/validate_test.go +++ b/pkg/auto/validate_test.go @@ -326,9 +326,9 @@ func Test_checkMinorPatchVersion(t *testing.T) { } type input struct { - validation validation - version string - latestReleasedVersion string + validation validation + version string + releasedVersions []lifecycle.Asset } type expected struct { err error @@ -341,35 +341,155 @@ func Test_checkMinorPatchVersion(t *testing.T) { tests := []test{ { - name: "Test #1 [patch update] : Expected NIL", + name: "Test #1.0 [patch update] : Expected NIL", i: input{ validation: validation{ dep: &lifecycle.Dependencies{ VR: vr, }, }, - version: "104.0.1", - latestReleasedVersion: "104.0.0", + version: "104.0.1", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}}, }, ex: expected{ err: nil, }, }, { - name: "Test #2 [minor update] : Expected NIL", + name: "Test #1.1 [minor update] : Expected NIL", i: input{ validation: validation{ dep: &lifecycle.Dependencies{ VR: vr, }, }, - version: "104.1.0", - latestReleasedVersion: "104.0.0", + version: "104.1.0", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}}, }, ex: expected{ err: nil, }, }, + { + name: "Test #1.2 [minor update && > 1 released chart] : Expected NIL", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.2.0", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}}, + }, + ex: expected{ + err: nil, + }, + }, + { + name: "Test #1.3 [patch update && > 1 released chart] : Expected NIL", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.2.1", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: nil, + }, + }, + { + name: "Test #1.4 [patch update (old chart) && > 1 released chart] : Expected NIL", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.1.1", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: nil, + }, + }, + { + name: "Test #1.5 [patch update (old chart) && > 1 released chart] : Expected NIL", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.0.1", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: nil, + }, + }, + { + name: "Test #2.0 [patch update (old chart) && > 1 released chart] : Expected ERR", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.0.2", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.0.2"), + }, + }, + { + name: "Test #2.1 [patch update (old chart) && > 1 released chart] : Expected ERR", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.1.2", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.1.2"), + }, + }, + { + name: "Test #2.2 [patch update (new chart) && > 1 released chart] : Expected ERR", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.2.2", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.2.2"), + }, + }, + { + name: "Test #2.3 [minor/patch update (new chart) && > 1 released chart] : Expected ERR", + i: input{ + validation: validation{ + dep: &lifecycle.Dependencies{ + VR: vr, + }, + }, + version: "104.3.1", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}, {Version: "104.1.0"}, {Version: "104.2.0"}}, + }, + ex: expected{ + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.3.1"), + }, + }, { name: "Test #3 [minor/patch update] : Expected Error", i: input{ @@ -378,11 +498,11 @@ func Test_checkMinorPatchVersion(t *testing.T) { VR: vr, }, }, - version: "104.1.1", - latestReleasedVersion: "104.0.0", + version: "104.1.1", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}}, }, ex: expected{ - err: fmt.Errorf("%w; version: %s; latest version: %s", errMinorPatchVersion, "104.1.1", "104.0.0"), + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.1.1"), }, }, { @@ -393,11 +513,11 @@ func Test_checkMinorPatchVersion(t *testing.T) { VR: vr, }, }, - version: "104.0.2", - latestReleasedVersion: "104.0.0", + version: "104.0.2", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}}, }, ex: expected{ - err: fmt.Errorf("%w; version: %s; latest version: %s", errMinorPatchVersion, "104.0.2", "104.0.0"), + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.0.2"), }, }, { @@ -408,11 +528,11 @@ func Test_checkMinorPatchVersion(t *testing.T) { VR: vr, }, }, - version: "104.3.0", - latestReleasedVersion: "104.0.0", + version: "104.3.0", + releasedVersions: []lifecycle.Asset{{Version: "104.0.0"}}, }, ex: expected{ - err: fmt.Errorf("%w; version: %s; latest version: %s", errMinorPatchVersion, "104.3.0", "104.0.0"), + err: fmt.Errorf("%w: version: %s", errMinorPatchVersion, "104.3.0"), }, }, { @@ -423,8 +543,8 @@ func Test_checkMinorPatchVersion(t *testing.T) { VR: vr, }, }, - version: "103.1.5", - latestReleasedVersion: "104.1.2", + version: "103.1.5", + releasedVersions: []lifecycle.Asset{{Version: "104.1.2"}}, }, ex: expected{ err: nil, @@ -434,7 +554,7 @@ func Test_checkMinorPatchVersion(t *testing.T) { for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - err := tt.i.validation.checkMinorPatchVersion(tt.i.version, tt.i.latestReleasedVersion) + err := tt.i.validation.checkMinorPatchVersion(tt.i.version, tt.i.releasedVersions) if tt.ex.err == nil { assert.Nil(t, err, "expected nil error") } else {