fix(update): 重跑命令从最新 release tag 读取安装脚本
This commit is contained in:
2 files changed
+66
-3
No files matched your search
+34
-3
@@ -50,10 +50,13 @@ type updateTarget struct {
|
|||||||
// and even on the bootstrap path it re-images felis-api from the binary setup is already
|
// and even on the bootstrap path it re-images felis-api from the binary setup is already
|
||||||
// running (FELIS_BOOTSTRAP_BINARY), which looks like an update and changes nothing.
|
// running (FELIS_BOOTSTRAP_BINARY), which looks like an update and changes nothing.
|
||||||
//
|
//
|
||||||
// The URL is the same one-liner both READMEs hand out. While the repo is private it
|
// The URL is the one-liner both READMEs hand out, read at a tag rather than main: the
|
||||||
|
// script's release channel installs the newest release's binary, and main can carry
|
||||||
|
// installer changes that binary was never tested with. installerRef picks the tag and
|
||||||
|
// renderApplyGuidance substitutes it for {ref}. While the repo is private the URL
|
||||||
// answers 404 (raw.githubusercontent.com hides private repos), which is why the trailer
|
// answers 404 (raw.githubusercontent.com hides private repos), which is why the trailer
|
||||||
// below points at the README's token'd form for that case.
|
// below points at the README's token'd form for that case.
|
||||||
const installerRerun = "curl -fsSL https://raw.githubusercontent.com/FelisMC/Felis/main/deploy/bootstrap.sh | sudo bash"
|
const installerRerun = "curl -fsSL https://raw.githubusercontent.com/FelisMC/Felis/{ref}/deploy/bootstrap.sh | sudo bash"
|
||||||
|
|
||||||
// updateTargets is the selector table. panel and plugins both resolve to felis-api
|
// updateTargets is the selector table. panel and plugins both resolve to felis-api
|
||||||
// because they are not separately versioned: the panel is compiled into the felis
|
// because they are not separately versioned: the panel is compiled into the felis
|
||||||
@@ -258,7 +261,7 @@ func renderApplyGuidance(res updater.Result, selected map[string]bool, force boo
|
|||||||
// component, and reinstalling the current release is a valid repair action.
|
// component, and reinstalling the current release is a valid repair action.
|
||||||
fmt.Fprintf(&b, " note: cannot tell whether %s is current — its latest version could not be discovered (see above); this reinstalls it either way\n", t.component)
|
fmt.Fprintf(&b, " note: cannot tell whether %s is current — its latest version could not be discovered (see above); this reinstalls it either way\n", t.component)
|
||||||
}
|
}
|
||||||
fmt.Fprintf(&b, " run: %s\n", t.command)
|
fmt.Fprintf(&b, " run: %s\n", strings.ReplaceAll(t.command, "{ref}", installerRef(byComponent)))
|
||||||
offeredCommand = true
|
offeredCommand = true
|
||||||
}
|
}
|
||||||
// Only explain the command when one was actually offered; a --mc-only run has
|
// Only explain the command when one was actually offered; a --mc-only run has
|
||||||
@@ -277,3 +280,31 @@ func renderApplyGuidance(res updater.Result, selected map[string]bool, force boo
|
|||||||
}
|
}
|
||||||
return b.String()
|
return b.String()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// installerRef is the git ref the installer re-run reads bootstrap.sh from: the newest
|
||||||
|
// stable felis release when the feed answered, which is the release that script then
|
||||||
|
// installs; else the release this host runs; main only when neither is a release tag.
|
||||||
|
func installerRef(byComponent map[string]updates.Action) string {
|
||||||
|
a, ok := byComponent["felis-api"]
|
||||||
|
if !ok {
|
||||||
|
return "main"
|
||||||
|
}
|
||||||
|
if a.LatestKnown && isReleaseTag(a.Latest) {
|
||||||
|
return a.Latest.String()
|
||||||
|
}
|
||||||
|
if isReleaseTag(a.Current) {
|
||||||
|
return a.Current.String()
|
||||||
|
}
|
||||||
|
return "main"
|
||||||
|
}
|
||||||
|
|
||||||
|
// isReleaseTag reports whether v was read from a stable vX.Y.Z tag, the only refs
|
||||||
|
// release.yml publishes a binary for.
|
||||||
|
func isReleaseTag(v updates.Version) bool {
|
||||||
|
s := v.String()
|
||||||
|
if !strings.HasPrefix(s, "v") || v.IsPrerelease() {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
_, err := updates.Parse(s)
|
||||||
|
return err == nil
|
||||||
|
}
|
||||||
@@ -167,3 +167,35 @@ func TestApplyGuidancePointsEveryComponentAtTheInstaller(t *testing.T) {
|
|||||||
t.Fatalf("--mc offers no command; the trailer is a non-sequitur:\n%s", mc)
|
t.Fatalf("--mc offers no command; the trailer is a non-sequitur:\n%s", mc)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The re-run reads bootstrap.sh at the tag whose binary it installs. main can carry
|
||||||
|
// installer changes no release was tested with.
|
||||||
|
func TestApplyGuidanceReadsTheInstallerAtTheReleaseTag(t *testing.T) {
|
||||||
|
v := func(s string) updates.Version {
|
||||||
|
t.Helper()
|
||||||
|
out, err := updates.Parse(s)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
cases := []struct {
|
||||||
|
name string
|
||||||
|
api []updates.Action
|
||||||
|
want string
|
||||||
|
}{
|
||||||
|
{"latest known", []updates.Action{{Component: "felis-api", Kind: updates.ActionNotify, Current: v("v1.3.0"), Latest: v("v1.4.0"), LatestKnown: true}}, "/FelisMC/Felis/v1.4.0/deploy/bootstrap.sh"},
|
||||||
|
{"latest unknown", []updates.Action{{Component: "felis-api", Kind: updates.ActionNone, Current: v("v1.3.0")}}, "/FelisMC/Felis/v1.3.0/deploy/bootstrap.sh"},
|
||||||
|
{"prerelease latest", []updates.Action{{Component: "felis-api", Kind: updates.ActionNone, Current: v("v1.3.0"), Latest: v("v1.4.0-rc.1"), LatestKnown: true}}, "/FelisMC/Felis/v1.3.0/deploy/bootstrap.sh"},
|
||||||
|
{"nothing known", nil, "/FelisMC/Felis/main/deploy/bootstrap.sh"},
|
||||||
|
}
|
||||||
|
for _, c := range cases {
|
||||||
|
out := renderApplyGuidance(planResult(c.api), map[string]bool{"velocity": true, "panel": true}, true)
|
||||||
|
if !strings.Contains(out, c.want) {
|
||||||
|
t.Errorf("%s: want %q in:\n%s", c.name, c.want, out)
|
||||||
|
}
|
||||||
|
if strings.Contains(out, "{ref}") {
|
||||||
|
t.Errorf("%s: placeholder left in:\n%s", c.name, out)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in new issue
Block a user