kubesphere.io/s2irun@v3.2.1+incompatible/pkg/run/s2i.go (about) 1 package run 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "fmt" 7 "github.com/kubesphere/s2irun/pkg/api" 8 "github.com/kubesphere/s2irun/pkg/api/describe" 9 "github.com/kubesphere/s2irun/pkg/api/validation" 10 "github.com/kubesphere/s2irun/pkg/build/strategies" 11 "github.com/kubesphere/s2irun/pkg/docker" 12 s2ierr "github.com/kubesphere/s2irun/pkg/errors" 13 "github.com/kubesphere/s2irun/pkg/scm/git" 14 utilglog "github.com/kubesphere/s2irun/pkg/utils/glog" 15 "os" 16 ) 17 18 const ( 19 ConfigEnvVariable = "S2I_CONFIG_PATH" 20 ) 21 22 var glog = utilglog.StderrLog 23 24 // S2I Just run the command 25 func S2I(cfg *api.Config) error { 26 cfg.DockerConfig = docker.GetDefaultDockerConfig() 27 if len(cfg.AsDockerfile) > 0 { 28 if cfg.RunImage { 29 return fmt.Errorf("ERROR: --run cannot be used with --as-dockerfile") 30 } 31 if len(cfg.RuntimeImage) > 0 { 32 return fmt.Errorf("ERROR: --runtime-image cannot be used with --as-dockerfile") 33 } 34 } 35 if cfg.Incremental && len(cfg.RuntimeImage) > 0 { 36 return fmt.Errorf("ERROR: Incremental build with runtime image isn't supported") 37 } 38 //set default image pull policy 39 if len(cfg.BuilderPullPolicy) == 0 { 40 cfg.BuilderPullPolicy = api.DefaultBuilderPullPolicy 41 } 42 if len(cfg.PreviousImagePullPolicy) == 0 { 43 cfg.PreviousImagePullPolicy = api.DefaultPreviousImagePullPolicy 44 } 45 if len(cfg.RuntimeImagePullPolicy) == 0 { 46 cfg.RuntimeImagePullPolicy = api.DefaultRuntimeImagePullPolicy 47 } 48 if errs := validation.ValidateConfig(cfg); len(errs) > 0 { 49 var buf bytes.Buffer 50 for _, e := range errs { 51 buf.WriteString("ERROR:") 52 buf.WriteString(e.Error()) 53 buf.WriteString("\n") 54 } 55 return fmt.Errorf(buf.String()) 56 } 57 58 client, err := docker.NewEngineAPIClient(cfg.DockerConfig) 59 if err != nil { 60 return err 61 } 62 63 d := docker.New(client, cfg.PullAuthentication, cfg.PushAuthentication) 64 err = d.CheckReachable() 65 if err != nil { 66 return err 67 } 68 69 glog.V(9).Infof("\n%s\n", describe.Config(client, cfg)) 70 71 builder, _, err := strategies.GetStrategy(client, cfg) 72 s2ierr.CheckError(err) 73 result, err := builder.Build(cfg) 74 if err != nil { 75 glog.V(0).Infof("Build failed") 76 s2ierr.CheckError(err) 77 return err 78 } else { 79 if len(cfg.AsDockerfile) > 0 { 80 glog.V(0).Infof("Application dockerfile generated in %s", cfg.AsDockerfile) 81 } else { 82 glog.V(0).Infof("Build completed successfully") 83 } 84 } 85 86 //result.Message store Callback Info 87 for _, message := range result.Messages { 88 glog.V(1).Infof(message) 89 } 90 91 return nil 92 } 93 94 func App() int { 95 var apiConfig = new(api.Config) 96 path := os.Getenv(ConfigEnvVariable) 97 file, err := os.Open(path) 98 defer file.Close() 99 if os.IsNotExist(err) { 100 glog.Errorf("Config file does not exist,please check the path: %s", path) 101 return 1 102 } 103 104 jsonParser := json.NewDecoder(file) 105 err = jsonParser.Decode(apiConfig) 106 if err != nil { 107 glog.Errorf("There are some errors in config file, please check the error:\n%v", err) 108 return 1 109 } 110 apiConfig.Source, err = git.Parse(apiConfig.SourceURL, apiConfig.IsBinaryURL) 111 if err != nil { 112 glog.Errorf("SourceURL is illegal, please check the error:\n%v", err) 113 return 1 114 } 115 apiConfig.Tag, err = api.Parse(apiConfig.Tag, apiConfig.PushAuthentication.ServerAddress) 116 if err != nil { 117 glog.Errorf("There are some errors in image name, please check the error:\n%v", err) 118 return 1 119 } 120 err = S2I(apiConfig) 121 if err != nil { 122 glog.Errorf("Build failed, please check the error:\n%v", err) 123 return 1 124 } 125 return 0 126 }