diff --git a/jenkins.go b/jenkins.go new file mode 100644 index 0000000..da779ff --- /dev/null +++ b/jenkins.go @@ -0,0 +1,107 @@ +package main + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" + "net/url" + "strings" +) + +type ( + // Auth contain username and token + Auth struct { + Username string + Token string + } + + // Jenkins contain Auth and BaseURL + Jenkins struct { + Auth *Auth + BaseURL string + } +) + +// NewJenkins is initial Jenkins object +func NewJenkins(auth *Auth, url string) *Jenkins { + url = strings.TrimRight(url, "/") + return &Jenkins{ + Auth: auth, + BaseURL: url, + } +} + +func (jenkins *Jenkins) buildURL(path string, params url.Values) (requestURL string) { + requestURL = jenkins.BaseURL + path + fmt.Println(requestURL) + if params != nil { + queryString := params.Encode() + if queryString != "" { + requestURL = requestURL + "?" + queryString + } + } + + return +} + +func (jenkins *Jenkins) sendRequest(req *http.Request) (*http.Response, error) { + if jenkins.Auth != nil { + req.SetBasicAuth(jenkins.Auth.Username, jenkins.Auth.Token) + } + return http.DefaultClient.Do(req) +} + +func (jenkins *Jenkins) parseResponse(resp *http.Response, body interface{}) (err error) { + defer resp.Body.Close() + + if body == nil { + return + } + + data, err := ioutil.ReadAll(resp.Body) + if err != nil { + return + } + + return json.Unmarshal(data, body) +} + +func (jenkins *Jenkins) post(path string, params url.Values, body interface{}) (err error) { + requestURL := jenkins.buildURL(path, params) + req, err := http.NewRequest("POST", requestURL, nil) + if err != nil { + return + } + + resp, err := jenkins.sendRequest(req) + if err != nil { + return + } + + fmt.Println(resp) + return jenkins.parseResponse(resp, body) +} + +func (jenkins *Jenkins) parseJobPath(job string) string { + var path string + + jobs := strings.Split(strings.TrimPrefix(job, "/"), "/") + + for _, value := range jobs { + value = strings.Trim(value, " ") + if len(value) == 0 { + continue + } + + path = fmt.Sprintf("%s/job/%s", path, value) + } + + return path +} + +func (jenkins *Jenkins) trigger(job string, params url.Values) error { + path := jenkins.parseJobPath(job) + "/build" + + return jenkins.post(path, params, nil) +} diff --git a/jenkins_test.go b/jenkins_test.go new file mode 100644 index 0000000..5b82f6f --- /dev/null +++ b/jenkins_test.go @@ -0,0 +1,30 @@ +package main + +import ( + "github.com/stretchr/testify/assert" + + "testing" +) + +func TestParseJobPath(t *testing.T) { + auth := &Auth{ + Username: "appleboy", + Token: "1234", + } + jenkins := NewJenkins(auth, "http://example.com") + + assert.Equal(t, "/job/foo", jenkins.parseJobPath("/foo/")) + assert.Equal(t, "/job/foo", jenkins.parseJobPath("foo/")) + assert.Equal(t, "/job/foo/job/bar", jenkins.parseJobPath("foo/bar")) + assert.Equal(t, "/job/foo/job/bar", jenkins.parseJobPath("foo///bar")) +} + +func TestTriggerBuild(t *testing.T) { + auth := &Auth{ + Username: "appleboy", + Token: "XXXXXXXX", + } + jenkins := NewJenkins(auth, "XXXXXX") + + jenkins.trigger("drone-jenkins", nil) +}