Skip to content

Instantly share code, notes, and snippets.

@chirauki
Last active March 15, 2023 13:33
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save chirauki/e16a7e37e217ce0a345a122dc09bbac1 to your computer and use it in GitHub Desktop.
Save chirauki/e16a7e37e217ce0a345a122dc09bbac1 to your computer and use it in GitHub Desktop.
Tail jenkins console output in local console
package main
import (
"flag"
"fmt"
"io/ioutil"
"net/http"
"net/url"
"os"
"strconv"
"time"
)
func exit(err error, code int) {
fmt.Println(err)
os.Exit(code)
}
func main() {
buildUrlPtr := flag.String("url", "", "URL of the jenkins build")
userPtr := flag.String("user", "", "Jenkins username")
tokenPtr := flag.String("token", "", "Jenkins user token")
sleepPtr := flag.Int("sleep", 1, "Sleep time between calls")
flag.Parse()
sleep := *sleepPtr
start := int64(0)
stop := false
client := &http.Client{}
if *buildUrlPtr == "" || *userPtr == "" || *tokenPtr == "" {
flag.PrintDefaults()
os.Exit(1)
}
consolePath := fmt.Sprintf("%v/logText/progressiveText", *buildUrlPtr)
httpReq, err := http.NewRequest("GET", consolePath, nil)
if err != nil {
exit(err, 1)
}
httpReq.SetBasicAuth(*userPtr, *tokenPtr)
for !stop {
q := url.Values{}
q.Add("start", fmt.Sprintf("%d", start))
httpReq.URL.RawQuery = q.Encode()
resp, err := client.Do(httpReq)
if resp.StatusCode > 399 {
exit(err, 1)
}
for k, v := range resp.Header {
if k == "X-Text-Size" {
start, err = strconv.ParseInt(v[0], 0, 0)
if err != nil {
exit(err, 1)
}
}
}
moreData := resp.Header.Get("X-More-Data")
if moreData == "" {
stop = true
}
bytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
exit(err, 1)
}
fmt.Printf("%s", bytes)
time.Sleep(time.Duration(sleep) * time.Second)
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment