job_build.go 1.9 KB
Newer Older
LinuxSuRen's avatar
LinuxSuRen 已提交
1 2 3
package cmd

import (
4
	"encoding/json"
LinuxSuRen's avatar
LinuxSuRen 已提交
5
	"fmt"
6
	"log"
LinuxSuRen's avatar
LinuxSuRen 已提交
7

8
	"github.com/AlecAivazis/survey"
LinuxSuRen's avatar
LinuxSuRen 已提交
9 10 11 12
	"github.com/linuxsuren/jenkins-cli/client"
	"github.com/spf13/cobra"
)

LinuxSuRen's avatar
LinuxSuRen 已提交
13 14 15 16 17 18
type JobBuildOption struct {
	BatchOption
}

var jobBuildOption JobBuildOption

LinuxSuRen's avatar
LinuxSuRen 已提交
19 20
func init() {
	jobCmd.AddCommand(jobBuildCmd)
LinuxSuRen's avatar
LinuxSuRen 已提交
21
	jobBuildCmd.Flags().BoolVarP(&jobBuildOption.Batch, "batch", "b", false, "Batch mode, no need confirm")
LinuxSuRen's avatar
LinuxSuRen 已提交
22 23 24
}

var jobBuildCmd = &cobra.Command{
25
	Use:   "build -n",
LinuxSuRen's avatar
LinuxSuRen 已提交
26 27 28 29
	Short: "Build the job of your Jenkins",
	Long:  `Build the job of your Jenkins`,
	Run: func(cmd *cobra.Command, args []string) {
		if jobOption.Name == "" {
30 31
			cmd.Help()
			return
LinuxSuRen's avatar
LinuxSuRen 已提交
32 33
		}

LinuxSuRen's avatar
LinuxSuRen 已提交
34 35 36 37
		if !jobBuildOption.Confirm(fmt.Sprintf("Are you sure to build job %s", jobOption.Name)) {
			return
		}

LinuxSuRen's avatar
LinuxSuRen 已提交
38 39 40 41 42 43 44 45
		jenkins := getCurrentJenkins()
		jclient := &client.JobClient{}
		jclient.URL = jenkins.URL
		jclient.UserName = jenkins.UserName
		jclient.Token = jenkins.Token
		jclient.Proxy = jenkins.Proxy
		jclient.ProxyAuth = jenkins.ProxyAuth

46 47 48 49 50 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
		paramDefs := []client.ParameterDefinition{}
		hasParam := false
		if job, err := jclient.GetJob(jobOption.Name); err == nil {
			if len(job.Property) != 0 {
				for _, pro := range job.Property {
					if len(pro.ParameterDefinitions) == 0 {
						continue
					}

					if data, err := json.MarshalIndent(pro.ParameterDefinitions, "", " "); err == nil {
						content := string(data)
						prompt := &survey.Editor{
							Message:       "Edit your pipeline script",
							FileName:      "*.sh",
							Default:       content,
							AppendDefault: true,
						}

						if err = survey.AskOne(prompt, &content); err != nil {
							log.Fatal(err)
						}

						if err = json.Unmarshal([]byte(content), &paramDefs); err != nil {
							log.Fatal(err)
						}
					}
					hasParam = true
					break
				}
			}
		}

		if hasParam {
			jclient.BuildWithParams(jobOption.Name, paramDefs)
		} else {
			jclient.Build(jobOption.Name)
		}
LinuxSuRen's avatar
LinuxSuRen 已提交
83 84
	},
}