4
4
"encoding/json"
5
5
"fmt"
6
6
"strings"
7
+ "time"
7
8
8
9
"github.com/jenkins-zh/jenkins-cli/app/cmd/common"
9
10
"github.com/jenkins-zh/jenkins-cli/app/i18n"
@@ -18,15 +19,18 @@ type JobBuildOption struct {
18
19
common.Option
19
20
cobra_ext.OutputOption
20
21
21
- Param string
22
- ParamArray []string
22
+ Param string
23
+ ParamArray []string
24
+ ParamJsonString string
23
25
24
26
ParamFilePathArray []string
25
27
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
30
34
}
31
35
32
36
var jobBuildOption JobBuildOption
@@ -40,23 +44,28 @@ func init() {
40
44
jobCmd .AddCommand (jobBuildCmd )
41
45
jobBuildCmd .Flags ().BoolVarP (& jobBuildOption .Batch , "batch" , "b" , false , "Batch mode, no need confirm" )
42
46
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 \" }' " ))
44
48
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 " ))
46
50
jobBuildCmd .Flags ().StringArrayVar (& jobBuildOption .ParamFilePathArray , "param-file" , nil ,
47
51
i18n .T ("Parameters of the job which is file path, for example: --param-file name=filename" ))
48
52
jobBuildCmd .Flags ().BoolVarP (& jobBuildOption .Wait , "wait" , "" , false ,
49
53
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 ,
51
55
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" ))
52
58
jobBuildCmd .Flags ().IntVarP (& jobBuildOption .Delay , "delay" , "" , 0 ,
53
59
i18n .T ("Delay when trigger a Jenkins job" ))
54
60
jobBuildCmd .Flags ().StringVarP (& jobBuildOption .Cause , "cause" , "" , "triggered by jcli" ,
55
61
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" ))
56
64
57
65
jobBuildOption .SetFlagWithHeaders (jobBuildCmd , "Number,URL" )
58
66
jobBuildOption .BatchOption .Stdio = common .GetSystemStdio ()
59
67
jobBuildOption .Option .Stdio = common .GetSystemStdio ()
68
+
60
69
}
61
70
62
71
var jobBuildCmd = & cobra.Command {
@@ -66,15 +75,28 @@ var jobBuildCmd = &cobra.Command{
66
75
You need to give the parameters if your pipeline has them. Learn more about it from https://jenkins.io/doc/book/pipeline/syntax/#parameters.` ),
67
76
Args : cobra .MinimumNArgs (1 ),
68
77
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 == "" {
70
79
return
71
80
}
72
81
73
82
paramDefs := make ([]client.ParameterDefinition , 0 )
74
83
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 ()))
76
87
return
77
88
}
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
+ }
78
100
}
79
101
80
102
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
113
135
jclient := & client.JobClient {
114
136
JenkinsCore : client.JenkinsCore {
115
137
RoundTripper : jobBuildOption .RoundTripper ,
138
+ Timeout : time .Duration (jobBuildOption .WaitTime ) * time .Second ,
116
139
},
117
140
}
118
141
getCurrentJenkinsAndClient (& (jclient .JenkinsCore ))
@@ -150,13 +173,18 @@ You need to give the parameters if your pipeline has them. Learn more about it f
150
173
}
151
174
152
175
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
+
153
183
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 )
160
188
}
161
189
} else {
162
190
err = jclient .Build (name )
0 commit comments