diff --git a/pkg/commands/root.go b/pkg/commands/root.go index a1f3f45..43f0fb1 100644 --- a/pkg/commands/root.go +++ b/pkg/commands/root.go @@ -5,6 +5,7 @@ import ( "path/filepath" "github.com/KusionStack/kusionup/pkg/sources" + "github.com/KusionStack/kusionup/pkg/sources/cdn" "github.com/KusionStack/kusionup/pkg/sources/github" "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -26,6 +27,7 @@ func init() { // Init release sources registedReleaseSources = map[string]sources.ReleaseSource{ github.GithubReleaseSource.GetName(): github.GithubReleaseSource, + cdn.GithubReleaseSource.GetName(): cdn.GithubReleaseSource, } var err error diff --git a/pkg/sources/cdn/source.go b/pkg/sources/cdn/source.go new file mode 100644 index 0000000..731992e --- /dev/null +++ b/pkg/sources/cdn/source.go @@ -0,0 +1,56 @@ +package cdn + +import ( + "github.com/KusionStack/kusionup/pkg/sources" + "github.com/KusionStack/kusionup/pkg/util/gitutil" +) + +var GithubReleaseSource sources.ReleaseSource = &releaseSource{} + +type releaseSource struct { + name string // release source name +} + +func (s *releaseSource) GetName() string { + s.name = "cdn" + + return s.name +} + +func (s *releaseSource) GetVersions() []string { + versions := []string{} + + // Get tags from github repo of kusion + remoteURL := "git@github.com:KusionStack/kusion" + + tags, err := gitutil.GetTagListFromRemote(remoteURL, true) + if err != nil { + // klog.Warningf("Get tag list from remote failed, err: %v", err) + return versions + } + + // Hidden timeout tags + isHiddenTag := getIsHiddenTag() + for _, tag := range tags { + if _, hidden := isHiddenTag[tag]; !hidden { + versions = append(versions, tag) + } + } + + return versions +} + +func (s *releaseSource) GetDownloadURL(ver string) (string, error) { + return getArchiveDownloadURL(ver) +} + +func getIsHiddenTag() map[string]struct{} { + hiddenTags := []string{"v0.4.0"} + isHiddenTag := make(map[string]struct{}) + + for _, tag := range hiddenTags { + isHiddenTag[tag] = struct{}{} + } + + return isHiddenTag +} diff --git a/pkg/sources/cdn/types.go b/pkg/sources/cdn/types.go new file mode 100644 index 0000000..713b7a2 --- /dev/null +++ b/pkg/sources/cdn/types.go @@ -0,0 +1,27 @@ +package cdn + +import ( + "fmt" + "runtime" +) + +var ErrUnsupportedOsArch = fmt.Errorf("unsupported os/arch: %s/%s", runtime.GOOS, runtime.GOARCH) + +func getArchiveDownloadURL(ver string) (string, error) { + archiveDownloadURLMap := map[string]string{ + "linux-amd64": "https://gh.api.99988866.xyz/https://github.com/KusionStack/kusion/releases/download/%s/kusion-linux.tgz", + "darwin-amd64": "https://gh.api.99988866.xyz/https://github.com/KusionStack/kusion/releases/download/%s/kusion-darwin.tgz", + // "darwin-arm64": "TODO", + // "windows-amd64": "TODO", + } + + if urlPattern, ok := archiveDownloadURLMap[getOsArchKey(runtime.GOOS, runtime.GOARCH)]; ok { + return fmt.Sprintf(urlPattern, ver), nil + } + + return "", ErrUnsupportedOsArch +} + +func getOsArchKey(goos, goarch string) string { + return goos + "-" + goarch +}