config.go 4.0 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
package cmd

import (
	"fmt"
	"io/ioutil"
	"log"
	"os"
	"runtime"

	"github.com/spf13/cobra"
	"gopkg.in/yaml.v2"
)

type ConfigOptions struct {
	Current  string
	Show     bool
	Generate bool
	List     bool

	ConfigFileLocation string
}

var configOptions ConfigOptions

func init() {
	rootCmd.AddCommand(configCmd)
	configCmd.PersistentFlags().StringVarP(&configOptions.Current, "current", "c", "", "Set the current Jenkins")
	configCmd.PersistentFlags().BoolVarP(&configOptions.Show, "show", "s", false, "Show the current Jenkins")
	configCmd.PersistentFlags().BoolVarP(&configOptions.Generate, "generate", "g", false, "Generate a sample config file for you")
	configCmd.PersistentFlags().BoolVarP(&configOptions.List, "list", "l", false, "Display all your Jenkins configs")
}

var configCmd = &cobra.Command{
	Use:   "config",
	Short: "Manage the config of jcli",
	Long:  `Manage the config of jcli`,
	Run: func(cmd *cobra.Command, args []string) {
LinuxSuRen's avatar
LinuxSuRen 已提交
38
		current := getCurrentJenkins()
39 40 41 42 43
		if configOptions.Show {
			fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
		}

		if configOptions.List {
LinuxSuRen's avatar
LinuxSuRen 已提交
44
			fmt.Println("number\tname\turl")
45
			for i, jenkins := range getConfig().JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
46 47 48 49 50
				name := jenkins.Name
				if name == current.Name {
					name = fmt.Sprintf("*%s", name)
				}
				fmt.Printf("%d\t%s\t%s\n", i, name, jenkins.URL)
51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84
			}
		}

		if configOptions.Generate {
			if data, err := generateSampleConfig(); err == nil {
				fmt.Print(string(data))
			} else {
				log.Fatal(err)
			}
		}

		if configOptions.Current != "" {
			found := false
			for _, jenkins := range getConfig().JenkinsServers {
				if jenkins.Name == configOptions.Current {
					found = true
					break
				}
			}

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

// JenkinsServer holds the configuration of your Jenkins
type JenkinsServer struct {
LinuxSuRen's avatar
LinuxSuRen 已提交
85 86 87 88 89 90
	Name      string `yaml:"name"`
	URL       string `yaml:"url"`
	UserName  string `yaml:"username"`
	Token     string `yaml:"token"`
	Proxy     string `yaml:"proxy"`
	ProxyAuth string `yaml:"proxyAuth"`
91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118
}

type Config struct {
	Current        string          `yaml:"current"`
	JenkinsServers []JenkinsServer `yaml:"jenkins_servers"`
}

func generateSampleConfig() ([]byte, error) {
	sampleConfig := Config{
		Current: "yourServer",
		JenkinsServers: []JenkinsServer{
			{
				Name:     "yourServer",
				URL:      "http://localhost:8080/jenkins",
				UserName: "admin",
				Token:    "111e3a2f0231198855dceaff96f20540a9",
			},
		},
	}
	return yaml.Marshal(&sampleConfig)
}

var config Config

func getConfig() Config {
	return config
}

LinuxSuRen's avatar
LinuxSuRen 已提交
119
func getCurrentJenkins() (jenkinsServer *JenkinsServer) {
120 121
	config := getConfig()
	current := config.Current
LinuxSuRen's avatar
LinuxSuRen 已提交
122 123 124 125 126 127
	jenkinsServer = findJenkinsByName(current)

	return
}

func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) {
128
	for _, cfg := range config.JenkinsServers {
LinuxSuRen's avatar
LinuxSuRen 已提交
129 130
		if cfg.Name == name {
			jenkinsServer = &cfg
131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178
			break
		}
	}
	return
}

func loadDefaultConfig() {
	userHome := userHomeDir()
	if err := loadConfig(fmt.Sprintf("%s/.jenkins-cli.yaml", userHome)); err != nil {
		log.Fatalf("error: %v", err)
	}
}

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
}

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

	if data, err = yaml.Marshal(&config); err == nil {
		err = ioutil.WriteFile(configOptions.ConfigFileLocation, data, 0644)
	}
	return
}

func userHomeDir() string {
	if runtime.GOOS == "windows" {
		home := os.Getenv("HOMEDRIVE") + os.Getenv("HOMEPATH")
		if home == "" {
			home = os.Getenv("USERPROFILE")
		}
		return home
	} else if runtime.GOOS == "linux" {
		home := os.Getenv("XDG_CONFIG_HOME")
		if home != "" {
			return home
		}
	}
	return os.Getenv("HOME")
}