github.com/openshift/source-to-image@v1.4.1-0.20240516041539-bf52fc02204e/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  // Strategy creates the appropriate build strategy for the provided config, using
    17  // the overrides provided. Not all strategies support all overrides.
    18  func Strategy(client docker.Client, config *api.Config, overrides build.Overrides) (build.Builder, api.BuildInfo, error) {
    19  	var builder build.Builder
    20  	var buildInfo api.BuildInfo
    21  	var err error
    22  
    23  	fileSystem := fs.NewFileSystem()
    24  
    25  	startTime := time.Now()
    26  
    27  	if len(config.AsDockerfile) != 0 {
    28  		builder, err = dockerfile.New(config, fileSystem)
    29  		if err != nil {
    30  			buildInfo.FailureReason = utilstatus.NewFailureReason(
    31  				utilstatus.ReasonGenericS2IBuildFailed,
    32  				utilstatus.ReasonMessageGenericS2iBuildFailed,
    33  			)
    34  			return nil, buildInfo, err
    35  		}
    36  		return builder, buildInfo, nil
    37  	}
    38  
    39  	dkr := docker.New(client, config.PullAuthentication)
    40  	image, err := docker.GetBuilderImage(dkr, config)
    41  	buildInfo.Stages = api.RecordStageAndStepInfo(buildInfo.Stages, api.StagePullImages, api.StepPullBuilderImage, startTime, time.Now())
    42  	if err != nil {
    43  		buildInfo.FailureReason = utilstatus.NewFailureReason(
    44  			utilstatus.ReasonPullBuilderImageFailed,
    45  			utilstatus.ReasonMessagePullBuilderImageFailed,
    46  		)
    47  		return nil, buildInfo, err
    48  	}
    49  	config.HasOnBuild = image.OnBuild
    50  
    51  	if config.AssembleUser, err = docker.GetAssembleUser(dkr, config); err != nil {
    52  		buildInfo.FailureReason = utilstatus.NewFailureReason(
    53  			utilstatus.ReasonPullBuilderImageFailed,
    54  			utilstatus.ReasonMessagePullBuilderImageFailed,
    55  		)
    56  		return nil, buildInfo, err
    57  	}
    58  
    59  	// if we're blocking onbuild, just do a normal s2i build flow
    60  	// which won't do a docker build and invoke the onbuild commands
    61  	if image.OnBuild && !config.BlockOnBuild {
    62  		builder, err = onbuild.New(client, config, fileSystem, overrides)
    63  		if err != nil {
    64  			buildInfo.FailureReason = utilstatus.NewFailureReason(
    65  				utilstatus.ReasonGenericS2IBuildFailed,
    66  				utilstatus.ReasonMessageGenericS2iBuildFailed,
    67  			)
    68  			return nil, buildInfo, err
    69  		}
    70  		return builder, buildInfo, nil
    71  	}
    72  
    73  	builder, err = sti.New(client, config, fileSystem, overrides)
    74  	if err != nil {
    75  		buildInfo.FailureReason = utilstatus.NewFailureReason(
    76  			utilstatus.ReasonGenericS2IBuildFailed,
    77  			utilstatus.ReasonMessageGenericS2iBuildFailed,
    78  		)
    79  		return nil, buildInfo, err
    80  	}
    81  	return builder, buildInfo, err
    82  }