未验证 提交 06889be4 编写于 作者: Z Zhao Xiaojie 提交者: GitHub

Merge pull request #36 from LinuxSuRen/fea/download-plugins

Add support to download plugins
package cmd
import (
"github.com/linuxsuren/jenkins-cli/client"
"github.com/spf13/cobra"
)
func init() {
pluginCmd.AddCommand(pluginDownloadCmd)
}
var pluginDownloadCmd = &cobra.Command{
Use: "download <keyword>",
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)
},
}
......@@ -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
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册