Skip to content

Commit e8e50c1

Browse files
authored
Merge pull request #215 from nicholasSUSE/multiRCs-fix-override-version
multi RC's for auto-chart-bumps - patch/minor force bump for auto-chart-bumps
2 parents 11928e2 + c1ccd20 commit e8e50c1

File tree

4 files changed

+192
-51
lines changed

4 files changed

+192
-51
lines changed

main.go

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@ const (
6464
defaultLogLevelEnvironmentVariable = "LOG"
6565
// defaultOverrideVersionEnvironmentVariable is the default environment variable that indicates the version to override
6666
defaultOverrideVersionEnvironmentVariable = "OVERRIDE_VERSION"
67+
// defaultMultiRCEnvironmentVariable is the default environment variable that indicates if the auto-bump should not remove previous RC versions
68+
defaultMultiRCEnvironmentVariable = "MULTI_RC"
6769
)
6870

6971
var (
@@ -103,8 +105,10 @@ var (
103105
SoftErrorMode = false
104106
// RepoRoot represents the root path of the repository
105107
RepoRoot string
106-
// OverrideVersion
108+
// OverrideVersion is the type of version override (patch, minor, auto)
107109
OverrideVersion string
110+
// MultiRC indicates if the auto-bump should not remove previous RC versions
111+
MultiRC bool
108112
)
109113

110114
func init() {
@@ -251,6 +255,13 @@ func main() {
251255
Required: false,
252256
Destination: &RemoteMode,
253257
}
258+
multiRCFlag := cli.BoolFlag{
259+
Name: "multi-rc",
260+
Usage: "default is false, if passed, auto-bump will not remove previous RC versions",
261+
Required: false,
262+
EnvVar: defaultMultiRCEnvironmentVariable,
263+
Destination: &MultiRC,
264+
}
254265
ghTokenFlag := cli.StringFlag{
255266
Name: "gh_token",
256267
Usage: `Usage:
@@ -458,7 +469,7 @@ func main() {
458469
`,
459470
Action: chartBump,
460471
Before: setupCache,
461-
Flags: []cli.Flag{packageFlag, branchFlag, overrideVersionFlag},
472+
Flags: []cli.Flag{packageFlag, branchFlag, overrideVersionFlag, multiRCFlag},
462473
},
463474
}
464475

@@ -1009,7 +1020,7 @@ func chartBump(c *cli.Context) {
10091020
}
10101021

10111022
logger.Log(ctx, slog.LevelInfo, "start auto-chart-bump")
1012-
if err := bump.BumpChart(ctx, OverrideVersion); err != nil {
1023+
if err := bump.BumpChart(ctx, OverrideVersion, MultiRC); err != nil {
10131024
logger.Fatal(ctx, fmt.Errorf("failed to bump: %w", err).Error())
10141025
}
10151026
}

pkg/auto/chart_bump.go

Lines changed: 38 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -218,7 +218,7 @@ func checkUpstreamOptions(options *options.UpstreamOptions) error {
218218

219219
// BumpChart will execute a similar approach as the defined development workflow for chartowners.
220220
// The main difference is that between the steps: (make prepare and make patch) we will calculate the next version to release.
221-
func (b *Bump) BumpChart(ctx context.Context, versionOverride string) error {
221+
func (b *Bump) BumpChart(ctx context.Context, versionOverride string, multiRCs bool) error {
222222
// List the possible target charts
223223
targetCharts, err := chartsTargets(b.targetChart)
224224
if err != nil {
@@ -335,14 +335,24 @@ func (b *Bump) BumpChart(ctx context.Context, versionOverride string) error {
335335
return err
336336
}
337337

338-
bumpVersion := b.Pkg.AutoGeneratedBumpVersion.String()
338+
if !multiRCs {
339+
if strings.Contains(b.versions.toRelease.txt, "-rc") {
339340

340-
// TODO: Create option to skip removal of -RC (rancher-webhook for example)
341-
if strings.Contains(b.versions.latest.txt, "-rc") {
342-
logger.Log(ctx, slog.LevelInfo, "removing last -RC version", slog.String("latestVersion", b.versions.latest.txt))
343-
if err := b.makeRemove(targetCharts, git); err != nil {
344-
logger.Log(ctx, slog.LevelError, "error while removing -RC version", logger.Err(err))
345-
return err
341+
listRCVersions, err := listRCVersions(b.versions.toRelease.txt, b.assetsVersionsMap[b.targetChart])
342+
if err != nil {
343+
logger.Log(ctx, slog.LevelError, "error while listing RC versions", logger.Err(err))
344+
return err
345+
}
346+
347+
if len(listRCVersions) > 0 {
348+
for _, rcVersion := range listRCVersions {
349+
logger.Log(ctx, slog.LevelInfo, "removing RC version", slog.String("rcVersion", rcVersion))
350+
if err := makeRemove(rcVersion, targetCharts, git); err != nil {
351+
logger.Log(ctx, slog.LevelError, "error while removing -RC version", logger.Err(err))
352+
return err
353+
}
354+
}
355+
}
346356
}
347357
}
348358

@@ -371,6 +381,7 @@ func (b *Bump) BumpChart(ctx context.Context, versionOverride string) error {
371381
return err
372382
}
373383

384+
bumpVersion := b.Pkg.AutoGeneratedBumpVersion.String()
374385
logger.Log(ctx, slog.LevelInfo, "bump version", slog.String("bumpVersion", bumpVersion))
375386
return writeBumpJSON(targetCharts, bumpVersion)
376387
}
@@ -481,11 +492,9 @@ func chartsTargets(targetChart string) ([]string, error) {
481492
return nil, fmt.Errorf("chart %s not listed", targetChart)
482493
}
483494

484-
func (b *Bump) makeRemove(targetCharts []string, g *git.Git) error {
485-
version := b.versions.latestRepoPrefix.txt + "+up" + b.versions.latest.txt
486-
495+
func makeRemove(targetVersion string, targetCharts []string, g *git.Git) error {
487496
for _, chart := range targetCharts {
488-
cmd := exec.Command("make", "remove", fmt.Sprintf("CHART=%s", chart), fmt.Sprintf("VERSION=%s", version))
497+
cmd := exec.Command("make", "remove", fmt.Sprintf("CHART=%s", chart), fmt.Sprintf("VERSION=%s", targetVersion))
489498
cmd.Stdout = os.Stdout
490499
cmd.Stderr = os.Stderr
491500
if err := cmd.Run(); err != nil {
@@ -537,3 +546,20 @@ func checkBumpAppVersion(ctx context.Context, bumpAppVersion *string, versions [
537546

538547
return false, nil
539548
}
549+
550+
func listRCVersions(rcVersion string, assets []lifecycle.Asset) ([]string, error) {
551+
idx := strings.Index(rcVersion, "-rc")
552+
if idx == -1 {
553+
return nil, fmt.Errorf("invalid rcVersion format: %s", rcVersion)
554+
}
555+
rcVersionCheckStr := rcVersion[:idx+len("-rc")]
556+
557+
var rcVersions []string
558+
for _, asset := range assets {
559+
if strings.Contains(asset.Version, rcVersionCheckStr) {
560+
rcVersions = append(rcVersions, asset.Version)
561+
}
562+
}
563+
564+
return rcVersions, nil
565+
}

pkg/auto/chart_bump_versions.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"strings"
77

88
"github.com/blang/semver"
9+
"github.com/rancher/charts-build-scripts/pkg/lifecycle"
910
"github.com/rancher/charts-build-scripts/pkg/logger"
1011
)
1112

@@ -77,21 +78,18 @@ func (b *Bump) loadVersions() error {
7778
toReleaseRepoPrefix: &version{},
7879
}
7980

80-
// latestVersion and latestRepoPrefixVersion are the latest versions from the index.yaml
81-
// get the latest released version from the index.yaml (the first version is the latest; already sorted)
82-
latestUnparsedVersion := b.assetsVersionsMap[b.targetChart][0].Version
83-
if latestUnparsedVersion == "" {
84-
return errChartLatestVersion
85-
}
86-
8781
// Latest version may/may not contain a repoPrefixVersion
88-
latestRepoPrefix, latestVersion, found := parseRepoPrefixVersionIfAny(latestUnparsedVersion)
82+
latestRepoPrefix, latestVersion, found, err := getLatestVersionFromIndex(b.assetsVersionsMap[b.targetChart])
83+
if err != nil {
84+
return err
85+
}
8986
if found {
9087
b.versions.latestRepoPrefix.txt = latestRepoPrefix
9188
if err := b.versions.latestRepoPrefix.updateSemver(); err != nil {
9289
return err
9390
}
9491
}
92+
9593
b.versions.latest.txt = latestVersion
9694
if err := b.versions.latest.updateSemver(); err != nil {
9795
return err
@@ -120,6 +118,27 @@ func (b *Bump) loadVersions() error {
120118
return nil
121119
}
122120

121+
func getLatestVersionFromIndex(versions []lifecycle.Asset) (string, string, bool, error) {
122+
// latestVersion and latestRepoPrefixVersion are the latest versions from the index.yaml
123+
// get the latest released version from the index.yaml (the first version is the latest; already sorted)
124+
latestUnparsedVersion := getLatestVersionRecursively(versions)
125+
if latestUnparsedVersion == "" {
126+
return "", "", false, errChartLatestVersion
127+
}
128+
129+
latestRepoPrefix, latestVersion, found := parseRepoPrefixVersionIfAny(latestUnparsedVersion)
130+
return latestRepoPrefix, latestVersion, found, nil
131+
}
132+
133+
func getLatestVersionRecursively(versions []lifecycle.Asset) string {
134+
latestVersion := versions[0].Version
135+
if strings.Contains(latestVersion, "-rc") {
136+
return getLatestVersionRecursively(versions[1:])
137+
}
138+
139+
return latestVersion
140+
}
141+
123142
// parseRepoPrefixVersionIfAny will parse the repository prefix version if it exists
124143
func parseRepoPrefixVersionIfAny(unparsedVersion string) (repoPrefix, version string, found bool) {
125144
found = strings.Contains(unparsedVersion, "+up")
@@ -177,12 +196,14 @@ func (b *Bump) applyVersionRules(versionOverride string) error {
177196
}
178197

179198
} else if versionOverride == "patch" {
180-
b.versions.toReleaseRepoPrefix.svr = b.versions.latestRepoPrefix.svr
199+
b.versions.toReleaseRepoPrefix.txt = b.versions.latestRepoPrefix.txt
200+
b.versions.toReleaseRepoPrefix.updateSemver()
181201
b.versions.toReleaseRepoPrefix.svr.Patch++
182202
b.versions.toReleaseRepoPrefix.svr.Minor = 0
183203
b.versions.toReleaseRepoPrefix.updateTxt()
184204
} else if versionOverride == "minor" {
185-
b.versions.toReleaseRepoPrefix.svr = b.versions.latestRepoPrefix.svr
205+
b.versions.toReleaseRepoPrefix.txt = b.versions.latestRepoPrefix.txt
206+
b.versions.toReleaseRepoPrefix.updateSemver()
186207
b.versions.toReleaseRepoPrefix.svr.Minor++
187208
b.versions.toReleaseRepoPrefix.svr.Patch = 0
188209
b.versions.toReleaseRepoPrefix.updateTxt()

0 commit comments

Comments
 (0)