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  }