func Execute(c *cli.Context) { target := returnTarget(c.GlobalString("target")) buildConfig := c.String("config") insecure := c.GlobalBool("insecure") excludeIgnored := c.Bool("exclude-ignored") atcRequester := newAtcRequester(target, insecure) inputMappings := c.StringSlice("input") if len(inputMappings) == 0 { wd, err := os.Getwd() if err != nil { log.Fatalln(err) } inputMappings = append(inputMappings, filepath.Base(wd)+"="+wd) } inputs := []Input{} for _, i := range inputMappings { segs := strings.SplitN(i, "=", 2) if len(segs) < 2 { log.Println("malformed input:", i) os.Exit(1) } inputName := segs[0] absPath, err := filepath.Abs(segs[1]) if err != nil { log.Printf("could not locate input %s: %s\n", inputName, err) os.Exit(1) } pipe := createPipe(atcRequester) inputs = append(inputs, Input{ Name: inputName, Path: absPath, Pipe: pipe, }) } absConfig, err := filepath.Abs(buildConfig) if err != nil { log.Println("could not locate config file:", err) os.Exit(1) } build := createBuild( atcRequester, c.Bool("privileged"), inputs, config.LoadTaskConfig(absConfig, c.Args()), ) fmt.Fprintf(os.Stdout, "executing build %d\n", build.ID) terminate := make(chan os.Signal, 1) go abortOnSignal(atcRequester, terminate, build) signal.Notify(terminate, syscall.SIGINT, syscall.SIGTERM) eventSource, err := sse.Connect(atcRequester.httpClient, time.Second, func() *http.Request { logOutput, err := atcRequester.CreateRequest( atc.BuildEvents, rata.Params{"build_id": strconv.Itoa(build.ID)}, nil, ) if err != nil { log.Fatalln(err) } return logOutput }) if err != nil { log.Println("failed to connect to event stream:", err) os.Exit(1) } go func() { for _, i := range inputs { upload(i, excludeIgnored, atcRequester) } }() exitCode, err := eventstream.RenderStream(eventSource) if err != nil { log.Println("failed to render stream:", err) os.Exit(1) } eventSource.Close() os.Exit(exitCode) }
func (command *ExecuteCommand) Execute(args []string) error { connection, err := rc.TargetConnection(Fly.Target) if err != nil { log.Fatalln(err) return nil } client := concourse.NewClient(connection) taskConfigFile := command.TaskConfig excludeIgnored := command.ExcludeIgnored atcRequester := deprecated.NewAtcRequester(connection.URL(), connection.HTTPClient()) taskConfig := config.LoadTaskConfig(string(taskConfigFile), args) inputs, err := executehelpers.DetermineInputs( client, taskConfig.Inputs, command.Inputs, command.InputsFrom, ) if err != nil { return err } outputs, err := executehelpers.DetermineOutputs( client, taskConfig.Outputs, command.Outputs, ) if err != nil { return err } build, err := executehelpers.CreateBuild( atcRequester, client, command.Privileged, inputs, outputs, taskConfig, command.Tags, Fly.Target, ) if err != nil { return err } fmt.Println("executing build", build.ID) terminate := make(chan os.Signal, 1) go abortOnSignal(client, terminate, build) signal.Notify(terminate, syscall.SIGINT, syscall.SIGTERM) inputChan := make(chan interface{}) go func() { for _, i := range inputs { if i.Path != "" { executehelpers.Upload(i, excludeIgnored, atcRequester) } } close(inputChan) }() var outputChans []chan (interface{}) if len(outputs) > 0 { for i, output := range outputs { outputChans = append(outputChans, make(chan interface{}, 1)) go func(o executehelpers.Output, outputChan chan<- interface{}) { if o.Path != "" { executehelpers.Download(o, atcRequester) } close(outputChan) }(output, outputChans[i]) } } eventSource, err := client.BuildEvents(fmt.Sprintf("%d", build.ID)) if err != nil { log.Println("failed to attach to stream:", err) os.Exit(1) } exitCode := eventstream.Render(os.Stdout, eventSource) eventSource.Close() <-inputChan if len(outputs) > 0 { for _, outputChan := range outputChans { <-outputChan } } os.Exit(exitCode) return nil }
func (command *ExecuteCommand) Execute(args []string) error { client, err := rc.TargetClient(Fly.Target) if err != nil { return err } err = rc.ValidateClient(client, Fly.Target) if err != nil { return err } taskConfigFile := command.TaskConfig excludeIgnored := command.ExcludeIgnored taskConfig, err := config.LoadTaskConfig(string(taskConfigFile), args) if err != nil { return err } inputs, err := executehelpers.DetermineInputs( client, taskConfig.Inputs, command.Inputs, command.InputsFrom, ) if err != nil { return err } outputs, err := executehelpers.DetermineOutputs( client, taskConfig.Outputs, command.Outputs, ) if err != nil { return err } build, err := executehelpers.CreateBuild( client, command.Privileged, inputs, outputs, taskConfig, command.Tags, Fly.Target, ) if err != nil { return err } fmt.Println("executing build", build.ID) terminate := make(chan os.Signal, 1) go abortOnSignal(client, terminate, build) signal.Notify(terminate, syscall.SIGINT, syscall.SIGTERM) inputChan := make(chan interface{}) go func() { for _, i := range inputs { if i.Path != "" { executehelpers.Upload(client, i, excludeIgnored) } } close(inputChan) }() var outputChans []chan (interface{}) if len(outputs) > 0 { for i, output := range outputs { outputChans = append(outputChans, make(chan interface{}, 1)) go func(o executehelpers.Output, outputChan chan<- interface{}) { if o.Path != "" { executehelpers.Download(client, o) } close(outputChan) }(output, outputChans[i]) } } eventSource, err := client.BuildEvents(fmt.Sprintf("%d", build.ID)) if err != nil { return err } exitCode := eventstream.Render(os.Stdout, eventSource) eventSource.Close() <-inputChan if len(outputs) > 0 { for _, outputChan := range outputChans { <-outputChan } } os.Exit(exitCode) return nil }