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

Merge pull request #69 from LinuxSuRen/fea/select-jenkins

Split config options into sub-cmd
package cmd
import (
"errors"
"fmt"
"io/ioutil"
"log"
"os"
"runtime"
"github.com/linuxsuren/jenkins-cli/util"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
)
type ConfigOptions struct {
Current string
Show bool
Generate bool
List bool
ConfigFileLocation string
}
......@@ -26,54 +19,15 @@ var configOptions ConfigOptions
func init() {
rootCmd.AddCommand(configCmd)
configCmd.Flags().StringVarP(&configOptions.Current, "current", "c", "", "Set the current Jenkins")
configCmd.Flags().BoolVarP(&configOptions.Show, "show", "s", false, "Show the current Jenkins")
configCmd.Flags().BoolVarP(&configOptions.Generate, "generate", "g", false, "Generate a sample config file for you")
configCmd.Flags().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`,
Args: func(cmd *cobra.Command, args []string) (err error) {
if !configOptions.Show && !configOptions.Generate &&
!configOptions.List && configOptions.Current == "" {
err = errors.New("need arguments")
}
return
},
Run: func(cmd *cobra.Command, args []string) {
current := getCurrentJenkins()
if configOptions.Show {
fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
}
if configOptions.List {
table := util.CreateTable(os.Stdout)
table.AddRow("number", "name", "url")
for i, jenkins := range getConfig().JenkinsServers {
name := jenkins.Name
if name == current.Name {
name = fmt.Sprintf("*%s", name)
}
table.AddRow(fmt.Sprintf("%d", i), name, jenkins.URL)
}
table.Render()
}
if configOptions.Generate {
if data, err := generateSampleConfig(); err == nil {
fmt.Print(string(data))
fmt.Println("# Goto 'http://localhost:8080/jenkins/me/configure', then you can generate your token.")
} else {
log.Fatal(err)
}
}
if configOptions.Current != "" {
setCurrentJenkins(configOptions.Current)
}
fmt.Printf("Current Jenkins's name is %s, url is %s\n", current.Name, current.URL)
},
Example: "jcli config -l",
}
......@@ -112,21 +66,6 @@ func setCurrentJenkins(name string) {
}
}
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 {
......@@ -160,50 +99,6 @@ func findJenkinsByName(name string) (jenkinsServer *JenkinsServer) {
return
}
func addJenkins(jenkinsServer JenkinsServer) (err error) {
jenkinsName := jenkinsServer.Name
if jenkinsName == "" {
err = fmt.Errorf("Name cannot be empty")
return
}
if findJenkinsByName(jenkinsName) != nil {
err = fmt.Errorf("Jenkins %s is existed", jenkinsName)
return
}
config.JenkinsServers = append(config.JenkinsServers, jenkinsServer)
err = saveConfig()
return
}
func removeJenkins(name string) (err error) {
current := getCurrentJenkins()
if name == current.Name {
err = fmt.Errorf("You cannot remove current Jenkins")
}
index := -1
config := getConfig()
for i, jenkins := range config.JenkinsServers {
if name == jenkins.Name {
index = i
break
}
}
if index == -1 {
err = fmt.Errorf("Cannot found by name %s", name)
} else {
config.JenkinsServers[index] = config.JenkinsServers[len(config.JenkinsServers)-1]
config.JenkinsServers[len(config.JenkinsServers)-1] = JenkinsServer{}
config.JenkinsServers = config.JenkinsServers[:len(config.JenkinsServers)-1]
err = saveConfig()
}
return
}
func loadDefaultConfig() (err error) {
userHome := userHomeDir()
configPath := fmt.Sprintf("%s/.jenkins-cli.yaml", userHome)
......
package cmd
import (
"fmt"
"log"
"github.com/spf13/cobra"
......@@ -14,21 +15,39 @@ var configAddOptions ConfigAddOptions
func init() {
configCmd.AddCommand(configAddCmd)
configAddCmd.PersistentFlags().StringVarP(&configAddOptions.Name, "name", "n", "", "Name of the Jenkins")
configAddCmd.PersistentFlags().StringVarP(&configAddOptions.URL, "url", "", "", "URL of the Jenkins")
configAddCmd.PersistentFlags().StringVarP(&configAddOptions.UserName, "username", "u", "", "UserName of the Jenkins")
configAddCmd.PersistentFlags().StringVarP(&configAddOptions.Token, "token", "t", "", "Token of the Jenkins")
configAddCmd.PersistentFlags().StringVarP(&configAddOptions.Proxy, "proxy", "p", "", "Proxy of the Jenkins")
configAddCmd.PersistentFlags().StringVarP(&configAddOptions.ProxyAuth, "proxyAuth", "a", "", "ProxyAuth of the Jenkins")
configAddCmd.Flags().StringVarP(&configAddOptions.Name, "name", "n", "", "Name of the Jenkins")
configAddCmd.Flags().StringVarP(&configAddOptions.URL, "url", "", "", "URL of the Jenkins")
configAddCmd.Flags().StringVarP(&configAddOptions.UserName, "username", "u", "", "UserName of the Jenkins")
configAddCmd.Flags().StringVarP(&configAddOptions.Token, "token", "t", "", "Token of the Jenkins")
configAddCmd.Flags().StringVarP(&configAddOptions.Proxy, "proxy", "p", "", "Proxy of the Jenkins")
configAddCmd.Flags().StringVarP(&configAddOptions.ProxyAuth, "proxyAuth", "a", "", "ProxyAuth of the Jenkins")
}
var configAddCmd = &cobra.Command{
Use: "add",
Short: "Add a Jenkins config",
Long: `Add a Jenkins config`,
Short: "Add a Jenkins config item",
Long: `Add a Jenkins config item`,
Run: func(cmd *cobra.Command, args []string) {
if err := addJenkins(configAddOptions.JenkinsServer); err != nil {
log.Fatal(err)
}
},
Example: "jcli config add -n demo",
}
func addJenkins(jenkinsServer JenkinsServer) (err error) {
jenkinsName := jenkinsServer.Name
if jenkinsName == "" {
err = fmt.Errorf("Name cannot be empty")
return
}
if findJenkinsByName(jenkinsName) != nil {
err = fmt.Errorf("Jenkins %s is existed", jenkinsName)
return
}
config.JenkinsServers = append(config.JenkinsServers, jenkinsServer)
err = saveConfig()
return
}
package cmd
import (
"fmt"
"log"
"github.com/spf13/cobra"
"gopkg.in/yaml.v2"
)
func init() {
configCmd.AddCommand(configGenerateCmd)
}
var configGenerateCmd = &cobra.Command{
Use: "generate",
Short: "Generate a sample config file for you",
Long: `Generate a sample config file for you`,
Run: func(cmd *cobra.Command, args []string) {
if data, err := generateSampleConfig(); err == nil {
fmt.Print(string(data))
fmt.Println("# Goto 'http://localhost:8080/jenkins/me/configure', then you can generate your token.")
} else {
log.Fatal(err)
}
},
}
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)
}
package cmd
import (
"fmt"
"os"
"github.com/linuxsuren/jenkins-cli/util"
"github.com/spf13/cobra"
)
func init() {
configCmd.AddCommand(configListCmd)
}
var configListCmd = &cobra.Command{
Use: "list",
Short: "List all Jenkins config items",
Long: `List all Jenkins config items`,
Run: func(cmd *cobra.Command, args []string) {
current := getCurrentJenkins()
table := util.CreateTable(os.Stdout)
table.AddRow("number", "name", "url")
for i, jenkins := range getConfig().JenkinsServers {
name := jenkins.Name
if name == current.Name {
name = fmt.Sprintf("*%s", name)
}
table.AddRow(fmt.Sprintf("%d", i), name, jenkins.URL)
}
table.Render()
},
}
package cmd
import (
"fmt"
"log"
"github.com/spf13/cobra"
......@@ -25,3 +26,30 @@ var configRemoveCmd = &cobra.Command{
}
},
}
func removeJenkins(name string) (err error) {
current := getCurrentJenkins()
if name == current.Name {
err = fmt.Errorf("You cannot remove current Jenkins")
}
index := -1
config := getConfig()
for i, jenkins := range config.JenkinsServers {
if name == jenkins.Name {
index = i
break
}
}
if index == -1 {
err = fmt.Errorf("Cannot found by name %s", name)
} else {
config.JenkinsServers[index] = config.JenkinsServers[len(config.JenkinsServers)-1]
config.JenkinsServers[len(config.JenkinsServers)-1] = JenkinsServer{}
config.JenkinsServers = config.JenkinsServers[:len(config.JenkinsServers)-1]
err = saveConfig()
}
return
}
......@@ -10,24 +10,32 @@ func init() {
}
var configSelectCmd = &cobra.Command{
Use: "select",
Use: "select [<name>]",
Short: "Select one config as current Jenkins",
Long: `Select one config as current Jenkins`,
Run: func(cmd *cobra.Command, args []string) {
target := ""
if currentJenkins := getCurrentJenkins(); currentJenkins != nil {
target = currentJenkins.Name
}
prompt := &survey.Select{
Message: "Choose a Jenkins as the current one:",
Options: getJenkinsNames(),
Default: target,
}
survey.AskOne(prompt, &target)
if len(args) > 0 {
jenkinsName := args[0]
if target != "" {
setCurrentJenkins(target)
setCurrentJenkins(jenkinsName)
} else {
selectByManual()
}
},
}
func selectByManual() {
target := ""
if currentJenkins := getCurrentJenkins(); currentJenkins != nil {
target = currentJenkins.Name
}
prompt := &survey.Select{
Message: "Choose a Jenkins as the current one:",
Options: getJenkinsNames(),
Default: target,
}
if err := survey.AskOne(prompt, &target); err == nil && target != "" {
setCurrentJenkins(target)
}
}
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册