未验证 提交 6c65096b 编写于 作者: JenkinsInChina's avatar JenkinsInChina 提交者: GitHub

Add support to trigger build and getting the build id (#434)

* Add support to trigger build and getting the build id

* Add support on the job build command

* Test pass for trigger and wait the job build

* Add documentation for job build
上级 e253b3e7
......@@ -15,11 +15,17 @@ import (
type JobBuildOption struct {
common.BatchOption
common.CommonOption
common.OutputOption
Param string
ParamArray []string
ParamFilePathArray []string
Wait bool
WaitTime int
Delay int
Cause string
}
var jobBuildOption JobBuildOption
......@@ -31,14 +37,23 @@ func ResetJobBuildOption() {
func init() {
jobCmd.AddCommand(jobBuildCmd)
jobBuildOption.SetFlag(jobBuildCmd)
jobBuildCmd.Flags().BoolVarP(&jobBuildOption.Batch, "batch", "b", false, "Batch mode, no need 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"))
jobBuildCmd.Flags().StringArrayVar(&jobBuildOption.ParamFilePathArray, "param-file", nil,
i18n.T("Parameters of the job which is file path, for example: --param-file name=filename"))
jobBuildCmd.Flags().BoolVarP(&jobBuildOption.Wait, "wait", "", false,
i18n.T("If you want to wait for the build ID from Jenkins. You need to install plugin pipeline-restful-api first"))
jobBuildCmd.Flags().IntVarP(&jobBuildOption.WaitTime, "wait-timeout", "", 30,
i18n.T("The timeout of seconds when you wait for the build ID"))
jobBuildCmd.Flags().IntVarP(&jobBuildOption.Delay, "delay", "", 0,
i18n.T("Delay when trigger a Jenkins job"))
jobBuildCmd.Flags().StringVarP(&jobBuildOption.Cause, "cause", "", "triggered by jcli",
i18n.T("The cause of a job build"))
jobBuildOption.SetFlagWithHeaders(jobBuildCmd, "Number,URL")
jobBuildOption.BatchOption.Stdio = common.GetSystemStdio()
jobBuildOption.CommonOption.Stdio = common.GetSystemStdio()
}
......@@ -87,7 +102,7 @@ You need to give the parameters if your pipeline has them. Learn more about it f
}
return
},
RunE: func(_ *cobra.Command, args []string) (err error) {
RunE: func(cmd *cobra.Command, args []string) (err error) {
name := args[0]
if !jobBuildOption.Confirm(fmt.Sprintf("Are you sure to build job %s", name)) {
......@@ -136,6 +151,12 @@ You need to give the parameters if your pipeline has them. Learn more about it f
if err == nil {
if hasParam {
err = jclient.BuildWithParams(name, paramDefs)
} else if jobBuildOption.Wait {
var build client.IdentityBuild
if build, err = jclient.BuildAndReturn(name, jobBuildOption.Cause, jobBuildOption.WaitTime, jobBuildOption.Delay); err == nil {
jobBuildOption.Writer = cmd.OutOrStdout()
err = jobBuildOption.OutputV2([1]client.SimpleJobBuild{build.Build.SimpleJobBuild})
}
} else {
err = jclient.Build(name)
}
......
......@@ -196,7 +196,6 @@ func init() {
if rootOptions.GetGitHubClient() == nil {
rootOptions.SetGitHubClient(github.NewClient(nil))
fmt.Println("setup a new gh client")
} else {
fmt.Println(rootOptions.GetGitHubClient())
}
......
......@@ -49,6 +49,38 @@ func (q *JobClient) Build(jobName string) (err error) {
return
}
// IdentityBuild is the build which carry the identity cause
type IdentityBuild struct {
Build JobBuild
Cause IdentityCause
}
// IdentityCause carray a identity cause
type IdentityCause struct {
UUID string `json:"uuid"`
ShortDescription string `json:"shortDescription"`
Message string
}
// BuildAndReturn trigger a job then returns the build info
func (q *JobClient) BuildAndReturn(jobName, cause string, timeout, delay int) (build IdentityBuild, err error) {
path := ParseJobPath(jobName)
api := fmt.Sprintf("%s/restFul/build?1=1", path)
if timeout >= 0 {
api += fmt.Sprintf("&timeout=%d", timeout)
}
if delay >= 0 {
api += fmt.Sprintf("&delay=%d", delay)
}
if cause != "" {
api += fmt.Sprintf("&identifyCause=%s", cause)
}
err = q.RequestWithData(http.MethodPost, api, nil, nil, 200, &build)
return
}
// GetBuild get build information of a job
func (q *JobClient) GetBuild(jobName string, id int) (job *JobBuild, err error) {
path := ParseJobPath(jobName)
......
......@@ -21,6 +21,11 @@ weight: 80
`jcli job build "jobName" -b`
当你需要触发任务构建,并等待对应任务的构建号的话,可以使用下面的命令
(依赖插件[pipeline-restful-api-plugin](https://github.com/jenkinsci/pipeline-restful-api-plugin)):
`jcli job build job/test -b --wait`
## 交互式输入
执行到 Jenkins 流水线中的 `input` 指令时,会有交互式输入的提示。下面是一个样例:
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册