diff --git a/app/cmd/plugin_download.go b/app/cmd/plugin_download.go new file mode 100644 index 0000000000000000000000000000000000000000..b331ed53bfdabf9707f5678ae89b39b9948e5be0 --- /dev/null +++ b/app/cmd/plugin_download.go @@ -0,0 +1,25 @@ +package cmd + +import ( + "github.com/linuxsuren/jenkins-cli/client" + "github.com/spf13/cobra" +) + +func init() { + pluginCmd.AddCommand(pluginDownloadCmd) +} + +var pluginDownloadCmd = &cobra.Command{ + Use: "download ", + Short: "Download the plugins", + Long: `Download the plugins`, + Run: func(cmd *cobra.Command, args []string) { + if len(args) == 0 { + cmd.Help() + return + } + + jclient := &client.PluginDownloader{} + jclient.DownloadPlugins(args) + }, +} diff --git a/client/pluginManger.go b/client/pluginManger.go index a04a09f218ad13a368b08a20989fa6829e6aa1cb..3b6b0a1ae56596e8e2cc8be0492a2e361795cb81 100644 --- a/client/pluginManger.go +++ b/client/pluginManger.go @@ -65,6 +65,30 @@ type InstalledPlugin struct { BackVersion string } +type PluginDependency struct { + Name string `json:"name"` + Implied bool `json:"implied"` + Optional bool `json:"optional"` + Title string `json:"title"` + Version string `json:"version"` +} + +type PluginInfo struct { + BuildDate string `json:"buildDate"` + Dependencies []PluginDependency `json:"dependencies"` + Excerpt string `json:"excerpt"` + FirstRelease string `json:"firstRelease"` + Gav string `json:"gav"` + Name string `json:"name"` + PreviousTimestamp string `json:"previousTimestamp"` + PreviousVersion string `json:"previousVersion"` + ReleaseTimestamp string `json:"releaseTimestamp"` + RequireCore string `json:"RequireCore"` + Title string `json:"title"` + URL string `json:"url"` + Version string `json:"version"` +} + // CheckUpdate fetch the lastest plugins from update center site func (p *PluginManager) CheckUpdate(handle func(*http.Response)) { api := fmt.Sprintf("%s/pluginManager/checkUpdatesServer", p.URL) @@ -328,3 +352,80 @@ func newfileUploadRequest(uri string, params map[string]string, paramName, path req.Header.Set("Content-Type", writer.FormDataContentType()) return req, err } + +type PluginDownloader struct { + dependencyMap map[string]string +} + +// DownloadPlugins will download those plugins from update center +func (d *PluginDownloader) DownloadPlugins(names []string) { + d.dependencyMap = make(map[string]string) + fmt.Println("Start to collect plugin dependencies...") + plugins := make([]PluginInfo, 0) + for _, name := range names { + plugins = append(plugins, d.collectDependencies(name)...) + } + + fmt.Printf("Ready to download plugins, total: %d.\n", len(plugins)) + for i, plugin := range plugins { + fmt.Printf("Start to download plugin %s, version: %s, number: %d\n", + plugin.Name, plugin.Version, i) + + d.download(plugin.URL, plugin.Name) + } +} + +func (d *PluginDownloader) download(url string, name string) { + if resp, err := http.Get(url); err != nil { + fmt.Println(err) + } else { + defer resp.Body.Close() + if body, err := ioutil.ReadAll(resp.Body); err != nil { + fmt.Println(err) + } else { + if err = ioutil.WriteFile(fmt.Sprintf("%s.hpi", name), body, 0644); err != nil { + fmt.Println(err) + } + } + } +} + +func (d *PluginDownloader) getPlugin(name string) (plugin *PluginInfo, err error) { + resp, err := http.Get("https://plugins.jenkins.io/api/plugin/" + name) + if err != nil { + return plugin, err + } + + defer resp.Body.Close() + body, err := ioutil.ReadAll(resp.Body) + + plugin = &PluginInfo{} + err = json.Unmarshal(body, plugin) + if err != nil { + log.Println("error when unmarshal:", string(body)) + } + return +} + +func (d *PluginDownloader) collectDependencies(pluginName string) (plugins []PluginInfo) { + plugin, err := d.getPlugin(pluginName) + if err != nil { + log.Println("can't get the plugin by name:", pluginName) + panic(err) + } + + plugins = make([]PluginInfo, 0) + plugins = append(plugins, *plugin) + + for _, dependency := range plugin.Dependencies { + if dependency.Optional { + continue + } + if _, ok := d.dependencyMap[dependency.Name]; !ok { + d.dependencyMap[dependency.Name] = dependency.Version + + plugins = append(plugins, d.collectDependencies(dependency.Name)...) + } + } + return +}