github.com/pf-qiu/concourse/v6@v6.7.3-0.20201207032516-1f455d73275f/atc/api/jobserver/rerun_build.go (about)

     1  package jobserver
     2  
     3  import (
     4  	"encoding/json"
     5  	"errors"
     6  	"net/http"
     7  
     8  	"github.com/pf-qiu/concourse/v6/atc/api/present"
     9  	"github.com/pf-qiu/concourse/v6/atc/db"
    10  )
    11  
    12  func (s *Server) RerunJobBuild(pipeline db.Pipeline) http.Handler {
    13  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    14  		w.Header().Set("Content-Type", "application/json")
    15  		logger := s.logger.Session("rerun-build")
    16  
    17  		jobName := r.FormValue(":job_name")
    18  		buildName := r.FormValue(":build_name")
    19  
    20  		job, found, err := pipeline.Job(jobName)
    21  		if err != nil {
    22  			logger.Error("failed-to-get-job", err)
    23  			w.WriteHeader(http.StatusInternalServerError)
    24  			return
    25  		}
    26  
    27  		if !found {
    28  			w.WriteHeader(http.StatusNotFound)
    29  			return
    30  		}
    31  
    32  		buildToRerun, found, err := job.Build(buildName)
    33  		if err != nil {
    34  			logger.Error("failed-to-get-build-to-rerun", err)
    35  			w.WriteHeader(http.StatusInternalServerError)
    36  			return
    37  		}
    38  
    39  		if !found {
    40  			w.WriteHeader(http.StatusNotFound)
    41  			return
    42  		}
    43  
    44  		if !buildToRerun.InputsReady() {
    45  			logger.Error("build-to-rerun-has-no-inputs", errors.New("build has no inputs"))
    46  			w.WriteHeader(http.StatusInternalServerError)
    47  			return
    48  		}
    49  
    50  		build, err := job.RerunBuild(buildToRerun)
    51  		if err != nil {
    52  			logger.Error("failed-to-retrigger-build", err)
    53  			w.WriteHeader(http.StatusInternalServerError)
    54  			return
    55  		}
    56  
    57  		err = json.NewEncoder(w).Encode(present.Build(build))
    58  		if err != nil {
    59  			logger.Error("failed-to-encode-build", err)
    60  			w.WriteHeader(http.StatusInternalServerError)
    61  		}
    62  	})
    63  }