github.imxd.top/openshift/source-to-image@v1.2.0/pkg/build/strategies/strategies.go (about)

     1  package strategies
     2  
     3  import (
     4  	"time"
     5  
     6  	"github.com/openshift/source-to-image/pkg/api"
     7  	"github.com/openshift/source-to-image/pkg/build"
     8  	"github.com/openshift/source-to-image/pkg/build/strategies/dockerfile"
     9  	"github.com/openshift/source-to-image/pkg/build/strategies/onbuild"
    10  	"github.com/openshift/source-to-image/pkg/build/strategies/sti"
    11  	"github.com/openshift/source-to-image/pkg/docker"
    12  	"github.com/openshift/source-to-image/pkg/util/fs"
    13  	utilstatus "github.com/openshift/source-to-image/pkg/util/status"
    14  )
    15  
    16  // GetStrategy decides what build strategy will be used for the STI build.
    17  // TODO: deprecated, use Strategy() instead
    18  func GetStrategy(client docker.Client, config *api.Config) (build.Builder, api.BuildInfo, error) {
    19  	return Strategy(client, config, build.Overrides{})
    20  }
    21  
    22  // Strategy creates the appropriate build strategy for the provided config, using
    23  // the overrides provided. Not all strategies support all overrides.
    24  func Strategy(client docker.Client, config *api.Config, overrides build.Overrides) (build.Builder, api.BuildInfo, error) {
    25  	var builder build.Builder
    26  	var buildInfo api.BuildInfo
    27  	var err error
    28  
    29  	fileSystem := fs.NewFileSystem()
    30  
    31  	startTime := time.Now()
    32  
    33  	if len(config.AsDockerfile) != 0 {
    34  		builder, err = dockerfile.New(config, fileSystem)
    35  		if err != nil {
    36  			buildInfo.FailureReason = utilstatus.NewFailureReason(
    37  				utilstatus.ReasonGenericS2IBuildFailed,
    38  				utilstatus.ReasonMessageGenericS2iBuildFailed,
    39  			)
    40  			return nil, buildInfo, err
    41  		}
    42  		return builder, buildInfo, nil
    43  	}
    44  
    45  	dkr := docker.New(client, config.PullAuthentication)
    46  	image, err := docker.GetBuilderImage(dkr, config)
    47  	buildInfo.Stages = api.RecordStageAndStepInfo(buildInfo.Stages, api.StagePullImages, api.StepPullBuilderImage, startTime, time.Now())
    48  	if err != nil {
    49  		buildInfo.FailureReason = utilstatus.NewFailureReason(
    50  			utilstatus.ReasonPullBuilderImageFailed,
    51  			utilstatus.ReasonMessagePullBuilderImageFailed,
    52  		)
    53  		return nil, buildInfo, err
    54  	}
    55  	config.HasOnBuild = image.OnBuild
    56  
    57  	if config.AssembleUser, err = docker.GetAssembleUser(dkr, config); err != nil {
    58  		buildInfo.FailureReason = utilstatus.NewFailureReason(
    59  			utilstatus.ReasonPullBuilderImageFailed,
    60  			utilstatus.ReasonMessagePullBuilderImageFailed,
    61  		)
    62  		return nil, buildInfo, err
    63  	}
    64  
    65  	// if we're blocking onbuild, just do a normal s2i build flow
    66  	// which won't do a docker build and invoke the onbuild commands
    67  	if image.OnBuild && !config.BlockOnBuild {
    68  		builder, err = onbuild.New(client, config, fileSystem, overrides)
    69  		if err != nil {
    70  			buildInfo.FailureReason = utilstatus.NewFailureReason(
    71  				utilstatus.ReasonGenericS2IBuildFailed,
    72  				utilstatus.ReasonMessageGenericS2iBuildFailed,
    73  			)
    74  			return nil, buildInfo, err
    75  		}
    76  		return builder, buildInfo, nil
    77  	}
    78  
    79  	builder, err = sti.New(client, config, fileSystem, overrides)
    80  	if err != nil {
    81  		buildInfo.FailureReason = utilstatus.NewFailureReason(
    82  			utilstatus.ReasonGenericS2IBuildFailed,
    83  			utilstatus.ReasonMessageGenericS2iBuildFailed,
    84  		)
    85  		return nil, buildInfo, err
    86  	}
    87  	return builder, buildInfo, err
    88  }