From 1e10cd454915e8d426b7447eb10602044c0136bb Mon Sep 17 00:00:00 2001 From: Zhao Xiaojie Date: Thu, 27 Jun 2019 10:33:08 +0800 Subject: [PATCH] Add queue as subcmd --- app/cmd/queue.go | 44 +++++++++++++++++++++++++++ client/queue.go | 79 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 123 insertions(+) create mode 100644 app/cmd/queue.go create mode 100644 client/queue.go diff --git a/app/cmd/queue.go b/app/cmd/queue.go new file mode 100644 index 0000000..aa6b2b5 --- /dev/null +++ b/app/cmd/queue.go @@ -0,0 +1,44 @@ +package cmd + +import ( + "fmt" + "log" + + "github.com/linuxsuren/jenkins-cli/client" + "github.com/spf13/cobra" +) + +type QueueOption struct { + OutputOption +} + +var queueOption QueueOption + +func init() { + rootCmd.AddCommand(queueCmd) + queueCmd.PersistentFlags().StringVarP(&queueOption.Format, "output", "o", "json", "Format the output") +} + +var queueCmd = &cobra.Command{ + Use: "queue", + Short: "Print the queue of your Jenkins", + Long: `Print the queue of your Jenkins`, + Run: func(cmd *cobra.Command, args []string) { + jenkins := getCurrentJenkins() + jclient := &client.QueueClient{} + jclient.URL = jenkins.URL + jclient.UserName = jenkins.UserName + jclient.Token = jenkins.Token + + if status, err := jclient.Get(); err == nil { + var data []byte + if data, err = Format(status, queueOption.Format); err == nil { + fmt.Printf("%s\n", string(data)) + } else { + log.Fatal(err) + } + } else { + log.Fatal(err) + } + }, +} diff --git a/client/queue.go b/client/queue.go new file mode 100644 index 0000000..fca750b --- /dev/null +++ b/client/queue.go @@ -0,0 +1,79 @@ +package client + +import ( + "crypto/tls" + "encoding/json" + "fmt" + "io/ioutil" + "log" + "net/http" +) + +type QueueClient struct { + JenkinsCore +} + +func (q *QueueClient) Get() (status *JobQueue, err error) { + api := fmt.Sprintf("%s/queue/api/json", q.URL) + var ( + req *http.Request + response *http.Response + ) + + req, err = http.NewRequest("GET", api, nil) + if err == nil { + q.AuthHandle(req) + } else { + return + } + + tr := &http.Transport{ + TLSClientConfig: &tls.Config{InsecureSkipVerify: true}, + } + client := &http.Client{Transport: tr} + if response, err = client.Do(req); err == nil { + code := response.StatusCode + var data []byte + data, err = ioutil.ReadAll(response.Body) + if code == 200 { + if err == nil { + status = &JobQueue{} + err = json.Unmarshal(data, status) + } + } else { + log.Fatal(string(data)) + } + } else { + log.Fatal(err) + } + return +} + +type JobQueue struct { + Items []QueueItem +} + +type QueueItem struct { + Blocked bool + Buildable bool + ID int + Params string + Pending bool + Stuck bool + URL string + Why string + BuildableStartMilliseconds int64 + InQueueSince int64 + Actions []CauseAction +} + +type CauseAction struct { + Causes []Cause +} + +type Cause struct { + UpstreamUrl string + UpstreamProject string + UpstreamBuild int + ShortDescription string +} -- GitLab