未验证 提交 5c929c3b 编写于 作者: LinuxSuRen's avatar LinuxSuRen 提交者: GitHub

Add param-entry for job build (#249)

* Add param-entry for job build

* Add test cases
上级 7c3092fe
......@@ -6,6 +6,7 @@ import (
"github.com/jenkins-zh/jenkins-cli/app/i18n"
"log"
"net/http"
"strings"
"github.com/AlecAivazis/survey/v2"
"github.com/jenkins-zh/jenkins-cli/client"
......@@ -16,27 +17,63 @@ import (
type JobBuildOption struct {
BatchOption
Param string
Debug bool
Param string
ParamArray []string
RoundTripper http.RoundTripper
}
var jobBuildOption JobBuildOption
// ResetJobBuildOption give it a clean option struct
func ResetJobBuildOption() {
jobBuildOption = JobBuildOption{}
}
func init() {
jobCmd.AddCommand(jobBuildCmd)
jobBuildCmd.Flags().BoolVarP(&jobBuildOption.Batch, "batch", "b", false, "Batch mode, no need confirm")
jobBuildCmd.Flags().StringVarP(&jobBuildOption.Param, "param", "", "", "Params of the job")
jobBuildCmd.Flags().BoolVarP(&jobBuildOption.Debug, "verbose", "", false, "Output the verbose")
jobBuildCmd.Flags().BoolVarP(&jobBuildOption.Batch, "batch", "b", false,
i18n.T("Batch mode, no need to confirm"))
jobBuildCmd.Flags().StringVarP(&jobBuildOption.Param, "param", "", "",
i18n.T("Parameters of the job which is JSON format"))
jobBuildCmd.Flags().StringArrayVar(&jobBuildOption.ParamArray, "param-entry", nil,
i18n.T("Parameters of the job which are the entry format, for example: --param-entry name=value"))
}
var jobBuildCmd = &cobra.Command{
Use: "build <jobName>",
Short: i18n.T("Build the job of your Jenkins"),
Long: i18n.T("Build the job of your Jenkins"),
Args: cobra.MinimumNArgs(1),
Run: func(cmd *cobra.Command, args []string) {
Long: i18n.T(`Build the job of your Jenkins.
You need to give the parameters if your pipeline has them. Learn more about it from https://jenkins.io/doc/book/pipeline/syntax/#parameters.`),
Args: cobra.MinimumNArgs(1),
PreRunE: func(cmd *cobra.Command, args []string) (err error) {
if jobBuildOption.ParamArray == nil {
return
}
paramDefs := make([]client.ParameterDefinition, 0)
if jobBuildOption.Param != "" {
if err = json.Unmarshal([]byte(jobBuildOption.Param), &paramDefs); err != nil {
return
}
}
for _, paramEntry := range jobBuildOption.ParamArray {
if entryArray := strings.SplitN(paramEntry, "=", 2); len(entryArray) == 2 {
paramDefs = append(paramDefs, client.ParameterDefinition{
Name: entryArray[0],
Value: entryArray[1],
})
}
}
var data []byte
if data, err = json.Marshal(paramDefs); err == nil {
jobBuildOption.Param = string(data)
}
return
},
RunE: func(cmd *cobra.Command, args []string) (err error) {
name := args[0]
if !jobBuildOption.Batch && !jobBuildOption.Confirm(fmt.Sprintf("Are you sure to build job %s", name)) {
......@@ -53,19 +90,15 @@ var jobBuildCmd = &cobra.Command{
paramDefs := []client.ParameterDefinition{}
hasParam := false
var job *client.Job
if jobBuildOption.Batch {
if jobBuildOption.Param != "" {
hasParam = true
if err := json.Unmarshal([]byte(jobBuildOption.Param), &paramDefs); err != nil {
log.Fatal(err)
}
err = json.Unmarshal([]byte(jobBuildOption.Param), &paramDefs)
}
} else if job, err := jclient.GetJob(name); err == nil {
} else if job, err = jclient.GetJob(name); err == nil {
proCount := len(job.Property)
if jobBuildOption.Debug {
fmt.Println("Found properties ", proCount)
}
if proCount != 0 {
for _, pro := range job.Property {
if len(pro.ParameterDefinitions) == 0 {
......@@ -94,17 +127,15 @@ var jobBuildCmd = &cobra.Command{
break
}
}
} else {
log.Fatal(err)
}
if hasParam {
jclient.BuildWithParams(name, paramDefs)
} else {
if jobBuildOption.Debug {
fmt.Println("Not params found")
if err == nil {
if hasParam {
err = jclient.BuildWithParams(name, paramDefs)
} else {
err = jclient.Build(name)
}
jclient.Build(name)
}
return
},
}
......@@ -3,6 +3,7 @@ package cmd
import (
"bytes"
"fmt"
"github.com/jenkins-zh/jenkins-cli/client"
"io/ioutil"
"net/http"
"os"
......@@ -18,6 +19,7 @@ var _ = Describe("job build command", func() {
var (
ctrl *gomock.Controller
roundTripper *mhttp.MockRoundTripper
jobName string
)
BeforeEach(func() {
......@@ -27,11 +29,13 @@ var _ = Describe("job build command", func() {
rootOptions.Jenkins = ""
rootOptions.ConfigFile = "test.yaml"
jobName = "fakeJob"
jobBuildOption.RoundTripper = roundTripper
})
AfterEach(func() {
rootCmd.SetArgs([]string{})
ResetJobBuildOption()
os.Remove(rootOptions.ConfigFile)
rootOptions.ConfigFile = ""
ctrl.Finish()
......@@ -44,7 +48,6 @@ var _ = Describe("job build command", func() {
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
jobName := "fakeJob"
request, _ := http.NewRequest("POST", fmt.Sprintf("http://localhost:8080/jenkins/job/%s/build", jobName), nil)
request.Header.Add("CrumbRequestField", "Crumb")
request.SetBasicAuth("admin", "111e3a2f0231198855dceaff96f20540a9")
......@@ -74,5 +77,26 @@ var _ = Describe("job build command", func() {
_, err = rootCmd.ExecuteC()
Expect(err).To(BeNil())
})
It("with --param-entry and invalid --param", func() {
var err error
rootCmd.SetArgs([]string{"job", "build", jobName, "--param", "fake-param", "--param-entry", "key=value"})
_, err = rootCmd.ExecuteC()
Expect(err).To(HaveOccurred())
})
It("with --param-entry", func() {
data, err := generateSampleConfig()
Expect(err).To(BeNil())
err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664)
Expect(err).To(BeNil())
client.PrepareForBuildWithParams(roundTripper, "http://localhost:8080/jenkins", jobName,
"admin", "111e3a2f0231198855dceaff96f20540a9")
rootCmd.SetArgs([]string{"job", "build", jobName, "--param-entry", "name=value", "-b", "true", "--param", ""})
_, err = rootCmd.ExecuteC()
Expect(err).NotTo(HaveOccurred())
})
})
})
......@@ -68,7 +68,7 @@ var _ = Describe("restart command", func() {
_, err = rootCmd.ExecuteC()
Expect(err).To(BeNil())
Expect(buf.String()).To(Equal("The current user no permission\n"))
Expect(buf.String()).To(Equal("bad request, code 400\n"))
})
})
})
......@@ -125,7 +125,7 @@ func getCurrentJenkinsFromOptions() (jenkinsServer *JenkinsServer) {
func getCurrentJenkinsFromOptionsOrDie() (jenkinsServer *JenkinsServer) {
if jenkinsServer = getCurrentJenkinsFromOptions(); jenkinsServer == nil {
log.Fatal("Cannot found Jenkins by", rootOptions.Jenkins) // TODO not accurate
log.Fatal("Cannot found Jenkins by", rootOptions.Jenkins)
}
return
}
......
......@@ -169,10 +169,13 @@ func (j *JenkinsCore) ErrorHandle(statusCode int, data []byte) (err error) {
// PermissionError handles the no permission
func (j *JenkinsCore) PermissionError(statusCode int) (err error) {
if statusCode == 404 {
err = fmt.Errorf("Not found resources")
} else {
err = fmt.Errorf("The current user no permission")
switch statusCode {
case 400:
err = fmt.Errorf("bad request, code %d", statusCode)
case 404:
err = fmt.Errorf("not found resources")
default:
err = fmt.Errorf("the current user has not permission, code %d", statusCode)
}
return
}
......
......@@ -182,13 +182,13 @@ var _ = Describe("common test", func() {
It("with 404 error from server", func() {
err := jenkinsCore.ErrorHandle(404, []byte{})
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("Not found resources"))
Expect(err.Error()).To(Equal("not found resources"))
})
It("with 403 error from server", func() {
err := jenkinsCore.ErrorHandle(403, []byte{})
Expect(err).To(HaveOccurred())
Expect(err.Error()).To(Equal("The current user no permission"))
Expect(err.Error()).To(Equal("the current user has not permission, code 403"))
})
It("with CrumbHandle error from server", func() {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册