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

     1  package jobserver
     2  
     3  import (
     4  	"context"
     5  	"encoding/json"
     6  	"net/http"
     7  
     8  	"code.cloudfoundry.org/lager/lagerctx"
     9  	"github.com/pf-qiu/concourse/v6/atc/api/present"
    10  	"github.com/pf-qiu/concourse/v6/atc/db"
    11  )
    12  
    13  func (s *Server) CreateJobBuild(pipeline db.Pipeline) http.Handler {
    14  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    15  		w.Header().Set("Content-Type", "application/json")
    16  		logger := s.logger.Session("create-job-build")
    17  
    18  		jobName := r.FormValue(":job_name")
    19  
    20  		job, found, err := pipeline.Job(jobName)
    21  		if err != nil {
    22  			logger.Error("failed-to-get-resource-types", err)
    23  			w.WriteHeader(http.StatusInternalServerError)
    24  			return
    25  		}
    26  
    27  		if !found {
    28  			w.WriteHeader(http.StatusNotFound)
    29  			return
    30  		}
    31  
    32  		if job.DisableManualTrigger() {
    33  			w.WriteHeader(http.StatusConflict)
    34  			return
    35  		}
    36  
    37  		build, err := job.CreateBuild()
    38  		if err != nil {
    39  			logger.Error("failed-to-create-job-build", err)
    40  			w.WriteHeader(http.StatusInternalServerError)
    41  			return
    42  		}
    43  
    44  		resources, err := pipeline.Resources()
    45  		if err != nil {
    46  			logger.Error("failed-to-get-resources", err)
    47  			w.WriteHeader(http.StatusInternalServerError)
    48  			return
    49  		}
    50  
    51  		resourceTypes, err := pipeline.ResourceTypes()
    52  		if err != nil {
    53  			logger.Error("failed-to-get-resource-types", err)
    54  			w.WriteHeader(http.StatusInternalServerError)
    55  			return
    56  		}
    57  
    58  		inputs, err := job.Inputs()
    59  		if err != nil {
    60  			logger.Error("failed-to-get-job-inputs", err)
    61  			w.WriteHeader(http.StatusInternalServerError)
    62  			return
    63  		}
    64  
    65  		for _, input := range inputs {
    66  			resource, found := resources.Lookup(input.Resource)
    67  			if found {
    68  				version := resource.CurrentPinnedVersion()
    69  				_, _, err := s.checkFactory.TryCreateCheck(
    70  					lagerctx.NewContext(context.Background(), logger),
    71  					resource,
    72  					resourceTypes,
    73  					version,
    74  					true,
    75  				)
    76  				if err != nil {
    77  					logger.Error("failed-to-create-check", err)
    78  				}
    79  			}
    80  		}
    81  
    82  		err = json.NewEncoder(w).Encode(present.Build(build))
    83  		if err != nil {
    84  			logger.Error("failed-to-encode-build", err)
    85  			w.WriteHeader(http.StatusInternalServerError)
    86  		}
    87  	})
    88  }