config.go 5.0 KB
Newer Older
1 2 3 4
package cmd

import (
	"fmt"
5 6 7 8 9 10 11

	"github.com/jenkins-zh/jenkins-cli/app/i18n"

	"io/ioutil"
	"log"
	"os"

12 13
	"github.com/mitchellh/go-homedir"
	"github.com/spf13/cobra"
14
	"go.uber.org/zap"
15
	"gopkg.in/yaml.v2"
16 17
)

LinuxSuRen's avatar
LinuxSuRen 已提交
18
// ConfigOptions is the config cmd option
19 20 21 22 23 24 25 26 27 28 29
type ConfigOptions struct {
	ConfigFileLocation string
}

var configOptions ConfigOptions

func init() {
	rootCmd.AddCommand(configCmd)
}

var configCmd = &cobra.Command{
30 31
	Use:     "config",
	Aliases: []string{"cfg"},
32 33
	Short:   i18n.T("Manage the config of jcli"),
	Long:    i18n.T("Manage the config of jcli"),
34
	RunE: func(cmd *cobra.Command, _ []string) (err error) {
LinuxSuRen's avatar
LinuxSuRen 已提交
35
		current := getCurrentJenkins()
36 37
		if current == nil {
			err = fmt.Errorf("no config file found or no current setting")
38
		} else {
39 40 41 42 43
			if current.Description != "" {
				cmd.Printf("Current Jenkins's name is %s, url is %s, description is %s\n", current.Name, current.URL, current.Description)
			} else {
				cmd.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
			}
44
		}
45
		return
46
	},
47 48 49
	Example: `  jcli config generate
  jcli config list
  jcli config edit`,
50 51 52 53
}

// JenkinsServer holds the configuration of your Jenkins
type JenkinsServer struct {
54 55 56 57 58 59 60 61
	Name               string `yaml:"name"`
	URL                string `yaml:"url"`
	UserName           string `yaml:"username"`
	Token              string `yaml:"token"`
	Proxy              string `yaml:"proxy"`
	ProxyAuth          string `yaml:"proxyAuth"`
	InsecureSkipVerify bool   `yaml:"insecureSkipVerify"`
	Description        string `yaml:"description"`
62 63
}

64 65
// CommandHook is a hook
type CommandHook struct {
LinuxSuRen's avatar
LinuxSuRen 已提交
66 67 68 69
	Path    string `yaml:"path"`
	Command string `yaml:"cmd"`
}

70 71 72 73 74 75 76
// PluginSuite define a suite of plugins
type PluginSuite struct {
	Name        string   `yaml:"name"`
	Plugins     []string `yaml:"plugins"`
	Description string   `yaml:"description"`
}

77 78 79 80 81 82
// JenkinsMirror represents the mirror of Jenkins
type JenkinsMirror struct {
	Name string
	URL  string
}

LinuxSuRen's avatar
LinuxSuRen 已提交
83
// Config is a global config struct
84 85
type Config struct {
	Current        string          `yaml:"current"`
86
	Language       string          `yaml:"language"`
87
	JenkinsServers []JenkinsServer `yaml:"jenkins_servers"`
88 89
	PreHooks       []CommandHook   `yaml:"preHooks"`
	PostHooks      []CommandHook   `yaml:"postHooks"`
90
	PluginSuites   []PluginSuite   `yaml:"pluginSuites"`
91
	Mirrors        []JenkinsMirror `yaml:"mirrors"`
92 93
}

94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
func setCurrentJenkins(name string) {
	found := false
	for _, jenkins := range getConfig().JenkinsServers {
		if jenkins.Name == name {
			found = true
			break
		}
	}

	if found {
		config.Current = name
		if err := saveConfig(); err != nil {
			log.Fatal(err)
		}
	} else {
		log.Fatalf("Cannot found Jenkins by name %s", name)
	}
}

Y
Yanjun Shi 已提交
113
var config *Config
114

Y
Yanjun Shi 已提交
115
func getConfig() *Config {
116 117 118
	return config
}

119 120 121 122 123 124 125 126
func getJenkinsNames() []string {
	names := make([]string, 0)
	for _, j := range config.JenkinsServers {
		names = append(names, j.Name)
	}
	return names
}

LinuxSuRen's avatar
LinuxSuRen 已提交
127
func getCurrentJenkins() (jenkinsServer *JenkinsServer) {
128 129 130 131
	if config != nil {
		current := config.Current
		jenkinsServer = findJenkinsByName(current)
	}
LinuxSuRen's avatar
LinuxSuRen 已提交
132 133 134 135 136

	return
}

func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) {
137 138 139 140
	if config == nil {
		return
	}

141
	for _, cfg := range config.JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
142 143
		if cfg.Name == name {
			jenkinsServer = &cfg
144 145 146 147 148 149
			break
		}
	}
	return
}

150 151 152 153 154 155 156 157 158 159
func findSuiteByName(name string) (suite *PluginSuite) {
	for _, cfg := range config.PluginSuites {
		if cfg.Name == name {
			suite = &cfg
			break
		}
	}
	return
}

160
func loadDefaultConfig() (err error) {
161 162
	var configPath string
	if configPath, err = getDefaultConfigPath(); err == nil {
163 164 165
		if _, err = os.Stat(configPath); err == nil {
			err = loadConfig(configPath)
		}
166
	}
167
	return
168 169
}

170 171 172 173 174 175 176 177 178
func getDefaultConfigPath() (configPath string, err error) {
	var userHome string
	userHome, err = homedir.Dir()
	if err == nil {
		configPath = fmt.Sprintf("%s/.jenkins-cli.yaml", userHome)
	}
	return
}

179 180 181 182 183 184 185 186 187 188
func loadConfig(path string) (err error) {
	configOptions.ConfigFileLocation = path

	var content []byte
	if content, err = ioutil.ReadFile(path); err == nil {
		err = yaml.Unmarshal([]byte(content), &config)
	}
	return
}

189 190
// getMirrors returns the mirror list, one official mirror should be returned if user don't give it
func getMirrors() (mirrors []JenkinsMirror) {
191 192 193
	if config != nil {
		mirrors = config.Mirrors
	}
194 195 196 197 198 199 200 201 202 203 204
	if len(mirrors) == 0 {
		mirrors = []JenkinsMirror{
			{
				Name: "default",
				URL:  "http://mirrors.jenkins.io/",
			},
		}
	}
	return
}

205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220
func getMirror(name string) string {
	mirrors := getMirrors()

	for _, mirror := range mirrors {
		if mirror.Name == name {
			logger.Debug("find mirror", zap.String("name", name), zap.String("url", mirror.URL))
			return mirror.URL
		}
	}
	return ""
}

func getDefaultMirror() string {
	return getMirror("default")
}

221 222 223 224
func saveConfig() (err error) {
	var data []byte
	config := getConfig()

LinuxSuRen's avatar
LinuxSuRen 已提交
225 226 227 228 229
	configPath := configOptions.ConfigFileLocation
	if rootOptions.ConfigFile != "" {
		configPath = rootOptions.ConfigFile
	}

230
	if data, err = yaml.Marshal(&config); err == nil {
LinuxSuRen's avatar
LinuxSuRen 已提交
231
		err = ioutil.WriteFile(configPath, data, 0644)
232 233 234
	}
	return
}