Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: 增加内测模式 #4685

Merged
merged 1 commit into from
Apr 24, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions backend/app/dto/setting.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ type SettingInfo struct {
SystemIP string `json:"systemIP"`
SystemVersion string `json:"systemVersion"`
DockerSockPath string `json:"dockerSockPath"`
DeveloperMode string `json:"developerMode"`

SessionTimeout string `json:"sessionTimeout"`
LocalTime string `json:"localTime"`
Expand Down Expand Up @@ -140,6 +141,7 @@ type SnapshotInfo struct {
}

type UpgradeInfo struct {
TestVersion string `json:"testVersion"`
NewVersion string `json:"newVersion"`
LatestVersion string `json:"latestVersion"`
ReleaseNote string `json:"releaseNote"`
Expand Down
120 changes: 80 additions & 40 deletions backend/app/service/upgrade.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,11 @@ import (
"net/http"
"os"
"path"
"strconv"
"strings"
"time"

"github.com/1Panel-dev/1Panel/backend/app/dto"
"github.com/1Panel-dev/1Panel/backend/buserr"
"github.com/1Panel-dev/1Panel/backend/constant"
"github.com/1Panel-dev/1Panel/backend/global"
"github.com/1Panel-dev/1Panel/backend/utils/cmd"
"github.com/1Panel-dev/1Panel/backend/utils/common"
Expand All @@ -37,45 +36,30 @@ func (u *UpgradeService) SearchUpgrade() (*dto.UpgradeInfo, error) {
if err != nil {
return nil, err
}

latestVersion, err := u.loadVersion(true, currentVersion.Value)
DeveloperMode, err := settingRepo.Get(settingRepo.WithByKey("DeveloperMode"))
if err != nil {
global.LOG.Infof("load latest version failed, err: %v", err)
return nil, err
}
if !common.ComparePanelVersion(string(latestVersion), currentVersion.Value) {
return nil, err
}
upgrade.LatestVersion = latestVersion
if latestVersion[0:4] == currentVersion.Value[0:4] {
upgrade.NewVersion = ""
} else {
newerVersion, err := u.loadVersion(false, currentVersion.Value)
if err != nil {
global.LOG.Infof("load newer version failed, err: %v", err)
return nil, err
}
if newerVersion == currentVersion.Value {
upgrade.NewVersion = ""
} else {
upgrade.NewVersion = newerVersion
}
}

upgrade.TestVersion, upgrade.NewVersion, upgrade.LatestVersion = u.loadVersionByMode(DeveloperMode.Value, currentVersion.Value)
itemVersion := upgrade.LatestVersion
if upgrade.NewVersion != "" {
itemVersion = upgrade.NewVersion
}
notes, err := u.loadReleaseNotes(fmt.Sprintf("%s/%s/%s/release/1panel-%s-release-notes", global.CONF.System.RepoUrl, global.CONF.System.Mode, itemVersion, itemVersion))

if err != nil {
return nil, fmt.Errorf("load releases-notes of version %s failed, err: %v", latestVersion, err)
return nil, fmt.Errorf("load releases-notes of version %s failed, err: %v", itemVersion, err)
}
upgrade.ReleaseNote = notes
return &upgrade, nil
}

func (u *UpgradeService) LoadNotes(req dto.Upgrade) (string, error) {
notes, err := u.loadReleaseNotes(fmt.Sprintf("%s/%s/%s/release/1panel-%s-release-notes", global.CONF.System.RepoUrl, global.CONF.System.Mode, req.Version, req.Version))
mode := global.CONF.System.Mode
if strings.Contains(req.Version, "beta") {
mode = "beta"
}
notes, err := u.loadReleaseNotes(fmt.Sprintf("%s/%s/%s/release/1panel-%s-release-notes", global.CONF.System.RepoUrl, mode, req.Version, req.Version))
if err != nil {
return "", fmt.Errorf("load releases-notes of version %s failed, err: %v", req.Version, err)
}
Expand Down Expand Up @@ -211,36 +195,92 @@ func (u *UpgradeService) handleRollback(originalDir string, errStep int) {
}
}

func (u *UpgradeService) loadVersion(isLatest bool, currentVersion string) (string, error) {
path := fmt.Sprintf("%s/%s/latest", global.CONF.System.RepoUrl, global.CONF.System.Mode)
func (u *UpgradeService) loadVersionByMode(developer, currentVersion string) (string, string, string) {
var current, latest string
if global.CONF.System.Mode == "dev" {
betaVersionLatest := u.loadVersion(true, currentVersion, "beta")
devVersionLatest := u.loadVersion(true, currentVersion, "dev")
if common.ComparePanelVersion(betaVersionLatest, devVersionLatest) {
return betaVersionLatest, "", ""
}
return devVersionLatest, "", ""
}

latest = u.loadVersion(true, currentVersion, "stable")
current = u.loadVersion(false, currentVersion, "stable")
if len(developer) == 0 || developer == "disable" {
return "", current, latest
}
betaVersionLatest := u.loadVersion(true, currentVersion, "beta")

return betaVersionLatest, current, latest
}

func (u *UpgradeService) loadVersion(isLatest bool, currentVersion, mode string) string {
path := fmt.Sprintf("%s/%s/latest", global.CONF.System.RepoUrl, mode)
if !isLatest {
path = fmt.Sprintf("%s/%s/latest.current", global.CONF.System.RepoUrl, global.CONF.System.Mode)
path = fmt.Sprintf("%s/%s/latest.current", global.CONF.System.RepoUrl, mode)
}
latestVersionRes, err := http.Get(path)
if err != nil {
return "", buserr.New(constant.ErrOSSConn)
global.LOG.Errorf("load latest version from oss failed, err: %v", err)
return ""
}
defer latestVersionRes.Body.Close()
version, err := io.ReadAll(latestVersionRes.Body)
if err != nil {
return "", buserr.New(constant.ErrOSSConn)
versionByte, err := io.ReadAll(latestVersionRes.Body)
version := string(versionByte)
if err != nil || strings.Contains(version, "<") {
global.LOG.Errorf("load latest version from oss failed, err: %v", version)
return ""
}
if isLatest {
return string(version), nil
return u.checkVersion(version, currentVersion)
}

versionMap := make(map[string]string)
if err := json.Unmarshal(version, &versionMap); err != nil {
return "", buserr.New(constant.ErrOSSConn)
if err := json.Unmarshal(versionByte, &versionMap); err != nil {
global.LOG.Errorf("load latest version from oss failed (error unmarshal), err: %v", err)
return ""
}

if len(currentVersion) < 4 {
return "", fmt.Errorf("current version is error format: %s", currentVersion)
versionPart := strings.Split(currentVersion, ".")
if len(versionPart) < 3 {
global.LOG.Errorf("current version is error format: %s", currentVersion)
return ""
}
num, _ := strconv.Atoi(versionPart[1])
if num == 0 {
global.LOG.Errorf("current version is error format: %s", currentVersion)
return ""
}
if num >= 10 {
if version, ok := versionMap[currentVersion[0:5]]; ok {
return u.checkVersion(version, currentVersion)
}
return ""
}
if version, ok := versionMap[currentVersion[0:4]]; ok {
return version, nil
return u.checkVersion(version, currentVersion)
}
return ""
}

func (u *UpgradeService) checkVersion(v2, v1 string) string {
addSuffix := false
if !strings.Contains(v1, "-") {
v1 = v1 + "-lts"
}
if !strings.Contains(v2, "-") {
addSuffix = true
v2 = v2 + "-lts"
}
if common.ComparePanelVersion(v2, v1) {
if addSuffix {
return strings.TrimSuffix(v2, "-lts")
}
return v2
}
return "", buserr.New(constant.ErrOSSConn)
return ""
}

func (u *UpgradeService) loadReleaseNotes(path string) (string, error) {
Expand Down
1 change: 1 addition & 0 deletions backend/init/migration/migrate.go
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,7 @@ func Init() {
migrations.AddNoAuthSetting,
migrations.UpdateXpackHideMenu,
migrations.AddMenuTabsSetting,
migrations.AddDeveloperSetting,
})
if err := m.Migrate(); err != nil {
global.LOG.Error(err)
Expand Down
10 changes: 10 additions & 0 deletions backend/init/migration/migrations/v_1_10.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,3 +144,13 @@ var AddMenuTabsSetting = &gormigrate.Migration{
return nil
},
}

var AddDeveloperSetting = &gormigrate.Migration{
ID: "20240423-add-developer-setting",
Migrate: func(tx *gorm.DB) error {
if err := tx.Create(&model.Setting{Key: "DeveloperMode", Value: "disable"}).Error; err != nil {
return err
}
return nil
},
}
27 changes: 24 additions & 3 deletions backend/utils/common/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,8 +49,8 @@ func ComparePanelVersion(version1, version2 string) bool {
if version1 == version2 {
return false
}
version1s := strings.Split(version1, ".")
version2s := strings.Split(version2, ".")
version1s := SplitStr(version1, ".", "-")
version2s := SplitStr(version2, ".", "-")

if len(version2s) > len(version1s) {
for i := 0; i < len(version2s)-len(version1s); i++ {
Expand All @@ -68,7 +68,15 @@ func ComparePanelVersion(version1, version2 string) bool {
if version1s[i] == version2s[i] {
continue
} else {
return version1s[i] > version2s[i]
v1, err1 := strconv.Atoi(version1s[i])
if err1 != nil {
return version1s[i] > version2s[i]
}
v2, err2 := strconv.Atoi(version2s[i])
if err2 != nil {
return version1s[i] > version2s[i]
}
return v1 > v2
}
}
return true
Expand Down Expand Up @@ -296,3 +304,16 @@ func PunycodeEncode(text string) (string, error) {
}
return ascii, nil
}

func SplitStr(str string, spi ...string) []string {
lists := []string{str}
var results []string
for _, s := range spi {
results = []string{}
for _, list := range lists {
results = append(results, strings.Split(list, s)...)
}
lists = results
}
return results
}
15 changes: 15 additions & 0 deletions cmd/server/docs/docs.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions cmd/server/docs/swagger.json
Original file line number Diff line number Diff line change
Expand Up @@ -14668,6 +14668,12 @@
"image": {
"type": "string"
},
"ipv4": {
"type": "string"
},
"ipv6": {
"type": "string"
},
"labels": {
"type": "array",
"items": {
Expand Down Expand Up @@ -17768,6 +17774,9 @@
"defaultNetwork": {
"type": "string"
},
"developerMode": {
"type": "string"
},
"dingVars": {
"type": "string"
},
Expand Down Expand Up @@ -17807,6 +17816,9 @@
"localTime": {
"type": "string"
},
"menuTabs": {
"type": "string"
},
"messageType": {
"type": "string"
},
Expand Down Expand Up @@ -18069,6 +18081,9 @@
},
"releaseNote": {
"type": "string"
},
"testVersion": {
"type": "string"
}
}
},
Expand Down
10 changes: 10 additions & 0 deletions cmd/server/docs/swagger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -444,6 +444,10 @@ definitions:
type: boolean
image:
type: string
ipv4:
type: string
ipv6:
type: string
labels:
items:
type: string
Expand Down Expand Up @@ -2541,6 +2545,8 @@ definitions:
type: string
defaultNetwork:
type: string
developerMode:
type: string
dingVars:
type: string
dockerSockPath:
Expand All @@ -2567,6 +2573,8 @@ definitions:
type: string
localTime:
type: string
menuTabs:
type: string
messageType:
type: string
mfaInterval:
Expand Down Expand Up @@ -2740,6 +2748,8 @@ definitions:
type: string
releaseNote:
type: string
testVersion:
type: string
type: object
dto.UserLoginInfo:
properties:
Expand Down
1 change: 1 addition & 0 deletions frontend/src/api/interface/setting.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ export namespace Setting {
systemIP: string;
systemVersion: string;
dockerSockPath: string;
developerMode: string;

sessionTimeout: number;
localTime: string;
Expand Down
Loading
Loading