From d182f90a35e06c2e337596c5a91441ddab0bbbfa Mon Sep 17 00:00:00 2001 From: Zhao Xiaojie Date: Sat, 2 Nov 2019 15:19:10 +0800 Subject: [PATCH] Add support to load a jenkinsfile from url (#220) * Add support to load a jenkinsfile from url * Add more test cases --- app/cmd/job_edit.go | 23 +++++++++++++++++++++ app/cmd/job_edit_test.go | 44 ++++++++++++++++++++++++++++++++++------ 2 files changed, 61 insertions(+), 6 deletions(-) diff --git a/app/cmd/job_edit.go b/app/cmd/job_edit.go index 876ffb0..b8dcb0a 100644 --- a/app/cmd/job_edit.go +++ b/app/cmd/job_edit.go @@ -13,6 +13,7 @@ import ( type JobEditOption struct { Filename string Script string + URL string RoundTripper http.RoundTripper } @@ -21,6 +22,8 @@ var jobEditOption JobEditOption func init() { jobCmd.AddCommand(jobEditCmd) + jobEditCmd.Flags().StringVarP(&jobEditOption.URL, "url", "", "", + "URL of the Jenkinsfile to files to use to replace pipeline") jobEditCmd.Flags().StringVarP(&jobEditOption.Filename, "filename", "f", "", "Filename to files to use to replace pipeline") jobEditCmd.Flags().StringVarP(&jobEditOption.Script, "script", "s", "", @@ -67,6 +70,10 @@ func (j *JobEditOption) getPipeline(jClient *client.JobClient, name string) (scr return } + if script, err = j.getPipelineFromURL(jClient); script != "" || err != nil { + return + } + var job *client.Pipeline if job, err = jClient.GetPipeline(name); err == nil { content := "" @@ -102,3 +109,19 @@ func (j *JobEditOption) getPipelineFromFile() (script string, err error) { } return } + +func (j *JobEditOption) getPipelineFromURL(jClient *client.JobClient) (script string, err error) { + if j.URL == "" { + return + } + + var resp *http.Response + var body []byte + httpClient := jClient.JenkinsCore.GetClient() + if resp, err = httpClient.Get(j.URL); err == nil { + if body, err = ioutil.ReadAll(resp.Body); err == nil { + script = string(body) + } + } + return +} diff --git a/app/cmd/job_edit_test.go b/app/cmd/job_edit_test.go index 47495a8..21d24d3 100644 --- a/app/cmd/job_edit_test.go +++ b/app/cmd/job_edit_test.go @@ -3,6 +3,7 @@ package cmd import ( "bytes" "io/ioutil" + "net/http" "os" "github.com/golang/mock/gomock" @@ -10,8 +11,6 @@ import ( "github.com/jenkins-zh/jenkins-cli/mock/mhttp" . "github.com/onsi/ginkgo" . "github.com/onsi/gomega" - // "github.com/AlecAivazis/survey/v2/core" - // "github.com/AlecAivazis/survey/v2/terminal" ) var _ = Describe("job edit command", func() { @@ -21,6 +20,8 @@ var _ = Describe("job edit command", func() { jenkinsRoot string username string token string + + script string ) BeforeEach(func() { @@ -34,6 +35,8 @@ var _ = Describe("job edit command", func() { jenkinsRoot = "http://localhost:8080/jenkins" username = "admin" token = "111e3a2f0231198855dceaff96f20540a9" + + script = "sample" }) AfterEach(func() { @@ -51,9 +54,9 @@ var _ = Describe("job edit command", func() { Expect(err).To(BeNil()) jobName := "test" - client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, "sample", username, token) + client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, script, username, token) - rootCmd.SetArgs([]string{"job", "edit", jobName, "--script", "sample"}) + rootCmd.SetArgs([]string{"job", "edit", jobName, "--script", script}) buf := new(bytes.Buffer) rootCmd.SetOutput(buf) @@ -72,10 +75,10 @@ var _ = Describe("job edit command", func() { tempFile, err := ioutil.TempFile("", "example") Expect(err).To(BeNil()) defer os.Remove(tempFile.Name()) - err = ioutil.WriteFile(tempFile.Name(), []byte("sample"), 0644) + err = ioutil.WriteFile(tempFile.Name(), []byte(script), 0644) jobName := "test" - client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, "sample", username, token) + client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, script, username, token) rootCmd.SetArgs([]string{"job", "edit", jobName, "--filename", tempFile.Name(), "--script", ""}) @@ -86,5 +89,34 @@ var _ = Describe("job edit command", func() { Expect(buf.String()).To(Equal("")) }) + + It("edit with url param", func() { + data, err := generateSampleConfig() + Expect(err).To(BeNil()) + err = ioutil.WriteFile(rootOptions.ConfigFile, data, 0664) + Expect(err).To(BeNil()) + + jobName := "test" + client.PrepareForUpdatePipelineJob(roundTripper, jenkinsRoot, "sample", username, token) + + remoteJenkinsfileURL := "http://test" + remoteJenkinsfileReq, _ := http.NewRequest("GET", remoteJenkinsfileURL, nil) + remoteJenkinsfileResponse := &http.Response{ + StatusCode: 200, + Request: remoteJenkinsfileReq, + Body: ioutil.NopCloser(bytes.NewBufferString(script)), + } + roundTripper.EXPECT(). + RoundTrip(remoteJenkinsfileReq).Return(remoteJenkinsfileResponse, nil) + + rootCmd.SetArgs([]string{"job", "edit", jobName, "--filename", "", "--script", "", "--url", remoteJenkinsfileURL}) + + buf := new(bytes.Buffer) + rootCmd.SetOutput(buf) + _, err = rootCmd.ExecuteC() + Expect(err).To(BeNil()) + + Expect(buf.String()).To(Equal("")) + }) }) }) -- GitLab