44 "encoding/json"
55 "fmt"
66 "strings"
7+ "time"
78
89 "github.com/jenkins-zh/jenkins-cli/app/cmd/common"
910 "github.com/jenkins-zh/jenkins-cli/app/i18n"
@@ -18,15 +19,18 @@ type JobBuildOption struct {
1819 common.Option
1920 cobra_ext.OutputOption
2021
21- Param string
22- ParamArray []string
22+ Param string
23+ ParamArray []string
24+ ParamJsonString string
2325
2426 ParamFilePathArray []string
2527
26- Wait bool
27- WaitTime int
28- Delay int
29- Cause string
28+ Wait bool
29+ WaitTime int
30+ WaitInterval int
31+ Delay int
32+ Cause string
33+ LogConsole bool
3034}
3135
3236var jobBuildOption JobBuildOption
@@ -40,23 +44,28 @@ func init() {
4044 jobCmd .AddCommand (jobBuildCmd )
4145 jobBuildCmd .Flags ().BoolVarP (& jobBuildOption .Batch , "batch" , "b" , false , "Batch mode, no need confirm" )
4246 jobBuildCmd .Flags ().StringVarP (& jobBuildOption .Param , "param" , "" , "" ,
43- i18n .T ("Parameters of the job which is JSON format" ))
47+ i18n .T ("Parameters of the job which is JSON format, for example: --param '{ \" limit \" : \" 2 \" , \" timeoutLimit \" : \" 10 \" }' " ))
4448 jobBuildCmd .Flags ().StringArrayVar (& jobBuildOption .ParamArray , "param-entry" , nil ,
45- i18n .T ("Parameters of the job which are the entry format, for example: --param-entry name=value " ))
49+ i18n .T ("Parameters of the job which are the entry format, for example: --param-entry name1=value1, --param-entry name2=value2 " ))
4650 jobBuildCmd .Flags ().StringArrayVar (& jobBuildOption .ParamFilePathArray , "param-file" , nil ,
4751 i18n .T ("Parameters of the job which is file path, for example: --param-file name=filename" ))
4852 jobBuildCmd .Flags ().BoolVarP (& jobBuildOption .Wait , "wait" , "" , false ,
4953 i18n .T ("If you want to wait for the build ID from Jenkins. You need to install plugin pipeline-restful-api first" ))
50- jobBuildCmd .Flags ().IntVarP (& jobBuildOption .WaitTime , "wait-timeout" , "" , 30 ,
54+ jobBuildCmd .Flags ().IntVarP (& jobBuildOption .WaitTime , "wait-timeout" , "" , 60 ,
5155 i18n .T ("The timeout of seconds when you wait for the build ID" ))
56+ jobBuildCmd .Flags ().IntVarP (& jobBuildOption .WaitInterval , "wait-interval" , "" , 10 ,
57+ i18n .T ("The interval of seconds when you want to wait for buildID... query, use with wait" ))
5258 jobBuildCmd .Flags ().IntVarP (& jobBuildOption .Delay , "delay" , "" , 0 ,
5359 i18n .T ("Delay when trigger a Jenkins job" ))
5460 jobBuildCmd .Flags ().StringVarP (& jobBuildOption .Cause , "cause" , "" , "triggered by jcli" ,
5561 i18n .T ("The cause of a job build" ))
62+ jobBuildCmd .Flags ().BoolVarP (& jobBuildOption .LogConsole , "log" , "l" , false ,
63+ i18n .T ("If you want to wait for build log and wait log output end" ))
5664
5765 jobBuildOption .SetFlagWithHeaders (jobBuildCmd , "Number,URL" )
5866 jobBuildOption .BatchOption .Stdio = common .GetSystemStdio ()
5967 jobBuildOption .Option .Stdio = common .GetSystemStdio ()
68+
6069}
6170
6271var jobBuildCmd = & cobra.Command {
@@ -66,15 +75,28 @@ var jobBuildCmd = &cobra.Command{
6675You need to give the parameters if your pipeline has them. Learn more about it from https://jenkins.io/doc/book/pipeline/syntax/#parameters.` ),
6776 Args : cobra .MinimumNArgs (1 ),
6877 PreRunE : func (_ * cobra.Command , _ []string ) (err error ) {
69- if jobBuildOption .ParamArray == nil && jobBuildOption .ParamFilePathArray == nil {
78+ if jobBuildOption .ParamArray == nil && jobBuildOption .ParamFilePathArray == nil && jobBuildOption . Param == "" {
7079 return
7180 }
7281
7382 paramDefs := make ([]client.ParameterDefinition , 0 )
7483 if jobBuildOption .Param != "" {
75- if err = json .Unmarshal ([]byte (jobBuildOption .Param ), & paramDefs ); err != nil {
84+ paramMap := make (map [string ]interface {})
85+ if err = json .Unmarshal ([]byte (jobBuildOption .Param ), & paramMap ); err != nil {
86+ logger .Error (fmt .Sprintf ("build param unmarshal error %v" , err .Error ()))
7687 return
7788 }
89+ for key , value := range paramMap {
90+ if key == "" || value == nil {
91+ logger .Error ("build param key or value empty" )
92+ return
93+ }
94+ paramDefs = append (paramDefs , client.ParameterDefinition {
95+ Name : key ,
96+ Value : fmt .Sprintf ("%v" , value ),
97+ Type : client .StringParameterDefinition ,
98+ })
99+ }
78100 }
79101
80102 for _ , paramEntry := range jobBuildOption .ParamArray {
@@ -113,6 +135,7 @@ You need to give the parameters if your pipeline has them. Learn more about it f
113135 jclient := & client.JobClient {
114136 JenkinsCore : client.JenkinsCore {
115137 RoundTripper : jobBuildOption .RoundTripper ,
138+ Timeout : time .Duration (jobBuildOption .WaitTime ) * time .Second ,
116139 },
117140 }
118141 getCurrentJenkinsAndClient (& (jclient .JenkinsCore ))
@@ -150,13 +173,18 @@ You need to give the parameters if your pipeline has them. Learn more about it f
150173 }
151174
152175 if err == nil {
176+ options := client.JobCmdOptionsCommon {
177+ Wait : jobBuildOption .Wait ,
178+ WaitTime : jobBuildOption .WaitTime ,
179+ WaitInterval : jobBuildOption .WaitInterval ,
180+ LogConsole : jobBuildOption .LogConsole ,
181+ }
182+
153183 if hasParam {
154- err = jclient .BuildWithParams (name , paramDefs )
155- } else if jobBuildOption .Wait {
156- var build client.IdentityBuild
157- if build , err = jclient .BuildAndReturn (name , jobBuildOption .Cause , jobBuildOption .WaitTime , jobBuildOption .Delay ); err == nil {
158- jobBuildOption .Writer = cmd .OutOrStdout ()
159- err = jobBuildOption .OutputV2 ([1 ]client.SimpleJobBuild {build .Build .SimpleJobBuild })
184+ var jobState client.JenkinsBuildState
185+ jobState , err = jclient .BuildWithParamsGetResponse (name , paramDefs , options )
186+ if err == nil && jobBuildOption .LogConsole && jobState .RunId > 0 {
187+ err = printLogRunFunc (name , JobLogOptionGetDefault (int (jobState .RunId )), cmd )
160188 }
161189 } else {
162190 err = jclient .Build (name )
0 commit comments