Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Jenkins 中文社区
jenkins-cli
提交
5c929c3b
J
jenkins-cli
项目概览
Jenkins 中文社区
/
jenkins-cli
通知
49
Star
8
Fork
1
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
J
jenkins-cli
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
未验证
提交
5c929c3b
编写于
11月 25, 2019
作者:
LinuxSuRen
提交者:
GitHub
11月 25, 2019
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Add param-entry for job build (#249)
* Add param-entry for job build * Add test cases
上级
7c3092fe
变更
6
隐藏空白更改
内联
并排
Showing
6 changed file
with
90 addition
and
32 deletion
+90
-32
app/cmd/job_build.go
app/cmd/job_build.go
+54
-23
app/cmd/job_build_test.go
app/cmd/job_build_test.go
+25
-1
app/cmd/restart_test.go
app/cmd/restart_test.go
+1
-1
app/cmd/root.go
app/cmd/root.go
+1
-1
client/common.go
client/common.go
+7
-4
client/common_test.go
client/common_test.go
+2
-2
未找到文件。
app/cmd/job_build.go
浏览文件 @
5c929c3b
...
...
@@ -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
},
}
app/cmd/job_build_test.go
浏览文件 @
5c929c3b
...
...
@@ -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
())
})
})
})
app/cmd/restart_test.go
浏览文件 @
5c929c3b
...
...
@@ -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
"
))
})
})
})
app/cmd/root.go
浏览文件 @
5c929c3b
...
...
@@ -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
}
...
...
client/common.go
浏览文件 @
5c929c3b
...
...
@@ -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
}
...
...
client/common_test.go
浏览文件 @
5c929c3b
...
...
@@ -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
(
"
N
ot found resources"
))
Expect
(
err
.
Error
())
.
To
(
Equal
(
"
n
ot 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.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录