Skip to content

Commit ac2b98d

Browse files
authored
Merge pull request #11169 from spowelljr/addBetaNotifications
Add opt-in notifications for beta releases
2 parents 3de6dc0 + c9ccfec commit ac2b98d

File tree

9 files changed

+187
-119
lines changed

9 files changed

+187
-119
lines changed

cmd/minikube/cmd/config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,10 @@ var settings = []Setting{
114114
name: config.WantUpdateNotification,
115115
set: SetBool,
116116
},
117+
{
118+
name: config.WantBetaUpdateNotification,
119+
set: SetBool,
120+
},
117121
{
118122
name: config.ReminderWaitPeriodInHours,
119123
set: SetInt,

cmd/minikube/cmd/update-check.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ var updateCheckCmd = &cobra.Command{
3131
Long: `Print current and latest version number`,
3232
Run: func(command *cobra.Command, args []string) {
3333
url := notify.GithubMinikubeReleasesURL
34-
r, err := notify.GetAllVersionsFromURL(url)
34+
r, err := notify.AllVersionsFromURL(url)
3535
if err != nil {
3636
exit.Error(reason.InetVersionUnavailable, "Unable to fetch latest version info", err)
3737
}

deploy/minikube/releases-beta.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[
2+
]

hack/jenkins/release_update_releases_json.sh

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,6 @@ export DARWIN_SHA256=$(cat out/minikube-darwin-amd64.sha256)
3030
export LINUX_SHA256=$(cat out/minikube-linux-amd64.sha256)
3131
export WINDOWS_SHA256=$(cat out/minikube-windows-amd64.exe.sha256)
3232

33-
if ! [[ "${VERSION_BUILD}" =~ ^[0-9]+$ ]]; then
34-
echo "NOTE: ${TAGNAME} appears to be a non-standard release, not updating releases.json"
35-
exit 0
36-
fi
37-
3833
# Update releases.json w/ new release in gcs and github
3934
git config user.name "minikube-bot"
4035
git config user.email "[email protected]"
@@ -43,20 +38,36 @@ git checkout -b "jenkins-releases.json-${TAGNAME}"
4338

4439
git status
4540

46-
#Prepends the new version to the release.json file
47-
sed -i "0,/{/s/{/{\n \"name\": \"${TAGNAME}\",\n \"checksums\": {\n \"darwin\": \"${DARWIN_SHA256}\",\n \"linux\": \"${LINUX_SHA256}\",\n \"windows\": \"${WINDOWS_SHA256}\"\n }\n },\n {"/ deploy/minikube/releases.json
41+
if ! [[ "${VERSION_BUILD}" =~ ^[0-9]+$ ]]; then
42+
#Prepends the new version to the release-beta.json file
43+
sed -i "0,/{/s/{/{\n \"name\": \"${TAGNAME}\",\n \"checksums\": {\n \"darwin\": \"${DARWIN_SHA256}\",\n \"linux\": \"${LINUX_SHA256}\",\n \"windows\": \"${WINDOWS_SHA256}\"\n }\n },\n {"/ deploy/minikube/releases-beta.json
44+
45+
git add -A
46+
git commit -m "Update releases-beta.json to include ${TAGNAME}"
47+
git remote add minikube-bot [email protected]:minikube-bot/minikube.git
48+
git push -f minikube-bot jenkins-releases.json-${TAGNAME}
49+
50+
# Send PR from minikube-bot/minikube to kubernetes/minikube
51+
curl -X POST -u minikube-bot:${BOT_PASSWORD} -k -d "{\"title\": \"update releases-beta.json to include ${TAGNAME}\",\"head\": \"minikube-bot:jenkins-releases.json-${TAGNAME}\",\"base\": \"master\"}" https://api.github.com/repos/kubernetes/minikube/pulls
4852

49-
#Update the front page of our documentation
50-
now=$(date +"%b %d, %Y")
51-
sed -i "s/Latest Release: .* (/Latest Release: ${TAGNAME} - ${now} (/" site/content/en/docs/_index.md
53+
# Upload file to GCS so that minikube can see the new version
54+
gsutil cp deploy/minikube/releases.json gs://minikube/releases-beta.json
55+
else
56+
#Prepends the new version to the release.json file
57+
sed -i "0,/{/s/{/{\n \"name\": \"${TAGNAME}\",\n \"checksums\": {\n \"darwin\": \"${DARWIN_SHA256}\",\n \"linux\": \"${LINUX_SHA256}\",\n \"windows\": \"${WINDOWS_SHA256}\"\n }\n },\n {"/ deploy/minikube/releases.json
5258

53-
git add -A
54-
git commit -m "Update releases.json to include ${TAGNAME}"
55-
git remote add minikube-bot [email protected]:minikube-bot/minikube.git
56-
git push -f minikube-bot jenkins-releases.json-${TAGNAME}
59+
#Update the front page of our documentation
60+
now=$(date +"%b %d, %Y")
61+
sed -i "s/Latest Release: .* (/Latest Release: ${TAGNAME} - ${now} (/" site/content/en/docs/_index.md
5762

58-
# Send PR from minikube-bot/minikube to kubernetes/minikube
59-
curl -X POST -u minikube-bot:${BOT_PASSWORD} -k -d "{\"title\": \"update releases.json to include ${TAGNAME}\",\"head\": \"minikube-bot:jenkins-releases.json-${TAGNAME}\",\"base\": \"master\"}" https://api.github.com/repos/kubernetes/minikube/pulls
63+
git add -A
64+
git commit -m "Update releases.json to include ${TAGNAME}"
65+
git remote add minikube-bot [email protected]:minikube-bot/minikube.git
66+
git push -f minikube-bot jenkins-releases.json-${TAGNAME}
6067

61-
# Upload file to GCS so that minikube can see the new version
62-
gsutil cp deploy/minikube/releases.json gs://minikube/releases.json
68+
# Send PR from minikube-bot/minikube to kubernetes/minikube
69+
curl -X POST -u minikube-bot:${BOT_PASSWORD} -k -d "{\"title\": \"update releases.json to include ${TAGNAME}\",\"head\": \"minikube-bot:jenkins-releases.json-${TAGNAME}\",\"base\": \"master\"}" https://api.github.com/repos/kubernetes/minikube/pulls
70+
71+
# Upload file to GCS so that minikube can see the new version
72+
gsutil cp deploy/minikube/releases.json gs://minikube/releases.json
73+
fi

pkg/minikube/config/config.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,9 @@ import (
3232
const (
3333
// WantUpdateNotification is the key for WantUpdateNotification
3434
WantUpdateNotification = "WantUpdateNotification"
35-
// ReminderWaitPeriodInHours is the key for WantUpdateNotification
35+
// WantBetaUpdateNotification is the key for WantBetaUpdateNotification
36+
WantBetaUpdateNotification = "WantBetaUpdateNotification"
37+
// ReminderWaitPeriodInHours is the key for ReminderWaitPeriodInHours
3638
ReminderWaitPeriodInHours = "ReminderWaitPeriodInHours"
3739
// WantReportError is the key for WantReportError
3840
WantReportError = "WantReportError"

pkg/minikube/notify/constants.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,4 +19,6 @@ package notify
1919
const (
2020
// GithubMinikubeReleasesURL is the URL of the minikube github releases JSON file
2121
GithubMinikubeReleasesURL = "https://storage.googleapis.com/minikube/releases.json"
22+
// GithubMinikubeBetaReleasesURL is the URL of the minikube Github beta releases JSON file
23+
GithubMinikubeBetaReleasesURL = "https://storage.googleapis.com/minikube/releases-beta.json"
2224
)

pkg/minikube/notify/notify.go

Lines changed: 68 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -43,45 +43,88 @@ var (
4343
)
4444

4545
// MaybePrintUpdateTextFromGithub prints update text if needed, from github
46-
func MaybePrintUpdateTextFromGithub() bool {
47-
return MaybePrintUpdateText(GithubMinikubeReleasesURL, lastUpdateCheckFilePath)
46+
func MaybePrintUpdateTextFromGithub() {
47+
maybePrintUpdateText(GithubMinikubeReleasesURL, GithubMinikubeBetaReleasesURL, lastUpdateCheckFilePath)
4848
}
4949

50-
// MaybePrintUpdateText prints update text, returns a bool if life is good.
51-
func MaybePrintUpdateText(url string, lastUpdatePath string) bool {
50+
func maybePrintUpdateText(latestReleasesURL string, betaReleasesURL string, lastUpdatePath string) {
5251
if !shouldCheckURLVersion(lastUpdatePath) {
53-
return false
52+
return
5453
}
55-
latestVersion, err := getLatestVersionFromURL(url)
54+
latestVersion, err := latestVersionFromURL(latestReleasesURL)
5655
if err != nil {
5756
klog.Warning(err)
58-
return true
57+
return
5958
}
6059
localVersion, err := version.GetSemverVersion()
6160
if err != nil {
6261
klog.Warning(err)
63-
return true
64-
}
65-
if localVersion.Compare(latestVersion) < 0 {
66-
if err := writeTimeToFile(lastUpdateCheckFilePath, time.Now().UTC()); err != nil {
67-
klog.Errorf("write time failed: %v", err)
68-
}
69-
url := "https://github.com/kubernetes/minikube/releases/tag/v" + latestVersion.String()
70-
out.Styled(style.Celebrate, `minikube {{.version}} is available! Download it: {{.url}}`, out.V{"version": latestVersion, "url": url})
71-
out.Styled(style.Tip, "To disable this notice, run: 'minikube config set WantUpdateNotification false'\n")
72-
return true
73-
}
74-
return false
62+
return
63+
}
64+
if maybePrintBetaUpdateText(betaReleasesURL, localVersion, latestVersion, lastUpdatePath) {
65+
return
66+
}
67+
if localVersion.Compare(latestVersion) >= 0 {
68+
return
69+
}
70+
printUpdateText(latestVersion)
71+
}
72+
73+
// maybePrintBetaUpdateText returns true if update text is printed
74+
func maybePrintBetaUpdateText(betaReleasesURL string, localVersion semver.Version, latestFullVersion semver.Version, lastUpdatePath string) bool {
75+
if !shouldCheckURLBetaVersion(lastUpdatePath) {
76+
return false
77+
}
78+
latestBetaVersion, err := latestVersionFromURL(betaReleasesURL)
79+
if err != nil {
80+
klog.Warning(err)
81+
return false
82+
}
83+
if latestFullVersion.Compare(latestBetaVersion) >= 0 {
84+
return false
85+
}
86+
if localVersion.Compare(latestBetaVersion) >= 0 {
87+
return false
88+
}
89+
printBetaUpdateText(latestBetaVersion)
90+
return true
91+
}
92+
93+
func printUpdateTextCommon(version semver.Version) {
94+
if err := writeTimeToFile(lastUpdateCheckFilePath, time.Now().UTC()); err != nil {
95+
klog.Errorf("write time failed: %v", err)
96+
}
97+
url := "https://github.com/kubernetes/minikube/releases/tag/v" + version.String()
98+
out.Styled(style.Celebrate, `minikube {{.version}} is available! Download it: {{.url}}`, out.V{"version": version, "url": url})
99+
}
100+
101+
func printUpdateText(version semver.Version) {
102+
printUpdateTextCommon(version)
103+
out.Styled(style.Tip, "To disable this notice, run: 'minikube config set WantUpdateNotification false'\n")
104+
}
105+
106+
func printBetaUpdateText(version semver.Version) {
107+
printUpdateTextCommon(version)
108+
out.Styled(style.Tip, "To disable beta notices, run: 'minikube config set WantBetaUpdateNotification false'")
109+
out.Styled(style.Tip, "To disable update notices in general, run: 'minikube config set WantUpdateNotification false'\n")
75110
}
76111

77112
func shouldCheckURLVersion(filePath string) bool {
78113
if !viper.GetBool(config.WantUpdateNotification) {
79114
return false
80115
}
81-
lastUpdateTime := getTimeFromFileIfExists(filePath)
116+
lastUpdateTime := timeFromFileIfExists(filePath)
82117
return time.Since(lastUpdateTime).Hours() >= viper.GetFloat64(config.ReminderWaitPeriodInHours)
83118
}
84119

120+
func shouldCheckURLBetaVersion(filePath string) bool {
121+
if !viper.GetBool(config.WantBetaUpdateNotification) {
122+
return false
123+
}
124+
125+
return shouldCheckURLVersion(filePath)
126+
}
127+
85128
// Release represents a release
86129
type Release struct {
87130
Name string
@@ -112,16 +155,16 @@ func getJSON(url string, target *Releases) error {
112155
return json.NewDecoder(resp.Body).Decode(target)
113156
}
114157

115-
func getLatestVersionFromURL(url string) (semver.Version, error) {
116-
r, err := GetAllVersionsFromURL(url)
158+
var latestVersionFromURL = func(url string) (semver.Version, error) {
159+
r, err := AllVersionsFromURL(url)
117160
if err != nil {
118161
return semver.Version{}, err
119162
}
120163
return semver.Make(strings.TrimPrefix(r[0].Name, version.VersionPrefix))
121164
}
122165

123-
// GetAllVersionsFromURL get all versions from a JSON URL
124-
func GetAllVersionsFromURL(url string) (Releases, error) {
166+
// AllVersionsFromURL get all versions from a JSON URL
167+
func AllVersionsFromURL(url string) (Releases, error) {
125168
var releases Releases
126169
klog.Info("Checking for updates...")
127170
if err := getJSON(url, &releases); err != nil {
@@ -141,7 +184,7 @@ func writeTimeToFile(path string, inputTime time.Time) error {
141184
return nil
142185
}
143186

144-
func getTimeFromFileIfExists(path string) time.Time {
187+
func timeFromFileIfExists(path string) time.Time {
145188
lastUpdateCheckTime, err := ioutil.ReadFile(path)
146189
if err != nil {
147190
return time.Time{}

0 commit comments

Comments
 (0)